flush
[mdref/mdref] / index.js
1 function is_constant(s) {
2 return s.length > 3 && s.toUpperCase(s) === s;
3 }
4
5 function is_variable(s) {
6 return s.substring(0,1) === "$";
7 }
8
9 function type(s) {
10 var i, j, t;
11
12 // nothing
13 if (!s.match(/[a-zA-Z]/)) {
14 return;
15 }
16
17 switch (s) {
18 // types
19 case "void":
20 case "bool":
21 case "int":
22 case "float":
23 case "string":
24 case "array":
25 case "object":
26 case "callable":
27 case "mixed":
28 return "<code>";
29
30 // keywords
31 case "class":
32 case "interface":
33 case "namespace":
34 case "extends":
35 case "implements":
36 case "public":
37 case "protected":
38 case "private":
39 case "static":
40 case "final":
41 case "abstract":
42 // phrases
43 case "Optional":
44 case "optional":
45 return "<em>";
46 }
47
48 // class members
49 if (-1 !== (i = s.indexOf("::"))) {
50 t = s.substring(i+2);
51 if (!is_constant(t) && !is_variable(t)) {
52 // methods
53 return "<a href=\"/" + s.replace(/::|\\/g, "/") + "\">";
54 }
55 }
56 if (-1 !== (j = s.indexOf("\\"))) {
57 return "<a href=\"/" + s.replace(/\\/g, "/").replace(/::|$/, "#") + "\">";
58 }
59
60 switch (s.toLowerCase()) {
61 // variables
62 default:
63 if (!is_variable(s)) {
64 break;
65 }
66 // special constants
67 case "null":
68 case "true":
69 case "false":
70 return "<span class=\"var\">";
71 }
72
73 // constants
74 if (is_constant(s)) {
75 return "<span class=\"constant\">";
76 }
77 }
78 function node(s) {
79 //console.log("node", s);
80
81 var t;
82
83 if ((t = type(s))) {
84 return $(t).text(s);
85 }
86 return document.createTextNode(s);
87 }
88 function wrap(n) {
89 var $n = $(n)
90 var a = [];
91
92 $n.text().split(/([^a-zA-Z_\\\$:]+)/).forEach(function(v) {
93 a.push(node(v));
94 });
95 $n.replaceWith(a);
96 }
97 function walk(i, e) {
98 //console.log("walk", i, e);
99
100 e && $.each(e.childNodes, function(i, n) {
101 //console.log(n.nodeName);
102 switch (n.nodeName) {
103 case "A":
104 break;
105 case "#text":
106 wrap(n);
107 break;
108 default:
109 walk(n);
110 }
111 });
112 }
113
114 function hashchange() {
115 if (location.hash.length > 1) {
116 var hash = location.hash.substring(1);
117
118 $(is_variable(hash) ? ".var" : ".constant").each(function(i, c) {
119
120 if (c.textContent === hash) {
121 var $c = $(c);
122
123 $(window).scrollTop($c.offset().top - 100);
124 $c.fadeOut("slow").queue(function(next) {
125 this.style.color = "red";
126 next();
127 }).fadeIn("fast").fadeOut("fast").queue(function(next) {
128 this.style.color = "";
129 next();
130 }).fadeIn("slow");
131 return false;
132 }
133 });
134 }
135 }
136
137 $(function() {
138 $("h1,h2,h3,h4,h5,h6,p,li,code").each(walk);
139 $(window).on("hashchange", hashchange);
140 hashchange();
141 });