]> source.dussan.org Git - nextcloud-server.git/commitdiff
Squashed commit of the following:
authorThomas Mueller <thomas.mueller@tmit.eu>
Fri, 14 Jun 2013 09:18:30 +0000 (11:18 +0200)
committerThomas Mueller <thomas.mueller@tmit.eu>
Fri, 14 Jun 2013 09:19:13 +0000 (11:19 +0200)
commit 1c7d5da4d1687183f8701336fc14636f61095f4e
Author: infoneo <infoneo@yahoo.pl>
Date:   Sat Jun 8 19:44:58 2013 +0300

    Update mapper.php

commit 37f1f034f776b084ac7e25be136ce64b5772a446
Author: infoneo <infoneo@yahoo.pl>
Date:   Sat Jun 8 18:39:25 2013 +0300

    Update mapper.php

    Now slugify is performed on whole filename (including extension). Changed method of adding index number (using regular expressions pathinfo() method removed).

commit 4a5f872f1f55941d07992d7ac5e8f8b74ec8febc
Author: infoneo <infoneo@yahoo.pl>
Date:   Sun May 12 15:22:57 2013 +0300

    Fixed problems with a dots in a filenames

commit bc17f958349e36c1caacfc9263ae1de2df8e6a76
Author: infoneo <infoneo@yahoo.pl>
Date:   Sun May 12 01:47:48 2013 +0200

    Dots in a filenames fix

lib/files/mapper.php
tests/lib/files/mapper.php

index 15f5f0628b5cd7ebee9072c1d234dfc2b9727c80..748b65dc4f120af77758caa66de8ce36b653343d 100644 (file)
@@ -172,14 +172,9 @@ class Mapper
 
                $pathElements = explode('/', $path);
                $sluggedElements = array();
-
-               // rip off the extension ext from last element
+               
                $last= end($pathElements);
-               $parts = pathinfo($last);
-               $filename = $parts['filename'];
-               array_pop($pathElements);
-               array_push($pathElements, $filename);
-
+               
                foreach ($pathElements as $pathElement) {
                        // remove empty elements
                        if (empty($pathElement)) {
@@ -192,13 +187,15 @@ class Mapper
                // apply index to file name
                if ($index !== null) {
                        $last= array_pop($sluggedElements);
-                       array_push($sluggedElements, $last.'-'.$index);
-               }
+                       
+                       // if filename contains periods - add index number before last period
+                       if (preg_match('~\.[^\.]+$~i',$last,$extension)){
+                               array_push($sluggedElements, substr($last,0,-(strlen($extension[0]))).'-'.$index.$extension[0]);
+                       } else {
+                               // if filename doesn't contain periods add index ofter the last char
+                               array_push($sluggedElements, $last.'-'.$index);
+                               }
 
-               // add back the extension
-               if (isset($parts['extension'])) {
-                       $last= array_pop($sluggedElements);
-                       array_push($sluggedElements, $last.'.'.$parts['extension']);
                }
 
                $sluggedPath = $this->unchangedPhysicalRoot.implode('/', $sluggedElements);
@@ -213,8 +210,8 @@ class Mapper
         */
        private function slugify($text)
        {
-               // replace non letter or digits by -
-               $text = preg_replace('~[^\\pL\d]+~u', '-', $text);
+               // replace non letter or digits or dots by -
+               $text = preg_replace('~[^\\pL\d\.]+~u', '-', $text);
 
                // trim
                $text = trim($text, '-');
@@ -228,7 +225,10 @@ class Mapper
                $text = strtolower($text);
 
                // remove unwanted characters
-               $text = preg_replace('~[^-\w]+~', '', $text);
+               $text = preg_replace('~[^-\w\.]+~', '', $text);
+               
+               // trim ending dots (for security reasons and win compatibility)
+               $text = preg_replace('~\.+$~', '', $text);
 
                if (empty($text)) {
                        return uniqid();
index e3859bc0f2333213e041acd899ecd1069992dab2..48ae95b7e72286ffdcd08a83c33b973135c406d2 100644 (file)
@@ -45,8 +45,20 @@ class Mapper extends \PHPUnit_Framework_TestCase {
                $this->assertEquals('D:/a/b/text', $this->mapper->slugifyPath('D:/a/b/text'));
 
                // with double dot
-               $this->assertEquals('D:/text-text.txt', $this->mapper->slugifyPath('D:/text.text.txt'));
-               $this->assertEquals('D:/text-text-2.txt', $this->mapper->slugifyPath('D:/text.text.txt', 2));
-               $this->assertEquals('D:/a/b/text-text.txt', $this->mapper->slugifyPath('D:/a/b/text.text.txt'));
+               $this->assertEquals('D:/text.text.txt', $this->mapper->slugifyPath('D:/text.text.txt'));
+               $this->assertEquals('D:/text.text-2.txt', $this->mapper->slugifyPath('D:/text.text.txt', 2));
+               $this->assertEquals('D:/a/b/text.text.txt', $this->mapper->slugifyPath('D:/a/b/text.text.txt'));
+                       
+               // foldername and filename with periods
+               $this->assertEquals('D:/folder.name.with.periods', $this->mapper->slugifyPath('D:/folder.name.with.periods'));
+               $this->assertEquals('D:/folder.name.with.periods/test-2.txt', $this->mapper->slugifyPath('D:/folder.name.with.periods/test.txt', 2));
+               $this->assertEquals('D:/folder.name.with.periods/test.txt', $this->mapper->slugifyPath('D:/folder.name.with.periods/test.txt'));
+
+               // foldername and filename with periods and spaces
+               $this->assertEquals('D:/folder.name.with.peri-ods', $this->mapper->slugifyPath('D:/folder.name.with.peri ods'));
+               $this->assertEquals('D:/folder.name.with.peri-ods/te-st-2.t-x-t', $this->mapper->slugifyPath('D:/folder.name.with.peri ods/te st.t x t', 2));
+               $this->assertEquals('D:/folder.name.with.peri-ods/te-st.t-x-t', $this->mapper->slugifyPath('D:/folder.name.with.peri ods/te st.t x t'));
+
+               
        }
 }