$value) { switch ($spec) { case "d": $delim = $value; break; case "b": $bytes = $value; break; case "f": $fields = $value; break; } } $result = []; if ($bytes) { $func = "substr"; } else { $func = function($a, $o = 0, $l = 0) { return join(" ", array_slice($a, $o, $l ? $l+1 : count($a)-$o)); }; } foreach ($lines as $line) { if ($bytes) { $spec = $bytes; } else { $line = split($delim, $line); $spec = $fields; } if ($spec[0] == "-") { $result[] = $func($line, 0, $spec[1]); } elseif ($spec[1] == "-") { if (empty($spec[2])) { $result[] = $func($line, $spec[0]); } else { $result[] = $func($line, $spec[0], $spec[2]-$spec[0]); } } else { $result[] = $line{$spec[0]}; } } return $result; } function head($file, $lines = 1) { $ld = []; if (is_resource($file) || ($file = fopen($file, "r"))) { while ($lines--) { $ld[] = fgets($file); } } return $ld; } function ns($path) { $ns = ""; $parts = explode("/", $path); $upper = ctype_upper($path[0]); for ($i = 0; $i < count($parts); ++$i) { if (!strlen($parts[$i]) || $parts[$i] === ".") { continue; } if (strlen($ns)) { if ($upper && !ctype_upper($parts[$i][0])) { $ns .= "::"; } else { $ns .= "\\"; } } $ns .= $parts[$i]; $upper = ctype_upper($parts[$i][0]); } return $ns; return str_replace("/", "\\", str_replace("//", "/", trim($file, "/."))); } function urlpath($dir, $file) { return (strlen($dir) ? $dir . "/" : "") . basename($file, ".md"); } function ls($dir) { $dir = rtrim(is_dir($dir) ? $dir : dirname($dir) ."/". basename($dir, ".md"), "/"); printf("\n"); } function ml($file) { $pi = pathinfo($file); if (!isset($pi["extension"])) { return; } if ($pi["extension"] !== "md") { return; } if (!ctype_upper($pi["filename"][0])) { // namespaced functions $dir = $pi["dirname"] . "/" . $pi["filename"]; if (is_dir($dir)) { printf("

Functions:

\n"); printf("\n"); } } else { // methods $dir = $pi["dirname"] . "/" . $pi["filename"]; if (is_dir($dir)) { printf("

Methods:

\n"); printf("\n"); } } } function md($file, $res) { $file = rtrim($file, "/"); if (is_file($file) || is_file($file .= ".md")) { $pi = pathinfo($file); switch (@$pi["extension"]) { case "md": $r = fopen($file, "r"); $md = MarkdownDocument::createFromStream($r); $md->compile(MarkdownDocument::AUTOLINK|MarkdownDocument::TOC); print str_replace("
","
",$md->getHtml()); fclose($r); ml($file); break; case null: printf("

%s

", basename($file)); printf("
%s
\n", htmlspecialchars(file_get_contents($file))); break; } } else { $res->setResponseCode(404); printf("

Not Found

\n"); printf("

Sorry, I could not find %s/%s.

", dirname($file), basename($file, ".md")); } } chdir($_SERVER["DOCUMENT_ROOT"]); $t = ["css"=>"text/css", "js"=>"application/javascript"]; $r = new http\Env\Request; $u = new http\Url($r->getRequestUrl()); $s = new http\Env\Response; $p = ".". $u->path; switch($p) { case "./index.php": exit; case "./index.js": case "./index.css": $s->setHeader("Content-type", $t[pathinfo($p, PATHINFO_EXTENSION)]); $s->setBody(new http\Message\Body(fopen($p, "r"))); $s->send(); exit; } ob_start($s); ?> <?=ns($p)?>

Quick Markdown Documentation Browser

v

send();