github edit link
[mdref/mdref] / index.php
index b2109846572cbf8c414f5117b29a4a39ddc5c8ba..5fad47b69cd296f12b7e689d526e9575b9b5830e 100644 (file)
--- a/index.php
+++ b/index.php
@@ -54,15 +54,33 @@ function cut(array $lines, array $specs) {
 
 function head($file, $lines = 1) {
        $ld = [];
-       if (($fd = fopen($file, "r"))) {
+       if (is_resource($file) || ($file = fopen($file, "r"))) {
                while ($lines--) {
-                       $ld[] = fgets($fd);
+                       $ld[] = fgets($file);
                }
        }
        return $ld;
 }
 
-function ns($file) {
+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, "/.")));
 }
 
@@ -73,16 +91,17 @@ function urlpath($dir, $file) {
 function ls($dir) {
        $dir = rtrim(is_dir($dir) ? $dir : dirname($dir) ."/". basename($dir, ".md"), "/");
        printf("<ul>\n");
-       printf("<li><a href=/>Home</a></li>\n");
+       printf("<li>&lArr; <a href=>Home</a></li>\n");
        if ($dir !== "." && ($dn = dirname($dir)) !== ".") {
-               printf("<li><a href=/%s>%s</a></li>\n", 
+               printf("<li>&uArr; <a href=%s>%s</a></li>\n", 
                        urlpath($dir, ".."),
                        ns($dn));
        }
        if (is_dir($dir)) {
                if ($dir !== ".") {
-                       printf("<li>%s</li>\n", ns($dir));
+                       printf("<ul>\n<li>&nbsp; %s</li>\n", ns($dir));
                }
+               printf("<ul>\n");
                foreach (scandir($dir) as $file) {
                        /* ignore dot-files */
                        if ($file{0} === ".") {
@@ -97,20 +116,25 @@ function ls($dir) {
                                if (!isset($pi["extension"]) || $pi["extension"] != "md") {
                                        continue;
                                }
-                               if (!ctype_upper($file{0}) && !is_dir("$dir/".$pi["filename"])) {
+                               /* ignore files where an accompanying directory exists */
+                               if (is_dir("$dir/".$pi["filename"])) {
                                        continue;
                                }
                        } else {
-                               /* ignore directories where an companying file exists */
-                               if (is_file("$path.md")) {
+                               /* ignore directories where no accompanying file exists */
+                               if (!is_file("$path.md")) {
                                        continue;
                                }
                        }
                        
-                       printf("<li><a href=\"/%s\">%s</a></li>\n", 
+                       printf("<li>&rArr; <a href=\"%s\">%s</a></li>\n", 
                                urlpath($dir, $file),
                                ns("$dir/".basename($file, ".md")));
                }
+               printf("</ul>\n");
+               if ($dir !== ".") {
+                       printf("</ul>\n");
+               }
        }
        
        printf("</ul>\n");
@@ -118,17 +142,45 @@ function ls($dir) {
 
 function ml($file) {
        $pi = pathinfo($file);
-       if (ctype_upper($pi["filename"][0])) {
-               printf("<h2>Methods:</h2>\n");
+       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("<h2>Functions:</h2>\n");
                        printf("<ul>\n");
                        foreach (scandir($dir) as $file) {
-                               if (!is_file("$dir/$file") || ctype_upper($file{0})) {
+                               if ($file{0} === "." || !is_file("$dir/$file") || ctype_upper($file{0})) {
                                        continue;
                                }
-                               printf("<li><h3>%s</h3><p>%s</p></li>\n",
+                               printf("<li><h3><a href=\"%s\">%s</a></h3><p>%s</p><p>%s</p></li>\n",
+                                       urlpath($dir, $file),
                                        basename($file, ".md"),
+                                       @end(head("$dir/$file", 3)),
+                                       join(" ", cut(head("$dir/$file"), ["f"=>"1-"]))
+                               );
+                       }
+                       printf("</ul>\n");
+               }
+       } else {
+               // methods
+               $dir = $pi["dirname"] . "/" . $pi["filename"];
+               if (is_dir($dir)) {
+                       printf("<h2>Methods:</h2>\n");
+                       printf("<ul>\n");
+                       foreach (scandir($dir) as $file) {
+                               if ($file{0} === "." || !is_file("$dir/$file") || ctype_upper($file{0})) {
+                                       continue;
+                               }
+                               printf("<li><h3><a href=\"%s\">%s</a></h3><p>%s</p><p>%s</p></li>\n",
+                                       urlpath($dir, $file),
+                                       basename($file, ".md"),
+                                       @end(head("$dir/$file", 3)),
                                        join(" ", cut(head("$dir/$file"), ["f"=>"1-"]))
                                );
                        }
@@ -137,69 +189,106 @@ function ml($file) {
        }
 }
 
-function md($file) {
+function md($file, $res) {
        $file = rtrim($file, "/");
        if (is_file($file) || is_file($file .= ".md")) {
-               $r = fopen($file, "r");
-               $md = MarkdownDocument::createFromStream($r);
-               $md->compile();
-               echo $md->getHtml();
-               fclose($r);
-               ml($file);
+               $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("<br/>","<br />",$md->getHtml());
+                       fclose($r);
+                       ml($file);
+                       break;
+               case null:
+                       printf("<h1>%s</h1>", basename($file));
+                       printf("<pre>%s</pre>\n", htmlspecialchars(file_get_contents($file)));
+                       break;
+               }
        } else {
-               printf("<h1>Quick Markdown Doc Browser</h1>\n");
-               printf("<p>v0.1.0</p>\n");
-               printf("<p>");
-               ob_start(function($s) {
-                       return nl2br(htmlspecialchars($s));
-               });
-               readfile("LICENSE");
-               ob_end_flush();
-               printf("</p>\n");
+               $res->setResponseCode(404);
+               printf("<h1>Not Found</h1>\n");
+               printf("<blockquote><p>Sorry, I could not find <code>%s/%s</code>.</p></blockquote>", dirname($file), basename($file, ".md"));
        }
 }
 
-
-function index($pn) {
-       ?>
-       <!doctype html>
-       <html>
-       <head>
-               <meta charset="utf-8">
-               <title><?=ns($pn)?></title>
-               <link rel="stylesheet" href="/index.css">
-       </head>
-       <body>
-               <div class="sidebar">
-                       <?php ls($pn); ?>
-               </div>
-               <?php md($pn); ?>
-               <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
-               <script src="/index.js"></script>
-       </body>
-       </html>
-       <?php
-}
-
-chdir($_SERVER["DOCUMENT_ROOT"]);
+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($u->path) {
-case "/index.js":
-case "/index.css":
-       $s->setHeader("Content-type", $t[pathinfo($u->path, PATHINFO_EXTENSION)]);
-       $s->setBody(new http\Message\Body(fopen(basename($u->path), "r")));
-       $s->send();
+switch($p) {
+case "./index.php":
        exit;
-default:
-       ob_start($s);
-       index(".".$u->path);
-       ob_end_flush();
+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();
-       break;
+       exit;
 }
 
+ob_start($s);
+
 ?>
+<!doctype html>
+<html>
+<head>
+       <meta charset="utf-8">
+       <title><?=ns($p)?></title>
+       <base href="<?=$b?>/">
+       <link rel="stylesheet" href="index.css">
+       <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
+</head>
+<body>
+       <div class="sidebar">
+               <?php ls($p); ?>
+       </div>
+       <?php if ($p === "./") : ?>
+               <h1>Quick Markdown Documentation Browser</h1>
+               <p>v<?php readfile("VERSION")?></p>
+               <pre><?php
+                       ob_start(function($s) {
+                               return htmlspecialchars($s);
+                       });
+                       readfile("LICENSE");
+                       ob_end_flush();
+               ?></pre>
+       <?php else: ?>
+               <?php md($p, $s); ?>
+       <?php endif; ?>
+       
+       <div id="disqus_thread"></div>
+       
+       <footer>
+               <a href="VERSION">Version</a>
+               <a href="AUTHORS">Authors</a>
+               <a href="LICENSE">License</a>
+               <?php if ($p !== "./") : ?>
+               <a href="https://github.com/m6w6/mdref/edit/master/<?=trim($p,"/")?>.md">Edit</a>
+               <?php endif; ?>
+       </footer>
+       <script src="index.js"></script>
+       <?php if ($_SERVER["SERVER_NAME"] != "localhost") : ?>
+    <script>
+        var disqus_shortname = 'mdref';
+        var disqus_identifier = '<?=$p?>';
+        (function() {
+            var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
+            dsq.src = '//' + disqus_shortname + '.disqus.com/embed.js';
+            (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
+        })();
+    </script>
+    <?php endif; ?>
+</body>
+</html>
+<?php
+
+ob_end_flush();
+$s->send();