jekyll_pages_api_search 0.4.5 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -36,11 +36,10 @@ module.exports = function() {
36
36
  return;
37
37
  }
38
38
 
39
-
40
- return searchEngine.executeSearch(window.JEKYLL_PAGES_API_SEARCH_BASEURL, window.location.href)
39
+ return searchEngine.executeSearch(
40
+ window.JEKYLL_PAGES_API_SEARCH_INDEX_URL, window.location.href)
41
41
  .then(function(searchResults) {
42
- searchUi.renderResults(searchResults.query,
43
- searchResults.results || [],
42
+ searchUi.renderResults(searchResults.query, searchResults.results,
44
43
  window.renderJekyllPagesApiSearchResults || writeResultsToList);
45
44
  })
46
45
  .catch(function(error) {
@@ -1,13 +1,11 @@
1
1
  #! /usr/bin/env ruby
2
- # Author: Mike Bland <michael.bland@gsa.gov>
3
- # Date: 2015-06-21
4
2
 
5
3
  require_relative '../lib/jekyll_pages_api_search'
6
4
  require 'fileutils'
7
5
  require 'jekyll_pages_api'
8
6
  require 'zlib'
9
7
 
10
- ASSETS_DIR = ::JekyllPagesApiSearch::JavascriptCopier::ASSETS_DIR
8
+ ASSETS_DIR = ::JekyllPagesApiSearch::Assets::JAVASCRIPT_DIR
11
9
 
12
10
  USAGE=<<END_USAGE
13
11
  #{$0}: generate a lunr.js index from Jekyll Pages API output
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require_relative './jekyll_pages_api_search/assets'
4
2
  require_relative './jekyll_pages_api_search/generator'
5
3
  require_relative './jekyll_pages_api_search/sass'
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require_relative './sass'
4
2
  require_relative './tags'
5
3
 
@@ -9,6 +9,8 @@ var zlib = require('zlib');
9
9
 
10
10
  var SOURCE = process.argv[2];
11
11
  var TARGET = process.argv[3];
12
+ var OPTIONS = process.argv[4];
13
+ var options;
12
14
  var errors = [];
13
15
 
14
16
  if (!SOURCE) {
@@ -23,15 +25,21 @@ if (!TARGET) {
23
25
  errors.push('parent directory of target file ' + TARGET + ' does not exist');
24
26
  }
25
27
 
28
+ try {
29
+ options = JSON.parse(OPTIONS);
30
+ } catch (e) {
31
+ errors.push('failed to parse Browserify options object:' + e);
32
+ }
33
+
26
34
  if (errors.length !== 0) {
27
35
  process.stderr.write(errors.join('\n') + '\n');
28
36
  process.exit(1);
29
37
  }
30
38
 
31
- var bundler = browserify({ standalone: 'renderJekyllPagesApiSearchResults' });
32
39
  var outputStream = fs.createWriteStream(TARGET);
33
40
 
34
- bundler.add(SOURCE)
41
+ browserify(options)
42
+ .add(SOURCE)
35
43
  .transform({ global: true }, 'uglifyify')
36
44
  .bundle()
37
45
  .pipe(outputStream);
@@ -0,0 +1,77 @@
1
+ require_relative './assets'
2
+ require_relative './compressor'
3
+ require_relative './config'
4
+
5
+ require 'English'
6
+ require 'jekyll_pages_api'
7
+ require 'json'
8
+
9
+ module JekyllPagesApiSearch
10
+ class Bundler
11
+ DIRNAME = File.dirname(__FILE__).freeze
12
+ BROWSERIFY_SCRIPT = File.join(DIRNAME, 'browserify.js').freeze
13
+ CONSTANTS_MODULE = File.join(Assets::JAVASCRIPT_DIR, 'search-constants.js')
14
+ .freeze
15
+
16
+ def self.create_search_bundles(site)
17
+ create_custom_renderer_bundle(site)
18
+ create_search_constants_bundle(site)
19
+ end
20
+
21
+ def self.create_custom_renderer_bundle(site)
22
+ browserify_config = Config.get(site, 'browserify')
23
+ return if browserify_config.nil?
24
+ source = File.join(site.source, browserify_config['source'])
25
+ target = create_target_path(site, browserify_config['target'])
26
+ execute_browserify(source, target,
27
+ { standalone: 'renderJekyllPagesApiSearchResults' })
28
+ end
29
+
30
+ # Generates a JavaScript module containing constants based on `site` values.
31
+ def self.create_search_constants_bundle(site)
32
+ target = create_target_path(site, CONSTANTS_MODULE)
33
+ constants = generate_constants(site)
34
+ File.open(target, 'w') do |target_file|
35
+ target_file.write(constants)
36
+ end
37
+ Compressor.gzip_in_memory_content({ target => constants })
38
+ end
39
+
40
+ # Creates an object of constants based on `site` values.
41
+ def self.generate_constants(site)
42
+ return "var JEKYLL_PAGES_API_SEARCH_INDEX_URL = '" +
43
+ baseurl_prefix(site) + SearchIndexBuilder::INDEX_FILE + "';\n"
44
+ end
45
+
46
+ # Generates the correct baseurl prefix.
47
+ def self.baseurl_prefix(site)
48
+ baseurl = site.baseurl
49
+ if baseurl.nil? || baseurl.empty? then
50
+ return '/'
51
+ elsif baseurl == '/' then
52
+ return baseurl
53
+ end
54
+ return baseurl + '/'
55
+ end
56
+
57
+ # Creates the target bundle path and its directory if it doesn't exist.
58
+ def self.create_target_path(site, target_file)
59
+ target = File.join(site.dest, target_file)
60
+ target_dir = File.dirname(target)
61
+ if !Dir.exists?(target_dir) then
62
+ FileUtils.mkdir_p(target_dir)
63
+ end
64
+ target
65
+ end
66
+
67
+ def self.execute_browserify(source, target, options)
68
+ status = system('node', "#{BROWSERIFY_SCRIPT}", "#{source}", "#{target}",
69
+ JSON.generate(options))
70
+ if $CHILD_STATUS.exitstatus.nil?
71
+ $stderr.puts('Could not execute browserify script')
72
+ exit 1
73
+ end
74
+ exit $CHILD_STATUS.exitstatus if !status
75
+ end
76
+ end
77
+ end
@@ -1,5 +1,4 @@
1
1
  require_relative './assets'
2
- require_relative './browserify'
3
2
  require_relative './config'
4
3
  require_relative './search_page'
5
4
  require_relative './search_page_layouts'
@@ -1,7 +1 @@
1
- /**
2
- * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 0.6.0
3
- * Copyright (C) 2015 Oliver Nightingale
4
- * MIT Licensed
5
- * @license
6
- */
7
- !function(){var t=function(e){var n=new t.Index;return n.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),e&&e.call(n,n),n};t.version="0.6.0",t.utils={},t.utils.warn=function(t){return function(e){t.console&&console.warn&&console.warn(e)}}(this),t.utils.asString=function(t){return void 0===t||null===t?"":t.toString()},t.EventEmitter=function(){this.events={}},t.EventEmitter.prototype.addListener=function(){var t=Array.prototype.slice.call(arguments),e=t.pop(),n=t;if("function"!=typeof e)throw new TypeError("last argument must be a function");n.forEach(function(t){this.hasHandler(t)||(this.events[t]=[]),this.events[t].push(e)},this)},t.EventEmitter.prototype.removeListener=function(t,e){if(this.hasHandler(t)){var n=this.events[t].indexOf(e);this.events[t].splice(n,1),this.events[t].length||delete this.events[t]}},t.EventEmitter.prototype.emit=function(t){if(this.hasHandler(t)){var e=Array.prototype.slice.call(arguments,1);this.events[t].forEach(function(t){t.apply(void 0,e)})}},t.EventEmitter.prototype.hasHandler=function(t){return t in this.events},t.tokenizer=function(e){return arguments.length&&null!=e&&void 0!=e?Array.isArray(e)?e.map(function(e){return t.utils.asString(e).toLowerCase()}):e.toString().trim().toLowerCase().split(t.tokenizer.seperator):[]},t.tokenizer.seperator=/[\s\-]+/,t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions={},t.Pipeline.registerFunction=function(e,n){n in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+n),e.label=n,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var n=e.label&&e.label in this.registeredFunctions;n||t.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",e)},t.Pipeline.load=function(e){var n=new t.Pipeline;return e.forEach(function(e){var i=t.Pipeline.registeredFunctions[e];if(!i)throw new Error("Cannot load un-registered function: "+e);n.add(i)}),n},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(e){t.Pipeline.warnIfFunctionNotRegistered(e),this._stack.push(e)},this)},t.Pipeline.prototype.after=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,n)},t.Pipeline.prototype.before=function(e,n){t.Pipeline.warnIfFunctionNotRegistered(n);var i=this._stack.indexOf(e);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,n)},t.Pipeline.prototype.remove=function(t){var e=this._stack.indexOf(t);-1!=e&&this._stack.splice(e,1)},t.Pipeline.prototype.run=function(t){for(var e=[],n=t.length,i=this._stack.length,r=0;n>r;r++){for(var o=t[r],s=0;i>s&&(o=this._stack[s](o,r,t),void 0!==o&&""!==o);s++);void 0!==o&&""!==o&&e.push(o)}return e},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})},t.Vector=function(){this._magnitude=null,this.list=void 0,this.length=0},t.Vector.Node=function(t,e,n){this.idx=t,this.val=e,this.next=n},t.Vector.prototype.insert=function(e,n){this._magnitude=void 0;var i=this.list;if(!i)return this.list=new t.Vector.Node(e,n,i),this.length++;if(e<i.idx)return this.list=new t.Vector.Node(e,n,i),this.length++;for(var r=i,o=i.next;void 0!=o;){if(e<o.idx)return r.next=new t.Vector.Node(e,n,o),this.length++;r=o,o=o.next}return r.next=new t.Vector.Node(e,n,o),this.length++},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var t,e=this.list,n=0;e;)t=e.val,n+=t*t,e=e.next;return this._magnitude=Math.sqrt(n)},t.Vector.prototype.dot=function(t){for(var e=this.list,n=t.list,i=0;e&&n;)e.idx<n.idx?e=e.next:e.idx>n.idx?n=n.next:(i+=e.val*n.val,e=e.next,n=n.next);return i},t.Vector.prototype.similarity=function(t){return this.dot(t)/(this.magnitude()*t.magnitude())},t.SortedSet=function(){this.length=0,this.elements=[]},t.SortedSet.load=function(t){var e=new this;return e.elements=t,e.length=t.length,e},t.SortedSet.prototype.add=function(){var t,e;for(t=0;t<arguments.length;t++)e=arguments[t],~this.indexOf(e)||this.elements.splice(this.locationFor(e),0,e);this.length=this.elements.length},t.SortedSet.prototype.toArray=function(){return this.elements.slice()},t.SortedSet.prototype.map=function(t,e){return this.elements.map(t,e)},t.SortedSet.prototype.forEach=function(t,e){return this.elements.forEach(t,e)},t.SortedSet.prototype.indexOf=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;){if(o===t)return r;t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r]}return o===t?r:-1},t.SortedSet.prototype.locationFor=function(t){for(var e=0,n=this.elements.length,i=n-e,r=e+Math.floor(i/2),o=this.elements[r];i>1;)t>o&&(e=r),o>t&&(n=r),i=n-e,r=e+Math.floor(i/2),o=this.elements[r];return o>t?r:t>o?r+1:void 0},t.SortedSet.prototype.intersect=function(e){for(var n=new t.SortedSet,i=0,r=0,o=this.length,s=e.length,a=this.elements,h=e.elements;;){if(i>o-1||r>s-1)break;a[i]!==h[r]?a[i]<h[r]?i++:a[i]>h[r]&&r++:(n.add(a[i]),i++,r++)}return n},t.SortedSet.prototype.clone=function(){var e=new t.SortedSet;return e.elements=this.toArray(),e.length=e.elements.length,e},t.SortedSet.prototype.union=function(t){var e,n,i;return this.length>=t.length?(e=this,n=t):(e=t,n=this),i=e.clone(),i.add.apply(i,n.toArray()),i},t.SortedSet.prototype.toJSON=function(){return this.toArray()},t.Index=function(){this._fields=[],this._ref="id",this.pipeline=new t.Pipeline,this.documentStore=new t.Store,this.tokenStore=new t.TokenStore,this.corpusTokens=new t.SortedSet,this.eventEmitter=new t.EventEmitter,this._idfCache={},this.on("add","remove","update",function(){this._idfCache={}}.bind(this))},t.Index.prototype.on=function(){var t=Array.prototype.slice.call(arguments);return this.eventEmitter.addListener.apply(this.eventEmitter,t)},t.Index.prototype.off=function(t,e){return this.eventEmitter.removeListener(t,e)},t.Index.load=function(e){e.version!==t.version&&t.utils.warn("version mismatch: current "+t.version+" importing "+e.version);var n=new this;return n._fields=e.fields,n._ref=e.ref,n.documentStore=t.Store.load(e.documentStore),n.tokenStore=t.TokenStore.load(e.tokenStore),n.corpusTokens=t.SortedSet.load(e.corpusTokens),n.pipeline=t.Pipeline.load(e.pipeline),n},t.Index.prototype.field=function(t,e){var e=e||{},n={name:t,boost:e.boost||1};return this._fields.push(n),this},t.Index.prototype.ref=function(t){return this._ref=t,this},t.Index.prototype.add=function(e,n){var i={},r=new t.SortedSet,o=e[this._ref],n=void 0===n?!0:n;this._fields.forEach(function(n){var o=this.pipeline.run(t.tokenizer(e[n.name]));i[n.name]=o,t.SortedSet.prototype.add.apply(r,o)},this),this.documentStore.set(o,r),t.SortedSet.prototype.add.apply(this.corpusTokens,r.toArray());for(var s=0;s<r.length;s++){var a=r.elements[s],h=this._fields.reduce(function(t,e){var n=i[e.name].length;if(!n)return t;var r=i[e.name].filter(function(t){return t===a}).length;return t+r/n*e.boost},0);this.tokenStore.add(a,{ref:o,tf:h})}n&&this.eventEmitter.emit("add",e,this)},t.Index.prototype.remove=function(t,e){var n=t[this._ref],e=void 0===e?!0:e;if(this.documentStore.has(n)){var i=this.documentStore.get(n);this.documentStore.remove(n),i.forEach(function(t){this.tokenStore.remove(t,n)},this),e&&this.eventEmitter.emit("remove",t,this)}},t.Index.prototype.update=function(t,e){var e=void 0===e?!0:e;this.remove(t,!1),this.add(t,!1),e&&this.eventEmitter.emit("update",t,this)},t.Index.prototype.idf=function(t){var e="@"+t;if(Object.prototype.hasOwnProperty.call(this._idfCache,e))return this._idfCache[e];var n=this.tokenStore.count(t),i=1;return n>0&&(i=1+Math.log(this.documentStore.length/n)),this._idfCache[e]=i},t.Index.prototype.search=function(e){var n=this.pipeline.run(t.tokenizer(e)),i=new t.Vector,r=[],o=this._fields.reduce(function(t,e){return t+e.boost},0),s=n.some(function(t){return this.tokenStore.has(t)},this);if(!s)return[];n.forEach(function(e,n,s){var a=1/s.length*this._fields.length*o,h=this,u=this.tokenStore.expand(e).reduce(function(n,r){var o=h.corpusTokens.indexOf(r),s=h.idf(r),u=1,l=new t.SortedSet;if(r!==e){var c=Math.max(3,r.length-e.length);u=1/Math.log(c)}o>-1&&i.insert(o,a*s*u);for(var f=h.tokenStore.get(r),p=Object.keys(f),d=p.length,v=0;d>v;v++)l.add(f[p[v]].ref);return n.union(l)},new t.SortedSet);r.push(u)},this);var a=r.reduce(function(t,e){return t.intersect(e)});return a.map(function(t){return{ref:t,score:i.similarity(this.documentVector(t))}},this).sort(function(t,e){return e.score-t.score})},t.Index.prototype.documentVector=function(e){for(var n=this.documentStore.get(e),i=n.length,r=new t.Vector,o=0;i>o;o++){var s=n.elements[o],a=this.tokenStore.get(s)[e].tf,h=this.idf(s);r.insert(this.corpusTokens.indexOf(s),a*h)}return r},t.Index.prototype.toJSON=function(){return{version:t.version,fields:this._fields,ref:this._ref,documentStore:this.documentStore.toJSON(),tokenStore:this.tokenStore.toJSON(),corpusTokens:this.corpusTokens.toJSON(),pipeline:this.pipeline.toJSON()}},t.Index.prototype.use=function(t){var e=Array.prototype.slice.call(arguments,1);e.unshift(this),t.apply(this,e)},t.Store=function(){this.store={},this.length=0},t.Store.load=function(e){var n=new this;return n.length=e.length,n.store=Object.keys(e.store).reduce(function(n,i){return n[i]=t.SortedSet.load(e.store[i]),n},{}),n},t.Store.prototype.set=function(t,e){this.has(t)||this.length++,this.store[t]=e},t.Store.prototype.get=function(t){return this.store[t]},t.Store.prototype.has=function(t){return t in this.store},t.Store.prototype.remove=function(t){this.has(t)&&(delete this.store[t],this.length--)},t.Store.prototype.toJSON=function(){return{store:this.store,length:this.length}},t.stemmer=function(){var t={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},e={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",r=n+"[^aeiouy]*",o=i+"[aeiou]*",s="^("+r+")?"+o+r,a="^("+r+")?"+o+r+"("+o+")?$",h="^("+r+")?"+o+r+o+r,u="^("+r+")?"+i,l=new RegExp(s),c=new RegExp(h),f=new RegExp(a),p=new RegExp(u),d=/^(.+?)(ss|i)es$/,v=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,g=/^(.+?)(ed|ing)$/,y=/.$/,S=/(at|bl|iz)$/,w=new RegExp("([^aeiouylsz])\\1$"),x=new RegExp("^"+r+i+"[^aeiouwxy]$"),k=/^(.+?[^aeiou])y$/,b=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,E=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,_=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,F=/^(.+?)(s|t)(ion)$/,O=/^(.+?)e$/,P=/ll$/,N=new RegExp("^"+r+i+"[^aeiouwxy]$"),T=function(n){var i,r,o,s,a,h,u;if(n.length<3)return n;if(o=n.substr(0,1),"y"==o&&(n=o.toUpperCase()+n.substr(1)),s=d,a=v,s.test(n)?n=n.replace(s,"$1$2"):a.test(n)&&(n=n.replace(a,"$1$2")),s=m,a=g,s.test(n)){var T=s.exec(n);s=l,s.test(T[1])&&(s=y,n=n.replace(s,""))}else if(a.test(n)){var T=a.exec(n);i=T[1],a=p,a.test(i)&&(n=i,a=S,h=w,u=x,a.test(n)?n+="e":h.test(n)?(s=y,n=n.replace(s,"")):u.test(n)&&(n+="e"))}if(s=k,s.test(n)){var T=s.exec(n);i=T[1],n=i+"i"}if(s=b,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+t[r])}if(s=E,s.test(n)){var T=s.exec(n);i=T[1],r=T[2],s=l,s.test(i)&&(n=i+e[r])}if(s=_,a=F,s.test(n)){var T=s.exec(n);i=T[1],s=c,s.test(i)&&(n=i)}else if(a.test(n)){var T=a.exec(n);i=T[1]+T[2],a=c,a.test(i)&&(n=i)}if(s=O,s.test(n)){var T=s.exec(n);i=T[1],s=c,a=f,h=N,(s.test(i)||a.test(i)&&!h.test(i))&&(n=i)}return s=P,a=c,s.test(n)&&a.test(n)&&(s=y,n=n.replace(s,"")),"y"==o&&(n=o.toLowerCase()+n.substr(1)),n};return T}(),t.Pipeline.registerFunction(t.stemmer,"stemmer"),t.generateStopWordFilter=function(t){var e=t.reduce(function(t,e){return t[e]=e,t},{});return function(t){return t&&e[t]!==t?t:void 0}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter"),t.trimmer=function(t){return t.replace(/^\W+/,"").replace(/\W+$/,"")},t.Pipeline.registerFunction(t.trimmer,"trimmer"),t.TokenStore=function(){this.root={docs:{}},this.length=0},t.TokenStore.load=function(t){var e=new this;return e.root=t.root,e.length=t.length,e},t.TokenStore.prototype.add=function(t,e,n){var n=n||this.root,i=t.charAt(0),r=t.slice(1);return i in n||(n[i]={docs:{}}),0===r.length?(n[i].docs[e.ref]=e,void(this.length+=1)):this.add(r,e,n[i])},t.TokenStore.prototype.has=function(t){if(!t)return!1;for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return!1;e=e[t.charAt(n)]}return!0},t.TokenStore.prototype.getNode=function(t){if(!t)return{};for(var e=this.root,n=0;n<t.length;n++){if(!e[t.charAt(n)])return{};e=e[t.charAt(n)]}return e},t.TokenStore.prototype.get=function(t,e){return this.getNode(t,e).docs||{}},t.TokenStore.prototype.count=function(t,e){return Object.keys(this.get(t,e)).length},t.TokenStore.prototype.remove=function(t,e){if(t){for(var n=this.root,i=0;i<t.length;i++){if(!(t.charAt(i)in n))return;n=n[t.charAt(i)]}delete n.docs[e]}},t.TokenStore.prototype.expand=function(t,e){var n=this.getNode(t),i=n.docs||{},e=e||[];return Object.keys(i).length&&e.push(t),Object.keys(n).forEach(function(n){"docs"!==n&&e.concat(this.expand(t+n,e))},this),e},t.TokenStore.prototype.toJSON=function(){return{root:this.root,length:this.length}},function(t,e){"function"==typeof define&&define.amd?define(e):"object"==typeof exports?module.exports=e():t.lunr=e()}(this,function(){return t})}();
1
+ !function(){var e=function(t){var r=new e.Builder;return r.pipeline.add(e.trimmer,e.stopWordFilter,e.stemmer),r.searchPipeline.add(e.stemmer),t.call(r,r),r.build()};e.version="2.1.5",e.utils={},e.utils.warn=(t=this,function(e){t.console&&console.warn&&console.warn(e)});var t;e.utils.asString=function(e){return void 0===e||null===e?"":e.toString()},e.FieldRef=function(e,t,r){this.docRef=e,this.fieldName=t,this._stringValue=r},e.FieldRef.joiner="/",e.FieldRef.fromString=function(t){var r=t.indexOf(e.FieldRef.joiner);if(-1===r)throw"malformed field ref string";var i=t.slice(0,r),n=t.slice(r+1);return new e.FieldRef(n,i,t)},e.FieldRef.prototype.toString=function(){return void 0==this._stringValue&&(this._stringValue=this.fieldName+e.FieldRef.joiner+this.docRef),this._stringValue},e.idf=function(e,t){var r=0;for(var i in e)"_index"!=i&&(r+=Object.keys(e[i]).length);var n=(t-r+.5)/(r+.5);return Math.log(1+Math.abs(n))},e.Token=function(e,t){this.str=e||"",this.metadata=t||{}},e.Token.prototype.toString=function(){return this.str},e.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},e.Token.prototype.clone=function(t){return t=t||function(e){return e},new e.Token(t(this.str,this.metadata),this.metadata)},e.tokenizer=function(t){if(null==t||void 0==t)return[];if(Array.isArray(t))return t.map(function(t){return new e.Token(e.utils.asString(t).toLowerCase())});for(var r=t.toString().trim().toLowerCase(),i=r.length,n=[],s=0,o=0;s<=i;s++){var a=s-o;(r.charAt(s).match(e.tokenizer.separator)||s==i)&&(a>0&&n.push(new e.Token(r.slice(o,s),{position:[o,a],index:n.length})),o=s+1)}return n},e.tokenizer.separator=/[\s\-]+/,e.Pipeline=function(){this._stack=[]},e.Pipeline.registeredFunctions=Object.create(null),e.Pipeline.registerFunction=function(t,r){r in this.registeredFunctions&&e.utils.warn("Overwriting existing registered function: "+r),t.label=r,e.Pipeline.registeredFunctions[t.label]=t},e.Pipeline.warnIfFunctionNotRegistered=function(t){t.label&&t.label in this.registeredFunctions||e.utils.warn("Function is not registered with pipeline. This may cause problems when serialising the index.\n",t)},e.Pipeline.load=function(t){var r=new e.Pipeline;return t.forEach(function(t){var i=e.Pipeline.registeredFunctions[t];if(!i)throw new Error("Cannot load unregistered function: "+t);r.add(i)}),r},e.Pipeline.prototype.add=function(){Array.prototype.slice.call(arguments).forEach(function(t){e.Pipeline.warnIfFunctionNotRegistered(t),this._stack.push(t)},this)},e.Pipeline.prototype.after=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(-1==i)throw new Error("Cannot find existingFn");i+=1,this._stack.splice(i,0,r)},e.Pipeline.prototype.before=function(t,r){e.Pipeline.warnIfFunctionNotRegistered(r);var i=this._stack.indexOf(t);if(-1==i)throw new Error("Cannot find existingFn");this._stack.splice(i,0,r)},e.Pipeline.prototype.remove=function(e){var t=this._stack.indexOf(e);-1!=t&&this._stack.splice(t,1)},e.Pipeline.prototype.run=function(e){for(var t=this._stack.length,r=0;r<t;r++){var i=this._stack[r];e=e.reduce(function(t,r,n){var s=i(r,n,e);return void 0===s||""===s?t:t.concat(s)},[])}return e},e.Pipeline.prototype.runString=function(t){var r=new e.Token(t);return this.run([r]).map(function(e){return e.toString()})},e.Pipeline.prototype.reset=function(){this._stack=[]},e.Pipeline.prototype.toJSON=function(){return this._stack.map(function(t){return e.Pipeline.warnIfFunctionNotRegistered(t),t.label})},e.Vector=function(e){this._magnitude=0,this.elements=e||[]},e.Vector.prototype.positionForIndex=function(e){if(0==this.elements.length)return 0;for(var t=0,r=this.elements.length/2,i=r-t,n=Math.floor(i/2),s=this.elements[2*n];i>1&&(s<e&&(t=n),s>e&&(r=n),s!=e);)i=r-t,n=t+Math.floor(i/2),s=this.elements[2*n];return s==e?2*n:s>e?2*n:s<e?2*(n+1):void 0},e.Vector.prototype.insert=function(e,t){this.upsert(e,t,function(){throw"duplicate index"})},e.Vector.prototype.upsert=function(e,t,r){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=r(this.elements[i+1],t):this.elements.splice(i,0,e,t)},e.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,t=this.elements.length,r=1;r<t;r+=2){var i=this.elements[r];e+=i*i}return this._magnitude=Math.sqrt(e)},e.Vector.prototype.dot=function(e){for(var t=0,r=this.elements,i=e.elements,n=r.length,s=i.length,o=0,a=0,u=0,l=0;u<n&&l<s;)(o=r[u])<(a=i[l])?u+=2:o>a?l+=2:o==a&&(t+=r[u+1]*i[l+1],u+=2,l+=2);return t},e.Vector.prototype.similarity=function(e){return this.dot(e)/(this.magnitude()*e.magnitude())},e.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),t=1,r=0;t<this.elements.length;t+=2,r++)e[r]=this.elements[t];return e},e.Vector.prototype.toJSON=function(){return this.elements},e.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},t={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},r="[aeiouy]",i="[^aeiou][^aeiouy]*",n=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),s=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*[aeiouy][aeiou]*[^aeiou][^aeiouy]*"),o=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy][aeiou]*[^aeiou][^aeiouy]*([aeiouy][aeiou]*)?$"),a=new RegExp("^([^aeiou][^aeiouy]*)?[aeiouy]"),u=/^(.+?)(ss|i)es$/,l=/^(.+?)([^s])s$/,d=/^(.+?)eed$/,h=/^(.+?)(ed|ing)$/,c=/.$/,f=/(at|bl|iz)$/,p=new RegExp("([^aeiouylsz])\\1$"),y=new RegExp("^"+i+r+"[^aeiouwxy]$"),m=/^(.+?[^aeiou])y$/,g=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,v=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,x=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,w=/^(.+?)(s|t)(ion)$/,k=/^(.+?)e$/,Q=/ll$/,L=new RegExp("^"+i+r+"[^aeiouwxy]$"),T=function(r){var i,T,S,b,P,E,I;if(r.length<3)return r;if("y"==(S=r.substr(0,1))&&(r=S.toUpperCase()+r.substr(1)),P=l,(b=u).test(r)?r=r.replace(b,"$1$2"):P.test(r)&&(r=r.replace(P,"$1$2")),P=h,(b=d).test(r)){var O=b.exec(r);(b=n).test(O[1])&&(b=c,r=r.replace(b,""))}else if(P.test(r)){i=(O=P.exec(r))[1],(P=a).test(i)&&(E=p,I=y,(P=f).test(r=i)?r+="e":E.test(r)?(b=c,r=r.replace(b,"")):I.test(r)&&(r+="e"))}if((b=m).test(r)){r=(i=(O=b.exec(r))[1])+"i"}if((b=g).test(r)){i=(O=b.exec(r))[1],T=O[2],(b=n).test(i)&&(r=i+e[T])}if((b=v).test(r)){i=(O=b.exec(r))[1],T=O[2],(b=n).test(i)&&(r=i+t[T])}if(P=w,(b=x).test(r)){i=(O=b.exec(r))[1],(b=s).test(i)&&(r=i)}else if(P.test(r)){i=(O=P.exec(r))[1]+O[2],(P=s).test(i)&&(r=i)}if((b=k).test(r)){i=(O=b.exec(r))[1],P=o,E=L,((b=s).test(i)||P.test(i)&&!E.test(i))&&(r=i)}return P=s,(b=Q).test(r)&&P.test(r)&&(b=c,r=r.replace(b,"")),"y"==S&&(r=S.toLowerCase()+r.substr(1)),r};return function(e){return e.update(T)}}(),e.Pipeline.registerFunction(e.stemmer,"stemmer"),e.generateStopWordFilter=function(e){var t=e.reduce(function(e,t){return e[t]=t,e},{});return function(e){if(e&&t[e.toString()]!==e.toString())return e}},e.stopWordFilter=e.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),e.Pipeline.registerFunction(e.stopWordFilter,"stopWordFilter"),e.trimmer=function(e){return e.update(function(e){return e.replace(/^\W+/,"").replace(/\W+$/,"")})},e.Pipeline.registerFunction(e.trimmer,"trimmer"),e.TokenSet=function(){this.final=!1,this.edges={},this.id=e.TokenSet._nextId,e.TokenSet._nextId+=1},e.TokenSet._nextId=1,e.TokenSet.fromArray=function(t){for(var r=new e.TokenSet.Builder,i=0,n=t.length;i<n;i++)r.insert(t[i]);return r.finish(),r.root},e.TokenSet.fromClause=function(t){return"editDistance"in t?e.TokenSet.fromFuzzyString(t.term,t.editDistance):e.TokenSet.fromString(t.term)},e.TokenSet.fromFuzzyString=function(t,r){for(var i=new e.TokenSet,n=[{node:i,editsRemaining:r,str:t}];n.length;){var s=n.pop();if(s.str.length>0){var o;(a=s.str.charAt(0))in s.node.edges?o=s.node.edges[a]:(o=new e.TokenSet,s.node.edges[a]=o),1==s.str.length?o.final=!0:n.push({node:o,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining>0&&s.str.length>1){var a,u;(a=s.str.charAt(1))in s.node.edges?u=s.node.edges[a]:(u=new e.TokenSet,s.node.edges[a]=u),s.str.length<=2?u.final=!0:n.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str.slice(2)})}if(s.editsRemaining>0&&1==s.str.length&&(s.node.final=!0),s.editsRemaining>0&&s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{l=new e.TokenSet;s.node.edges["*"]=l}1==s.str.length?l.final=!0:n.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.editsRemaining>0){if("*"in s.node.edges)var d=s.node.edges["*"];else{d=new e.TokenSet;s.node.edges["*"]=d}0==s.str.length?d.final=!0:n.push({node:d,editsRemaining:s.editsRemaining-1,str:s.str})}if(s.editsRemaining>0&&s.str.length>1){var h,c=s.str.charAt(0),f=s.str.charAt(1);f in s.node.edges?h=s.node.edges[f]:(h=new e.TokenSet,s.node.edges[f]=h),1==s.str.length?h.final=!0:n.push({node:h,editsRemaining:s.editsRemaining-1,str:c+s.str.slice(2)})}}return i},e.TokenSet.fromString=function(t){for(var r=new e.TokenSet,i=r,n=!1,s=0,o=t.length;s<o;s++){var a=t[s],u=s==o-1;if("*"==a)n=!0,r.edges[a]=r,r.final=u;else{var l=new e.TokenSet;l.final=u,r.edges[a]=l,r=l,n&&(r.edges["*"]=i)}}return i},e.TokenSet.prototype.toArray=function(){for(var e=[],t=[{prefix:"",node:this}];t.length;){var r=t.pop(),i=Object.keys(r.node.edges),n=i.length;r.node.final&&e.push(r.prefix);for(var s=0;s<n;s++){var o=i[s];t.push({prefix:r.prefix.concat(o),node:r.node.edges[o]})}}return e},e.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",t=Object.keys(this.edges).sort(),r=t.length,i=0;i<r;i++){var n=t[i];e=e+n+this.edges[n].id}return e},e.TokenSet.prototype.intersect=function(t){for(var r=new e.TokenSet,i=void 0,n=[{qNode:t,output:r,node:this}];n.length;){i=n.pop();for(var s=Object.keys(i.qNode.edges),o=s.length,a=Object.keys(i.node.edges),u=a.length,l=0;l<o;l++)for(var d=s[l],h=0;h<u;h++){var c=a[h];if(c==d||"*"==d){var f=i.node.edges[c],p=i.qNode.edges[d],y=f.final&&p.final,m=void 0;c in i.output.edges?(m=i.output.edges[c]).final=m.final||y:((m=new e.TokenSet).final=y,i.output.edges[c]=m),n.push({qNode:p,output:m,node:f})}}}return r},e.TokenSet.Builder=function(){this.previousWord="",this.root=new e.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},e.TokenSet.Builder.prototype.insert=function(t){var r,i=0;if(t<this.previousWord)throw new Error("Out of order word insertion");for(var n=0;n<t.length&&n<this.previousWord.length&&t[n]==this.previousWord[n];n++)i++;this.minimize(i),r=0==this.uncheckedNodes.length?this.root:this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(n=i;n<t.length;n++){var s=new e.TokenSet,o=t[n];r.edges[o]=s,this.uncheckedNodes.push({parent:r,char:o,child:s}),r=s}r.final=!0,this.previousWord=t},e.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},e.TokenSet.Builder.prototype.minimize=function(e){for(var t=this.uncheckedNodes.length-1;t>=e;t--){var r=this.uncheckedNodes[t],i=r.child.toString();i in this.minimizedNodes?r.parent.edges[r.char]=this.minimizedNodes[i]:(r.child._str=i,this.minimizedNodes[i]=r.child),this.uncheckedNodes.pop()}},e.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},e.Index.prototype.search=function(t){return this.query(function(r){new e.QueryParser(t,r).parse()})},e.Index.prototype.query=function(t){var r=new e.Query(this.fields),i=Object.create(null),n=Object.create(null),s=Object.create(null);t.call(r,r);for(var o=0;o<r.clauses.length;o++){var a=r.clauses[o],u=null;u=a.usePipeline?this.pipeline.runString(a.term):[a.term];for(var l=0;l<u.length;l++){var d=u[l];a.term=d;for(var h=e.TokenSet.fromClause(a),c=this.tokenSet.intersect(h).toArray(),f=0;f<c.length;f++)for(var p=c[f],y=this.invertedIndex[p],m=y._index,g=0;g<a.fields.length;g++){var v=a.fields[g],x=y[v],w=Object.keys(x),k=p+"/"+v;if(void 0===n[v]&&(n[v]=new e.Vector),n[v].upsert(m,1*a.boost,function(e,t){return e+t}),!s[k]){for(var Q=0;Q<w.length;Q++){var L,T=w[Q],S=new e.FieldRef(T,v),b=x[T];void 0===(L=i[S])?i[S]=new e.MatchData(p,v,b):L.add(p,v,b)}s[k]=!0}}}}var P=Object.keys(i),E=[],I=Object.create(null);for(o=0;o<P.length;o++){var O,F=e.FieldRef.fromString(P[o]),R=F.docRef,_=this.fieldVectors[F],N=n[F.fieldName].similarity(_);if(void 0!==(O=I[R]))O.score+=N,O.matchData.combine(i[F]);else{var C={ref:R,score:N,matchData:i[F]};I[R]=C,E.push(C)}}return E.sort(function(e,t){return t.score-e.score})},e.Index.prototype.toJSON=function(){var t=Object.keys(this.invertedIndex).sort().map(function(e){return[e,this.invertedIndex[e]]},this),r=Object.keys(this.fieldVectors).map(function(e){return[e,this.fieldVectors[e].toJSON()]},this);return{version:e.version,fields:this.fields,fieldVectors:r,invertedIndex:t,pipeline:this.pipeline.toJSON()}},e.Index.load=function(t){var r={},i={},n=t.fieldVectors,s={},o=t.invertedIndex,a=new e.TokenSet.Builder,u=e.Pipeline.load(t.pipeline);t.version!=e.version&&e.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+e.version+"' does not match serialized index '"+t.version+"'");for(var l=0;l<n.length;l++){var d=(c=n[l])[0],h=c[1];i[d]=new e.Vector(h)}for(l=0;l<o.length;l++){var c,f=(c=o[l])[0],p=c[1];a.insert(f),s[f]=p}return a.finish(),r.fields=t.fields,r.fieldVectors=i,r.invertedIndex=s,r.tokenSet=a.root,r.pipeline=u,new e.Index(r)},e.Builder=function(){this._ref="id",this._fields=[],this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=e.tokenizer,this.pipeline=new e.Pipeline,this.searchPipeline=new e.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},e.Builder.prototype.ref=function(e){this._ref=e},e.Builder.prototype.field=function(e){this._fields.push(e)},e.Builder.prototype.b=function(e){this._b=e<0?0:e>1?1:e},e.Builder.prototype.k1=function(e){this._k1=e},e.Builder.prototype.add=function(t){var r=t[this._ref];this.documentCount+=1;for(var i=0;i<this._fields.length;i++){var n=this._fields[i],s=t[n],o=this.tokenizer(s),a=this.pipeline.run(o),u=new e.FieldRef(r,n),l=Object.create(null);this.fieldTermFrequencies[u]=l,this.fieldLengths[u]=0,this.fieldLengths[u]+=a.length;for(var d=0;d<a.length;d++){var h=a[d];if(void 0==l[h]&&(l[h]=0),l[h]+=1,void 0==this.invertedIndex[h]){var c=Object.create(null);c._index=this.termIndex,this.termIndex+=1;for(var f=0;f<this._fields.length;f++)c[this._fields[f]]=Object.create(null);this.invertedIndex[h]=c}void 0==this.invertedIndex[h][n][r]&&(this.invertedIndex[h][n][r]=Object.create(null));for(var p=0;p<this.metadataWhitelist.length;p++){var y=this.metadataWhitelist[p],m=h.metadata[y];void 0==this.invertedIndex[h][n][r][y]&&(this.invertedIndex[h][n][r][y]=[]),this.invertedIndex[h][n][r][y].push(m)}}}},e.Builder.prototype.calculateAverageFieldLengths=function(){for(var t=Object.keys(this.fieldLengths),r=t.length,i={},n={},s=0;s<r;s++){var o=e.FieldRef.fromString(t[s]);n[a=o.fieldName]||(n[a]=0),n[a]+=1,i[a]||(i[a]=0),i[a]+=this.fieldLengths[o]}for(s=0;s<this._fields.length;s++){var a;i[a=this._fields[s]]=i[a]/n[a]}this.averageFieldLength=i},e.Builder.prototype.createFieldVectors=function(){for(var t={},r=Object.keys(this.fieldTermFrequencies),i=r.length,n=Object.create(null),s=0;s<i;s++){for(var o=e.FieldRef.fromString(r[s]),a=o.fieldName,u=this.fieldLengths[o],l=new e.Vector,d=this.fieldTermFrequencies[o],h=Object.keys(d),c=h.length,f=0;f<c;f++){var p,y,m,g=h[f],v=d[g],x=this.invertedIndex[g]._index;void 0===n[g]?(p=e.idf(this.invertedIndex[g],this.documentCount),n[g]=p):p=n[g],y=p*((this._k1+1)*v)/(this._k1*(1-this._b+this._b*(u/this.averageFieldLength[a]))+v),m=Math.round(1e3*y)/1e3,l.insert(x,m)}t[o]=l}this.fieldVectors=t},e.Builder.prototype.createTokenSet=function(){this.tokenSet=e.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},e.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new e.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:this._fields,pipeline:this.searchPipeline})},e.Builder.prototype.use=function(e){var t=Array.prototype.slice.call(arguments,1);t.unshift(this),e.apply(this,t)},e.MatchData=function(e,t,r){for(var i=Object.create(null),n=Object.keys(r),s=0;s<n.length;s++){var o=n[s];i[o]=r[o].slice()}this.metadata=Object.create(null),this.metadata[e]=Object.create(null),this.metadata[e][t]=i},e.MatchData.prototype.combine=function(e){for(var t=Object.keys(e.metadata),r=0;r<t.length;r++){var i=t[r],n=Object.keys(e.metadata[i]);void 0==this.metadata[i]&&(this.metadata[i]=Object.create(null));for(var s=0;s<n.length;s++){var o=n[s],a=Object.keys(e.metadata[i][o]);void 0==this.metadata[i][o]&&(this.metadata[i][o]=Object.create(null));for(var u=0;u<a.length;u++){var l=a[u];void 0==this.metadata[i][o][l]?this.metadata[i][o][l]=e.metadata[i][o][l]:this.metadata[i][o][l]=this.metadata[i][o][l].concat(e.metadata[i][o][l])}}}},e.MatchData.prototype.add=function(e,t,r){if(!(e in this.metadata))return this.metadata[e]=Object.create(null),void(this.metadata[e][t]=r);if(t in this.metadata[e])for(var i=Object.keys(r),n=0;n<i.length;n++){var s=i[n];s in this.metadata[e][t]?this.metadata[e][t][s]=this.metadata[e][t][s].concat(r[s]):this.metadata[e][t][s]=r[s]}else this.metadata[e][t]=r},e.Query=function(e){this.clauses=[],this.allFields=e},e.Query.wildcard=new String("*"),e.Query.wildcard.NONE=0,e.Query.wildcard.LEADING=1,e.Query.wildcard.TRAILING=2,e.Query.prototype.clause=function(t){return"fields"in t||(t.fields=this.allFields),"boost"in t||(t.boost=1),"usePipeline"in t||(t.usePipeline=!0),"wildcard"in t||(t.wildcard=e.Query.wildcard.NONE),t.wildcard&e.Query.wildcard.LEADING&&t.term.charAt(0)!=e.Query.wildcard&&(t.term="*"+t.term),t.wildcard&e.Query.wildcard.TRAILING&&t.term.slice(-1)!=e.Query.wildcard&&(t.term=t.term+"*"),this.clauses.push(t),this},e.Query.prototype.term=function(e,t){var r=t||{};return r.term=e,this.clause(r),this},e.QueryParseError=function(e,t,r){this.name="QueryParseError",this.message=e,this.start=t,this.end=r},e.QueryParseError.prototype=new Error,e.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},e.QueryLexer.prototype.run=function(){for(var t=e.QueryLexer.lexText;t;)t=t(this)},e.QueryLexer.prototype.sliceString=function(){for(var e=[],t=this.start,r=this.pos,i=0;i<this.escapeCharPositions.length;i++)r=this.escapeCharPositions[i],e.push(this.str.slice(t,r)),t=r+1;return e.push(this.str.slice(t,this.pos)),this.escapeCharPositions.length=0,e.join("")},e.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},e.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},e.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return e.QueryLexer.EOS;var t=this.str.charAt(this.pos);return this.pos+=1,t},e.QueryLexer.prototype.width=function(){return this.pos-this.start},e.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},e.QueryLexer.prototype.backup=function(){this.pos-=1},e.QueryLexer.prototype.acceptDigitRun=function(){var t,r;do{r=(t=this.next()).charCodeAt(0)}while(r>47&&r<58);t!=e.QueryLexer.EOS&&this.backup()},e.QueryLexer.prototype.more=function(){return this.pos<this.length},e.QueryLexer.EOS="EOS",e.QueryLexer.FIELD="FIELD",e.QueryLexer.TERM="TERM",e.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",e.QueryLexer.BOOST="BOOST",e.QueryLexer.lexField=function(t){return t.backup(),t.emit(e.QueryLexer.FIELD),t.ignore(),e.QueryLexer.lexText},e.QueryLexer.lexTerm=function(t){if(t.width()>1&&(t.backup(),t.emit(e.QueryLexer.TERM)),t.ignore(),t.more())return e.QueryLexer.lexText},e.QueryLexer.lexEditDistance=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.EDIT_DISTANCE),e.QueryLexer.lexText},e.QueryLexer.lexBoost=function(t){return t.ignore(),t.acceptDigitRun(),t.emit(e.QueryLexer.BOOST),e.QueryLexer.lexText},e.QueryLexer.lexEOS=function(t){t.width()>0&&t.emit(e.QueryLexer.TERM)},e.QueryLexer.termSeparator=e.tokenizer.separator,e.QueryLexer.lexText=function(t){for(;;){var r=t.next();if(r==e.QueryLexer.EOS)return e.QueryLexer.lexEOS;if(92!=r.charCodeAt(0)){if(":"==r)return e.QueryLexer.lexField;if("~"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexEditDistance;if("^"==r)return t.backup(),t.width()>0&&t.emit(e.QueryLexer.TERM),e.QueryLexer.lexBoost;if(r.match(e.QueryLexer.termSeparator))return e.QueryLexer.lexTerm}else t.escapeCharacter()}},e.QueryParser=function(t,r){this.lexer=new e.QueryLexer(t),this.query=r,this.currentClause={},this.lexemeIdx=0},e.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var t=e.QueryParser.parseFieldOrTerm;t;)t=t(this);return this.query},e.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},e.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},e.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},e.QueryParser.parseFieldOrTerm=function(t){var r=t.peekLexeme();if(void 0!=r)switch(r.type){case e.QueryLexer.FIELD:return e.QueryParser.parseField;case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:var i="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(i+=" with value '"+r.str+"'"),new e.QueryParseError(i,r.start,r.end)}},e.QueryParser.parseField=function(t){var r=t.consumeLexeme();if(void 0!=r){if(-1==t.query.allFields.indexOf(r.str)){var i=t.query.allFields.map(function(e){return"'"+e+"'"}).join(", "),n="unrecognised field '"+r.str+"', possible fields: "+i;throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.fields=[r.str];var s=t.peekLexeme();if(void 0==s){n="expecting term, found nothing";throw new e.QueryParseError(n,r.start,r.end)}switch(s.type){case e.QueryLexer.TERM:return e.QueryParser.parseTerm;default:n="expecting term, found '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}}},e.QueryParser.parseTerm=function(t){var r=t.consumeLexeme();if(void 0!=r){t.currentClause.term=r.str.toLowerCase(),-1!=r.str.indexOf("*")&&(t.currentClause.usePipeline=!1);var i=t.peekLexeme();if(void 0!=i)switch(i.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:var n="Unexpected lexeme type '"+i.type+"'";throw new e.QueryParseError(n,i.start,i.end)}else t.nextClause()}},e.QueryParser.parseEditDistance=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="edit distance must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.editDistance=i;var s=t.peekLexeme();if(void 0!=s)switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}else t.nextClause()}},e.QueryParser.parseBoost=function(t){var r=t.consumeLexeme();if(void 0!=r){var i=parseInt(r.str,10);if(isNaN(i)){var n="boost must be numeric";throw new e.QueryParseError(n,r.start,r.end)}t.currentClause.boost=i;var s=t.peekLexeme();if(void 0!=s)switch(s.type){case e.QueryLexer.TERM:return t.nextClause(),e.QueryParser.parseTerm;case e.QueryLexer.FIELD:return t.nextClause(),e.QueryParser.parseField;case e.QueryLexer.EDIT_DISTANCE:return e.QueryParser.parseEditDistance;case e.QueryLexer.BOOST:return e.QueryParser.parseBoost;default:n="Unexpected lexeme type '"+s.type+"'";throw new e.QueryParseError(n,s.start,s.end)}else t.nextClause()}},r=this,i=function(){return e},"function"==typeof define&&define.amd?define(i):"object"==typeof exports?module.exports=i():r.lunr=i();var r,i}();
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require 'sass'
4
2
 
