$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");
printf("- ⇐ Home
\n");
if ($dir !== "." && ($dn = dirname($dir)) !== ".") {
printf("- ⇑ %s
\n",
urlpath($dir, ".."),
ns($dn));
}
if (is_dir($dir)) {
if ($dir !== ".") {
printf("\n- %s
\n", ns($dir));
}
printf("\n");
foreach (scandir($dir) as $file) {
/* ignore dot-files */
if ($file{0} === ".") {
continue;
}
$path = "$dir/$file";
if (is_file($path)) {
$pi = pathinfo($path);
/* ignore files not ending in .md */
if (!isset($pi["extension"]) || $pi["extension"] != "md") {
continue;
}
/* ignore files where an accompanying directory exists */
if (is_dir("$dir/".$pi["filename"])) {
continue;
}
} else {
/* ignore directories where no accompanying file exists */
if (!is_file("$path.md")) {
continue;
}
}
printf("- ⇒ %s
\n",
urlpath($dir, $file),
ns("$dir/".basename($file, ".md")));
}
printf("
\n");
if ($dir !== ".") {
printf("
\n");
}
}
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");
foreach (scandir($dir) as $file) {
if ($file{0} === "." || !is_file("$dir/$file") || ctype_upper($file{0})) {
continue;
}
printf("%s
%s
\n",
urlpath($dir, $file),
basename($file, ".md"),
@end(head("$dir/$file", 3)),
join(" ", cut(head("$dir/$file"), ["f"=>"1-"]))
);
}
printf("
\n");
}
} else {
// methods
$dir = $pi["dirname"] . "/" . $pi["filename"];
if (is_dir($dir)) {
printf("Methods:
\n");
printf("\n");
foreach (scandir($dir) as $file) {
if ($file{0} === "." || !is_file("$dir/$file") || ctype_upper($file{0})) {
continue;
}
printf("%s
%s
\n",
urlpath($dir, $file),
basename($file, ".md"),
@end(head("$dir/$file", 3)),
join(" ", cut(head("$dir/$file"), ["f"=>"1-"]))
);
}
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(__DIR__);
$t = ["css"=>"text/css", "js"=>"application/javascript"];
$r = new http\Env\Request;
$u = new http\Url($r->getRequestUrl());
$s = new http\Env\Response;
$b = dirname($_SERVER["SCRIPT_NAME"]);
$p = ".". substr($u->path, strlen($b));
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();