summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/tests/inc/utf8_basename.test.php69
-rw-r--r--inc/utf8.php25
2 files changed, 94 insertions, 0 deletions
diff --git a/_test/tests/inc/utf8_basename.test.php b/_test/tests/inc/utf8_basename.test.php
new file mode 100644
index 000000000..1cb5b5606
--- /dev/null
+++ b/_test/tests/inc/utf8_basename.test.php
@@ -0,0 +1,69 @@
+<?php
+
+class utf8_basename_test extends DokuWikiTest {
+
+ function test1(){
+ $data = array(
+ array('/this/foo/bar.test.png', '', 'bar.test.png'),
+ array('\\this\\foo\\bar.test.png', '', 'bar.test.png'),
+ array('/this\\foo/bar.test.png', '', 'bar.test.png'),
+ array('/this/foo\\bar.test.png', '', 'bar.test.png'),
+
+ array('/this/ДокуВики/bar.test.png', '', 'bar.test.png'),
+ array('\\this\\ДокуВики\\bar.test.png', '', 'bar.test.png'),
+ array('/this\\ДокуВики/bar.test.png', '', 'bar.test.png'),
+ array('/this/ДокуВики\\bar.test.png', '', 'bar.test.png'),
+
+ array('/this/foo/ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('\\this\\foo\\ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('/this\\foo/ДокуВики.test.png', '', 'ДокуВики.test.png'),
+ array('/this/foo\\ДокуВики.test.png', '', 'ДокуВики.test.png'),
+
+ array('/this/foo/bar.test.png', '.png', 'bar.test'),
+ array('\\this\\foo\\bar.test.png', '.png', 'bar.test'),
+ array('/this\\foo/bar.test.png', '.png', 'bar.test'),
+ array('/this/foo\\bar.test.png', '.png', 'bar.test'),
+
+ array('/this/ДокуВики/bar.test.png', '.png', 'bar.test'),
+ array('\\this\\ДокуВики\\bar.test.png', '.png', 'bar.test'),
+ array('/this\\ДокуВики/bar.test.png', '.png', 'bar.test'),
+ array('/this/ДокуВики\\bar.test.png', '.png', 'bar.test'),
+
+ array('/this/foo/ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('\\this\\foo\\ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('/this\\foo/ДокуВики.test.png', '.png', 'ДокуВики.test'),
+ array('/this/foo\\ДокуВики.test.png', '.png', 'ДокуВики.test'),
+
+ array('/this/foo/bar.test.png', '.foo', 'bar.test.png'),
+ array('\\this\\foo\\bar.test.png', '.foo', 'bar.test.png'),
+ array('/this\\foo/bar.test.png', '.foo', 'bar.test.png'),
+ array('/this/foo\\bar.test.png', '.foo', 'bar.test.png'),
+
+ array('/this/ДокуВики/bar.test.png', '.foo', 'bar.test.png'),
+ array('\\this\\ДокуВики\\bar.test.png', '.foo', 'bar.test.png'),
+ array('/this\\ДокуВики/bar.test.png', '.foo', 'bar.test.png'),
+ array('/this/ДокуВики\\bar.test.png', '.foo', 'bar.test.png'),
+
+ array('/this/foo/ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('\\this\\foo\\ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('/this\\foo/ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+ array('/this/foo\\ДокуВики.test.png', '.foo', 'ДокуВики.test.png'),
+
+
+ array('/this/foo/ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('\\this\\foo\\ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('/this\\foo/ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+ array('/this/foo\\ДокуВики.test.Вик', '.foo', 'ДокуВики.test.Вик'),
+
+ array('/this/foo/ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('\\this\\foo\\ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('/this\\foo/ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ array('/this/foo\\ДокуВики.test.Вик', '.Вик', 'ДокуВики.test'),
+ );
+
+ foreach($data as $test){
+ $this->assertEquals($test[2], utf8_basename($test[0], $test[1]), "input: ('".$test[0]."', '".$test[1]."')");
+ }
+ }
+
+} \ No newline at end of file
diff --git a/inc/utf8.php b/inc/utf8.php
index 7b7c19c6b..227fa830a 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -78,6 +78,31 @@ if(!function_exists('utf8_check')){
}
}
+if(!function_exists('utf8_basename')){
+ /**
+ * A locale independent basename() implementation
+ *
+ * works around a bug in PHP's basename() implementation
+ *
+ * @see basename()
+ * @link https://bugs.php.net/bug.php?id=37738
+ * @param string $path A path
+ * @param string $suffix If the name component ends in suffix this will also be cut off
+ * @return string
+ */
+ function utf8_basename($path, $suffix=''){
+ $rpos = max(strrpos($path, '/'), strrpos($path, '\\'));
+ $file = substr($path, $rpos+1);
+
+ $suflen = strlen($suffix);
+ if($suflen && (substr($file, -$suflen) == $suffix)){
+ $file = substr($file, 0, -$suflen);
+ }
+
+ return $file;
+ }
+}
+
if(!function_exists('utf8_strlen')){
/**
* Unicode aware replacement for strlen()