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