-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcomponent---src-pages-search-jsx-9ef45c8413248ee09a04.js.map
1 lines (1 loc) · 109 KB
/
component---src-pages-search-jsx-9ef45c8413248ee09a04.js.map
1
{"version":3,"file":"component---src-pages-search-jsx-9ef45c8413248ee09a04.js","mappings":"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","sources":["webpack://unittestbot-web/./node_modules/elasticlunr/elasticlunr.js","webpack://unittestbot-web/./node_modules/react-bootstrap/esm/divWithClassName.js","webpack://unittestbot-web/./node_modules/react-bootstrap/esm/CardImg.js","webpack://unittestbot-web/./node_modules/react-bootstrap/esm/Card.js","webpack://unittestbot-web/./src/components/search/SearchListElement.jsx","webpack://unittestbot-web/./src/components/search/SearchResultsList.jsx","webpack://unittestbot-web/./src/pages/search.jsx"],"sourcesContent":["/**\n * elasticlunr - http://weixsong.github.io\n * Lightweight full-text search engine in Javascript for browser search and offline search. - 0.9.5\n *\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n * MIT Licensed\n * @license\n */\n\n(function () {\n /*!\n * elasticlunr.js\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * Convenience function for instantiating a new elasticlunr index and configuring it\n * with the default pipeline functions and the passed config function.\n *\n * When using this convenience function a new index will be created with the\n * following functions already in the pipeline:\n * \n * 1. elasticlunr.trimmer - trim non-word character\n * 2. elasticlunr.StopWordFilter - filters out any stop words before they enter the\n * index\n * 3. elasticlunr.stemmer - stems the tokens before entering the index.\n *\n *\n * Example:\n *\n * var idx = elasticlunr(function () {\n * this.addField('id');\n * this.addField('title');\n * this.addField('body');\n * \n * //this.setRef('id'); // default ref is 'id'\n *\n * this.pipeline.add(function () {\n * // some custom pipeline function\n * });\n * });\n * \n * idx.addDoc({\n * id: 1, \n * title: 'Oracle released database 12g',\n * body: 'Yestaday, Oracle has released their latest database, named 12g, more robust. this product will increase Oracle profit.'\n * });\n * \n * idx.addDoc({\n * id: 2, \n * title: 'Oracle released annual profit report',\n * body: 'Yestaday, Oracle has released their annual profit report of 2015, total profit is 12.5 Billion.'\n * });\n * \n * # simple search\n * idx.search('oracle database');\n * \n * # search with query-time boosting\n * idx.search('oracle database', {fields: {title: {boost: 2}, body: {boost: 1}}});\n *\n * @param {Function} config A function that will be called with the new instance\n * of the elasticlunr.Index as both its context and first parameter. It can be used to\n * customize the instance of new elasticlunr.Index.\n * @namespace\n * @module\n * @return {elasticlunr.Index}\n *\n */\n var elasticlunr = function elasticlunr(config) {\n var idx = new elasticlunr.Index();\n idx.pipeline.add(elasticlunr.trimmer, elasticlunr.stopWordFilter, elasticlunr.stemmer);\n if (config) config.call(idx, idx);\n return idx;\n };\n elasticlunr.version = \"0.9.5\";\n\n // only used this to make elasticlunr.js compatible with lunr-languages\n // this is a trick to define a global alias of elasticlunr\n lunr = elasticlunr;\n\n /*!\n * elasticlunr.utils\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * A namespace containing utils for the rest of the elasticlunr library\n */\n elasticlunr.utils = {};\n\n /**\n * Print a warning message to the console.\n *\n * @param {String} message The message to be printed.\n * @memberOf Utils\n */\n elasticlunr.utils.warn = function (global) {\n return function (message) {\n if (global.console && console.warn) {\n console.warn(message);\n }\n };\n }(this);\n\n /**\n * Convert an object to string.\n *\n * In the case of `null` and `undefined` the function returns\n * an empty string, in all other cases the result of calling\n * `toString` on the passed object is returned.\n *\n * @param {object} obj The object to convert to a string.\n * @return {String} string representation of the passed object.\n * @memberOf Utils\n */\n elasticlunr.utils.toString = function (obj) {\n if (obj === void 0 || obj === null) {\n return \"\";\n }\n return obj.toString();\n };\n /*!\n * elasticlunr.EventEmitter\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.EventEmitter is an event emitter for elasticlunr.\n * It manages adding and removing event handlers and triggering events and their handlers.\n *\n * Each event could has multiple corresponding functions,\n * these functions will be called as the sequence that they are added into the event.\n * \n * @constructor\n */\n elasticlunr.EventEmitter = function () {\n this.events = {};\n };\n\n /**\n * Binds a handler function to a specific event(s).\n *\n * Can bind a single function to many different events in one call.\n *\n * @param {String} [eventName] The name(s) of events to bind this function to.\n * @param {Function} fn The function to call when an event is fired.\n * @memberOf EventEmitter\n */\n elasticlunr.EventEmitter.prototype.addListener = function () {\n var args = Array.prototype.slice.call(arguments),\n fn = args.pop(),\n names = args;\n if (typeof fn !== \"function\") throw new TypeError(\"last argument must be a function\");\n names.forEach(function (name) {\n if (!this.hasHandler(name)) this.events[name] = [];\n this.events[name].push(fn);\n }, this);\n };\n\n /**\n * Removes a handler function from a specific event.\n *\n * @param {String} eventName The name of the event to remove this function from.\n * @param {Function} fn The function to remove from an event.\n * @memberOf EventEmitter\n */\n elasticlunr.EventEmitter.prototype.removeListener = function (name, fn) {\n if (!this.hasHandler(name)) return;\n var fnIndex = this.events[name].indexOf(fn);\n if (fnIndex === -1) return;\n this.events[name].splice(fnIndex, 1);\n if (this.events[name].length == 0) delete this.events[name];\n };\n\n /**\n * Call all functions that bounded to the given event.\n *\n * Additional data can be passed to the event handler as arguments to `emit`\n * after the event name.\n *\n * @param {String} eventName The name of the event to emit.\n * @memberOf EventEmitter\n */\n elasticlunr.EventEmitter.prototype.emit = function (name) {\n if (!this.hasHandler(name)) return;\n var args = Array.prototype.slice.call(arguments, 1);\n this.events[name].forEach(function (fn) {\n fn.apply(undefined, args);\n }, this);\n };\n\n /**\n * Checks whether a handler has ever been stored against an event.\n *\n * @param {String} eventName The name of the event to check.\n * @private\n * @memberOf EventEmitter\n */\n elasticlunr.EventEmitter.prototype.hasHandler = function (name) {\n return name in this.events;\n };\n /*!\n * elasticlunr.tokenizer\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * A function for splitting a string into tokens.\n * Currently English is supported as default.\n * Uses `elasticlunr.tokenizer.seperator` to split strings, you could change\n * the value of this property to set how you want strings are split into tokens.\n * IMPORTANT: use elasticlunr.tokenizer.seperator carefully, if you are not familiar with\n * text process, then you'd better not change it.\n *\n * @module\n * @param {String} str The string that you want to tokenize.\n * @see elasticlunr.tokenizer.seperator\n * @return {Array}\n */\n elasticlunr.tokenizer = function (str) {\n if (!arguments.length || str === null || str === undefined) return [];\n if (Array.isArray(str)) {\n var arr = str.filter(function (token) {\n if (token === null || token === undefined) {\n return false;\n }\n return true;\n });\n arr = arr.map(function (t) {\n return elasticlunr.utils.toString(t).toLowerCase();\n });\n var out = [];\n arr.forEach(function (item) {\n var tokens = item.split(elasticlunr.tokenizer.seperator);\n out = out.concat(tokens);\n }, this);\n return out;\n }\n return str.toString().trim().toLowerCase().split(elasticlunr.tokenizer.seperator);\n };\n\n /**\n * Default string seperator.\n */\n elasticlunr.tokenizer.defaultSeperator = /[\\s\\-]+/;\n\n /**\n * The sperator used to split a string into tokens. Override this property to change the behaviour of\n * `elasticlunr.tokenizer` behaviour when tokenizing strings. By default this splits on whitespace and hyphens.\n *\n * @static\n * @see elasticlunr.tokenizer\n */\n elasticlunr.tokenizer.seperator = elasticlunr.tokenizer.defaultSeperator;\n\n /**\n * Set up customized string seperator\n *\n * @param {Object} sep The customized seperator that you want to use to tokenize a string.\n */\n elasticlunr.tokenizer.setSeperator = function (sep) {\n if (sep !== null && sep !== undefined && typeof sep === 'object') {\n elasticlunr.tokenizer.seperator = sep;\n }\n };\n\n /**\n * Reset string seperator\n *\n */\n elasticlunr.tokenizer.resetSeperator = function () {\n elasticlunr.tokenizer.seperator = elasticlunr.tokenizer.defaultSeperator;\n };\n\n /**\n * Get string seperator\n *\n */\n elasticlunr.tokenizer.getSeperator = function () {\n return elasticlunr.tokenizer.seperator;\n };\n /*!\n * elasticlunr.Pipeline\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.Pipelines maintain an ordered list of functions to be applied to \n * both documents tokens and query tokens.\n *\n * An instance of elasticlunr.Index will contain a pipeline\n * with a trimmer, a stop word filter, an English stemmer. Extra\n * functions can be added before or after either of these functions or these\n * default functions can be removed.\n *\n * When run the pipeline, it will call each function in turn.\n *\n * The output of the functions in the pipeline will be passed to the next function\n * in the pipeline. To exclude a token from entering the index the function\n * should return undefined, the rest of the pipeline will not be called with\n * this token.\n *\n * For serialisation of pipelines to work, all functions used in an instance of\n * a pipeline should be registered with elasticlunr.Pipeline. Registered functions can\n * then be loaded. If trying to load a serialised pipeline that uses functions\n * that are not registered an error will be thrown.\n *\n * If not planning on serialising the pipeline then registering pipeline functions\n * is not necessary.\n *\n * @constructor\n */\n elasticlunr.Pipeline = function () {\n this._queue = [];\n };\n elasticlunr.Pipeline.registeredFunctions = {};\n\n /**\n * Register a function in the pipeline.\n *\n * Functions that are used in the pipeline should be registered if the pipeline\n * needs to be serialised, or a serialised pipeline needs to be loaded.\n *\n * Registering a function does not add it to a pipeline, functions must still be\n * added to instances of the pipeline for them to be used when running a pipeline.\n *\n * @param {Function} fn The function to register.\n * @param {String} label The label to register this function with\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.registerFunction = function (fn, label) {\n if (label in elasticlunr.Pipeline.registeredFunctions) {\n elasticlunr.utils.warn('Overwriting existing registered function: ' + label);\n }\n fn.label = label;\n elasticlunr.Pipeline.registeredFunctions[label] = fn;\n };\n\n /**\n * Get a registered function in the pipeline.\n *\n * @param {String} label The label of registered function.\n * @return {Function}\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.getRegisteredFunction = function (label) {\n if (label in elasticlunr.Pipeline.registeredFunctions !== true) {\n return null;\n }\n return elasticlunr.Pipeline.registeredFunctions[label];\n };\n\n /**\n * Warns if the function is not registered as a Pipeline function.\n *\n * @param {Function} fn The function to check for.\n * @private\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.warnIfFunctionNotRegistered = function (fn) {\n var isRegistered = fn.label && fn.label in this.registeredFunctions;\n if (!isRegistered) {\n elasticlunr.utils.warn('Function is not registered with pipeline. This may cause problems when serialising the index.\\n', fn);\n }\n };\n\n /**\n * Loads a previously serialised pipeline.\n *\n * All functions to be loaded must already be registered with elasticlunr.Pipeline.\n * If any function from the serialised data has not been registered then an\n * error will be thrown.\n *\n * @param {Object} serialised The serialised pipeline to load.\n * @return {elasticlunr.Pipeline}\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.load = function (serialised) {\n var pipeline = new elasticlunr.Pipeline();\n serialised.forEach(function (fnName) {\n var fn = elasticlunr.Pipeline.getRegisteredFunction(fnName);\n if (fn) {\n pipeline.add(fn);\n } else {\n throw new Error('Cannot load un-registered function: ' + fnName);\n }\n });\n return pipeline;\n };\n\n /**\n * Adds new functions to the end of the pipeline.\n *\n * Logs a warning if the function has not been registered.\n *\n * @param {Function} functions Any number of functions to add to the pipeline.\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.add = function () {\n var fns = Array.prototype.slice.call(arguments);\n fns.forEach(function (fn) {\n elasticlunr.Pipeline.warnIfFunctionNotRegistered(fn);\n this._queue.push(fn);\n }, this);\n };\n\n /**\n * Adds a single function after a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n * If existingFn is not found, throw an Exception.\n *\n * @param {Function} existingFn A function that already exists in the pipeline.\n * @param {Function} newFn The new function to add to the pipeline.\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.after = function (existingFn, newFn) {\n elasticlunr.Pipeline.warnIfFunctionNotRegistered(newFn);\n var pos = this._queue.indexOf(existingFn);\n if (pos === -1) {\n throw new Error('Cannot find existingFn');\n }\n this._queue.splice(pos + 1, 0, newFn);\n };\n\n /**\n * Adds a single function before a function that already exists in the\n * pipeline.\n *\n * Logs a warning if the function has not been registered.\n * If existingFn is not found, throw an Exception.\n *\n * @param {Function} existingFn A function that already exists in the pipeline.\n * @param {Function} newFn The new function to add to the pipeline.\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.before = function (existingFn, newFn) {\n elasticlunr.Pipeline.warnIfFunctionNotRegistered(newFn);\n var pos = this._queue.indexOf(existingFn);\n if (pos === -1) {\n throw new Error('Cannot find existingFn');\n }\n this._queue.splice(pos, 0, newFn);\n };\n\n /**\n * Removes a function from the pipeline.\n *\n * @param {Function} fn The function to remove from the pipeline.\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.remove = function (fn) {\n var pos = this._queue.indexOf(fn);\n if (pos === -1) {\n return;\n }\n this._queue.splice(pos, 1);\n };\n\n /**\n * Runs the current list of functions that registered in the pipeline against the\n * input tokens.\n *\n * @param {Array} tokens The tokens to run through the pipeline.\n * @return {Array}\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.run = function (tokens) {\n var out = [],\n tokenLength = tokens.length,\n pipelineLength = this._queue.length;\n for (var i = 0; i < tokenLength; i++) {\n var token = tokens[i];\n for (var j = 0; j < pipelineLength; j++) {\n token = this._queue[j](token, i, tokens);\n if (token === void 0 || token === null) break;\n }\n ;\n if (token !== void 0 && token !== null) out.push(token);\n }\n ;\n return out;\n };\n\n /**\n * Resets the pipeline by removing any existing processors.\n *\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.reset = function () {\n this._queue = [];\n };\n\n /**\n * Get the pipeline if user want to check the pipeline.\n *\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.get = function () {\n return this._queue;\n };\n\n /**\n * Returns a representation of the pipeline ready for serialisation.\n * Only serialize pipeline function's name. Not storing function, so when\n * loading the archived JSON index file, corresponding pipeline function is \n * added by registered function of elasticlunr.Pipeline.registeredFunctions\n *\n * Logs a warning if the function has not been registered.\n *\n * @return {Array}\n * @memberOf Pipeline\n */\n elasticlunr.Pipeline.prototype.toJSON = function () {\n return this._queue.map(function (fn) {\n elasticlunr.Pipeline.warnIfFunctionNotRegistered(fn);\n return fn.label;\n });\n };\n /*!\n * elasticlunr.Index\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.Index is object that manages a search index. It contains the indexes\n * and stores all the tokens and document lookups. It also provides the main\n * user facing API for the library.\n *\n * @constructor\n */\n elasticlunr.Index = function () {\n this._fields = [];\n this._ref = 'id';\n this.pipeline = new elasticlunr.Pipeline();\n this.documentStore = new elasticlunr.DocumentStore();\n this.index = {};\n this.eventEmitter = new elasticlunr.EventEmitter();\n this._idfCache = {};\n this.on('add', 'remove', 'update', function () {\n this._idfCache = {};\n }.bind(this));\n };\n\n /**\n * Bind a handler to events being emitted by the index.\n *\n * The handler can be bound to many events at the same time.\n *\n * @param {String} [eventName] The name(s) of events to bind the function to.\n * @param {Function} fn The serialised set to load.\n * @memberOf Index\n */\n elasticlunr.Index.prototype.on = function () {\n var args = Array.prototype.slice.call(arguments);\n return this.eventEmitter.addListener.apply(this.eventEmitter, args);\n };\n\n /**\n * Removes a handler from an event being emitted by the index.\n *\n * @param {String} eventName The name of events to remove the function from.\n * @param {Function} fn The serialised set to load.\n * @memberOf Index\n */\n elasticlunr.Index.prototype.off = function (name, fn) {\n return this.eventEmitter.removeListener(name, fn);\n };\n\n /**\n * Loads a previously serialised index.\n *\n * Issues a warning if the index being imported was serialised\n * by a different version of elasticlunr.\n *\n * @param {Object} serialisedData The serialised set to load.\n * @return {elasticlunr.Index}\n * @memberOf Index\n */\n elasticlunr.Index.load = function (serialisedData) {\n if (serialisedData.version !== elasticlunr.version) {\n elasticlunr.utils.warn('version mismatch: current ' + elasticlunr.version + ' importing ' + serialisedData.version);\n }\n var idx = new this();\n idx._fields = serialisedData.fields;\n idx._ref = serialisedData.ref;\n idx.documentStore = elasticlunr.DocumentStore.load(serialisedData.documentStore);\n idx.pipeline = elasticlunr.Pipeline.load(serialisedData.pipeline);\n idx.index = {};\n for (var field in serialisedData.index) {\n idx.index[field] = elasticlunr.InvertedIndex.load(serialisedData.index[field]);\n }\n return idx;\n };\n\n /**\n * Adds a field to the list of fields that will be searchable within documents in the index.\n *\n * Remember that inner index is build based on field, which means each field has one inverted index.\n *\n * Fields should be added before any documents are added to the index, fields\n * that are added after documents are added to the index will only apply to new\n * documents added to the index.\n *\n * @param {String} fieldName The name of the field within the document that should be indexed\n * @return {elasticlunr.Index}\n * @memberOf Index\n */\n elasticlunr.Index.prototype.addField = function (fieldName) {\n this._fields.push(fieldName);\n this.index[fieldName] = new elasticlunr.InvertedIndex();\n return this;\n };\n\n /**\n * Sets the property used to uniquely identify documents added to the index,\n * by default this property is 'id'.\n *\n * This should only be changed before adding documents to the index, changing\n * the ref property without resetting the index can lead to unexpected results.\n *\n * @param {String} refName The property to use to uniquely identify the\n * documents in the index.\n * @param {Boolean} emitEvent Whether to emit add events, defaults to true\n * @return {elasticlunr.Index}\n * @memberOf Index\n */\n elasticlunr.Index.prototype.setRef = function (refName) {\n this._ref = refName;\n return this;\n };\n\n /**\n *\n * Set if the JSON format original documents are save into elasticlunr.DocumentStore\n *\n * Defaultly save all the original JSON documents.\n *\n * @param {Boolean} save Whether to save the original JSON documents.\n * @return {elasticlunr.Index}\n * @memberOf Index\n */\n elasticlunr.Index.prototype.saveDocument = function (save) {\n this.documentStore = new elasticlunr.DocumentStore(save);\n return this;\n };\n\n /**\n * Add a JSON format document to the index.\n *\n * This is the way new documents enter the index, this function will run the\n * fields from the document through the index's pipeline and then add it to\n * the index, it will then show up in search results.\n *\n * An 'add' event is emitted with the document that has been added and the index\n * the document has been added to. This event can be silenced by passing false\n * as the second argument to add.\n *\n * @param {Object} doc The JSON format document to add to the index.\n * @param {Boolean} emitEvent Whether or not to emit events, default true.\n * @memberOf Index\n */\n elasticlunr.Index.prototype.addDoc = function (doc, emitEvent) {\n if (!doc) return;\n var emitEvent = emitEvent === undefined ? true : emitEvent;\n var docRef = doc[this._ref];\n this.documentStore.addDoc(docRef, doc);\n this._fields.forEach(function (field) {\n var fieldTokens = this.pipeline.run(elasticlunr.tokenizer(doc[field]));\n this.documentStore.addFieldLength(docRef, field, fieldTokens.length);\n var tokenCount = {};\n fieldTokens.forEach(function (token) {\n if (token in tokenCount) tokenCount[token] += 1;else tokenCount[token] = 1;\n }, this);\n for (var token in tokenCount) {\n var termFrequency = tokenCount[token];\n termFrequency = Math.sqrt(termFrequency);\n this.index[field].addToken(token, {\n ref: docRef,\n tf: termFrequency\n });\n }\n }, this);\n if (emitEvent) this.eventEmitter.emit('add', doc, this);\n };\n\n /**\n * Removes a document from the index by doc ref.\n *\n * To make sure documents no longer show up in search results they can be\n * removed from the index using this method.\n *\n * A 'remove' event is emitted with the document that has been removed and the index\n * the document has been removed from. This event can be silenced by passing false\n * as the second argument to remove.\n *\n * If user setting DocumentStore not storing the documents, then remove doc by docRef is not allowed.\n *\n * @param {String|Integer} docRef The document ref to remove from the index.\n * @param {Boolean} emitEvent Whether to emit remove events, defaults to true\n * @memberOf Index\n */\n elasticlunr.Index.prototype.removeDocByRef = function (docRef, emitEvent) {\n if (!docRef) return;\n if (this.documentStore.isDocStored() === false) {\n return;\n }\n if (!this.documentStore.hasDoc(docRef)) return;\n var doc = this.documentStore.getDoc(docRef);\n this.removeDoc(doc, false);\n };\n\n /**\n * Removes a document from the index.\n * This remove operation could work even the original doc is not store in the DocumentStore.\n *\n * To make sure documents no longer show up in search results they can be\n * removed from the index using this method.\n *\n * A 'remove' event is emitted with the document that has been removed and the index\n * the document has been removed from. This event can be silenced by passing false\n * as the second argument to remove.\n *\n *\n * @param {Object} doc The document ref to remove from the index.\n * @param {Boolean} emitEvent Whether to emit remove events, defaults to true\n * @memberOf Index\n */\n elasticlunr.Index.prototype.removeDoc = function (doc, emitEvent) {\n if (!doc) return;\n var emitEvent = emitEvent === undefined ? true : emitEvent;\n var docRef = doc[this._ref];\n if (!this.documentStore.hasDoc(docRef)) return;\n this.documentStore.removeDoc(docRef);\n this._fields.forEach(function (field) {\n var fieldTokens = this.pipeline.run(elasticlunr.tokenizer(doc[field]));\n fieldTokens.forEach(function (token) {\n this.index[field].removeToken(token, docRef);\n }, this);\n }, this);\n if (emitEvent) this.eventEmitter.emit('remove', doc, this);\n };\n\n /**\n * Updates a document in the index.\n *\n * When a document contained within the index gets updated, fields changed,\n * added or removed, to make sure it correctly matched against search queries,\n * it should be updated in the index.\n *\n * This method is just a wrapper around `remove` and `add`\n *\n * An 'update' event is emitted with the document that has been updated and the index.\n * This event can be silenced by passing false as the second argument to update. Only\n * an update event will be fired, the 'add' and 'remove' events of the underlying calls\n * are silenced.\n *\n * @param {Object} doc The document to update in the index.\n * @param {Boolean} emitEvent Whether to emit update events, defaults to true\n * @see Index.prototype.remove\n * @see Index.prototype.add\n * @memberOf Index\n */\n elasticlunr.Index.prototype.updateDoc = function (doc, emitEvent) {\n var emitEvent = emitEvent === undefined ? true : emitEvent;\n this.removeDocByRef(doc[this._ref], false);\n this.addDoc(doc, false);\n if (emitEvent) this.eventEmitter.emit('update', doc, this);\n };\n\n /**\n * Calculates the inverse document frequency for a token within the index of a field.\n *\n * @param {String} token The token to calculate the idf of.\n * @param {String} field The field to compute idf.\n * @see Index.prototype.idf\n * @private\n * @memberOf Index\n */\n elasticlunr.Index.prototype.idf = function (term, field) {\n var cacheKey = \"@\" + field + '/' + term;\n if (Object.prototype.hasOwnProperty.call(this._idfCache, cacheKey)) return this._idfCache[cacheKey];\n var df = this.index[field].getDocFreq(term);\n var idf = 1 + Math.log(this.documentStore.length / (df + 1));\n this._idfCache[cacheKey] = idf;\n return idf;\n };\n\n /**\n * get fields of current index instance\n *\n * @return {Array}\n */\n elasticlunr.Index.prototype.getFields = function () {\n return this._fields.slice();\n };\n\n /**\n * Searches the index using the passed query.\n * Queries should be a string, multiple words are allowed.\n *\n * If config is null, will search all fields defaultly, and lead to OR based query.\n * If config is specified, will search specified with query time boosting.\n *\n * All query tokens are passed through the same pipeline that document tokens\n * are passed through, so any language processing involved will be run on every\n * query term.\n *\n * Each query term is expanded, so that the term 'he' might be expanded to\n * 'hello' and 'help' if those terms were already included in the index.\n *\n * Matching documents are returned as an array of objects, each object contains\n * the matching document ref, as set for this index, and the similarity score\n * for this document against the query.\n *\n * @param {String} query The query to search the index with.\n * @param {JSON} userConfig The user query config, JSON format.\n * @return {Object}\n * @see Index.prototype.idf\n * @see Index.prototype.documentVector\n * @memberOf Index\n */\n elasticlunr.Index.prototype.search = function (query, userConfig) {\n if (!query) return [];\n var configStr = null;\n if (userConfig != null) {\n configStr = JSON.stringify(userConfig);\n }\n var config = new elasticlunr.Configuration(configStr, this.getFields()).get();\n var queryTokens = this.pipeline.run(elasticlunr.tokenizer(query));\n var queryResults = {};\n for (var field in config) {\n var fieldSearchResults = this.fieldSearch(queryTokens, field, config);\n var fieldBoost = config[field].boost;\n for (var docRef in fieldSearchResults) {\n fieldSearchResults[docRef] = fieldSearchResults[docRef] * fieldBoost;\n }\n for (var docRef in fieldSearchResults) {\n if (docRef in queryResults) {\n queryResults[docRef] += fieldSearchResults[docRef];\n } else {\n queryResults[docRef] = fieldSearchResults[docRef];\n }\n }\n }\n var results = [];\n for (var docRef in queryResults) {\n results.push({\n ref: docRef,\n score: queryResults[docRef]\n });\n }\n results.sort(function (a, b) {\n return b.score - a.score;\n });\n return results;\n };\n\n /**\n * search queryTokens in specified field.\n *\n * @param {Array} queryTokens The query tokens to query in this field.\n * @param {String} field Field to query in.\n * @param {elasticlunr.Configuration} config The user query config, JSON format.\n * @return {Object}\n */\n elasticlunr.Index.prototype.fieldSearch = function (queryTokens, fieldName, config) {\n var booleanType = config[fieldName].bool;\n var expand = config[fieldName].expand;\n var boost = config[fieldName].boost;\n var scores = null;\n var docTokens = {};\n\n // Do nothing if the boost is 0\n if (boost === 0) {\n return;\n }\n queryTokens.forEach(function (token) {\n var tokens = [token];\n if (expand == true) {\n tokens = this.index[fieldName].expandToken(token);\n }\n // Consider every query token in turn. If expanded, each query token\n // corresponds to a set of tokens, which is all tokens in the \n // index matching the pattern queryToken* .\n // For the set of tokens corresponding to a query token, find and score\n // all matching documents. Store those scores in queryTokenScores, \n // keyed by docRef.\n // Then, depending on the value of booleanType, combine the scores\n // for this query token with previous scores. If booleanType is OR,\n // then merge the scores by summing into the accumulated total, adding\n // new document scores are required (effectively a union operator). \n // If booleanType is AND, accumulate scores only if the document \n // has previously been scored by another query token (an intersection\n // operation0. \n // Furthermore, since when booleanType is AND, additional \n // query tokens can't add new documents to the result set, use the\n // current document set to limit the processing of each new query \n // token for efficiency (i.e., incremental intersection).\n\n var queryTokenScores = {};\n tokens.forEach(function (key) {\n var docs = this.index[fieldName].getDocs(key);\n var idf = this.idf(key, fieldName);\n if (scores && booleanType == 'AND') {\n // special case, we can rule out documents that have been\n // already been filtered out because they weren't scored\n // by previous query token passes.\n var filteredDocs = {};\n for (var docRef in scores) {\n if (docRef in docs) {\n filteredDocs[docRef] = docs[docRef];\n }\n }\n docs = filteredDocs;\n }\n // only record appeared token for retrieved documents for the\n // original token, not for expaned token.\n // beause for doing coordNorm for a retrieved document, coordNorm only care how many\n // query token appear in that document.\n // so expanded token should not be added into docTokens, if added, this will pollute the\n // coordNorm\n if (key == token) {\n this.fieldSearchStats(docTokens, key, docs);\n }\n for (var docRef in docs) {\n var tf = this.index[fieldName].getTermFrequency(key, docRef);\n var fieldLength = this.documentStore.getFieldLength(docRef, fieldName);\n var fieldLengthNorm = 1;\n if (fieldLength != 0) {\n fieldLengthNorm = 1 / Math.sqrt(fieldLength);\n }\n var penality = 1;\n if (key != token) {\n // currently I'm not sure if this penality is enough,\n // need to do verification\n penality = (1 - (key.length - token.length) / key.length) * 0.15;\n }\n var score = tf * idf * fieldLengthNorm * penality;\n if (docRef in queryTokenScores) {\n queryTokenScores[docRef] += score;\n } else {\n queryTokenScores[docRef] = score;\n }\n }\n }, this);\n scores = this.mergeScores(scores, queryTokenScores, booleanType);\n }, this);\n scores = this.coordNorm(scores, docTokens, queryTokens.length);\n return scores;\n };\n\n /**\n * Merge the scores from one set of tokens into an accumulated score table.\n * Exact operation depends on the op parameter. If op is 'AND', then only the\n * intersection of the two score lists is retained. Otherwise, the union of\n * the two score lists is returned. For internal use only.\n *\n * @param {Object} bool accumulated scores. Should be null on first call.\n * @param {String} scores new scores to merge into accumScores.\n * @param {Object} op merge operation (should be 'AND' or 'OR').\n *\n */\n\n elasticlunr.Index.prototype.mergeScores = function (accumScores, scores, op) {\n if (!accumScores) {\n return scores;\n }\n if (op == 'AND') {\n var intersection = {};\n for (var docRef in scores) {\n if (docRef in accumScores) {\n intersection[docRef] = accumScores[docRef] + scores[docRef];\n }\n }\n return intersection;\n } else {\n for (var docRef in scores) {\n if (docRef in accumScores) {\n accumScores[docRef] += scores[docRef];\n } else {\n accumScores[docRef] = scores[docRef];\n }\n }\n return accumScores;\n }\n };\n\n /**\n * Record the occuring query token of retrieved doc specified by doc field.\n * Only for inner user.\n *\n * @param {Object} docTokens a data structure stores which token appears in the retrieved doc.\n * @param {String} token query token\n * @param {Object} docs the retrieved documents of the query token\n *\n */\n elasticlunr.Index.prototype.fieldSearchStats = function (docTokens, token, docs) {\n for (var doc in docs) {\n if (doc in docTokens) {\n docTokens[doc].push(token);\n } else {\n docTokens[doc] = [token];\n }\n }\n };\n\n /**\n * coord norm the score of a doc.\n * if a doc contain more query tokens, then the score will larger than the doc\n * contains less query tokens.\n *\n * only for inner use.\n *\n * @param {Object} results first results\n * @param {Object} docs field search results of a token\n * @param {Integer} n query token number\n * @return {Object}\n */\n elasticlunr.Index.prototype.coordNorm = function (scores, docTokens, n) {\n for (var doc in scores) {\n if (!(doc in docTokens)) continue;\n var tokens = docTokens[doc].length;\n scores[doc] = scores[doc] * tokens / n;\n }\n return scores;\n };\n\n /**\n * Returns a representation of the index ready for serialisation.\n *\n * @return {Object}\n * @memberOf Index\n */\n elasticlunr.Index.prototype.toJSON = function () {\n var indexJson = {};\n this._fields.forEach(function (field) {\n indexJson[field] = this.index[field].toJSON();\n }, this);\n return {\n version: elasticlunr.version,\n fields: this._fields,\n ref: this._ref,\n documentStore: this.documentStore.toJSON(),\n index: indexJson,\n pipeline: this.pipeline.toJSON()\n };\n };\n\n /**\n * Applies a plugin to the current index.\n *\n * A plugin is a function that is called with the index as its context.\n * Plugins can be used to customise or extend the behaviour the index\n * in some way. A plugin is just a function, that encapsulated the custom\n * behaviour that should be applied to the index.\n *\n * The plugin function will be called with the index as its argument, additional\n * arguments can also be passed when calling use. The function will be called\n * with the index as its context.\n *\n * Example:\n *\n * var myPlugin = function (idx, arg1, arg2) {\n * // `this` is the index to be extended\n * // apply any extensions etc here.\n * }\n *\n * var idx = elasticlunr(function () {\n * this.use(myPlugin, 'arg1', 'arg2')\n * })\n *\n * @param {Function} plugin The plugin to apply.\n * @memberOf Index\n */\n elasticlunr.Index.prototype.use = function (plugin) {\n var args = Array.prototype.slice.call(arguments, 1);\n args.unshift(this);\n plugin.apply(this, args);\n };\n /*!\n * elasticlunr.DocumentStore\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.DocumentStore is a simple key-value document store used for storing sets of tokens for\n * documents stored in index.\n *\n * elasticlunr.DocumentStore store original JSON format documents that you could build search snippet by this original JSON document.\n *\n * user could choose whether original JSON format document should be store, if no configuration then document will be stored defaultly.\n * If user care more about the index size, user could select not store JSON documents, then this will has some defects, such as user\n * could not use JSON document to generate snippets of search results.\n *\n * @param {Boolean} save If the original JSON document should be stored.\n * @constructor\n * @module\n */\n elasticlunr.DocumentStore = function (save) {\n if (save === null || save === undefined) {\n this._save = true;\n } else {\n this._save = save;\n }\n this.docs = {};\n this.docInfo = {};\n this.length = 0;\n };\n\n /**\n * Loads a previously serialised document store\n *\n * @param {Object} serialisedData The serialised document store to load.\n * @return {elasticlunr.DocumentStore}\n */\n elasticlunr.DocumentStore.load = function (serialisedData) {\n var store = new this();\n store.length = serialisedData.length;\n store.docs = serialisedData.docs;\n store.docInfo = serialisedData.docInfo;\n store._save = serialisedData.save;\n return store;\n };\n\n /**\n * check if current instance store the original doc\n *\n * @return {Boolean}\n */\n elasticlunr.DocumentStore.prototype.isDocStored = function () {\n return this._save;\n };\n\n /**\n * Stores the given doc in the document store against the given id.\n * If docRef already exist, then update doc.\n *\n * Document is store by original JSON format, then you could use original document to generate search snippets.\n *\n * @param {Integer|String} docRef The key used to store the JSON format doc.\n * @param {Object} doc The JSON format doc.\n */\n elasticlunr.DocumentStore.prototype.addDoc = function (docRef, doc) {\n if (!this.hasDoc(docRef)) this.length++;\n if (this._save === true) {\n this.docs[docRef] = clone(doc);\n } else {\n this.docs[docRef] = null;\n }\n };\n\n /**\n * Retrieves the JSON doc from the document store for a given key.\n *\n * If docRef not found, return null.\n * If user set not storing the documents, return null.\n *\n * @param {Integer|String} docRef The key to lookup and retrieve from the document store.\n * @return {Object}\n * @memberOf DocumentStore\n */\n elasticlunr.DocumentStore.prototype.getDoc = function (docRef) {\n if (this.hasDoc(docRef) === false) return null;\n return this.docs[docRef];\n };\n\n /**\n * Checks whether the document store contains a key (docRef).\n *\n * @param {Integer|String} docRef The id to look up in the document store.\n * @return {Boolean}\n * @memberOf DocumentStore\n */\n elasticlunr.DocumentStore.prototype.hasDoc = function (docRef) {\n return docRef in this.docs;\n };\n\n /**\n * Removes the value for a key in the document store.\n *\n * @param {Integer|String} docRef The id to remove from the document store.\n * @memberOf DocumentStore\n */\n elasticlunr.DocumentStore.prototype.removeDoc = function (docRef) {\n if (!this.hasDoc(docRef)) return;\n delete this.docs[docRef];\n delete this.docInfo[docRef];\n this.length--;\n };\n\n /**\n * Add field length of a document's field tokens from pipeline results.\n * The field length of a document is used to do field length normalization even without the original JSON document stored.\n *\n * @param {Integer|String} docRef document's id or reference\n * @param {String} fieldName field name\n * @param {Integer} length field length\n */\n elasticlunr.DocumentStore.prototype.addFieldLength = function (docRef, fieldName, length) {\n if (docRef === null || docRef === undefined) return;\n if (this.hasDoc(docRef) == false) return;\n if (!this.docInfo[docRef]) this.docInfo[docRef] = {};\n this.docInfo[docRef][fieldName] = length;\n };\n\n /**\n * Update field length of a document's field tokens from pipeline results.\n * The field length of a document is used to do field length normalization even without the original JSON document stored.\n *\n * @param {Integer|String} docRef document's id or reference\n * @param {String} fieldName field name\n * @param {Integer} length field length\n */\n elasticlunr.DocumentStore.prototype.updateFieldLength = function (docRef, fieldName, length) {\n if (docRef === null || docRef === undefined) return;\n if (this.hasDoc(docRef) == false) return;\n this.addFieldLength(docRef, fieldName, length);\n };\n\n /**\n * get field length of a document by docRef\n *\n * @param {Integer|String} docRef document id or reference\n * @param {String} fieldName field name\n * @return {Integer} field length\n */\n elasticlunr.DocumentStore.prototype.getFieldLength = function (docRef, fieldName) {\n if (docRef === null || docRef === undefined) return 0;\n if (!(docRef in this.docs)) return 0;\n if (!(fieldName in this.docInfo[docRef])) return 0;\n return this.docInfo[docRef][fieldName];\n };\n\n /**\n * Returns a JSON representation of the document store used for serialisation.\n *\n * @return {Object} JSON format\n * @memberOf DocumentStore\n */\n elasticlunr.DocumentStore.prototype.toJSON = function () {\n return {\n docs: this.docs,\n docInfo: this.docInfo,\n length: this.length,\n save: this._save\n };\n };\n\n /**\n * Cloning object\n *\n * @param {Object} object in JSON format\n * @return {Object} copied object\n */\n function clone(obj) {\n if (null === obj || \"object\" !== typeof obj) return obj;\n var copy = obj.constructor();\n for (var attr in obj) {\n if (obj.hasOwnProperty(attr)) copy[attr] = obj[attr];\n }\n return copy;\n }\n /*!\n * elasticlunr.stemmer\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n /**\n * elasticlunr.stemmer is an english language stemmer, this is a JavaScript\n * implementation of the PorterStemmer taken from http://tartarus.org/~martin\n *\n * @module\n * @param {String} str The string to stem\n * @return {String}\n * @see elasticlunr.Pipeline\n */\n elasticlunr.stemmer = function () {\n var step2list = {\n \"ational\": \"ate\",\n \"tional\": \"tion\",\n \"enci\": \"ence\",\n \"anci\": \"ance\",\n \"izer\": \"ize\",\n \"bli\": \"ble\",\n \"alli\": \"al\",\n \"entli\": \"ent\",\n \"eli\": \"e\",\n \"ousli\": \"ous\",\n \"ization\": \"ize\",\n \"ation\": \"ate\",\n \"ator\": \"ate\",\n \"alism\": \"al\",\n \"iveness\": \"ive\",\n \"fulness\": \"ful\",\n \"ousness\": \"ous\",\n \"aliti\": \"al\",\n \"iviti\": \"ive\",\n \"biliti\": \"ble\",\n \"logi\": \"log\"\n },\n step3list = {\n \"icate\": \"ic\",\n \"ative\": \"\",\n \"alize\": \"al\",\n \"iciti\": \"ic\",\n \"ical\": \"ic\",\n \"ful\": \"\",\n \"ness\": \"\"\n },\n c = \"[^aeiou]\",\n // consonant\n v = \"[aeiouy]\",\n // vowel\n C = c + \"[^aeiouy]*\",\n // consonant sequence\n V = v + \"[aeiou]*\",\n // vowel sequence\n\n mgr0 = \"^(\" + C + \")?\" + V + C,\n // [C]VC... is m>0\n meq1 = \"^(\" + C + \")?\" + V + C + \"(\" + V + \")?$\",\n // [C]VC[V] is m=1\n mgr1 = \"^(\" + C + \")?\" + V + C + V + C,\n // [C]VCVC... is m>1\n s_v = \"^(\" + C + \")?\" + v; // vowel in stem\n\n var re_mgr0 = new RegExp(mgr0);\n var re_mgr1 = new RegExp(mgr1);\n var re_meq1 = new RegExp(meq1);\n var re_s_v = new RegExp(s_v);\n var re_1a = /^(.+?)(ss|i)es$/;\n var re2_1a = /^(.+?)([^s])s$/;\n var re_1b = /^(.+?)eed$/;\n var re2_1b = /^(.+?)(ed|ing)$/;\n var re_1b_2 = /.$/;\n var re2_1b_2 = /(at|bl|iz)$/;\n var re3_1b_2 = new RegExp(\"([^aeiouylsz])\\\\1$\");\n var re4_1b_2 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n var re_1c = /^(.+?[^aeiou])y$/;\n var re_2 = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/;\n var re_3 = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/;\n var re_4 = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/;\n var re2_4 = /^(.+?)(s|t)(ion)$/;\n var re_5 = /^(.+?)e$/;\n var re_5_1 = /ll$/;\n var re3_5 = new RegExp(\"^\" + C + v + \"[^aeiouwxy]$\");\n var porterStemmer = function porterStemmer(w) {\n var stem, suffix, firstch, re, re2, re3, re4;\n if (w.length < 3) {\n return w;\n }\n firstch = w.substr(0, 1);\n if (firstch == \"y\") {\n w = firstch.toUpperCase() + w.substr(1);\n }\n\n // Step 1a\n re = re_1a;\n re2 = re2_1a;\n if (re.test(w)) {\n w = w.replace(re, \"$1$2\");\n } else if (re2.test(w)) {\n w = w.replace(re2, \"$1$2\");\n }\n\n // Step 1b\n re = re_1b;\n re2 = re2_1b;\n if (re.test(w)) {\n var fp = re.exec(w);\n re = re_mgr0;\n if (re.test(fp[1])) {\n re = re_1b_2;\n w = w.replace(re, \"\");\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1];\n re2 = re_s_v;\n if (re2.test(stem)) {\n w = stem;\n re2 = re2_1b_2;\n re3 = re3_1b_2;\n re4 = re4_1b_2;\n if (re2.test(w)) {\n w = w + \"e\";\n } else if (re3.test(w)) {\n re = re_1b_2;\n w = w.replace(re, \"\");\n } else if (re4.test(w)) {\n w = w + \"e\";\n }\n }\n }\n\n // Step 1c - replace suffix y or Y by i if preceded by a non-vowel which is not the first letter of the word (so cry -> cri, by -> by, say -> say)\n re = re_1c;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n w = stem + \"i\";\n }\n\n // Step 2\n re = re_2;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step2list[suffix];\n }\n }\n\n // Step 3\n re = re_3;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n suffix = fp[2];\n re = re_mgr0;\n if (re.test(stem)) {\n w = stem + step3list[suffix];\n }\n }\n\n // Step 4\n re = re_4;\n re2 = re2_4;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n if (re.test(stem)) {\n w = stem;\n }\n } else if (re2.test(w)) {\n var fp = re2.exec(w);\n stem = fp[1] + fp[2];\n re2 = re_mgr1;\n if (re2.test(stem)) {\n w = stem;\n }\n }\n\n // Step 5\n re = re_5;\n if (re.test(w)) {\n var fp = re.exec(w);\n stem = fp[1];\n re = re_mgr1;\n re2 = re_meq1;\n re3 = re3_5;\n if (re.test(stem) || re2.test(stem) && !re3.test(stem)) {\n w = stem;\n }\n }\n re = re_5_1;\n re2 = re_mgr1;\n if (re.test(w) && re2.test(w)) {\n re = re_1b_2;\n w = w.replace(re, \"\");\n }\n\n // and turn initial Y back to y\n\n if (firstch == \"y\") {\n w = firstch.toLowerCase() + w.substr(1);\n }\n return w;\n };\n return porterStemmer;\n }();\n elasticlunr.Pipeline.registerFunction(elasticlunr.stemmer, 'stemmer');\n /*!\n * elasticlunr.stopWordFilter\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.stopWordFilter is an English language stop words filter, any words\n * contained in the stop word list will not be passed through the filter.\n *\n * This is intended to be used in the Pipeline. If the token does not pass the\n * filter then undefined will be returned.\n * Currently this StopwordFilter using dictionary to do O(1) time complexity stop word filtering.\n *\n * @module\n * @param {String} token The token to pass through the filter\n * @return {String}\n * @see elasticlunr.Pipeline\n */\n elasticlunr.stopWordFilter = function (token) {\n if (token && elasticlunr.stopWordFilter.stopWords[token] !== true) {\n return token;\n }\n };\n\n /**\n * Remove predefined stop words\n * if user want to use customized stop words, user could use this function to delete\n * all predefined stopwords.\n *\n * @return {null}\n */\n elasticlunr.clearStopWords = function () {\n elasticlunr.stopWordFilter.stopWords = {};\n };\n\n /**\n * Add customized stop words\n * user could use this function to add customized stop words\n * \n * @params {Array} words customized stop words\n * @return {null}\n */\n elasticlunr.addStopWords = function (words) {\n if (words == null || Array.isArray(words) === false) return;\n words.forEach(function (word) {\n elasticlunr.stopWordFilter.stopWords[word] = true;\n }, this);\n };\n\n /**\n * Reset to default stop words\n * user could use this function to restore default stop words\n *\n * @return {null}\n */\n elasticlunr.resetStopWords = function () {\n elasticlunr.stopWordFilter.stopWords = elasticlunr.defaultStopWords;\n };\n elasticlunr.defaultStopWords = {\n \"\": true,\n \"a\": true,\n \"able\": true,\n \"about\": true,\n \"across\": true,\n \"after\": true,\n \"all\": true,\n \"almost\": true,\n \"also\": true,\n \"am\": true,\n \"among\": true,\n \"an\": true,\n \"and\": true,\n \"any\": true,\n \"are\": true,\n \"as\": true,\n \"at\": true,\n \"be\": true,\n \"because\": true,\n \"been\": true,\n \"but\": true,\n \"by\": true,\n \"can\": true,\n \"cannot\": true,\n \"could\": true,\n \"dear\": true,\n \"did\": true,\n \"do\": true,\n \"does\": true,\n \"either\": true,\n \"else\": true,\n \"ever\": true,\n \"every\": true,\n \"for\": true,\n \"from\": true,\n \"get\": true,\n \"got\": true,\n \"had\": true,\n \"has\": true,\n \"have\": true,\n \"he\": true,\n \"her\": true,\n \"hers\": true,\n \"him\": true,\n \"his\": true,\n \"how\": true,\n \"however\": true,\n \"i\": true,\n \"if\": true,\n \"in\": true,\n \"into\": true,\n \"is\": true,\n \"it\": true,\n \"its\": true,\n \"just\": true,\n \"least\": true,\n \"let\": true,\n \"like\": true,\n \"likely\": true,\n \"may\": true,\n \"me\": true,\n \"might\": true,\n \"most\": true,\n \"must\": true,\n \"my\": true,\n \"neither\": true,\n \"no\": true,\n \"nor\": true,\n \"not\": true,\n \"of\": true,\n \"off\": true,\n \"often\": true,\n \"on\": true,\n \"only\": true,\n \"or\": true,\n \"other\": true,\n \"our\": true,\n \"own\": true,\n \"rather\": true,\n \"said\": true,\n \"say\": true,\n \"says\": true,\n \"she\": true,\n \"should\": true,\n \"since\": true,\n \"so\": true,\n \"some\": true,\n \"than\": true,\n \"that\": true,\n \"the\": true,\n \"their\": true,\n \"them\": true,\n \"then\": true,\n \"there\": true,\n \"these\": true,\n \"they\": true,\n \"this\": true,\n \"tis\": true,\n \"to\": true,\n \"too\": true,\n \"twas\": true,\n \"us\": true,\n \"wants\": true,\n \"was\": true,\n \"we\": true,\n \"were\": true,\n \"what\": true,\n \"when\": true,\n \"where\": true,\n \"which\": true,\n \"while\": true,\n \"who\": true,\n \"whom\": true,\n \"why\": true,\n \"will\": true,\n \"with\": true,\n \"would\": true,\n \"yet\": true,\n \"you\": true,\n \"your\": true\n };\n elasticlunr.stopWordFilter.stopWords = elasticlunr.defaultStopWords;\n elasticlunr.Pipeline.registerFunction(elasticlunr.stopWordFilter, 'stopWordFilter');\n /*!\n * elasticlunr.trimmer\n * Copyright (C) 2016 Oliver Nightingale\n * Copyright (C) 2016 Wei Song\n */\n\n /**\n * elasticlunr.trimmer is a pipeline function for trimming non word\n * characters from the begining and end of tokens before they\n * enter the index.\n *\n * This implementation may not work correctly for non latin\n * characters and should either be removed or adapted for use\n * with languages with non-latin characters.\n *\n * @module\n * @param {String} token The token to pass through the filter\n * @return {String}\n * @see elasticlunr.Pipeline\n */\n elasticlunr.trimmer = function (token) {\n if (token === null || token === undefined) {\n throw new Error('token should not be undefined');\n }\n return token.replace(/^\\W+/, '').replace(/\\W+$/, '');\n };\n elasticlunr.Pipeline.registerFunction(elasticlunr.trimmer, 'trimmer');\n /*!\n * elasticlunr.InvertedIndex\n * Copyright (C) 2016 Wei Song\n * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt\n */\n\n /**\n * elasticlunr.InvertedIndex is used for efficiently storing and\n * lookup of documents that contain a given token.\n *\n * @constructor\n */\n elasticlunr.InvertedIndex = function () {\n this.root = {\n docs: {},\n df: 0\n };\n };\n\n /**\n * Loads a previously serialised inverted index.\n *\n * @param {Object} serialisedData The serialised inverted index to load.\n * @return {elasticlunr.InvertedIndex}\n */\n elasticlunr.InvertedIndex.load = function (serialisedData) {\n var idx = new this();\n idx.root = serialisedData.root;\n return idx;\n };\n\n /**\n * Adds a {token: tokenInfo} pair to the inverted index.\n * If the token already exist, then update the tokenInfo.\n *\n * tokenInfo format: { ref: 1, tf: 2}\n * tokenInfor should contains the document's ref and the tf(token frequency) of that token in\n * the document.\n *\n * By default this function starts at the root of the current inverted index, however\n * it can start at any node of the inverted index if required.\n *\n * @param {String} token \n * @param {Object} tokenInfo format: { ref: 1, tf: 2}\n * @param {Object} root An optional node at which to start looking for the\n * correct place to enter the doc, by default the root of this elasticlunr.InvertedIndex\n * is used.\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.addToken = function (token, tokenInfo, root) {\n var root = root || this.root,\n idx = 0;\n while (idx <= token.length - 1) {\n var key = token[idx];\n if (!(key in root)) root[key] = {\n docs: {},\n df: 0\n };\n idx += 1;\n root = root[key];\n }\n var docRef = tokenInfo.ref;\n if (!root.docs[docRef]) {\n // if this doc not exist, then add this doc\n root.docs[docRef] = {\n tf: tokenInfo.tf\n };\n root.df += 1;\n } else {\n // if this doc already exist, then update tokenInfo\n root.docs[docRef] = {\n tf: tokenInfo.tf\n };\n }\n };\n\n /**\n * Checks whether a token is in this elasticlunr.InvertedIndex.\n * \n *\n * @param {String} token The token to be checked\n * @return {Boolean}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.hasToken = function (token) {\n if (!token) return false;\n var node = this.root;\n for (var i = 0; i < token.length; i++) {\n if (!node[token[i]]) return false;\n node = node[token[i]];\n }\n return true;\n };\n\n /**\n * Retrieve a node from the inverted index for a given token.\n * If token not found in this InvertedIndex, return null.\n * \n *\n * @param {String} token The token to get the node for.\n * @return {Object}\n * @see InvertedIndex.prototype.get\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.getNode = function (token) {\n if (!token) return null;\n var node = this.root;\n for (var i = 0; i < token.length; i++) {\n if (!node[token[i]]) return null;\n node = node[token[i]];\n }\n return node;\n };\n\n /**\n * Retrieve the documents of a given token.\n * If token not found, return {}.\n *\n *\n * @param {String} token The token to get the documents for.\n * @return {Object}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.getDocs = function (token) {\n var node = this.getNode(token);\n if (node == null) {\n return {};\n }\n return node.docs;\n };\n\n /**\n * Retrieve term frequency of given token in given docRef.\n * If token or docRef not found, return 0.\n *\n *\n * @param {String} token The token to get the documents for.\n * @param {String|Integer} docRef\n * @return {Integer}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.getTermFrequency = function (token, docRef) {\n var node = this.getNode(token);\n if (node == null) {\n return 0;\n }\n if (!(docRef in node.docs)) {\n return 0;\n }\n return node.docs[docRef].tf;\n };\n\n /**\n * Retrieve the document frequency of given token.\n * If token not found, return 0.\n *\n *\n * @param {String} token The token to get the documents for.\n * @return {Object}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.getDocFreq = function (token) {\n var node = this.getNode(token);\n if (node == null) {\n return 0;\n }\n return node.df;\n };\n\n /**\n * Remove the document identified by document's ref from the token in the inverted index.\n *\n *\n * @param {String} token Remove the document from which token.\n * @param {String} ref The ref of the document to remove from given token.\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.removeToken = function (token, ref) {\n if (!token) return;\n var node = this.getNode(token);\n if (node == null) return;\n if (ref in node.docs) {\n delete node.docs[ref];\n node.df -= 1;\n }\n };\n\n /**\n * Find all the possible suffixes of given token using tokens currently in the inverted index.\n * If token not found, return empty Array.\n *\n * @param {String} token The token to expand.\n * @return {Array}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.expandToken = function (token, memo, root) {\n if (token == null || token == '') return [];\n var memo = memo || [];\n if (root == void 0) {\n root = this.getNode(token);\n if (root == null) return memo;\n }\n if (root.df > 0) memo.push(token);\n for (var key in root) {\n if (key === 'docs') continue;\n if (key === 'df') continue;\n this.expandToken(token + key, memo, root[key]);\n }\n return memo;\n };\n\n /**\n * Returns a representation of the inverted index ready for serialisation.\n *\n * @return {Object}\n * @memberOf InvertedIndex\n */\n elasticlunr.InvertedIndex.prototype.toJSON = function () {\n return {\n root: this.root\n };\n };\n\n /*!\n * elasticlunr.Configuration\n * Copyright (C) 2016 Wei Song\n */\n\n /** \n * elasticlunr.Configuration is used to analyze the user search configuration.\n * \n * By elasticlunr.Configuration user could set query-time boosting, boolean model in each field.\n * \n * Currently configuration supports:\n * 1. query-time boosting, user could set how to boost each field.\n * 2. boolean model chosing, user could choose which boolean model to use for each field.\n * 3. token expandation, user could set token expand to True to improve Recall. Default is False.\n * \n * Query time boosting must be configured by field category, \"boolean\" model could be configured \n * by both field category or globally as the following example. Field configuration for \"boolean\"\n * will overwrite global configuration.\n * Token expand could be configured both by field category or golbally. Local field configuration will\n * overwrite global configuration.\n * \n * configuration example:\n * {\n * fields:{ \n * title: {boost: 2},\n * body: {boost: 1}\n * },\n * bool: \"OR\"\n * }\n * \n * \"bool\" field configuation overwrite global configuation example:\n * {\n * fields:{ \n * title: {boost: 2, bool: \"AND\"},\n * body: {boost: 1}\n * },\n * bool: \"OR\"\n * }\n * \n * \"expand\" example:\n * {\n * fields:{ \n * title: {boost: 2, bool: \"AND\"},\n * body: {boost: 1}\n * },\n * bool: \"OR\",\n * expand: true\n * }\n * \n * \"expand\" example for field category:\n * {\n * fields:{ \n * title: {boost: 2, bool: \"AND\", expand: true},\n * body: {boost: 1}\n * },\n * bool: \"OR\"\n * }\n * \n * setting the boost to 0 ignores the field (this will only search the title):\n * {\n * fields:{\n * title: {boost: 1},\n * body: {boost: 0}\n * }\n * }\n *\n * then, user could search with configuration to do query-time boosting.\n * idx.search('oracle database', {fields: {title: {boost: 2}, body: {boost: 1}}});\n * \n * \n * @constructor\n * \n * @param {String} config user configuration\n * @param {Array} fields fields of index instance\n * @module\n */\n elasticlunr.Configuration = function (config, fields) {\n var config = config || '';\n if (fields == undefined || fields == null) {\n throw new Error('fields should not be null');\n }\n this.config = {};\n var userConfig;\n try {\n userConfig = JSON.parse(config);\n this.buildUserConfig(userConfig, fields);\n } catch (error) {\n elasticlunr.utils.warn('user configuration parse failed, will use default configuration');\n this.buildDefaultConfig(fields);\n }\n };\n\n /**\n * Build default search configuration.\n * \n * @param {Array} fields fields of index instance\n */\n elasticlunr.Configuration.prototype.buildDefaultConfig = function (fields) {\n this.reset();\n fields.forEach(function (field) {\n this.config[field] = {\n boost: 1,\n bool: \"OR\",\n expand: false\n };\n }, this);\n };\n\n /**\n * Build user configuration.\n * \n * @param {JSON} config User JSON configuratoin\n * @param {Array} fields fields of index instance\n */\n elasticlunr.Configuration.prototype.buildUserConfig = function (config, fields) {\n var global_bool = \"OR\";\n var global_expand = false;\n this.reset();\n if ('bool' in config) {\n global_bool = config['bool'] || global_bool;\n }\n if ('expand' in config) {\n global_expand = config['expand'] || global_expand;\n }\n if ('fields' in config) {\n for (var field in config['fields']) {\n if (fields.indexOf(field) > -1) {\n var field_config = config['fields'][field];\n var field_expand = global_expand;\n if (field_config.expand != undefined) {\n field_expand = field_config.expand;\n }\n this.config[field] = {\n boost: field_config.boost || field_config.boost === 0 ? field_config.boost : 1,\n bool: field_config.bool || global_bool,\n expand: field_expand\n };\n } else {\n elasticlunr.utils.warn('field name in user configuration not found in index instance fields');\n }\n }\n } else {\n this.addAllFields2UserConfig(global_bool, global_expand, fields);\n }\n };\n\n /**\n * Add all fields to user search configuration.\n * \n * @param {String} bool Boolean model\n * @param {String} expand Expand model\n * @param {Array} fields fields of index instance\n */\n elasticlunr.Configuration.prototype.addAllFields2UserConfig = function (bool, expand, fields) {\n fields.forEach(function (field) {\n this.config[field] = {\n boost: 1,\n bool: bool,\n expand: expand\n };\n }, this);\n };\n\n /**\n * get current user configuration\n */\n elasticlunr.Configuration.prototype.get = function () {\n return this.config;\n };\n\n /**\n * reset user search configuration.\n */\n elasticlunr.Configuration.prototype.reset = function () {\n this.config = {};\n };\n /**\n * sorted_set.js is added only to make elasticlunr.js compatible with lunr-languages.\n * if elasticlunr.js support different languages by default, this will make elasticlunr.js\n * much bigger that not good for browser usage.\n *\n */\n\n /*!\n * lunr.SortedSet\n * Copyright (C) 2016 Oliver Nightingale\n */\n\n /**\n * lunr.SortedSets are used to maintain an array of uniq values in a sorted\n * order.\n *\n * @constructor\n */\n lunr.SortedSet = function () {\n this.length = 0;\n this.elements = [];\n };\n\n /**\n * Loads a previously serialised sorted set.\n *\n * @param {Array} serialisedData The serialised set to load.\n * @returns {lunr.SortedSet}\n * @memberOf SortedSet\n */\n lunr.SortedSet.load = function (serialisedData) {\n var set = new this();\n set.elements = serialisedData;\n set.length = serialisedData.length;\n return set;\n };\n\n /**\n * Inserts new items into the set in the correct position to maintain the\n * order.\n *\n * @param {Object} The objects to add to this set.\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.add = function () {\n var i, element;\n for (i = 0; i < arguments.length; i++) {\n element = arguments[i];\n if (~this.indexOf(element)) continue;\n this.elements.splice(this.locationFor(element), 0, element);\n }\n this.length = this.elements.length;\n };\n\n /**\n * Converts this sorted set into an array.\n *\n * @returns {Array}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.toArray = function () {\n return this.elements.slice();\n };\n\n /**\n * Creates a new array with the results of calling a provided function on every\n * element in this sorted set.\n *\n * Delegates to Array.prototype.map and has the same signature.\n *\n * @param {Function} fn The function that is called on each element of the\n * set.\n * @param {Object} ctx An optional object that can be used as the context\n * for the function fn.\n * @returns {Array}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.map = function (fn, ctx) {\n return this.elements.map(fn, ctx);\n };\n\n /**\n * Executes a provided function once per sorted set element.\n *\n * Delegates to Array.prototype.forEach and has the same signature.\n *\n * @param {Function} fn The function that is called on each element of the\n * set.\n * @param {Object} ctx An optional object that can be used as the context\n * @memberOf SortedSet\n * for the function fn.\n */\n lunr.SortedSet.prototype.forEach = function (fn, ctx) {\n return this.elements.forEach(fn, ctx);\n };\n\n /**\n * Returns the index at which a given element can be found in the\n * sorted set, or -1 if it is not present.\n *\n * @param {Object} elem The object to locate in the sorted set.\n * @returns {Number}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.indexOf = function (elem) {\n var start = 0,\n end = this.elements.length,\n sectionLength = end - start,\n pivot = start + Math.floor(sectionLength / 2),\n pivotElem = this.elements[pivot];\n while (sectionLength > 1) {\n if (pivotElem === elem) return pivot;\n if (pivotElem < elem) start = pivot;\n if (pivotElem > elem) end = pivot;\n sectionLength = end - start;\n pivot = start + Math.floor(sectionLength / 2);\n pivotElem = this.elements[pivot];\n }\n if (pivotElem === elem) return pivot;\n return -1;\n };\n\n /**\n * Returns the position within the sorted set that an element should be\n * inserted at to maintain the current order of the set.\n *\n * This function assumes that the element to search for does not already exist\n * in the sorted set.\n *\n * @param {Object} elem The elem to find the position for in the set\n * @returns {Number}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.locationFor = function (elem) {\n var start = 0,\n end = this.elements.length,\n sectionLength = end - start,\n pivot = start + Math.floor(sectionLength / 2),\n pivotElem = this.elements[pivot];\n while (sectionLength > 1) {\n if (pivotElem < elem) start = pivot;\n if (pivotElem > elem) end = pivot;\n sectionLength = end - start;\n pivot = start + Math.floor(sectionLength / 2);\n pivotElem = this.elements[pivot];\n }\n if (pivotElem > elem) return pivot;\n if (pivotElem < elem) return pivot + 1;\n };\n\n /**\n * Creates a new lunr.SortedSet that contains the elements in the intersection\n * of this set and the passed set.\n *\n * @param {lunr.SortedSet} otherSet The set to intersect with this set.\n * @returns {lunr.SortedSet}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.intersect = function (otherSet) {\n var intersectSet = new lunr.SortedSet(),\n i = 0,\n j = 0,\n a_len = this.length,\n b_len = otherSet.length,\n a = this.elements,\n b = otherSet.elements;\n while (true) {\n if (i > a_len - 1 || j > b_len - 1) break;\n if (a[i] === b[j]) {\n intersectSet.add(a[i]);\n i++, j++;\n continue;\n }\n if (a[i] < b[j]) {\n i++;\n continue;\n }\n if (a[i] > b[j]) {\n j++;\n continue;\n }\n }\n ;\n return intersectSet;\n };\n\n /**\n * Makes a copy of this set\n *\n * @returns {lunr.SortedSet}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.clone = function () {\n var clone = new lunr.SortedSet();\n clone.elements = this.toArray();\n clone.length = clone.elements.length;\n return clone;\n };\n\n /**\n * Creates a new lunr.SortedSet that contains the elements in the union\n * of this set and the passed set.\n *\n * @param {lunr.SortedSet} otherSet The set to union with this set.\n * @returns {lunr.SortedSet}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.union = function (otherSet) {\n var longSet, shortSet, unionSet;\n if (this.length >= otherSet.length) {\n longSet = this, shortSet = otherSet;\n } else {\n longSet = otherSet, shortSet = this;\n }\n unionSet = longSet.clone();\n for (var i = 0, shortSetElements = shortSet.toArray(); i < shortSetElements.length; i++) {\n unionSet.add(shortSetElements[i]);\n }\n return unionSet;\n };\n\n /**\n * Returns a representation of the sorted set ready for serialisation.\n *\n * @returns {Array}\n * @memberOf SortedSet\n */\n lunr.SortedSet.prototype.toJSON = function () {\n return this.toArray();\n }\n /**\n * export the module via AMD, CommonJS or as a browser global\n * Export code from https://github.com/umdjs/umd/blob/master/returnExports.js\n */;\n (function (root, factory) {\n if (typeof define === 'function' && define.amd) {\n // AMD. Register as an anonymous module.\n define(factory);\n } else if (typeof exports === 'object') {\n /**\n * Node. Does not work with strict CommonJS, but\n * only CommonJS-like enviroments that support module.exports,\n * like Node.\n */\n module.exports = factory();\n } else {\n // Browser globals (root is window)\n root.elasticlunr = factory();\n }\n })(this, function () {\n /**\n * Just return a value to define the module export.\n * This example returns an object, but the module\n * can return a function as the exported value.\n */\n return elasticlunr;\n });\n})();","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport React from 'react';\nimport classNames from 'classnames';\nexport default (function (className) {\n return /*#__PURE__*/React.forwardRef(function (p, ref) {\n return /*#__PURE__*/React.createElement(\"div\", _extends({}, p, {\n ref: ref,\n className: classNames(p.className, className)\n }));\n });\n});","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport classNames from 'classnames';\nimport React from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nvar defaultProps = {\n variant: null\n};\nvar CardImg = /*#__PURE__*/React.forwardRef(\n// Need to define the default \"as\" during prop destructuring to be compatible with styled-components github.com/react-bootstrap/react-bootstrap/issues/3595\nfunction (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n variant = _ref.variant,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'img' : _ref$as,\n props = _objectWithoutPropertiesLoose(_ref, [\"bsPrefix\", \"className\", \"variant\", \"as\"]);\n var prefix = useBootstrapPrefix(bsPrefix, 'card-img');\n return /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref,\n className: classNames(variant ? prefix + \"-\" + variant : prefix, className)\n }, props));\n});\nCardImg.displayName = 'CardImg';\nCardImg.defaultProps = defaultProps;\nexport default CardImg;","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _objectWithoutPropertiesLoose from \"@babel/runtime/helpers/esm/objectWithoutPropertiesLoose\";\nimport classNames from 'classnames';\nimport React, { useMemo } from 'react';\nimport { useBootstrapPrefix } from './ThemeProvider';\nimport createWithBsPrefix from './createWithBsPrefix';\nimport divWithClassName from './divWithClassName';\nimport CardContext from './CardContext';\nimport CardImg from './CardImg';\nvar DivStyledAsH5 = divWithClassName('h5');\nvar DivStyledAsH6 = divWithClassName('h6');\nvar CardBody = createWithBsPrefix('card-body');\nvar CardTitle = createWithBsPrefix('card-title', {\n Component: DivStyledAsH5\n});\nvar CardSubtitle = createWithBsPrefix('card-subtitle', {\n Component: DivStyledAsH6\n});\nvar CardLink = createWithBsPrefix('card-link', {\n Component: 'a'\n});\nvar CardText = createWithBsPrefix('card-text', {\n Component: 'p'\n});\nvar CardHeader = createWithBsPrefix('card-header');\nvar CardFooter = createWithBsPrefix('card-footer');\nvar CardImgOverlay = createWithBsPrefix('card-img-overlay');\nvar defaultProps = {\n body: false\n};\nvar Card = /*#__PURE__*/React.forwardRef(function (_ref, ref) {\n var bsPrefix = _ref.bsPrefix,\n className = _ref.className,\n bg = _ref.bg,\n text = _ref.text,\n border = _ref.border,\n body = _ref.body,\n children = _ref.children,\n _ref$as = _ref.as,\n Component = _ref$as === void 0 ? 'div' : _ref$as,\n props = _objectWithoutPropertiesLoose(_ref, [\"bsPrefix\", \"className\", \"bg\", \"text\", \"border\", \"body\", \"children\", \"as\"]);\n var prefix = useBootstrapPrefix(bsPrefix, 'card');\n var cardContext = useMemo(function () {\n return {\n cardHeaderBsPrefix: prefix + \"-header\"\n };\n }, [prefix]);\n return /*#__PURE__*/React.createElement(CardContext.Provider, {\n value: cardContext\n }, /*#__PURE__*/React.createElement(Component, _extends({\n ref: ref\n }, props, {\n className: classNames(className, prefix, bg && \"bg-\" + bg, text && \"text-\" + text, border && \"border-\" + border)\n }), body ? /*#__PURE__*/\n // @ts-ignore\n React.createElement(CardBody, null, children) : children));\n});\nCard.displayName = 'Card';\nCard.defaultProps = defaultProps;\nCard.Img = CardImg;\nCard.Title = CardTitle;\nCard.Subtitle = CardSubtitle;\nCard.Body = CardBody;\nCard.Link = CardLink;\nCard.Text = CardText;\nCard.Header = CardHeader;\nCard.Footer = CardFooter;\nCard.ImgOverlay = CardImgOverlay;\nexport default Card;","import React from 'react';\nimport './search.css';\n\nconst SearchListElement = (props) => {\n return (\n <li key={props.route}>\n <h3 className=\"search-results-list__heading\">\n <a href={props.route} className=\"search-results-list__link\">{props.name}</a>\n </h3>\n <small>{props.route}</small>\n <p>\n {props.description}\n </p>\n </li>\n );\n};\n\nexport default SearchListElement;","import React from 'react';\nimport SearchListElement from './SearchListElement';\nimport './search.css';\n\nconst SearchResultsList = (props) => {\n \n const objects = props.objects !== undefined ? props.objects: [];\n const results = objects.filter((obj) => \n obj.name !== undefined && obj.description !== undefined && obj.route !== undefined\n );\n \n return (\n <section className=\"searchResults\" aria-label=\"Search results over documentation\">\n <ol className=\"search-results-list\">\n {\n results.map(obj =>\n <SearchListElement route={obj.route} name={obj.name} description={obj.description}/> \n ) \n }\n </ol>\n </section>\n );\n};\n\nexport default SearchResultsList;\n","import React from \"react\";\nimport { Card } from \"react-bootstrap\";\nimport { navigate, StaticQuery, graphql } from \"gatsby\";\nimport { Index } from \"elasticlunr\";\n\nimport { useTranslation } from \"react-i18next\";\nimport SearchResultsList from \"../components/search/SearchResultsList\";\nimport Layout from \"../components/layout\";\nimport SEO from \"../components/seo\";\nimport withTrans from \"../i18n/withTrans\";\nimport \"./styles/page.css\";\nimport \"./styles/search.css\";\n\nconst SearchInner = props => {\n const { t, i18n } = useTranslation();\n\n let searchQuery = \"\";\n\n if (typeof window !== \"undefined\") {\n searchQuery = new URL(window.location.href).searchParams.get(\"query\") || \"\";\n }\n\n function getSearchResults(query) {\n const index = Index.load(props.searchIndex);\n return index\n .search(query, { expand: true })\n .map(({ ref }) => index.documentStore.getDoc(ref));\n }\n\n const results = getSearchResults(searchQuery);\n\n return (\n <Layout>\n <div className=\"pageFlexContainer\">\n <SEO title=\"Search\" />\n\n <Card className=\"searchCard\" bg=\"light\">\n <Card.Header as=\"h3\">{t(\"search.title\")}</Card.Header>\n <Card.Body>\n <span>\n <input\n type=\"search\"\n placeholder={t(\"search.placeholder\")}\n className=\"form-control mr-sm-2\"\n value={searchQuery}\n onKeyDown={e => {\n if (e.key === \"Enter\" && e.shiftKey === false) {\n e.preventDefault();\n navigate(`/search?query=${encodeURIComponent(searchQuery)}`);\n }\n }}\n onChange={e => {\n const navigateTo = `/search?query=${encodeURIComponent(\n e.target.value\n )}`;\n navigate(navigateTo);\n }}\n />\n </span>\n </Card.Body>\n </Card>\n <SearchResultsList objects={results} />\n </div>\n </Layout>\n );\n};\n\nconst SearchPage = () => {\n return (\n <StaticQuery\n query={graphql`\n query SearchIndexQuery {\n siteSearchIndex {\n index\n }\n }\n `}\n render={data => <SearchInner searchIndex={data.siteSearchIndex.index} />}\n />\n );\n};\n\nexport default withTrans(SearchPage);\n"],"names":["global","step2list","step3list","v","C","re_mgr0","re_mgr1","re_meq1","re_s_v","re_1a","re2_1a","re_1b","re2_1b","re_1b_2","re2_1b_2","re3_1b_2","re4_1b_2","re_1c","re_2","re_3","re_4","re2_4","re_5","re_5_1","re3_5","elasticlunr","config","idx","Index","pipeline","add","trimmer","stopWordFilter","stemmer","call","version","lunr","utils","warn","this","message","console","toString","obj","EventEmitter","events","prototype","addListener","args","Array","slice","arguments","fn","pop","names","TypeError","forEach","name","hasHandler","push","removeListener","fnIndex","indexOf","splice","length","emit","apply","undefined","tokenizer","str","isArray","arr","filter","token","map","t","toLowerCase","out","item","tokens","split","seperator","concat","trim","defaultSeperator","setSeperator","sep","resetSeperator","getSeperator","Pipeline","_queue","registeredFunctions","registerFunction","label","getRegisteredFunction","warnIfFunctionNotRegistered","load","serialised","fnName","Error","fns","after","existingFn","newFn","pos","before","remove","run","tokenLength","pipelineLength","i","j","reset","get","toJSON","_fields","_ref","documentStore","DocumentStore","index","eventEmitter","_idfCache","on","bind","off","serialisedData","field","fields","ref","InvertedIndex","addField","fieldName","setRef","refName","saveDocument","save","addDoc","doc","emitEvent","docRef","fieldTokens","addFieldLength","tokenCount","termFrequency","Math","sqrt","addToken","tf","removeDocByRef","isDocStored","hasDoc","getDoc","removeDoc","removeToken","updateDoc","idf","term","cacheKey","Object","hasOwnProperty","df","getDocFreq","log","getFields","search","query","userConfig","configStr","JSON","stringify","Configuration","queryTokens","queryResults","fieldSearchResults","fieldSearch","fieldBoost","boost","results","score","sort","a","b","booleanType","bool","expand","scores","docTokens","expandToken","queryTokenScores","key","docs","getDocs","filteredDocs","fieldSearchStats","getTermFrequency","fieldLength","getFieldLength","fieldLengthNorm","penality","mergeScores","coordNorm","accumScores","op","intersection","n","indexJson","use","plugin","unshift","_save","docInfo","store","copy","constructor","attr","clone","updateFieldLength","c","RegExp","w","stem","suffix","firstch","re","re2","re3","re4","substr","toUpperCase","test","replace","fp","exec","stopWords","clearStopWords","addStopWords","words","word","resetStopWords","defaultStopWords","root","tokenInfo","hasToken","node","getNode","memo","parse","buildUserConfig","error","buildDefaultConfig","global_bool","global_expand","field_config","field_expand","addAllFields2UserConfig","SortedSet","elements","set","element","locationFor","toArray","ctx","elem","start","end","sectionLength","pivot","floor","pivotElem","intersect","otherSet","intersectSet","a_len","b_len","union","longSet","shortSet","unionSet","shortSetElements","className","p","CardImg","bsPrefix","variant","_ref$as","as","Component","props","prefix","displayName","defaultProps","DivStyledAsH5","divWithClassName","DivStyledAsH6","CardBody","createWithBsPrefix","CardTitle","CardSubtitle","CardLink","CardText","CardHeader","CardFooter","CardImgOverlay","Card","bg","text","border","body","children","cardContext","useMemo","cardHeaderBsPrefix","CardContext","value","Img","Title","Subtitle","Body","Link","Text","Header","Footer","ImgOverlay","SearchListElement","route","href","description","SearchResultsList","objects","SearchInner","useTranslation","searchQuery","i18n","window","URL","location","searchParams","searchIndex","title","type","placeholder","onKeyDown","e","shiftKey","preventDefault","navigate","encodeURIComponent","onChange","navigateTo","target","withTrans","StaticQuery","render","data","siteSearchIndex"],"sourceRoot":""}