add og:title
[mdref/mdref] / public / index.js
index 35587b7a2b459c848d84fa063a8e93d29dcfd44f..e9b65c1180058942b54995bc7e3606c017143a2f 100644 (file)
 "use strict";
 
-$(function() {
-       var mdref = {
-               log: function log() {
-                       console.log.apply(console, arguments);
-               },
-               is_constant: function is_constant(s) {
-                       s = s.replace(/v\d+(_\d+)?$/, "");
-                       if (s.length < 2) {
-                               return false;
-                       }
-                       return s.toUpperCase(s) === s;
-               },
-               is_variable: function is_variable(s) {
-                       return s.substring(0,1) === "$";
-               },
-               type: function type(s, nn) {
-                       var i, j, t;
-                       // mdref.log("type", s);
-                       // nothing
-                       if (!s.match(/[a-zA-Z]/)) {
-                               return;
-                       }
-
-                       switch (s) {
-                       // types
-                       case "void":
-                       case "bool":
-                       case "int":
-                       case "float":
-                       case "string":
-                       case "resource":
-                       case "array":
-                       case "object":
-                       case "callable":
-                       case "mixed":
-                       // Zend/SPL
-                       case "stdClass":
-                       case "Exception":
-                       case "ErrorException":
-                       case "RuntimeException":
-                       case "UnexpectedValueException":
-                       case "DomainException":
-                       case "InvalidArgumentException":
-                       case "BadMethodCallException":
-                       case "Closure":
-                       case "Generator":
-                       case "Countable":
-                       case "Serializable":
-                       case "Traversable":
-                       case "Iterator":
-                       case "IteratorAggregate":
-                       case "ArrayAccess":
-                       case "ArrayObject":
-                       case "ArrayIterator":
-                       case "RecursiveArrayIterator":
-                       case "SplObserver":
-                       case "SplSubject":
-                       case "SplObjectStorage":
-                               return "<code>";
-
-                       // keywords
-                       case "is":
-                               if (nn !== "H1") {
-                                       return;
-                               }
-                       case "extends":
-                       case "implements":
-                               if (nn === "H1") {
-                                       return "<br>&nbsp;<em>";
-                               }
-                       case "class":
-                       case "interface":
-                       case "namespace":
-                       case "public":
-                       case "protected":
-                       case "private":
-                       case "static":
-                       case "final":
-                       case "abstract":
-                       case "self":
-                       case "parent":
-                       // phrases
-                       case "Optional":
-                       case "optional":
-                               return "<em>";
-                       }
-
-                       // class members
-                       if (-1 !== (i = s.indexOf("::"))) {
-                               t = s.substring(i+2);
-                               if (!mdref.is_constant(t) && !mdref.is_variable(t)) {
-                                       // methods
-                                       return "<a href=\"" + s.replace(/::|\\/g, "/") + "\">";
-                               }
-                       }
-                       if (-1 !== (j = s.indexOf("\\")) && s.substr(j+1,1) !== "n") {
-                               return "<a href=\"" + s.replace(/\\/g, "/").replace(/::|$/, "#") + "\">";
-                       }
-
-                       switch (s.toLowerCase()) {
-                       // variables
-                       default:
-                               if (!mdref.is_variable(s)) {
-                                       break;
-                               }
-                       // special constants
-                       case "null":
-                       case "true":
-                       case "false":
-                               return "<span class=\"var\">";
-                       }
-
-                       // constants
-                       if (mdref.is_constant(s)) {
-                               return "<span class=\"constant\">";
-                       }
-               },
-               node: function node(s, nn) {
-                       // mdref.log("node", s);
-                       var t;
-                       if ((t = mdref.type(s, nn))) {
-                               return $(t).text(s);
-                       }
-                       return document.createTextNode(s);
-               },
-               wrap: function wrap(n, nn) {
-                       var $n = $(n)
-                       var a = [];
-
-                       $n.text().split(/([^a-zA-Z0-9_\\\$:]+)/).forEach(function(v) {
-                               a.push(mdref.node(v, nn));
+document.addEventListener("DOMContentLoaded", function() {
+       const doTransition = function(e, trans, state, speed) {
+               e.classList.remove(trans + "-in", trans + "-out", "trans-slow", "trans-fast");
+               e.classList.add(trans + "-" + state, "trans-" + speed);
+               return (cb) => setTimeout(cb, speed === "slow" ? 600 : 200);
+       };
+       const letElementBlink = function(e, last) {
+               setTimeout(() => doTransition(e, "fade", "out", "fast")(function() {
+                       e.classList.add("blink");
+                       doTransition(e, "fade", "in", "fast")(function() {
+                               e.classList.remove("blink");
+                               doTransition(e, "fade", "out", "slow")(function () {
+                                       doTransition(e, "fade", "in", "slow");
+                               });
                        });
-                       $n.replaceWith(a);
-               },
-               walk: function walk(i, e) {
-                       // mdref.log("walk", i, e);
-
-                       $.each($.makeArray(e.childNodes), function(i, n) {
-                               switch (n.nodeName) {
-                               case "A":
-                               case "BR":
-                               case "HR":
-                                       break;
-                               case "#text":
-                                       mdref.wrap(n, e.nodeName);
-                                       break;
-                               default:
-                                       mdref.walk(-1, n);
-                                       break;
+               }), 200);
+       };
+       const onHashChange = function() {
+               if (location.hash.length > 1) {
+                       let hash = decodeURIComponent(location.hash.substring(1));
+                       let e = document.getElementById(hash) || document.getElementById(location.hash.substring(1));
+                       if (e) {
+                               letElementBlink(e);
+                       } else {
+                               if (hash.substring(hash.length-1) === "*") {
+                                       hash = hash.substring(0, hash.length-1);
                                }
-                       });
-               },
-               blink: function blink(c) {
-                       var $c = $(c);
-
-                       $c.fadeOut("fast").queue(function(next) {
-                               this.style.color = "red";
-                               next();
-                       }).fadeIn("fast").fadeOut("slow").queue(function(next) {
-                               this.style.color = "";
-                               next();
-                       }).fadeIn("slow");
-               },
-               hashchange: function hashchange() {
-                       if (location.hash.length > 1) {
-                               var hash = location.hash.substring(1);
-                               var name = mdref.is_variable(hash) ? ".var" : ".constant";
-                               var scrolled = false;
-
-                               $(name).each(hash.substring(hash.length-1) === "_" ? function(i, c) {
-                                       if (c.textContent.substring(0, hash.length) === hash) {
-                                               if (!scrolled) {
-                                                       $(window).scrollTop($(c).offset().top - 100);
-                                                       scrolled = true;
-                                               }
-                                               blink(c);
+                               let klass = (hash.substring(0,1) === "$") ? "var" : "constant";
+                               let scrolled = false;
+                               Array.prototype.forEach.call(document.getElementsByClassName(klass), function(e) {
+                                       if (e.textContent.substring(0, hash.length) !== hash) {
+                                               return;
                                        }
-                               } : function(i, c) {
-                                       if (c.textContent === hash) {
-                                               $(window).scrollTop($(c).offset().top - 100);
-                                               blink(c);
-                                               return false;
+                                       if (!scrolled) {
+                                               scrolled = true;
+                                               window.scrollTo(0, e.offsetTop > 64 ? e.offsetTop - 64 : 0);
                                        }
+                                       letElementBlink(e);
                                });
                        }
                }
        };
-       
-       $("h1,h2,h3,h4,h5,h6,p,li,code").each(mdref.walk);
-       $(window).on("hashchange", mdref.hashchange);
-       mdref.hashchange();
-});
+
+       onHashChange();
+       window.addEventListener("hashchange", onHashChange);
+       setTimeout(()=>document.getElementsByTagName("footer")[0].classList.add("hidden"), 1000);
+})