Added help for Pen and updated some other docs
[supercollider.git] / HelpSource / Search.html
blob9cd042ed55b2a437defe0c1d0f1cf54fdf241211
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 getSubClasses(doc) {
270 var a = [];
271 if(doc.subclasses) {
272 for(var i=0;i<doc.subclasses.length;i++) {
273 var x = doc.subclasses[i];
274 var v = docmap["Classes/"+x];
275 a.push(x);
276 if(v)
277 a = a.concat(getSubClasses(v));
280 return a;
283 function doPrint() {
284 var now = Date.now();
285 inProgress = false;
286 for(; cindex<docs.length; cindex++) {
287 var k = docs[cindex][0];
288 var c = docs[cindex][1];
289 if(cindex2==0) {
290 var div = document.createElement("div");
291 div.className="result_category";
292 if(!k) k = "(uncategorized)";
293 div.innerHTML = k;
294 node.appendChild(div);
296 for(;cindex2<c.length;cindex2++) {
297 var v = c[cindex2];
298 var x = v.path.split("/");
299 var div = document.createElement("div");
300 div.className = "result_item";
302 var n = document.createElement("a");
303 if(v.matched_kw) {
304 n.setAttribute("href",v.path+".html#kw_"+v.matched_kw);
305 } else {
306 n.setAttribute("href",v.path+".html");
308 n.innerHTML = v.title;
309 div.appendChild(n);
310 div.appendChild(document.createTextNode(" - "+v.summary+" "));
312 if(v.installed!="standard") {
313 var n = document.createElement("span");
314 n.className = "soft";
315 var res = "[";
316 if(v.installed=="extension")
317 res += "+";
318 else if(v.installed=="missing")
319 res += "missing!";
320 n.innerHTML = res+"]";
322 div.appendChild(n);
325 node.appendChild(div);
327 if(Date.now()-now > 200) {
328 inProgress = true;
329 return;
333 cindex2=0;
336 if(foundMets) {
337 if(mindex==0) {
338 var div = document.createElement("div");
339 div.className="result_category";
340 div.innerHTML = "Methods";
341 node.appendChild(div);
344 for(;mindex<mets.length; mindex++) {
345 var mname = mets[mindex][0]; //name
346 var div = document.createElement("div");
347 div.className = "result_item";
348 var x = document.createElement("div");
349 x.appendChild(document.createTextNode(mname));
350 x.className = "result_met";
351 div.appendChild(x);
352 var cnt = document.createElement("span");
353 cnt.className = "soft";
354 cnt.innerHTML = " ("+mets[mindex][1].length+" matches)";
355 x.appendChild(cnt);
357 var x = mets[mindex][1].sort(function(a,b) { //document list
358 a = a.pfx + a.doc.title;
359 b = b.pfx + b.doc.title;
360 if(a<b) return -1;
361 else
362 if(a>b) return +1;
363 else
364 return 0;
367 for(var i=0;i<x.length;i++) {
368 var m = x[i];
369 var v = m.doc;
371 var div2 = document.createElement("div");
372 div2.className = "met_docs";
373 div.appendChild(div2);
375 var p = m.pfx;
376 if(p==".") p=" ";
377 div2.appendChild(document.createTextNode(p+" "));
378 var a = document.createElement("a");
379 a.setAttribute("href",helpRoot+"/"+v.path+".html#"+m.pfx+mname);
380 a.innerHTML = v.title;
381 div2.appendChild(a);
382 if(m.ext)
383 div2.appendChild(document.createTextNode("+"));
384 div2.appendChild(document.createTextNode(" - "+v.summary+" "));
385 var n = document.createElement("span");
386 n.className = "soft";
387 var res = "["+v.path.split("/")[0];
388 if(v.installed=="extension")
389 res += " +";
390 else if(v.installed=="missing")
391 res += " - missing!";
392 n.innerHTML = res+"]";
393 div2.appendChild(n);
394 if(v.path=="Classes/Object") {
395 var n = document.createElement("div");
396 n.className = "met_subclasses";
397 n.appendChild(document.createTextNode("Inherited by: All classes"));
398 div2.appendChild(n);
399 } else {
400 if(v.subclasses && v.subclasses.length>0) {
401 var n;
402 if(subclassCache[v.path]) {
403 n = subclassCache[v.path].cloneNode(true);
404 } else {
405 var subs = getSubClasses(v);
406 n = document.createElement("div");
407 var m = n;
408 n.className = "met_subclasses";
409 n.appendChild(document.createTextNode("Inherited by: "));
410 for(var j=0;j<subs.length;j++) {
411 var a = document.createElement("a");
412 a.setAttribute("href", helpRoot+"/Classes/"+subs[j]+".html");
413 if(j==10 && subs.length > 14) {
414 m = document.createElement("span");
415 m.className = "hiddenspan";
416 m.style.display = "none";
417 n.appendChild(m);
418 var a2 = document.createElement("a");
419 a2.setAttribute("href","#");
420 a2.className = "seemore";
421 a2.innerHTML = "&hellip; see "+(subs.length-10)+" more";
422 n.appendChild(document.createTextNode(" "));
423 n.appendChild(a2);
425 if(j>0)
426 m.appendChild(document.createTextNode(", "));
427 a.innerHTML = subs[j];
428 m.appendChild(a);
430 subclassCache[v.path] = n;
432 (function() {
433 var a = n.getElementsByClassName("seemore")[0];
434 if(a) {
435 var m = n.getElementsByClassName("hiddenspan")[0];
436 a.onclick = function() {
437 m.style.display = "";
438 a.parentNode.removeChild(a);
439 return false;
442 })();
443 div2.appendChild(n);
448 node.appendChild(div);
450 if(Date.now()-now > 200) {
451 inProgress = true;
452 return;
458 function randomDoc() {
459 while(node.hasChildNodes())
460 node.removeChild(node.lastChild);
462 cindex = 0;
463 cindex2 = 0;
464 mindex = 0;
465 foundMets = false;
466 mets = [];
468 document.getElementById("search_input").value = "";
470 var list = [];
471 for(var k in docmap) {
472 if(docmap.hasOwnProperty(k))
473 list.push(docmap[k]);
476 for(var i=0;i<100;i++) {
477 var v = list[Math.floor(Math.random()*list.length)];
478 if(! /Undocumented classes/.test(v.categories)) {
479 docs = [[v.path.split("/")[0],[v]]];
480 break;
484 doPrint();
486 document.getElementById("search_count").innerHTML = "random document";
489 function doSearch() {
490 var count = 0;
492 while(node.hasChildNodes())
493 node.removeChild(node.lastChild);
495 cindex = 0;
496 cindex2 = 0;
497 mindex = 0;
498 foundMets = false;
499 cats = [];
500 mets = [];
502 if(input!="") {
504 // setup regexp
505 try {
506 var str = input;
507 if(!document.getElementById("check_regexp").checked) {
508 str = escape_regexp(str); //escape special chars
509 if(document.getElementById("check_word").checked)
510 str = "\\b" + str + "\\b";
511 if(document.getElementById("check_prefix").checked)
512 str = "^" + str;
513 if(document.getElementById("check_suffix").checked)
514 str = str + "$";
516 re = RegExp(str,document.getElementById("ignore_case").checked?"i":"");
517 } catch(err) {
518 document.getElementById("search_count").innerHTML = "Invalid regexp";
519 document.getElementById("search_results").innerHTML = err;
520 return;
523 // search docmap
524 docs = {};
525 for(var k in docmap) {
526 var v = docmap[k];
527 var x = v.path.split("/");
528 var folder = x[0];
529 var file = x[x.length-1];
531 if(matchDoc(v,file,folder,re)) {
532 if(!docs.hasOwnProperty(folder))
533 docs[folder]=[];
534 docs[folder].push(v);
535 count++;
538 var tmp = []; for(var k in docs) tmp.push(
539 [k, docs[k].sort(function(a,b) {
540 a = a.title;
541 b = b.title;
542 if(a<b) return -1;
543 else
544 if(a>b) return 1;
545 else
546 return 0;
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 if(a<b) return -1;
554 else
555 if(a>b) return 1;
556 else
557 return 0;
560 // search methods
561 var include_ext_classes = document.getElementById("check_extensions").checked;
562 var filter_val = filter.value;
563 if(document.getElementById("check_methods").checked) {
564 for(var mname in methods) {
565 var m = methods[mname];
566 if(re.test(mname)) {
567 var c = [];
568 for(var i=0;i<m.length;i++) {
569 var doc = m[i].doc;
570 if(!doc) continue;
571 if(doc.installed == "extension" && !include_ext_classes) continue;
572 if(filter_val != "all" && doc.path.split("/")[0].toLowerCase() != filter_val) continue
573 c.push(m[i]);
575 if(c.length>0) {
576 mets.push([mname,c]);
577 foundMets = true;
578 count++;
584 doPrint();
587 document.getElementById("search_count").innerHTML = count+" results";
590 function delayed_update() {
591 if(input != newinput) {
592 input = newinput;
593 doSearch();
594 } else if(inProgress) {
595 doPrint();
598 window.onhashchange = checkHash;
599 </script>
601 </head>
603 <ul id="menubar"></ul>
604 <body onload="onLoad()">
605 <div class='contents'>
606 <div class='header'>
607 <div id='label'>SuperCollider</div>
608 <h1>Search</h1>
609 <div id='summary'>Search all documents</div>
610 </div>
611 <div id="search_checks0">
612 Filter:
613 <select id="menu_filter">
614 <option SELECTED value="all">All documents</option>
615 <option value="classes">Classes only</option>
616 <option value="reference">Reference only</option>
617 <option value="guides">Guides only</option>
618 <option value="tutorials">Tutorials only</option>
619 <option value="overviews">Overviews only</option>
620 <option value="other">Other only</option>
621 </select>
622 <input type="checkbox" id="check_extensions" checked="true">Include extensions</input>
623 </div>
625 <div id="search_box">
626 Search text:<input type="text" id="search_input" value="" size="40" onkeyup="SearchKeyPressed(this)"/>
627 </div>
629 <table id="search_settings">
630 <td>Options:
631 <td>
632 <div id="search_checks">
633 <input type="checkbox" id="ignore_case" checked="true">Ignore case</input>
634 <input class="nonregex" type="checkbox" id="check_word">Whole word</input>
635 <input class="nonregex" type="checkbox" id="check_prefix">Starts with</input>
636 <input class="nonregex" type="checkbox" id="check_suffix">Ends with</input>
637 <input type="checkbox" id="check_regexp">Regexp</input>
638 </div>
639 <tr>
640 <td>Match:
641 <td>
642 <div id="search_checks">
643 <input type="checkbox" id="check_title" checked="true">Title/Class</input>
644 <input type="checkbox" id="check_summary" checked="true">Summary</input>
645 <input type="checkbox" id="check_categories">Categories</input>
646 <input type="checkbox" id="check_methods" checked="true">Methods</input>
647 </div>
648 </table>
649 <div id="random"><a href="javascript:randomDoc()">random page</a></div>
650 <div id="search_count">0 results</div>
651 <div id="search_results"></div>
652 <div id="js_error"></div>
653 </div>
654 </body>
655 </html>