+ /**
+ * @return callable
+ */
+ private function generateSorter() : \Closure {
+ 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);
+ };
+ }
+