5
3
  module JekyllPagesApiSearch
@@ -14,13 +14,12 @@ function buildIndex(corpus, indexFields) {
14
14
  boost = indexFields[fieldName];
15
15
  this.field(fieldName, boost);
16
16
  }
17
- });
18
-
19
- corpus.entries.forEach(function(page) {
20
- if (page.skip_index !== true) {
21
- index.add(page);
22
- urlToDoc[page.url] = {url: page.url, title: page.title};
23
- }
17
+ corpus.entries.forEach(function(page) {
18
+ if (page.skip_index !== true) {
19
+ this.add(page);
20
+ urlToDoc[page.url] = {url: page.url, title: page.title};
21
+ }
22
+ }, this);
24
23
  });
25
24
 
26
25
  return JSON.stringify({
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require 'jekyll_pages_api'
4
2
  require 'json'
5
3
 
@@ -1,7 +1,7 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
1
+ require_relative './bundler'
3
2
  require_relative './compressor'
4
3
  require_relative './config'
4
+ require_relative './search_hook'
5
5
  require_relative './search_page'
6
6
  require_relative './search_page_layouts'
7
7
 
@@ -34,11 +34,13 @@ module Jekyll
34
34
  end
35
35
 
36
36
  def pages_api_search_after_write
37
- index = pages.find {|p| p.name == 'search-index.json'}
37
+ index = pages.find do |p|
38
+ p.name == JekyllPagesApiSearch::SearchIndexBuilder::INDEX_FILE
39
+ end
38
40
  raise 'Search index not found' if index.nil?
39
41
  JekyllPagesApiSearch::Compressor.gzip_in_memory_content(
40
42
  "#{index.destination self.dest}" => index.output)
41
- JekyllPagesApiSearch::Browserify.create_bundle(self)
43
+ JekyllPagesApiSearch::Bundler.create_search_bundles(self)
42
44
  end
43
45
  end
44
46
  end
@@ -18,6 +18,7 @@ module JekyllPagesApiSearch
18
18
  @base = LAYOUTS_DIR
19
19
  @name = "#{layout_name}.html"
20
20
  @path = File.join(@base, @name)
21
+ @relative_path = @path.sub(@base, '')
21
22
  parse_content_and_data(File.join(@base, name))
22
23
  process(name)
23
24
  end
@@ -1,21 +1,34 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require 'jekyll_pages_api'
4
2
  require 'safe_yaml'
5
3
 
6
4
  module JekyllPagesApiSearch
5
+ # This is a stand-in for a normal Jekyll::Site used only by the
6
+ # standalone.rb module in this directory, since the full Jekyll::Site would be
7
+ # too complex for this purpose.
7
8
  class Site
8
- attr_reader :source, :config
9
+ attr_reader :source, :dest, :config, :baseurl
9
10
  attr_accessor :pages
10
11
 
11
12
  def initialize(basedir, config)
12
13
  @source = basedir
14
+ @dest = basedir
13
15
  @config = SafeYAML.load_file(config, :safe => true)
16
+ @baseurl = @config['baseurl'] || '/'
14
17
  @pages = []
15
18
  end
16
19
 
17
- # TODO(mbland): comment on how a pages.json file can be transfered from
18
- # JekyllPagesApi::GeneratedSite
20
+ # Needed by Jekyll::Page.initialize().
21
+ def in_source_dir(*paths)
22
+ paths
23
+ end
24
+
25
+ # Needed by Jekyll::Page.initialize().
26
+ def in_theme_dir(*paths)
27
+ nil
28
+ end
29
+
30
+ # Adds an existing pages.json file (generated by jekyll_pages_api) to
31
+ # this site's `pages` collection.
19
32
  def load_pages_json(pages_json_path)
20
33
  basename = File.basename pages_json_path
21
34
  rel_dir = File.dirname pages_json_path
@@ -1,10 +1,26 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
1
+ require_relative './bundler'
3
2
  require_relative './compressor'
4
3
  require_relative './site'
5
4
  require 'fileutils'
6
5
  require 'jekyll_pages_api'
7
6
 
7
+ module JekyllPagesApi
8
+ # Reopens the existing JekyllPagesApi::GeneratedSite to add methods needed by
9
+ # Jekyll::Page.initialize().
10
+ #
11
+ # These are invoked via Standalone.generate_index() when using
12
+ # JekyllPagesApi::Generator to create a new `pages.json` file.
13
+ class GeneratedSite
14
+ def in_source_dir(*paths)
15
+ paths
16
+ end
17
+
18
+ def in_theme_dir(*paths)
19
+ nil
20
+ end
21
+ end
22
+ end
23
+
8
24
  module JekyllPagesApiSearch
9
25
  class Standalone
10
26
  def self.generate_index(basedir, config, pages_json, baseURL,
@@ -30,6 +46,7 @@ module JekyllPagesApiSearch
30
46
  File.open(outfile, 'w') {|f| f << content}
31
47
  end
32
48
  Compressor::gzip_in_memory_content output
49
+ Bundler::create_search_bundles(site)
33
50
  Assets::copy_to_basedir site.source
34
51
  end
35
52
  end
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  require_relative './config'
4
2
  require 'liquid'
5
3
 
@@ -34,8 +32,8 @@ module JekyllPagesApiSearch
34
32
  end
35
33
 
36
34
  def self.generate_script(baseurl, site: nil)
37
- "<script>JEKYLL_PAGES_API_SEARCH_BASEURL = '#{baseurl}';</script>\n" +
38
35
  site_bundle_load_tag(site, baseurl) +
36
+ "<script src=\"#{baseurl}/assets/js/search-constants.js\"></script>\n" +
39
37
  "<script async src=\"#{baseurl}/assets/js/search-bundle.js\">" +
40
38
  "</script>"
41
39
  end
@@ -1,5 +1,3 @@
1
- # @author Mike Bland (michael.bland@gsa.gov)
2
-
3
1
  module JekyllPagesApiSearch
4
- VERSION = '0.4.5'
2
+ VERSION = '0.5.0'
5
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: jekyll_pages_api_search
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.5
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Mike Bland
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-06-18 00:00:00.000000000 Z
11
+ date: 2018-01-01 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: jekyll_pages_api
@@ -139,15 +139,15 @@ dependencies:
139
139
  description: Contains a Jekyll plugin and associated files that facilitate adding
140
140
  client-side search features to a site using the jekyll_pages_api gem.
141
141
  email:
142
- - michael.bland@gsa.gov
142
+ - mbland@acm.org
143
143
  executables:
144
144
  - jekyll_pages_api_search
145
145
  extensions: []
146
146
  extra_rdoc_files: []
147
147
  files:
148
- - CONTRIBUTING.md
149
148
  - LICENSE.md
150
149
  - README.md
150
+ - assets/js/merge-options.js
151
151
  - assets/js/search-bundle.js
152
152
  - assets/js/search-bundle.js.gz
153
153
  - assets/js/search-engine.js
@@ -159,7 +159,7 @@ files:
159
159
  - lib/jekyll_pages_api_search.rb
160
160
  - lib/jekyll_pages_api_search/assets.rb
161
161
  - lib/jekyll_pages_api_search/browserify.js
162
- - lib/jekyll_pages_api_search/browserify.rb
162
+ - lib/jekyll_pages_api_search/bundler.rb
163
163
  - lib/jekyll_pages_api_search/compressor.rb
164
164
  - lib/jekyll_pages_api_search/config.rb
165
165
  - lib/jekyll_pages_api_search/generator.rb
@@ -177,9 +177,9 @@ files:
177
177
  - lib/jekyll_pages_api_search/standalone.rb
178
178
  - lib/jekyll_pages_api_search/tags.rb
179
179
  - lib/jekyll_pages_api_search/version.rb
180
- homepage: https://github.com/18F/jekyll_pages_api_search
180
+ homepage: https://github.com/mbland/jekyll_pages_api_search
181
181
  licenses:
182
- - CC0
182
+ - ISC
183
183
  metadata: {}
184
184
  post_install_message:
185
185
  rdoc_options: []
@@ -197,7 +197,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
197
197
  version: '0'
198
198
  requirements: []
199
199
  rubyforge_project:
200
- rubygems_version: 2.7.3
200
+ rubygems_version: 2.6.13
201
201
  signing_key:
202
202
  specification_version: 4
203
203
  summary: Adds lunr.js search based on the jekyll_pages_api gem
@@ -1,88 +0,0 @@
1
- ## Welcome!
2
-
3
- We're so glad you're thinking about contributing to an 18F open source project!
4
- If you're unsure or afraid of anything, just ask or submit the issue or pull
5
- request anyways. The worst that can happen is that you'll be politely asked to
6
- change something. We appreciate any sort of contribution, and don't want a wall
7
- of rules to get in the way of that.
8
-
9
- Before contributing, we encourage you to read our CONTRIBUTING policy (you are
10
- here), our LICENSE, and our README, all of which should be in this repository.
11
- If you have any questions, or want to read more about our underlying policies,
12
- you can consult the 18F Open Source Policy GitHub repository at
13
- https://github.com/18f/open-source-policy, or just shoot us an email/official
14
- government letterhead note to [18f@gsa.gov](mailto:18f@gsa.gov).
15
-
16
- ## Public domain
17
-
18
- This project is in the public domain within the United States, and
19
- copyright and related rights in the work worldwide are waived through
20
- the [CC0 1.0 Universal public domain dedication](https://creativecommons.org/publicdomain/zero/1.0/).
21
-
22
- All contributions to this project will be released under the CC0
23
- dedication. By submitting a pull request, you are agreeing to comply
24
- with this waiver of copyright interest.
25
-
26
- ## Starting work on an issue
27
-
28
- Issues that are marked with the `ready` label are ripe for the picking! Simply
29
- assign yourself to the issue to and change its label to `in progress` to
30
- indicate that you are working on it.
31
-
32
- If the issue involves writing code or producing some other change that will
33
- result in a pull request, begin by creating yourself a branch with a short
34
- descriptive name of the work that includes the issue number at the end, e.g.,
35
- `document-pr-process-#36`.
36
-
37
- **Note:** If you are not a part of the 18F Team, please fork the repository
38
- first and then create a branch for yourself with the same convention.
39
-
40
- Once your local branch is created, simply push it remotely and this will
41
- assign the issue to you and move it to be `in progress` automatically.
42
-
43
- ## Submitting a pull request and completing work
44
-
45
- When you are satisfied with your work and ready to submit it to be completed,
46
- please submit a pull request for review. If you haven't already, please
47
- follow the instructions above and create a branch for yourself first. Prior
48
- to submitting the pull request, please make note of the following:
49
-
50
- 1. Code changes should be accompanied by tests.
51
- 2. Please run the tests (`$ npm test`) and the linter
52
- (`$ npm run-script lint`) to make sure there are no regressions.
53
-
54
- Once everything is ready to go, [submit your pull request](https://help.github.com/articles/using-pull-requests/)!
55
- When creating a pull request please be sure to reference the issue number it
56
- is associated with, preferably in the title.
57
-
58
- If you are working in a branch off of the `18F/jekyll_pages_api_search` repo
59
- directly, you can reference the issue like this:
60
- `Closes #45: Short sentence describing the pull request`
61
-
62
- If you are working in a forked copy of the repo, please reference the issue
63
- like this:
64
- `Closes 18F/jekyll_pages_api_search#45: Short sentence describing the pull
65
- request`
66
-
67
- In both cases, please include a descriptive summary of the change in the body
68
- of the pull request as that will help greatly in reviewing the change and
69
- understanding what should be taking place inside of it.
70
-
71
- By referencing the issue in the pull request as noted above, this will
72
- automatically update the issue with a `needs review` label and notify the
73
- collaborators on the project that something is ready for a review. One of us
74
- will take a look as soon as we can and initiate the review process, provide
75
- feedback as necessary, and ultimately merge the change.
76
-
77
- Once the code is merged, the branch will be deleted and the `in review`
78
- label will be removed. The issue will be automatically updated again to be
79
- marked as Done and Closed.
80
-
81
- ## Performing a review of a pull request
82
-
83
- If you are performing a review of a pull request please add the `in review`
84
- label to the pull request and be sure keep the `needs review` label
85
- associated with it. This will help keep our Waffle board up-to-date and
86
- reflect that the pull request is being actively reviewed. Also, please
87
- assign yourself so others know who the primary reviewer is.
88
-