widget/sitemap: move find code to global PageSearch class
[minimedit.git] / article.inc.php
index 3c65a97d871b7fb8245023785a40f74646dc73ad..a39b8971c3546cc236a84fbd63b44571de780064 100644 (file)
@@ -21,8 +21,8 @@ class ArchiveArticle
 
        function __construct($path)
        {
-               $this->page = $path;
-               $this->link = preg_replace('{(?:/index)?\.html$}', '', $path);
+               $this->page = preg_replace('{^\.(?:/|$)}', '', $path);
+               $this->link = preg_replace('{(?:/index)?\.html$}', '', $this->page);
                if (file_exists($this->page)) {
                        $this->raw = file_get_contents($this->page);
 
@@ -141,3 +141,38 @@ class ArchiveArticle
                );
        }
 }
+
+class PageSearch
+{
+       function __construct($path = '.')
+       {
+               $this->iterator = new RecursiveCallbackFilterIterator(
+                       new RecursiveDirectoryIterator($path),
+                       function ($current) {
+                               if ($current->getFilename()[0] === '.') {
+                                       # skip hidden files and directories
+                                       return FALSE;
+                               }
+                               if ($current->isLink()) {
+                                       # ignore symlinks, original contents only
+                                       return FALSE;
+                               }
+                               # match **/*.html
+                               return $current->isDir()
+                                       || preg_match('/\.html$/', $current->getFilename());
+                       }
+               );
+       }
+
+       function files()
+       {
+               # order alphabetically by link
+               $dir = iterator_to_array(new RecursiveIteratorIterator($this->iterator));
+               array_walk($dir, function (&$row, $name) {
+                       # prepare values for sorting (directory index first)
+                       $row = preg_replace('{/index\.html$}', '', $name);
+               });
+               asort($dir);
+               return $dir;
+       }
+}