widget/sitemap: move find code to global PageSearch class
authorMischa POSLAWSKY <perl@shiar.org>
Thu, 17 Oct 2019 00:28:24 +0000 (02:28 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Thu, 17 Oct 2019 00:30:13 +0000 (02:30 +0200)
article.inc.php
widget/sitemap.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;
+       }
+}
index a10ea7a3c357900f5640568d5b75d093f19eb5d6..461690361aec77a64ff9fdea49aff65bda1107ac 100644 (file)
@@ -1,32 +1,8 @@
 <?php
-# find **/*.html
-$search = new RecursiveCallbackFilterIterator(
-       new RecursiveDirectoryIterator(ltrim($Args, '/') ?: '.'),
-       function ($current) {
-               if ($current->getFilename()[0] === '.') {
-                       # skip hidden files and directories
-                       return FALSE;
-               }
-               if ($current->isLink()) {
-                       # ignore symlinks, original contents only
-                       return FALSE;
-               }
-               return $current->isDir()
-                       || preg_match('/\.html$/', $current->getFilename());
-       }
-);
-
-# order alphabetically by link
-$dir = iterator_to_array(new RecursiveIteratorIterator($search));
-array_walk($dir, function (&$row, $name) {
-       # prepare values for sorting (directory index first)
-       $row = preg_replace('{/index\.html$}', '', $name);
-});
-asort($dir);
-
 # list article details
+$search = new PageSearch(ltrim($Args, '/') ?: '.');
 print '<ul class="replies">'."\n";
-foreach ($dir as $Args => $sorted) {
+foreach ($search->files() as $Args => $sorted) {
        print '<li>';
        include 'linkref.php';
        print "<li>\n";