python/mock-1.0.0/html/_static/searchtools.js

changeset 0
6474c204b198
     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

mercurial