diff options
-rw-r--r-- | _test/tests/inc/utf8_basename.test.php | 69 | ||||
-rw-r--r-- | inc/utf8.php | 25 |
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() |