1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/python/mock-1.0.0/html/_static/searchtools.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,560 @@ 1.4 +/* 1.5 + * searchtools.js_t 1.6 + * ~~~~~~~~~~~~~~~~ 1.7 + * 1.8 + * Sphinx JavaScript utilties for the full-text search. 1.9 + * 1.10 + * :copyright: Copyright 2007-2011 by the Sphinx team, see AUTHORS. 1.11 + * :license: BSD, see LICENSE for details. 1.12 + * 1.13 + */ 1.14 + 1.15 +/** 1.16 + * helper function to return a node containing the 1.17 + * search summary for a given text. keywords is a list 1.18 + * of stemmed words, hlwords is the list of normal, unstemmed 1.19 + * words. the first one is used to find the occurance, the 1.20 + * latter for highlighting it. 1.21 + */ 1.22 + 1.23 +jQuery.makeSearchSummary = function(text, keywords, hlwords) { 1.24 + var textLower = text.toLowerCase(); 1.25 + var start = 0; 1.26 + $.each(keywords, function() { 1.27 + var i = textLower.indexOf(this.toLowerCase()); 1.28 + if (i > -1) 1.29 + start = i; 1.30 + }); 1.31 + start = Math.max(start - 120, 0); 1.32 + var excerpt = ((start > 0) ? '...' : '') + 1.33 + $.trim(text.substr(start, 240)) + 1.34 + ((start + 240 - text.length) ? '...' : ''); 1.35 + var rv = $('<div class="context"></div>').text(excerpt); 1.36 + $.each(hlwords, function() { 1.37 + rv = rv.highlightText(this, 'highlighted'); 1.38 + }); 1.39 + return rv; 1.40 +} 1.41 + 1.42 + 1.43 +/** 1.44 + * Porter Stemmer 1.45 + */ 1.46 +var Stemmer = function() { 1.47 + 1.48 + var step2list = { 1.49 + ational: 'ate', 1.50 + tional: 'tion', 1.51 + enci: 'ence', 1.52 + anci: 'ance', 1.53 + izer: 'ize', 1.54 + bli: 'ble', 1.55 + alli: 'al', 1.56 + entli: 'ent', 1.57 + eli: 'e', 1.58 + ousli: 'ous', 1.59 + ization: 'ize', 1.60 + ation: 'ate', 1.61 + ator: 'ate', 1.62 + alism: 'al', 1.63 + iveness: 'ive', 1.64 + fulness: 'ful', 1.65 + ousness: 'ous', 1.66 + aliti: 'al', 1.67 + iviti: 'ive', 1.68 + biliti: 'ble', 1.69 + logi: 'log' 1.70 + }; 1.71 + 1.72 + var step3list = { 1.73 + icate: 'ic', 1.74 + ative: '', 1.75 + alize: 'al', 1.76 + iciti: 'ic', 1.77 + ical: 'ic', 1.78 + ful: '', 1.79 + ness: '' 1.80 + }; 1.81 + 1.82 + var c = "[^aeiou]"; // consonant 1.83 + var v = "[aeiouy]"; // vowel 1.84 + var C = c + "[^aeiouy]*"; // consonant sequence 1.85 + var V = v + "[aeiou]*"; // vowel sequence 1.86 + 1.87 + var mgr0 = "^(" + C + ")?" + V + C; // [C]VC... is m>0 1.88 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 1.89 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 1.90 + var s_v = "^(" + C + ")?" + v; // vowel in stem 1.91 + 1.92 + this.stemWord = function (w) { 1.93 + var stem; 1.94 + var suffix; 1.95 + var firstch; 1.96 + var origword = w; 1.97 + 1.98 + if (w.length < 3) 1.99 + return w; 1.100 + 1.101 + var re; 1.102 + var re2; 1.103 + var re3; 1.104 + var re4; 1.105 + 1.106 + firstch = w.substr(0,1); 1.107 + if (firstch == "y") 1.108 + w = firstch.toUpperCase() + w.substr(1); 1.109 + 1.110 + // Step 1a 1.111 + re = /^(.+?)(ss|i)es$/; 1.112 + re2 = /^(.+?)([^s])s$/; 1.113 + 1.114 + if (re.test(w)) 1.115 + w = w.replace(re,"$1$2"); 1.116 + else if (re2.test(w)) 1.117 + w = w.replace(re2,"$1$2"); 1.118 + 1.119 + // Step 1b 1.120 + re = /^(.+?)eed$/; 1.121 + re2 = /^(.+?)(ed|ing)$/; 1.122 + if (re.test(w)) { 1.123 + var fp = re.exec(w); 1.124 + re = new RegExp(mgr0); 1.125 + if (re.test(fp[1])) { 1.126 + re = /.$/; 1.127 + w = w.replace(re,""); 1.128 + } 1.129 + } 1.130 + else if (re2.test(w)) { 1.131 + var fp = re2.exec(w); 1.132 + stem = fp[1]; 1.133 + re2 = new RegExp(s_v); 1.134 + if (re2.test(stem)) { 1.135 + w = stem; 1.136 + re2 = /(at|bl|iz)$/; 1.137 + re3 = new RegExp("([^aeiouylsz])\\1$"); 1.138 + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 1.139 + if (re2.test(w)) 1.140 + w = w + "e"; 1.141 + else if (re3.test(w)) { 1.142 + re = /.$/; 1.143 + w = w.replace(re,""); 1.144 + } 1.145 + else if (re4.test(w)) 1.146 + w = w + "e"; 1.147 + } 1.148 + } 1.149 + 1.150 + // Step 1c 1.151 + re = /^(.+?)y$/; 1.152 + if (re.test(w)) { 1.153 + var fp = re.exec(w); 1.154 + stem = fp[1]; 1.155 + re = new RegExp(s_v); 1.156 + if (re.test(stem)) 1.157 + w = stem + "i"; 1.158 + } 1.159 + 1.160 + // Step 2 1.161 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; 1.162 + if (re.test(w)) { 1.163 + var fp = re.exec(w); 1.164 + stem = fp[1]; 1.165 + suffix = fp[2]; 1.166 + re = new RegExp(mgr0); 1.167 + if (re.test(stem)) 1.168 + w = stem + step2list[suffix]; 1.169 + } 1.170 + 1.171 + // Step 3 1.172 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; 1.173 + if (re.test(w)) { 1.174 + var fp = re.exec(w); 1.175 + stem = fp[1]; 1.176 + suffix = fp[2]; 1.177 + re = new RegExp(mgr0); 1.178 + if (re.test(stem)) 1.179 + w = stem + step3list[suffix]; 1.180 + } 1.181 + 1.182 + // Step 4 1.183 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; 1.184 + re2 = /^(.+?)(s|t)(ion)$/; 1.185 + if (re.test(w)) { 1.186 + var fp = re.exec(w); 1.187 + stem = fp[1]; 1.188 + re = new RegExp(mgr1); 1.189 + if (re.test(stem)) 1.190 + w = stem; 1.191 + } 1.192 + else if (re2.test(w)) { 1.193 + var fp = re2.exec(w); 1.194 + stem = fp[1] + fp[2]; 1.195 + re2 = new RegExp(mgr1); 1.196 + if (re2.test(stem)) 1.197 + w = stem; 1.198 + } 1.199 + 1.200 + // Step 5 1.201 + re = /^(.+?)e$/; 1.202 + if (re.test(w)) { 1.203 + var fp = re.exec(w); 1.204 + stem = fp[1]; 1.205 + re = new RegExp(mgr1); 1.206 + re2 = new RegExp(meq1); 1.207 + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); 1.208 + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) 1.209 + w = stem; 1.210 + } 1.211 + re = /ll$/; 1.212 + re2 = new RegExp(mgr1); 1.213 + if (re.test(w) && re2.test(w)) { 1.214 + re = /.$/; 1.215 + w = w.replace(re,""); 1.216 + } 1.217 + 1.218 + // and turn initial Y back to y 1.219 + if (firstch == "y") 1.220 + w = firstch.toLowerCase() + w.substr(1); 1.221 + return w; 1.222 + } 1.223 +} 1.224 + 1.225 + 1.226 +/** 1.227 + * Search Module 1.228 + */ 1.229 +var Search = { 1.230 + 1.231 + _index : null, 1.232 + _queued_query : null, 1.233 + _pulse_status : -1, 1.234 + 1.235 + init : function() { 1.236 + var params = $.getQueryParameters(); 1.237 + if (params.q) { 1.238 + var query = params.q[0]; 1.239 + $('input[name="q"]')[0].value = query; 1.240 + this.performSearch(query); 1.241 + } 1.242 + }, 1.243 + 1.244 + loadIndex : function(url) { 1.245 + $.ajax({type: "GET", url: url, data: null, success: null, 1.246 + dataType: "script", cache: true}); 1.247 + }, 1.248 + 1.249 + setIndex : function(index) { 1.250 + var q; 1.251 + this._index = index; 1.252 + if ((q = this._queued_query) !== null) { 1.253 + this._queued_query = null; 1.254 + Search.query(q); 1.255 + } 1.256 + }, 1.257 + 1.258 + hasIndex : function() { 1.259 + return this._index !== null; 1.260 + }, 1.261 + 1.262 + deferQuery : function(query) { 1.263 + this._queued_query = query; 1.264 + }, 1.265 + 1.266 + stopPulse : function() { 1.267 + this._pulse_status = 0; 1.268 + }, 1.269 + 1.270 + startPulse : function() { 1.271 + if (this._pulse_status >= 0) 1.272 + return; 1.273 + function pulse() { 1.274 + Search._pulse_status = (Search._pulse_status + 1) % 4; 1.275 + var dotString = ''; 1.276 + for (var i = 0; i < Search._pulse_status; i++) 1.277 + dotString += '.'; 1.278 + Search.dots.text(dotString); 1.279 + if (Search._pulse_status > -1) 1.280 + window.setTimeout(pulse, 500); 1.281 + }; 1.282 + pulse(); 1.283 + }, 1.284 + 1.285 + /** 1.286 + * perform a search for something 1.287 + */ 1.288 + performSearch : function(query) { 1.289 + // create the required interface elements 1.290 + this.out = $('#search-results'); 1.291 + this.title = $('<h2>' + _('Searching') + '</h2>').appendTo(this.out); 1.292 + this.dots = $('<span></span>').appendTo(this.title); 1.293 + this.status = $('<p style="display: none"></p>').appendTo(this.out); 1.294 + this.output = $('<ul class="search"/>').appendTo(this.out); 1.295 + 1.296 + $('#search-progress').text(_('Preparing search...')); 1.297 + this.startPulse(); 1.298 + 1.299 + // index already loaded, the browser was quick! 1.300 + if (this.hasIndex()) 1.301 + this.query(query); 1.302 + else 1.303 + this.deferQuery(query); 1.304 + }, 1.305 + 1.306 + query : function(query) { 1.307 + var stopwords = ["and","then","into","it","as","are","in","if","for","no","there","their","was","is","be","to","that","but","they","not","such","with","by","a","on","these","of","will","this","near","the","or","at"]; 1.308 + 1.309 + // Stem the searchterms and add them to the correct list 1.310 + var stemmer = new Stemmer(); 1.311 + var searchterms = []; 1.312 + var excluded = []; 1.313 + var hlterms = []; 1.314 + var tmp = query.split(/\s+/); 1.315 + var objectterms = []; 1.316 + for (var i = 0; i < tmp.length; i++) { 1.317 + if (tmp[i] != "") { 1.318 + objectterms.push(tmp[i].toLowerCase()); 1.319 + } 1.320 + 1.321 + if ($u.indexOf(stopwords, tmp[i]) != -1 || tmp[i].match(/^\d+$/) || 1.322 + tmp[i] == "") { 1.323 + // skip this "word" 1.324 + continue; 1.325 + } 1.326 + // stem the word 1.327 + var word = stemmer.stemWord(tmp[i]).toLowerCase(); 1.328 + // select the correct list 1.329 + if (word[0] == '-') { 1.330 + var toAppend = excluded; 1.331 + word = word.substr(1); 1.332 + } 1.333 + else { 1.334 + var toAppend = searchterms; 1.335 + hlterms.push(tmp[i].toLowerCase()); 1.336 + } 1.337 + // only add if not already in the list 1.338 + if (!$.contains(toAppend, word)) 1.339 + toAppend.push(word); 1.340 + }; 1.341 + var highlightstring = '?highlight=' + $.urlencode(hlterms.join(" ")); 1.342 + 1.343 + // console.debug('SEARCH: searching for:'); 1.344 + // console.info('required: ', searchterms); 1.345 + // console.info('excluded: ', excluded); 1.346 + 1.347 + // prepare search 1.348 + var filenames = this._index.filenames; 1.349 + var titles = this._index.titles; 1.350 + var terms = this._index.terms; 1.351 + var fileMap = {}; 1.352 + var files = null; 1.353 + // different result priorities 1.354 + var importantResults = []; 1.355 + var objectResults = []; 1.356 + var regularResults = []; 1.357 + var unimportantResults = []; 1.358 + $('#search-progress').empty(); 1.359 + 1.360 + // lookup as object 1.361 + for (var i = 0; i < objectterms.length; i++) { 1.362 + var others = [].concat(objectterms.slice(0,i), 1.363 + objectterms.slice(i+1, objectterms.length)) 1.364 + var results = this.performObjectSearch(objectterms[i], others); 1.365 + // Assume first word is most likely to be the object, 1.366 + // other words more likely to be in description. 1.367 + // Therefore put matches for earlier words first. 1.368 + // (Results are eventually used in reverse order). 1.369 + objectResults = results[0].concat(objectResults); 1.370 + importantResults = results[1].concat(importantResults); 1.371 + unimportantResults = results[2].concat(unimportantResults); 1.372 + } 1.373 + 1.374 + // perform the search on the required terms 1.375 + for (var i = 0; i < searchterms.length; i++) { 1.376 + var word = searchterms[i]; 1.377 + // no match but word was a required one 1.378 + if ((files = terms[word]) == null) 1.379 + break; 1.380 + if (files.length == undefined) { 1.381 + files = [files]; 1.382 + } 1.383 + // create the mapping 1.384 + for (var j = 0; j < files.length; j++) { 1.385 + var file = files[j]; 1.386 + if (file in fileMap) 1.387 + fileMap[file].push(word); 1.388 + else 1.389 + fileMap[file] = [word]; 1.390 + } 1.391 + } 1.392 + 1.393 + // now check if the files don't contain excluded terms 1.394 + for (var file in fileMap) { 1.395 + var valid = true; 1.396 + 1.397 + // check if all requirements are matched 1.398 + if (fileMap[file].length != searchterms.length) 1.399 + continue; 1.400 + 1.401 + // ensure that none of the excluded terms is in the 1.402 + // search result. 1.403 + for (var i = 0; i < excluded.length; i++) { 1.404 + if (terms[excluded[i]] == file || 1.405 + $.contains(terms[excluded[i]] || [], file)) { 1.406 + valid = false; 1.407 + break; 1.408 + } 1.409 + } 1.410 + 1.411 + // if we have still a valid result we can add it 1.412 + // to the result list 1.413 + if (valid) 1.414 + regularResults.push([filenames[file], titles[file], '', null]); 1.415 + } 1.416 + 1.417 + // delete unused variables in order to not waste 1.418 + // memory until list is retrieved completely 1.419 + delete filenames, titles, terms; 1.420 + 1.421 + // now sort the regular results descending by title 1.422 + regularResults.sort(function(a, b) { 1.423 + var left = a[1].toLowerCase(); 1.424 + var right = b[1].toLowerCase(); 1.425 + return (left > right) ? -1 : ((left < right) ? 1 : 0); 1.426 + }); 1.427 + 1.428 + // combine all results 1.429 + var results = unimportantResults.concat(regularResults) 1.430 + .concat(objectResults).concat(importantResults); 1.431 + 1.432 + // print the results 1.433 + var resultCount = results.length; 1.434 + function displayNextItem() { 1.435 + // results left, load the summary and display it 1.436 + if (results.length) { 1.437 + var item = results.pop(); 1.438 + var listItem = $('<li style="display:none"></li>'); 1.439 + if (DOCUMENTATION_OPTIONS.FILE_SUFFIX == '') { 1.440 + // dirhtml builder 1.441 + var dirname = item[0] + '/'; 1.442 + if (dirname.match(/\/index\/$/)) { 1.443 + dirname = dirname.substring(0, dirname.length-6); 1.444 + } else if (dirname == 'index/') { 1.445 + dirname = ''; 1.446 + } 1.447 + listItem.append($('<a/>').attr('href', 1.448 + DOCUMENTATION_OPTIONS.URL_ROOT + dirname + 1.449 + highlightstring + item[2]).html(item[1])); 1.450 + } else { 1.451 + // normal html builders 1.452 + listItem.append($('<a/>').attr('href', 1.453 + item[0] + DOCUMENTATION_OPTIONS.FILE_SUFFIX + 1.454 + highlightstring + item[2]).html(item[1])); 1.455 + } 1.456 + if (item[3]) { 1.457 + listItem.append($('<span> (' + item[3] + ')</span>')); 1.458 + Search.output.append(listItem); 1.459 + listItem.slideDown(5, function() { 1.460 + displayNextItem(); 1.461 + }); 1.462 + } else if (DOCUMENTATION_OPTIONS.HAS_SOURCE) { 1.463 + $.get(DOCUMENTATION_OPTIONS.URL_ROOT + '_sources/' + 1.464 + item[0] + '.txt', function(data) { 1.465 + if (data != '') { 1.466 + listItem.append($.makeSearchSummary(data, searchterms, hlterms)); 1.467 + Search.output.append(listItem); 1.468 + } 1.469 + listItem.slideDown(5, function() { 1.470 + displayNextItem(); 1.471 + }); 1.472 + }, "text"); 1.473 + } else { 1.474 + // no source available, just display title 1.475 + Search.output.append(listItem); 1.476 + listItem.slideDown(5, function() { 1.477 + displayNextItem(); 1.478 + }); 1.479 + } 1.480 + } 1.481 + // search finished, update title and status message 1.482 + else { 1.483 + Search.stopPulse(); 1.484 + Search.title.text(_('Search Results')); 1.485 + if (!resultCount) 1.486 + Search.status.text(_('Your search did not match any documents. Please make sure that all words are spelled correctly and that you\'ve selected enough categories.')); 1.487 + else 1.488 + Search.status.text(_('Search finished, found %s page(s) matching the search query.').replace('%s', resultCount)); 1.489 + Search.status.fadeIn(500); 1.490 + } 1.491 + } 1.492 + displayNextItem(); 1.493 + }, 1.494 + 1.495 + performObjectSearch : function(object, otherterms) { 1.496 + var filenames = this._index.filenames; 1.497 + var objects = this._index.objects; 1.498 + var objnames = this._index.objnames; 1.499 + var titles = this._index.titles; 1.500 + 1.501 + var importantResults = []; 1.502 + var objectResults = []; 1.503 + var unimportantResults = []; 1.504 + 1.505 + for (var prefix in objects) { 1.506 + for (var name in objects[prefix]) { 1.507 + var fullname = (prefix ? prefix + '.' : '') + name; 1.508 + if (fullname.toLowerCase().indexOf(object) > -1) { 1.509 + var match = objects[prefix][name]; 1.510 + var objname = objnames[match[1]][2]; 1.511 + var title = titles[match[0]]; 1.512 + // If more than one term searched for, we require other words to be 1.513 + // found in the name/title/description 1.514 + if (otherterms.length > 0) { 1.515 + var haystack = (prefix + ' ' + name + ' ' + 1.516 + objname + ' ' + title).toLowerCase(); 1.517 + var allfound = true; 1.518 + for (var i = 0; i < otherterms.length; i++) { 1.519 + if (haystack.indexOf(otherterms[i]) == -1) { 1.520 + allfound = false; 1.521 + break; 1.522 + } 1.523 + } 1.524 + if (!allfound) { 1.525 + continue; 1.526 + } 1.527 + } 1.528 + var descr = objname + _(', in ') + title; 1.529 + anchor = match[3]; 1.530 + if (anchor == '') 1.531 + anchor = fullname; 1.532 + else if (anchor == '-') 1.533 + anchor = objnames[match[1]][1] + '-' + fullname; 1.534 + result = [filenames[match[0]], fullname, '#'+anchor, descr]; 1.535 + switch (match[2]) { 1.536 + case 1: objectResults.push(result); break; 1.537 + case 0: importantResults.push(result); break; 1.538 + case 2: unimportantResults.push(result); break; 1.539 + } 1.540 + } 1.541 + } 1.542 + } 1.543 + 1.544 + // sort results descending 1.545 + objectResults.sort(function(a, b) { 1.546 + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); 1.547 + }); 1.548 + 1.549 + importantResults.sort(function(a, b) { 1.550 + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); 1.551 + }); 1.552 + 1.553 + unimportantResults.sort(function(a, b) { 1.554 + return (a[1] > b[1]) ? -1 : ((a[1] < b[1]) ? 1 : 0); 1.555 + }); 1.556 + 1.557 + return [importantResults, objectResults, unimportantResults] 1.558 + } 1.559 +} 1.560 + 1.561 +$(document).ready(function() { 1.562 + Search.init(); 1.563 +}); 1.564 \ No newline at end of file