scel: install files to site-lisp/SuperCollider
[supercollider.git] / HelpSource / Search.html
blob788d26c56dae00ae6fa52c7129b72789d9ecf0e4
1 <html>
2 <head>
3 <title>Search</title>
4 <link rel='stylesheet' href='./scdoc.css' type='text/css' />
5 <meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
6 <script src="docmap.js" type="text/javascript"></script>
7 <script src="scdoc.js" type="text/javascript"></script>
8 <!-- <script src="methods.js" type="text/javascript"></script>-->
9 <style>
10 div#search_box {
11 margin: 1.5em;
12 text-align: center;
14 #search_input {
15 border: 1px solid #aaa;
16 background: #eee;
17 margin-left: 0.5em;
19 div#search_count {
20 border-bottom: 2px solid #aaa;
21 color: #333;
24 div.result_item {
25 margin-bottom: 0.1em;
26 margin-left: 2em;
28 .result_met {
29 font-family: Andale Mono, monospace;
30 font-size: 9.5pt;
31 margin-top: 1em;
32 margin-left: -1em;
33 margin-bottom: 0.5em;
35 div.result_category {
36 color: #555;
37 margin-top: 1em;
38 margin-bottom: 0.5em;
39 /* font-size: 9.5pt;
40 border-bottom: 1px solid #ccc;*/
41 font-weight: bold;
42 /* font-size: 11pt;*/
44 div.met_docs {
45 margin-bottom: 0.2em;
46 /* margin-left: 2em;*/
48 div.met_subclasses {
49 font-size: 9pt;
50 color: #777;
51 margin-left: 3em;
52 text-align: left;
54 div.met_subclasses a {
55 color: #444;
57 div.met_subclasses a.seemore {
58 margin-left: 0.2em;
59 color: #558;
61 #search_checks {
62 padding: 0.5em;
63 padding-top: 0.25em;
64 padding-bottom: 0.25em;
65 font-size: 9pt;
66 color: #555;
67 background: #eee;
69 #search_checks0 {
70 font-size: 9pt;
71 color: #555;
72 border-bottom: 1px solid #ddd;
73 margin-top: 1em;
74 padding-bottom: 1em;
76 table#search_settings {
77 font-size: 9pt;
78 color: #555;
79 width: 100%;
80 margin-left: 0px;
81 margin-right: 0px;*/
82 margin: 0px;
83 padding: 0px;
84 border-collapse: collapse;
86 #search_settings td {
87 border: none;
88 padding: 2px;
90 #random {
91 text-align: right;
92 font-size: 9pt;
94 #js_error {
95 font-family: Andale Mono, monospace;
96 font-size: 9pt;
97 color: red;
100 </style>
101 <noscript>
102 <p>The search page needs JavaScript.
103 </noscript>
105 <script type="text/javascript">
106 var input = "";
107 var newinput = "";
108 var checkboxes;
109 var fields = ["title","summary","categories"];
110 var filter;
111 //var docmapdict = {};
113 escape_regexp = function(str) {
114 var specials = new RegExp("[.*+?|()\\[\\]{}\\\\]", "g"); // .*+?|()[]{}\
115 return str.replace(specials, "\\$&");
118 function debug(str) {
119 document.getElementById("js_error").innerHTML += str + "<br>"
122 var methods;
123 function buildMethodList() {
124 methods = {};
125 for(var k in docmap) {
126 var doc = docmap[k];
127 var mets = doc.methods;
128 if(mets) {
129 for(var j=0;j<mets.length;j++) {
130 var m = mets[j];
131 var mname = m.slice(2);
132 var pfx = m[1];
133 var ext = m[0]=="+";
134 if(!methods.hasOwnProperty(mname))
135 methods[mname] = [];
136 if(!methods[mname].push) {
137 debug("Problem with method '"+mname+"' in "+doc.path);
138 debug(methods[mname].toString());
139 } else {
140 methods[mname].push({doc:doc,pfx:pfx,ext:ext});
147 function getQuerystring(key)
149 key = key.replace(/[\[]/,"\\\[").replace(/[\]]/,"\\\]");
150 var regex = new RegExp("[\\?&]"+key+"=([^&#]*)");
151 var qs = regex.exec(window.location.href);
152 if(qs == null)
153 return null;
154 else
155 return qs[1];
158 function onLoad() {
159 helpRoot="."; fixTOC();
160 newinput = document.getElementById("search_input").value;
162 checkboxes = [];
163 for(var i=0;i<fields.length;i++) {
164 checkboxes[i] = document.getElementById("check_"+fields[i]);
167 var x = ["check_extensions", "check_methods","ignore_case","check_word","check_prefix","check_suffix","check_title","check_summary","check_categories"];
168 for(var i=0;i<x.length;i++) {
169 document.getElementById(x[i]).onchange = doSearch;
172 for(var i=0;i<x.length;i++) {
173 var name = x[i];
174 var val = getQuerystring(name);
175 if(val == "true")
176 document.getElementById(name).checked = true;
177 else if(val == "false")
178 document.getElementById(name).checked = false;
181 document.getElementById("check_regexp").onchange = function(e) {
182 var x = document.getElementsByClassName("nonregex");
183 for(var i=0;i<x.length;i++) {
184 x[i].disabled = e.target.checked;
186 doSearch();
189 document.getElementById("search_input").focus();
191 node = document.getElementById("search_results");
193 checkHash();
195 buildMethodList();
197 filter = document.getElementById("menu_filter");
198 filter.onchange = doSearch;
200 setInterval(delayed_update,250);
203 function checkHash() {
204 var x = unescape(window.location.hash.slice(1));
205 if(x!="" && newinput!=x) {
206 document.getElementById("search_input").value = x;
207 newinput = x;
208 // window.location.hash = "";
212 function SearchKeyPressed(e) {
213 newinput = e.value;
214 if(newinput != input) {
215 document.getElementById("search_results").innerHTML = "Searching...";
219 /*function updateHash() {
220 if(window.location.hash != input)
221 window.location.hash = input;
222 return true;
225 function matchDoc(doc,file,folder,re) {
226 doc.matched_kw = null;
228 if(filter.value != "all") {
229 if(folder.toLowerCase() != filter.value)
230 return false;
233 if(doc.installed=="extension" && !document.getElementById("check_extensions").checked)
234 return false;
236 for(var i=0;i<fields.length;i++) {
237 var f = fields[i];
238 if(checkboxes[i].checked && doc.hasOwnProperty(f) && re.test(doc[f])) {
239 doc.match_weight = i;
240 return true;
244 if(doc.hasOwnProperty('keywords')) {
245 for(var i=0;i<doc.keywords.length;i++) {
246 var kw = doc.keywords[i];
247 if(re.test(kw)) {
248 doc.matched_kw = kw;
249 doc.match_weight = fields.length;
250 return true;
255 return false;
258 var cindex;
259 var cindex2;
260 var mindex;
261 var inProgress = false;
262 var foundMets;
263 var mets;
264 var docs;
265 var re;
266 var node;
267 var subclassCache = {};
269 function strCmp(a,b) {
270 if(a<b) return -1;
271 else
272 if(a>b) return 1;
273 else
274 return 0;
277 function getSubClasses(doc) {
278 var a = [];
279 if(doc.subclasses) {
280 for(var i=0;i<doc.subclasses.length;i++) {
281 var x = doc.subclasses[i];
282 var v = docmap["Classes/"+x];
283 a.push(x);
284 if(v)
285 a = a.concat(getSubClasses(v));
288 return a;
291 function doPrint() {
292 var now = Date.now();
293 inProgress = false;
294 for(; cindex<docs.length; cindex++) {
295 var k = docs[cindex][0];
296 var c = docs[cindex][1];
297 if(cindex2==0) {
298 var div = document.createElement("div");
299 div.className="result_category";
300 if(!k) k = "(uncategorized)";
301 div.innerHTML = k;
302 node.appendChild(div);
304 for(;cindex2<c.length;cindex2++) {
305 var v = c[cindex2];
306 var x = v.path.split("/");
307 var div = document.createElement("div");
308 div.className = "result_item";
310 var n = document.createElement("a");
311 if(v.matched_kw) {
312 n.setAttribute("href",v.path+".html#kw_"+v.matched_kw);
313 } else {
314 n.setAttribute("href",v.path+".html");
316 n.innerHTML = v.title;
317 div.appendChild(n);
318 div.appendChild(document.createTextNode(" - "+v.summary+" "));
320 if(v.installed!="standard") {
321 var n = document.createElement("span");
322 n.className = "soft";
323 var res = "[";
324 if(v.installed=="extension")
325 res += "+";
326 else if(v.installed=="missing")
327 res += "missing!";
328 n.innerHTML = res+"]";
330 div.appendChild(n);
333 node.appendChild(div);
335 if(Date.now()-now > 200) {
336 inProgress = true;
337 return;
341 cindex2=0;
344 if(foundMets) {
345 if(mindex==0) {
346 var div = document.createElement("div");
347 div.className="result_category";
348 div.innerHTML = "Methods";
349 node.appendChild(div);
352 for(;mindex<mets.length; mindex++) {
353 var mname = mets[mindex][0]; //name
354 var div = document.createElement("div");
355 div.className = "result_item";
356 var x = document.createElement("div");
357 x.appendChild(document.createTextNode(mname));
358 x.className = "result_met";
359 div.appendChild(x);
360 var cnt = document.createElement("span");
361 cnt.className = "soft";
362 cnt.innerHTML = " ("+mets[mindex][1].length+" matches)";
363 x.appendChild(cnt);
365 var x = mets[mindex][1].sort(function(a,b) { //document list
366 a = a.pfx + a.doc.title;
367 b = b.pfx + b.doc.title;
368 return strCmp(a,b);
371 for(var i=0;i<x.length;i++) {
372 var m = x[i];
373 var v = m.doc;
375 var div2 = document.createElement("div");
376 div2.className = "met_docs";
377 div.appendChild(div2);
379 var p = m.pfx;
380 if(p==".") p=" ";
381 div2.appendChild(document.createTextNode(p+" "));
382 var a = document.createElement("a");
383 a.setAttribute("href",helpRoot+"/"+v.path+".html#"+m.pfx+mname);
384 a.innerHTML = v.title;
385 div2.appendChild(a);
386 if(m.ext)
387 div2.appendChild(document.createTextNode("+"));
388 div2.appendChild(document.createTextNode(" - "+v.summary+" "));
389 var n = document.createElement("span");
390 n.className = "soft";
391 var res = "["+v.path.split("/")[0];
392 if(v.installed=="extension")
393 res += " +";
394 else if(v.installed=="missing")
395 res += " - missing!";
396 n.innerHTML = res+"]";
397 div2.appendChild(n);
398 if(v.path=="Classes/Object") {
399 var n = document.createElement("div");
400 n.className = "met_subclasses";
401 n.appendChild(document.createTextNode("Inherited by: All classes"));
402 div2.appendChild(n);
403 } else {
404 if(v.subclasses && v.subclasses.length>0) {
405 var n;
406 if(subclassCache[v.path]) {
407 n = subclassCache[v.path].cloneNode(true);
408 } else {
409 var subs = getSubClasses(v);
410 n = document.createElement("div");
411 var m = n;
412 n.className = "met_subclasses";
413 n.appendChild(document.createTextNode("Inherited by: "));
414 for(var j=0;j<subs.length;j++) {
415 var a = document.createElement("a");
416 a.setAttribute("href", helpRoot+"/Classes/"+subs[j]+".html");
417 if(j==10 && subs.length > 14) {
418 m = document.createElement("span");
419 m.className = "hiddenspan";
420 m.style.display = "none";
421 n.appendChild(m);
422 var a2 = document.createElement("a");
423 a2.setAttribute("href","#");
424 a2.className = "seemore";
425 a2.innerHTML = "&hellip; see "+(subs.length-10)+" more";
426 n.appendChild(document.createTextNode(" "));
427 n.appendChild(a2);
429 if(j>0)
430 m.appendChild(document.createTextNode(", "));
431 a.innerHTML = subs[j];
432 m.appendChild(a);
434 subclassCache[v.path] = n;
436 (function() {
437 var a = n.getElementsByClassName("seemore")[0];
438 if(a) {
439 var m = n.getElementsByClassName("hiddenspan")[0];
440 a.onclick = function() {
441 m.style.display = "";
442 a.parentNode.removeChild(a);
443 return false;
446 })();
447 div2.appendChild(n);
452 node.appendChild(div);
454 if(Date.now()-now > 200) {
455 inProgress = true;
456 return;
462 function randomDoc() {
463 while(node.hasChildNodes())
464 node.removeChild(node.lastChild);
466 cindex = 0;
467 cindex2 = 0;
468 mindex = 0;
469 foundMets = false;
470 mets = [];
472 document.getElementById("search_input").value = "";
474 var list = [];
475 for(var k in docmap) {
476 if(docmap.hasOwnProperty(k))
477 list.push(docmap[k]);
480 for(var i=0;i<100;i++) {
481 var v = list[Math.floor(Math.random()*list.length)];
482 if(! /Undocumented classes/.test(v.categories)) {
483 docs = [[v.path.split("/")[0],[v]]];
484 break;
488 doPrint();
490 document.getElementById("search_count").innerHTML = "random document";
493 function doSearch() {
494 var count = 0;
496 while(node.hasChildNodes())
497 node.removeChild(node.lastChild);
499 cindex = 0;
500 cindex2 = 0;
501 mindex = 0;
502 foundMets = false;
503 cats = [];
504 mets = [];
506 if(input!="") {
508 // setup regexp
509 try {
510 var str = input;
511 if(!document.getElementById("check_regexp").checked) {
512 str = escape_regexp(str); //escape special chars
513 if(document.getElementById("check_word").checked)
514 str = "\\b" + str + "\\b";
515 if(document.getElementById("check_prefix").checked)
516 str = "^" + str;
517 if(document.getElementById("check_suffix").checked)
518 str = str + "$";
520 re = RegExp(str,document.getElementById("ignore_case").checked?"i":"");
521 } catch(err) {
522 document.getElementById("search_count").innerHTML = "Invalid regexp";
523 document.getElementById("search_results").innerHTML = err;
524 return;
527 // search docmap
528 docs = {};
529 for(var k in docmap) {
530 var v = docmap[k];
531 var x = v.path.split("/");
532 var folder = x[0];
533 var file = x[x.length-1];
535 if(matchDoc(v,file,folder,re)) {
536 if(!docs.hasOwnProperty(folder))
537 docs[folder]=[];
538 docs[folder].push(v);
539 count++;
542 var tmp = []; for(var k in docs) tmp.push(
543 [k, docs[k].sort(function(a,b) {
544 a = a.title;
545 b = b.title;
546 return strCmp(a,b);
549 var order = { Classes:1, Reference:2, Overviews:3, Guides:4, Tutorials:5 };
550 docs = tmp.sort(function(a,b) {
551 a = order[a[0]] || 10;
552 b = order[b[0]] || 10;
553 return strCmp(a,b);
556 // search methods
557 var include_ext_classes = document.getElementById("check_extensions").checked;
558 var filter_val = filter.value;
559 if(document.getElementById("check_methods").checked) {
560 for(var mname in methods) {
561 var m = methods[mname];
562 if(re.test(mname)) {
563 var c = [];
564 for(var i=0;i<m.length;i++) {
565 var doc = m[i].doc;
566 if(!doc) continue;
567 if(doc.installed == "extension" && !include_ext_classes) continue;
568 if(filter_val != "all" && doc.path.split("/")[0].toLowerCase() != filter_val) continue
569 c.push(m[i]);
571 if(c.length>0) {
572 mets.push([mname,c]);
573 foundMets = true;
574 count++;
578 mets = mets.sort(function(a,b) {
579 a = a[0];
580 b = b[0];
581 return strCmp(a,b);
585 doPrint();
588 document.getElementById("search_count").innerHTML = count+" results";
591 function delayed_update() {
592 if(input != newinput) {
593 input = newinput;
594 doSearch();
595 } else if(inProgress) {
596 doPrint();
599 window.onhashchange = checkHash;
600 </script>
602 </head>
604 <ul id="menubar"></ul>
605 <body onload="onLoad()">
606 <div class='contents'>
607 <div class='header'>
608 <div id='label'>SuperCollider</div>
609 <h1>Search</h1>
610 <div id='summary'>Search all documents</div>
611 </div>
612 <div id="search_checks0">
613 Filter:
614 <select id="menu_filter">
615 <option SELECTED value="all">All documents</option>
616 <option value="classes">Classes only</option>
617 <option value="reference">Reference only</option>
618 <option value="guides">Guides only</option>
619 <option value="tutorials">Tutorials only</option>
620 <option value="overviews">Overviews only</option>
621 <option value="other">Other only</option>
622 </select>
623 <input type="checkbox" id="check_extensions" checked="true">Include extensions</input>
624 </div>
626 <div id="search_box">
627 Search text:<input type="text" id="search_input" value="" size="40" onkeyup="SearchKeyPressed(this)"/>
628 </div>
630 <table id="search_settings">
631 <td>Options:
632 <td>
633 <div id="search_checks">
634 <input type="checkbox" id="ignore_case" checked="true">Ignore case</input>
635 <input class="nonregex" type="checkbox" id="check_word">Whole word</input>
636 <input class="nonregex" type="checkbox" id="check_prefix">Starts with</input>
637 <input class="nonregex" type="checkbox" id="check_suffix">Ends with</input>
638 <input type="checkbox" id="check_regexp">Regexp</input>
639 </div>
640 <tr>
641 <td>Match:
642 <td>
643 <div id="search_checks">
644 <input type="checkbox" id="check_title" checked="true">Title/Class</input>
645 <input type="checkbox" id="check_summary" checked="true">Summary</input>
646 <input type="checkbox" id="check_categories">Categories</input>
647 <input type="checkbox" id="check_methods" checked="true">Methods</input>
648 </div>
649 </table>
650 <div id="random"><a href="javascript:randomDoc()">random page</a></div>
651 <div id="search_count">0 results</div>
652 <div id="search_results"></div>
653 <div id="js_error"></div>
654 </div>
655 </body>
656 </html>