X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=mdref%2FTree.php;h=11cada07293495da26112af7c8e13b66d421bc04;hb=80ea76521e2ccbbfac1ac0f33f91af1739ead561;hp=d9e2b0db2149221b82e99d65fb43c4bddce90adb;hpb=6478b415c59070f70ed860f3a592377eef9783b1;p=mdref%2Fmdref diff --git a/mdref/Tree.php b/mdref/Tree.php index d9e2b0d..11cada0 100644 --- a/mdref/Tree.php +++ b/mdref/Tree.php @@ -8,32 +8,36 @@ class Tree implements \RecursiveIterator { * @var \mdref\Repo */ private $repo; - + /** * List of first level entries * @var array */ - private $list; - + private $list = array(); + /** * The list iterator * @var array */ private $iter; - + /** * @param string $path * @param \mdref\Repo $repo */ public function __construct($path, Repo $repo) { - if (!($list = glob("$path/*.md"))) { + if (realpath($path)."/" === $repo->getPath()) { + $list = [$path ."/". $repo->getName() .".md"]; + } elseif (!($list = glob("$path/*.md"))) { $list = glob("$path/*/*.md"); } - $this->list = array_filter($list, $this->generateFilter($list)); - sort($this->list, SORT_STRING); + if ($list) { + $this->list = array_filter($list, $this->generateFilter($list)); + usort($this->list, $this->generateSorter()); + } $this->repo = $repo; } - + /** * @param array $list * @return callable @@ -46,16 +50,58 @@ class Tree implements \RecursiveIterator { if (false !== array_search("$v.md", $list, true)) { return false; } - + $pi = pathinfo($v); if (isset($pi["extension"]) && "md" !== $pi["extension"]) { return false; } - + return true; }; } + /** + * @return callable + */ + private function generateSorter() { + return function($a, $b) { + $ab = basename($a, ".md"); + $bb = basename($b, ".md"); + + if ($ab{0} === ":" && $bb{0} === ":") { + return strcmp($ab, $bb); + } elseif ($ab{0} === ":") { + return -1; + } elseif ($bb{0} === ":") { + return 1; + } + + $ad = is_dir(dirname($a)."/$ab"); + $bd = is_dir(dirname($b)."/$bb"); + + if ($ad && $bd) { + return strcmp($ab, $bb); + } elseif ($ad) { + return -1; + } elseif ($bd) { + return 1; + } + + $au = preg_match("/^\p{Lu}/", $ab); + $bu = preg_match("/^\p{Lu}/", $bb); + + if ($au && $bu) { + return strcmp($ab, $bb); + } elseif ($au) { + return -1; + } elseif ($bu) { + return 1; + } + + return strcmp($ab, $bb); + }; + } + /** * Implements \Iterator * @return \mdref\Entry @@ -63,14 +109,14 @@ class Tree implements \RecursiveIterator { public function current() { return $this->repo->getEntry($this->repo->hasFile(current($this->iter))); } - + /** * Implements \Iterator */ public function next() { next($this->iter); } - + /** * Implements \Iterator * @return int @@ -78,7 +124,7 @@ class Tree implements \RecursiveIterator { public function key() { return key($this->iter); } - + /** * Implements \Iterator */ @@ -86,7 +132,7 @@ class Tree implements \RecursiveIterator { $this->iter = $this->list; reset($this->iter); } - + /** * Implements \Iterator * @return bool @@ -94,7 +140,7 @@ class Tree implements \RecursiveIterator { public function valid() { return null !== key($this->iter); } - + /** * Implements \RecursiveIterator * @return bool @@ -102,7 +148,7 @@ class Tree implements \RecursiveIterator { public function hasChildren() { return $this->current()->hasIterator(); } - + /** * Implements \RecursiveIterator * @return \mdref\Tree