From 63f103025b329fa913dfd4583d1be58522ebbdfd Mon Sep 17 00:00:00 2001
From: korki <65349313+korki43@users.noreply.github.com>
Date: Sun, 26 Mar 2023 16:43:55 +0200
Subject: [PATCH] replace list.js with fuse.js
---
config.yml | 2 +
docs/assets/js/list.js | 17 -
docs/assets/js/search.js | 55 +
docs/assets/js/vendor/list.js | 2021 ----------------------------
docs/layouts/partials/icons.html | 4 +-
docs/layouts/partials/scripts.html | 10 +-
package-lock.json | 10 +
package.json | 1 +
8 files changed, 75 insertions(+), 2045 deletions(-)
delete mode 100644 docs/assets/js/list.js
create mode 100644 docs/assets/js/search.js
delete mode 100644 docs/assets/js/vendor/list.js
diff --git a/config.yml b/config.yml
index 7f5797d28a..b0b7975fd4 100644
--- a/config.yml
+++ b/config.yml
@@ -50,6 +50,8 @@ module:
target: assets/js/vendor/bootstrap.bundle.min.js
- source: node_modules/clipboard/dist/clipboard.min.js
target: assets/js/vendor/clipboard.min.js
+ - source: node_modules/fuse.js/dist/fuse.min.js
+ target: assets/js/vendor/fuse.min.js
params:
description: "Official open source SVG icon library for Bootstrap"
diff --git a/docs/assets/js/list.js b/docs/assets/js/list.js
deleted file mode 100644
index 7beb4f165f..0000000000
--- a/docs/assets/js/list.js
+++ /dev/null
@@ -1,17 +0,0 @@
-/* global List:false */
-
-(function () {
- 'use strict'
-
- new List('icons-body', {
- searchDelay: 250,
- valueNames: [
- 'name', {
- data: [
- 'tags',
- 'categories'
- ]
- }
- ]
- })
-})()
diff --git a/docs/assets/js/search.js b/docs/assets/js/search.js
new file mode 100644
index 0000000000..a845b1c66f
--- /dev/null
+++ b/docs/assets/js/search.js
@@ -0,0 +1,55 @@
+/* global Fuse:false */
+
+(function () {
+ 'use strict'
+
+ const iconsBody = document.querySelector('#icons-body')
+
+ if (!iconsBody) return
+
+ const searchInput = iconsBody.querySelector('#search')
+ const iconListContainer = iconsBody.querySelector('#icons-list')
+ const iconElementList = iconListContainer.querySelectorAll('#icons-list li')
+
+ const iconDataList = Array.from(iconElementList).map(element => ({
+ name: element.dataset.name,
+ categories: element.dataset.categories.split(' '),
+ tags: element.dataset.tags.split(' ')
+ }))
+
+ const fuse = new Fuse(iconDataList, {
+ ignoreLocation: true,
+ useExtendedSearch: true,
+ keys: ['name', 'categories', 'tags'],
+ threshold: 0
+ })
+
+ function search(searchTerm) {
+ const searchResult = fuse.search(searchTerm)
+
+ iconListContainer.innerHTML = ''
+ if (searchTerm.length) {
+ const resultElements = searchResult.map(result => iconElementList[result.refIndex])
+ iconListContainer.append(...resultElements)
+ } else {
+ iconListContainer.append(...iconElementList)
+ }
+
+ const newUrl = new URL(window.location)
+ if (searchTerm.length > 0) {
+ newUrl.searchParams.set('q', searchTerm)
+ } else {
+ newUrl.searchParams.delete('q')
+ }
+
+ window.history.replaceState(null, null, newUrl)
+ }
+
+ searchInput.addEventListener('input', () => search(searchInput.value))
+
+ const query = new URLSearchParams(window.location.search).get('q')
+ if (query) {
+ search(query)
+ searchInput.value = query
+ }
+})()
diff --git a/docs/assets/js/vendor/list.js b/docs/assets/js/vendor/list.js
deleted file mode 100644
index b2e334c714..0000000000
--- a/docs/assets/js/vendor/list.js
+++ /dev/null
@@ -1,2021 +0,0 @@
-var List;List =
-/******/ (function() { // webpackBootstrap
-/******/ var __webpack_modules__ = ({
-
-/***/ "./src/add-async.js":
-/*!**************************!*\
- !*** ./src/add-async.js ***!
- \**************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (list) {
- var addAsync = function addAsync(values, callback, items) {
- var valuesToAdd = values.splice(0, 50);
- items = items || [];
- items = items.concat(list.add(valuesToAdd));
-
- if (values.length > 0) {
- setTimeout(function () {
- addAsync(values, callback, items);
- }, 1);
- } else {
- list.update();
- callback(items);
- }
- };
-
- return addAsync;
-};
-
-/***/ }),
-
-/***/ "./src/filter.js":
-/*!***********************!*\
- !*** ./src/filter.js ***!
- \***********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (list) {
- // Add handlers
- list.handlers.filterStart = list.handlers.filterStart || [];
- list.handlers.filterComplete = list.handlers.filterComplete || [];
- return function (filterFunction) {
- list.trigger('filterStart');
- list.i = 1; // Reset paging
-
- list.reset.filter();
-
- if (filterFunction === undefined) {
- list.filtered = false;
- } else {
- list.filtered = true;
- var is = list.items;
-
- for (var i = 0, il = is.length; i < il; i++) {
- var item = is[i];
-
- if (filterFunction(item)) {
- item.filtered = true;
- } else {
- item.filtered = false;
- }
- }
- }
-
- list.update();
- list.trigger('filterComplete');
- return list.visibleItems;
- };
-};
-
-/***/ }),
-
-/***/ "./src/fuzzy-search.js":
-/*!*****************************!*\
- !*** ./src/fuzzy-search.js ***!
- \*****************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module, __webpack_require__ */
-/*! CommonJS bailout: module.exports is used directly at 8:0-14 */
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-var classes = __webpack_require__(/*! ./utils/classes */ "./src/utils/classes.js"),
- events = __webpack_require__(/*! ./utils/events */ "./src/utils/events.js"),
- extend = __webpack_require__(/*! ./utils/extend */ "./src/utils/extend.js"),
- toString = __webpack_require__(/*! ./utils/to-string */ "./src/utils/to-string.js"),
- getByClass = __webpack_require__(/*! ./utils/get-by-class */ "./src/utils/get-by-class.js"),
- fuzzy = __webpack_require__(/*! ./utils/fuzzy */ "./src/utils/fuzzy.js");
-
-module.exports = function (list, options) {
- options = options || {};
- options = extend({
- location: 0,
- distance: 100,
- threshold: 0.4,
- multiSearch: true,
- searchClass: 'fuzzy-search'
- }, options);
- var fuzzySearch = {
- search: function search(searchString, columns) {
- // Substract arguments from the searchString or put searchString as only argument
- var searchArguments = options.multiSearch ? searchString.replace(/ +$/, '').split(/ +/) : [searchString];
-
- for (var k = 0, kl = list.items.length; k < kl; k++) {
- fuzzySearch.item(list.items[k], columns, searchArguments);
- }
- },
- item: function item(_item, columns, searchArguments) {
- var found = true;
-
- for (var i = 0; i < searchArguments.length; i++) {
- var foundArgument = false;
-
- for (var j = 0, jl = columns.length; j < jl; j++) {
- if (fuzzySearch.values(_item.values(), columns[j], searchArguments[i])) {
- foundArgument = true;
- }
- }
-
- if (!foundArgument) {
- found = false;
- }
- }
-
- _item.found = found;
- },
- values: function values(_values, value, searchArgument) {
- if (_values.hasOwnProperty(value)) {
- var text = toString(_values[value]).toLowerCase();
-
- if (fuzzy(text, searchArgument, options)) {
- return true;
- }
- }
-
- return false;
- }
- };
- events.bind(getByClass(list.listContainer, options.searchClass), 'keyup', list.utils.events.debounce(function (e) {
- var target = e.target || e.srcElement; // IE have srcElement
-
- list.search(target.value, fuzzySearch.search);
- }, list.searchDelay));
- return function (str, columns) {
- list.search(str, columns, fuzzySearch.search);
- };
-};
-
-/***/ }),
-
-/***/ "./src/index.js":
-/*!**********************!*\
- !*** ./src/index.js ***!
- \**********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module, __webpack_require__ */
-/*! CommonJS bailout: module.exports is used directly at 11:0-14 */
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-var naturalSort = __webpack_require__(/*! string-natural-compare */ "./node_modules/string-natural-compare/natural-compare.js"),
- getByClass = __webpack_require__(/*! ./utils/get-by-class */ "./src/utils/get-by-class.js"),
- extend = __webpack_require__(/*! ./utils/extend */ "./src/utils/extend.js"),
- indexOf = __webpack_require__(/*! ./utils/index-of */ "./src/utils/index-of.js"),
- events = __webpack_require__(/*! ./utils/events */ "./src/utils/events.js"),
- toString = __webpack_require__(/*! ./utils/to-string */ "./src/utils/to-string.js"),
- classes = __webpack_require__(/*! ./utils/classes */ "./src/utils/classes.js"),
- getAttribute = __webpack_require__(/*! ./utils/get-attribute */ "./src/utils/get-attribute.js"),
- toArray = __webpack_require__(/*! ./utils/to-array */ "./src/utils/to-array.js");
-
-module.exports = function (id, options, values) {
- var self = this,
- init,
- Item = __webpack_require__(/*! ./item */ "./src/item.js")(self),
- addAsync = __webpack_require__(/*! ./add-async */ "./src/add-async.js")(self),
- initPagination = __webpack_require__(/*! ./pagination */ "./src/pagination.js")(self);
-
- init = {
- start: function start() {
- self.listClass = 'list';
- self.searchClass = 'search';
- self.sortClass = 'sort';
- self.page = 10000;
- self.i = 1;
- self.items = [];
- self.visibleItems = [];
- self.matchingItems = [];
- self.searched = false;
- self.filtered = false;
- self.searchColumns = undefined;
- self.searchDelay = 0;
- self.handlers = {
- updated: []
- };
- self.valueNames = [];
- self.utils = {
- getByClass: getByClass,
- extend: extend,
- indexOf: indexOf,
- events: events,
- toString: toString,
- naturalSort: naturalSort,
- classes: classes,
- getAttribute: getAttribute,
- toArray: toArray
- };
- self.utils.extend(self, options);
- self.listContainer = typeof id === 'string' ? document.getElementById(id) : id;
-
- if (!self.listContainer) {
- return;
- }
-
- self.list = getByClass(self.listContainer, self.listClass, true);
- self.parse = __webpack_require__(/*! ./parse */ "./src/parse.js")(self);
- self.templater = __webpack_require__(/*! ./templater */ "./src/templater.js")(self);
- self.search = __webpack_require__(/*! ./search */ "./src/search.js")(self);
- self.filter = __webpack_require__(/*! ./filter */ "./src/filter.js")(self);
- self.sort = __webpack_require__(/*! ./sort */ "./src/sort.js")(self);
- self.fuzzySearch = __webpack_require__(/*! ./fuzzy-search */ "./src/fuzzy-search.js")(self, options.fuzzySearch);
- this.handlers();
- this.items();
- this.pagination();
- self.update();
- },
- handlers: function handlers() {
- for (var handler in self.handlers) {
- if (self[handler] && self.handlers.hasOwnProperty(handler)) {
- self.on(handler, self[handler]);
- }
- }
- },
- items: function items() {
- self.parse(self.list);
-
- if (values !== undefined) {
- self.add(values);
- }
- },
- pagination: function pagination() {
- if (options.pagination !== undefined) {
- if (options.pagination === true) {
- options.pagination = [{}];
- }
-
- if (options.pagination[0] === undefined) {
- options.pagination = [options.pagination];
- }
-
- for (var i = 0, il = options.pagination.length; i < il; i++) {
- initPagination(options.pagination[i]);
- }
- }
- }
- };
- /*
- * Re-parse the List, use if html have changed
- */
-
- this.reIndex = function () {
- self.items = [];
- self.visibleItems = [];
- self.matchingItems = [];
- self.searched = false;
- self.filtered = false;
- self.parse(self.list);
- };
-
- this.toJSON = function () {
- var json = [];
-
- for (var i = 0, il = self.items.length; i < il; i++) {
- json.push(self.items[i].values());
- }
-
- return json;
- };
- /*
- * Add object to list
- */
-
-
- this.add = function (values, callback) {
- if (values.length === 0) {
- return;
- }
-
- if (callback) {
- addAsync(values.slice(0), callback);
- return;
- }
-
- var added = [],
- notCreate = false;
-
- if (values[0] === undefined) {
- values = [values];
- }
-
- for (var i = 0, il = values.length; i < il; i++) {
- var item = null;
- notCreate = self.items.length > self.page ? true : false;
- item = new Item(values[i], undefined, notCreate);
- self.items.push(item);
- added.push(item);
- }
-
- self.update();
- return added;
- };
-
- this.show = function (i, page) {
- this.i = i;
- this.page = page;
- self.update();
- return self;
- };
- /* Removes object from list.
- * Loops through the list and removes objects where
- * property "valuename" === value
- */
-
-
- this.remove = function (valueName, value, options) {
- var found = 0;
-
- for (var i = 0, il = self.items.length; i < il; i++) {
- if (self.items[i].values()[valueName] == value) {
- self.templater.remove(self.items[i], options);
- self.items.splice(i, 1);
- il--;
- i--;
- found++;
- }
- }
-
- self.update();
- return found;
- };
- /* Gets the objects in the list which
- * property "valueName" === value
- */
-
-
- this.get = function (valueName, value) {
- var matchedItems = [];
-
- for (var i = 0, il = self.items.length; i < il; i++) {
- var item = self.items[i];
-
- if (item.values()[valueName] == value) {
- matchedItems.push(item);
- }
- }
-
- return matchedItems;
- };
- /*
- * Get size of the list
- */
-
-
- this.size = function () {
- return self.items.length;
- };
- /*
- * Removes all items from the list
- */
-
-
- this.clear = function () {
- self.templater.clear();
- self.items = [];
- return self;
- };
-
- this.on = function (event, callback) {
- self.handlers[event].push(callback);
- return self;
- };
-
- this.off = function (event, callback) {
- var e = self.handlers[event];
- var index = indexOf(e, callback);
-
- if (index > -1) {
- e.splice(index, 1);
- }
-
- return self;
- };
-
- this.trigger = function (event) {
- var i = self.handlers[event].length;
-
- while (i--) {
- self.handlers[event][i](self);
- }
-
- return self;
- };
-
- this.reset = {
- filter: function filter() {
- var is = self.items,
- il = is.length;
-
- while (il--) {
- is[il].filtered = false;
- }
-
- return self;
- },
- search: function search() {
- var is = self.items,
- il = is.length;
-
- while (il--) {
- is[il].found = false;
- }
-
- return self;
- }
- };
-
- this.update = function () {
- var is = self.items,
- il = is.length;
- self.visibleItems = [];
- self.matchingItems = [];
- self.templater.clear();
-
- for (var i = 0; i < il; i++) {
- if (is[i].matching() && self.matchingItems.length + 1 >= self.i && self.visibleItems.length < self.page) {
- is[i].show();
- self.visibleItems.push(is[i]);
- self.matchingItems.push(is[i]);
- } else if (is[i].matching()) {
- self.matchingItems.push(is[i]);
- is[i].hide();
- } else {
- is[i].hide();
- }
- }
-
- self.trigger('updated');
- return self;
- };
-
- init.start();
-};
-
-/***/ }),
-
-/***/ "./src/item.js":
-/*!*********************!*\
- !*** ./src/item.js ***!
- \*********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (list) {
- return function (initValues, element, notCreate) {
- var item = this;
- this._values = {};
- this.found = false; // Show if list.searched == true and this.found == true
-
- this.filtered = false; // Show if list.filtered == true and this.filtered == true
-
- var init = function init(initValues, element, notCreate) {
- if (element === undefined) {
- if (notCreate) {
- item.values(initValues, notCreate);
- } else {
- item.values(initValues);
- }
- } else {
- item.elm = element;
- var values = list.templater.get(item, initValues);
- item.values(values);
- }
- };
-
- this.values = function (newValues, notCreate) {
- if (newValues !== undefined) {
- for (var name in newValues) {
- item._values[name] = newValues[name];
- }
-
- if (notCreate !== true) {
- list.templater.set(item, item.values());
- }
- } else {
- return item._values;
- }
- };
-
- this.show = function () {
- list.templater.show(item);
- };
-
- this.hide = function () {
- list.templater.hide(item);
- };
-
- this.matching = function () {
- return list.filtered && list.searched && item.found && item.filtered || list.filtered && !list.searched && item.filtered || !list.filtered && list.searched && item.found || !list.filtered && !list.searched;
- };
-
- this.visible = function () {
- return item.elm && item.elm.parentNode == list.list ? true : false;
- };
-
- init(initValues, element, notCreate);
- };
-};
-
-/***/ }),
-
-/***/ "./src/pagination.js":
-/*!***************************!*\
- !*** ./src/pagination.js ***!
- \***************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module, __webpack_require__ */
-/*! CommonJS bailout: module.exports is used directly at 5:0-14 */
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-var classes = __webpack_require__(/*! ./utils/classes */ "./src/utils/classes.js"),
- events = __webpack_require__(/*! ./utils/events */ "./src/utils/events.js"),
- List = __webpack_require__(/*! ./index */ "./src/index.js");
-
-module.exports = function (list) {
- var isHidden = false;
-
- var refresh = function refresh(pagingList, options) {
- if (list.page < 1) {
- list.listContainer.style.display = 'none';
- isHidden = true;
- return;
- } else if (isHidden) {
- list.listContainer.style.display = 'block';
- }
-
- var item,
- l = list.matchingItems.length,
- index = list.i,
- page = list.page,
- pages = Math.ceil(l / page),
- currentPage = Math.ceil(index / page),
- innerWindow = options.innerWindow || 2,
- left = options.left || options.outerWindow || 0,
- right = options.right || options.outerWindow || 0;
- right = pages - right;
- pagingList.clear();
-
- for (var i = 1; i <= pages; i++) {
- var className = currentPage === i ? 'active' : ''; //console.log(i, left, right, currentPage, (currentPage - innerWindow), (currentPage + innerWindow), className);
-
- if (is.number(i, left, right, currentPage, innerWindow)) {
- item = pagingList.add({
- page: i,
- dotted: false
- })[0];
-
- if (className) {
- classes(item.elm).add(className);
- }
-
- item.elm.firstChild.setAttribute('data-i', i);
- item.elm.firstChild.setAttribute('data-page', page);
- } else if (is.dotted(pagingList, i, left, right, currentPage, innerWindow, pagingList.size())) {
- item = pagingList.add({
- page: '...',
- dotted: true
- })[0];
- classes(item.elm).add('disabled');
- }
- }
- };
-
- var is = {
- number: function number(i, left, right, currentPage, innerWindow) {
- return this.left(i, left) || this.right(i, right) || this.innerWindow(i, currentPage, innerWindow);
- },
- left: function left(i, _left) {
- return i <= _left;
- },
- right: function right(i, _right) {
- return i > _right;
- },
- innerWindow: function innerWindow(i, currentPage, _innerWindow) {
- return i >= currentPage - _innerWindow && i <= currentPage + _innerWindow;
- },
- dotted: function dotted(pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
- return this.dottedLeft(pagingList, i, left, right, currentPage, innerWindow) || this.dottedRight(pagingList, i, left, right, currentPage, innerWindow, currentPageItem);
- },
- dottedLeft: function dottedLeft(pagingList, i, left, right, currentPage, innerWindow) {
- return i == left + 1 && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right);
- },
- dottedRight: function dottedRight(pagingList, i, left, right, currentPage, innerWindow, currentPageItem) {
- if (pagingList.items[currentPageItem - 1].values().dotted) {
- return false;
- } else {
- return i == right && !this.innerWindow(i, currentPage, innerWindow) && !this.right(i, right);
- }
- }
- };
- return function (options) {
- var pagingList = new List(list.listContainer.id, {
- listClass: options.paginationClass || 'pagination',
- item: options.item || "
",
- valueNames: ['page', 'dotted'],
- searchClass: 'pagination-search-that-is-not-supposed-to-exist',
- sortClass: 'pagination-sort-that-is-not-supposed-to-exist'
- });
- events.bind(pagingList.listContainer, 'click', function (e) {
- var target = e.target || e.srcElement,
- page = list.utils.getAttribute(target, 'data-page'),
- i = list.utils.getAttribute(target, 'data-i');
-
- if (i) {
- list.show((i - 1) * page + 1, page);
- }
- });
- list.on('updated', function () {
- refresh(pagingList, options);
- });
- refresh(pagingList, options);
- };
-};
-
-/***/ }),
-
-/***/ "./src/parse.js":
-/*!**********************!*\
- !*** ./src/parse.js ***!
- \**********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module, __webpack_require__ */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-module.exports = function (list) {
- var Item = __webpack_require__(/*! ./item */ "./src/item.js")(list);
-
- var getChildren = function getChildren(parent) {
- var nodes = parent.childNodes,
- items = [];
-
- for (var i = 0, il = nodes.length; i < il; i++) {
- // Only textnodes have a data attribute
- if (nodes[i].data === undefined) {
- items.push(nodes[i]);
- }
- }
-
- return items;
- };
-
- var parse = function parse(itemElements, valueNames) {
- for (var i = 0, il = itemElements.length; i < il; i++) {
- list.items.push(new Item(valueNames, itemElements[i]));
- }
- };
-
- var parseAsync = function parseAsync(itemElements, valueNames) {
- var itemsToIndex = itemElements.splice(0, 50); // TODO: If < 100 items, what happens in IE etc?
-
- parse(itemsToIndex, valueNames);
-
- if (itemElements.length > 0) {
- setTimeout(function () {
- parseAsync(itemElements, valueNames);
- }, 1);
- } else {
- list.update();
- list.trigger('parseComplete');
- }
- };
-
- list.handlers.parseComplete = list.handlers.parseComplete || [];
- return function () {
- var itemsToIndex = getChildren(list.list),
- valueNames = list.valueNames;
-
- if (list.indexAsync) {
- parseAsync(itemsToIndex, valueNames);
- } else {
- parse(itemsToIndex, valueNames);
- }
- };
-};
-
-/***/ }),
-
-/***/ "./src/search.js":
-/*!***********************!*\
- !*** ./src/search.js ***!
- \***********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (_list) {
- var item, text, columns, searchString, customSearch;
- var prepare = {
- resetList: function resetList() {
- _list.i = 1;
-
- _list.templater.clear();
-
- customSearch = undefined;
- },
- setOptions: function setOptions(args) {
- if (args.length == 2 && args[1] instanceof Array) {
- columns = args[1];
- } else if (args.length == 2 && typeof args[1] == 'function') {
- columns = undefined;
- customSearch = args[1];
- } else if (args.length == 3) {
- columns = args[1];
- customSearch = args[2];
- } else {
- columns = undefined;
- }
- },
- setColumns: function setColumns() {
- if (_list.items.length === 0) return;
-
- if (columns === undefined) {
- columns = _list.searchColumns === undefined ? prepare.toArray(_list.items[0].values()) : _list.searchColumns;
- }
- },
- setSearchString: function setSearchString(s) {
- s = _list.utils.toString(s).toLowerCase();
- // FIXME XhmikosR removed `-`
- s = s.replace(/[[\]{}()*+?.,\\^$|#]/g, '\\$&'); // Escape regular expression characters
-
- searchString = s;
- },
- toArray: function toArray(values) {
- var tmpColumn = [];
-
- for (var name in values) {
- tmpColumn.push(name);
- }
-
- return tmpColumn;
- }
- };
- var search = {
- list: function list() {
- // Extract quoted phrases "word1 word2" from original searchString
- // searchString is converted to lowercase by List.js
- var words = [],
- phrase,
- ss = searchString;
-
- while ((phrase = ss.match(/"([^"]+)"/)) !== null) {
- words.push(phrase[1]);
- ss = ss.substring(0, phrase.index) + ss.substring(phrase.index + phrase[0].length);
- } // Get remaining space-separated words (if any)
-
-
- ss = ss.trim();
- if (ss.length) words = words.concat(ss.split(/\s+/));
-
- for (var k = 0, kl = _list.items.length; k < kl; k++) {
- var item = _list.items[k];
- item.found = false;
- if (!words.length) continue;
-
- for (var i = 0, il = words.length; i < il; i++) {
- var word_found = false;
-
- for (var j = 0, jl = columns.length; j < jl; j++) {
- var values = item.values(),
- column = columns[j];
-
- if (values.hasOwnProperty(column) && values[column] !== undefined && values[column] !== null) {
- var text = typeof values[column] !== 'string' ? values[column].toString() : values[column];
-
- if (text.toLowerCase().indexOf(words[i]) !== -1) {
- // word found, so no need to check it against any other columns
- word_found = true;
- break;
- }
- }
- } // this word not found? no need to check any other words, the item cannot match
-
-
- if (!word_found) break;
- }
-
- item.found = word_found;
- }
- },
- // Removed search.item() and search.values()
- reset: function reset() {
- _list.reset.search();
-
- _list.searched = false;
- }
- };
-
- var searchMethod = function searchMethod(str) {
- _list.trigger('searchStart');
-
- prepare.resetList();
- prepare.setSearchString(str);
- prepare.setOptions(arguments); // str, cols|searchFunction, searchFunction
-
- prepare.setColumns();
-
- if (searchString === '') {
- search.reset();
- } else {
- _list.searched = true;
-
- if (customSearch) {
- customSearch(searchString, columns);
- } else {
- search.list();
- }
- }
-
- _list.update();
-
- _list.trigger('searchComplete');
-
- return _list.visibleItems;
- };
-
- _list.handlers.searchStart = _list.handlers.searchStart || [];
- _list.handlers.searchComplete = _list.handlers.searchComplete || [];
-
- _list.utils.events.bind(_list.utils.getByClass(_list.listContainer, _list.searchClass), 'keyup', _list.utils.events.debounce(function (e) {
- var target = e.target || e.srcElement,
- // IE have srcElement
- alreadyCleared = target.value === '' && !_list.searched;
-
- if (!alreadyCleared) {
- // If oninput already have resetted the list, do nothing
- searchMethod(target.value);
- }
- }, _list.searchDelay)); // Used to detect click on HTML5 clear button
-
-
- _list.utils.events.bind(_list.utils.getByClass(_list.listContainer, _list.searchClass), 'input', function (e) {
- var target = e.target || e.srcElement;
-
- if (target.value === '') {
- searchMethod('');
- }
- });
-
- return searchMethod;
-};
-
-/***/ }),
-
-/***/ "./src/sort.js":
-/*!*********************!*\
- !*** ./src/sort.js ***!
- \*********************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (list) {
- var buttons = {
- els: undefined,
- clear: function clear() {
- for (var i = 0, il = buttons.els.length; i < il; i++) {
- list.utils.classes(buttons.els[i]).remove('asc');
- list.utils.classes(buttons.els[i]).remove('desc');
- }
- },
- getOrder: function getOrder(btn) {
- var predefinedOrder = list.utils.getAttribute(btn, 'data-order');
-
- if (predefinedOrder == 'asc' || predefinedOrder == 'desc') {
- return predefinedOrder;
- } else if (list.utils.classes(btn).has('desc')) {
- return 'asc';
- } else if (list.utils.classes(btn).has('asc')) {
- return 'desc';
- } else {
- return 'asc';
- }
- },
- getInSensitive: function getInSensitive(btn, options) {
- var insensitive = list.utils.getAttribute(btn, 'data-insensitive');
-
- if (insensitive === 'false') {
- options.insensitive = false;
- } else {
- options.insensitive = true;
- }
- },
- setOrder: function setOrder(options) {
- for (var i = 0, il = buttons.els.length; i < il; i++) {
- var btn = buttons.els[i];
-
- if (list.utils.getAttribute(btn, 'data-sort') !== options.valueName) {
- continue;
- }
-
- var predefinedOrder = list.utils.getAttribute(btn, 'data-order');
-
- if (predefinedOrder == 'asc' || predefinedOrder == 'desc') {
- if (predefinedOrder == options.order) {
- list.utils.classes(btn).add(options.order);
- }
- } else {
- list.utils.classes(btn).add(options.order);
- }
- }
- }
- };
-
- var sort = function sort() {
- list.trigger('sortStart');
- var options = {};
- var target = arguments[0].currentTarget || arguments[0].srcElement || undefined;
-
- if (target) {
- options.valueName = list.utils.getAttribute(target, 'data-sort');
- buttons.getInSensitive(target, options);
- options.order = buttons.getOrder(target);
- } else {
- options = arguments[1] || options;
- options.valueName = arguments[0];
- options.order = options.order || 'asc';
- options.insensitive = typeof options.insensitive == 'undefined' ? true : options.insensitive;
- }
-
- buttons.clear();
- buttons.setOrder(options); // caseInsensitive
- // alphabet
-
- var customSortFunction = options.sortFunction || list.sortFunction || null,
- multi = options.order === 'desc' ? -1 : 1,
- sortFunction;
-
- if (customSortFunction) {
- sortFunction = function sortFunction(itemA, itemB) {
- return customSortFunction(itemA, itemB, options) * multi;
- };
- } else {
- sortFunction = function sortFunction(itemA, itemB) {
- var sort = list.utils.naturalSort;
- sort.alphabet = list.alphabet || options.alphabet || undefined;
-
- if (!sort.alphabet && options.insensitive) {
- sort = list.utils.naturalSort.caseInsensitive;
- }
-
- return sort(itemA.values()[options.valueName], itemB.values()[options.valueName]) * multi;
- };
- }
-
- list.items.sort(sortFunction);
- list.update();
- list.trigger('sortComplete');
- }; // Add handlers
-
-
- list.handlers.sortStart = list.handlers.sortStart || [];
- list.handlers.sortComplete = list.handlers.sortComplete || [];
- buttons.els = list.utils.getByClass(list.listContainer, list.sortClass);
- list.utils.events.bind(buttons.els, 'click', sort);
- list.on('searchStart', buttons.clear);
- list.on('filterStart', buttons.clear);
- return sort;
-};
-
-/***/ }),
-
-/***/ "./src/templater.js":
-/*!**************************!*\
- !*** ./src/templater.js ***!
- \**************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 216:0-14 */
-/***/ (function(module) {
-
-var Templater = function Templater(list) {
- var createItem,
- templater = this;
-
- var init = function init() {
- var itemSource;
-
- if (typeof list.item === 'function') {
- createItem = function createItem(values) {
- var item = list.item(values);
- return getItemSource(item);
- };
-
- return;
- }
-
- if (typeof list.item === 'string') {
- if (list.item.indexOf('<') === -1) {
- itemSource = document.getElementById(list.item);
- } else {
- itemSource = getItemSource(list.item);
- }
- } else {
- /* If item source does not exists, use the first item in list as
- source for new items */
- itemSource = getFirstListItem();
- }
-
- if (!itemSource) {
- throw new Error("The list needs to have at least one item on init otherwise you'll have to add a template.");
- }
-
- itemSource = createCleanTemplateItem(itemSource, list.valueNames);
-
- createItem = function createItem() {
- return itemSource.cloneNode(true);
- };
- };
-
- var createCleanTemplateItem = function createCleanTemplateItem(templateNode, valueNames) {
- var el = templateNode.cloneNode(true);
- el.removeAttribute('id');
-
- for (var i = 0, il = valueNames.length; i < il; i++) {
- var elm = undefined,
- valueName = valueNames[i];
-
- if (valueName.data) {
- for (var j = 0, jl = valueName.data.length; j < jl; j++) {
- el.setAttribute('data-' + valueName.data[j], '');
- }
- } else if (valueName.attr && valueName.name) {
- elm = list.utils.getByClass(el, valueName.name, true);
-
- if (elm) {
- elm.setAttribute(valueName.attr, '');
- }
- } else {
- elm = list.utils.getByClass(el, valueName, true);
-
- if (elm) {
- elm.innerHTML = '';
- }
- }
- }
-
- return el;
- };
-
- var getFirstListItem = function getFirstListItem() {
- var nodes = list.list.childNodes;
-
- for (var i = 0, il = nodes.length; i < il; i++) {
- // Only textnodes have a data attribute
- if (nodes[i].data === undefined) {
- return nodes[i].cloneNode(true);
- }
- }
-
- return undefined;
- };
-
- var getItemSource = function getItemSource(itemHTML) {
- if (typeof itemHTML !== 'string') return undefined;
-
- if (/]/g.exec(itemHTML)) {
- var tbody = document.createElement('tbody');
- tbody.innerHTML = itemHTML;
- return tbody.firstElementChild;
- } else if (itemHTML.indexOf('<') !== -1) {
- var div = document.createElement('div');
- div.innerHTML = itemHTML;
- return div.firstElementChild;
- }
-
- return undefined;
- };
-
- var getValueName = function getValueName(name) {
- for (var i = 0, il = list.valueNames.length; i < il; i++) {
- var valueName = list.valueNames[i];
-
- if (valueName.data) {
- var data = valueName.data;
-
- for (var j = 0, jl = data.length; j < jl; j++) {
- if (data[j] === name) {
- return {
- data: name
- };
- }
- }
- } else if (valueName.attr && valueName.name && valueName.name == name) {
- return valueName;
- } else if (valueName === name) {
- return name;
- }
- }
- };
-
- var setValue = function setValue(item, name, value) {
- var elm = undefined,
- valueName = getValueName(name);
- if (!valueName) return;
-
- if (valueName.data) {
- item.elm.setAttribute('data-' + valueName.data, value);
- } else if (valueName.attr && valueName.name) {
- elm = list.utils.getByClass(item.elm, valueName.name, true);
-
- if (elm) {
- elm.setAttribute(valueName.attr, value);
- }
- } else {
- elm = list.utils.getByClass(item.elm, valueName, true);
-
- if (elm) {
- elm.innerHTML = value;
- }
- }
- };
-
- this.get = function (item, valueNames) {
- templater.create(item);
- var values = {};
-
- for (var i = 0, il = valueNames.length; i < il; i++) {
- var elm = undefined,
- valueName = valueNames[i];
-
- if (valueName.data) {
- for (var j = 0, jl = valueName.data.length; j < jl; j++) {
- values[valueName.data[j]] = list.utils.getAttribute(item.elm, 'data-' + valueName.data[j]);
- }
- } else if (valueName.attr && valueName.name) {
- elm = list.utils.getByClass(item.elm, valueName.name, true);
- values[valueName.name] = elm ? list.utils.getAttribute(elm, valueName.attr) : '';
- } else {
- elm = list.utils.getByClass(item.elm, valueName, true);
- values[valueName] = elm ? elm.innerHTML : '';
- }
- }
-
- return values;
- };
-
- this.set = function (item, values) {
- if (!templater.create(item)) {
- for (var v in values) {
- if (values.hasOwnProperty(v)) {
- setValue(item, v, values[v]);
- }
- }
- }
- };
-
- this.create = function (item) {
- if (item.elm !== undefined) {
- return false;
- }
-
- item.elm = createItem(item.values());
- templater.set(item, item.values());
- return true;
- };
-
- this.remove = function (item) {
- if (item.elm.parentNode === list.list) {
- list.list.removeChild(item.elm);
- }
- };
-
- this.show = function (item) {
- templater.create(item);
- list.list.appendChild(item.elm);
- };
-
- this.hide = function (item) {
- if (item.elm !== undefined && item.elm.parentNode === list.list) {
- list.list.removeChild(item.elm);
- }
- };
-
- this.clear = function () {
- /* .innerHTML = ''; fucks up IE */
- if (list.list.hasChildNodes()) {
- while (list.list.childNodes.length >= 1) {
- list.list.removeChild(list.list.firstChild);
- }
- }
- };
-
- init();
-};
-
-module.exports = function (list) {
- return new Templater(list);
-};
-
-/***/ }),
-
-/***/ "./src/utils/classes.js":
-/*!******************************!*\
- !*** ./src/utils/classes.js ***!
- \******************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module, __webpack_require__ */
-/*! CommonJS bailout: module.exports is used directly at 24:0-14 */
-/***/ (function(module, __unused_webpack_exports, __webpack_require__) {
-
-/**
- * Module dependencies.
- */
-var index = __webpack_require__(/*! ./index-of */ "./src/utils/index-of.js");
-/**
- * Whitespace regexp.
- */
-
-
-var re = /\s+/;
-/**
- * toString reference.
- */
-
-var toString = Object.prototype.toString;
-/**
- * Wrap `el` in a `ClassList`.
- *
- * @param {Element} el
- * @return {ClassList}
- * @api public
- */
-
-module.exports = function (el) {
- return new ClassList(el);
-};
-/**
- * Initialize a new ClassList for `el`.
- *
- * @param {Element} el
- * @api private
- */
-
-
-function ClassList(el) {
- if (!el || !el.nodeType) {
- throw new Error('A DOM element reference is required');
- }
-
- this.el = el;
- this.list = el.classList;
-}
-/**
- * Add class `name` if not already present.
- *
- * @param {String} name
- * @return {ClassList}
- * @api public
- */
-
-
-ClassList.prototype.add = function (name) {
- // classList
- if (this.list) {
- this.list.add(name);
- return this;
- } // fallback
-
-
- var arr = this.array();
- var i = index(arr, name);
- if (!~i) arr.push(name);
- this.el.className = arr.join(' ');
- return this;
-};
-/**
- * Remove class `name` when present, or
- * pass a regular expression to remove
- * any which match.
- *
- * @param {String|RegExp} name
- * @return {ClassList}
- * @api public
- */
-
-
-ClassList.prototype.remove = function (name) {
- // classList
- if (this.list) {
- this.list.remove(name);
- return this;
- } // fallback
-
-
- var arr = this.array();
- var i = index(arr, name);
- if (~i) arr.splice(i, 1);
- this.el.className = arr.join(' ');
- return this;
-};
-/**
- * Toggle class `name`, can force state via `force`.
- *
- * For browsers that support classList, but do not support `force` yet,
- * the mistake will be detected and corrected.
- *
- * @param {String} name
- * @param {Boolean} force
- * @return {ClassList}
- * @api public
- */
-
-
-ClassList.prototype.toggle = function (name, force) {
- // classList
- if (this.list) {
- if ('undefined' !== typeof force) {
- if (force !== this.list.toggle(name, force)) {
- this.list.toggle(name); // toggle again to correct
- }
- } else {
- this.list.toggle(name);
- }
-
- return this;
- } // fallback
-
-
- if ('undefined' !== typeof force) {
- if (!force) {
- this.remove(name);
- } else {
- this.add(name);
- }
- } else {
- if (this.has(name)) {
- this.remove(name);
- } else {
- this.add(name);
- }
- }
-
- return this;
-};
-/**
- * Return an array of classes.
- *
- * @return {Array}
- * @api public
- */
-
-
-ClassList.prototype.array = function () {
- var className = this.el.getAttribute('class') || '';
- var str = className.replace(/^\s+|\s+$/g, '');
- var arr = str.split(re);
- if ('' === arr[0]) arr.shift();
- return arr;
-};
-/**
- * Check if class `name` is present.
- *
- * @param {String} name
- * @return {ClassList}
- * @api public
- */
-
-
-ClassList.prototype.has = ClassList.prototype.contains = function (name) {
- return this.list ? this.list.contains(name) : !!~index(this.array(), name);
-};
-
-/***/ }),
-
-/***/ "./src/utils/events.js":
-/*!*****************************!*\
- !*** ./src/utils/events.js ***!
- \*****************************/
-/*! default exports */
-/*! export bind [provided] [no usage info] [missing usage info prevents renaming] */
-/*! export debounce [provided] [no usage info] [missing usage info prevents renaming] */
-/*! export unbind [provided] [no usage info] [missing usage info prevents renaming] */
-/*! other exports [not provided] [no usage info] */
-/*! runtime requirements: __webpack_exports__, __webpack_require__ */
-/***/ (function(__unused_webpack_module, exports, __webpack_require__) {
-
-var bind = window.addEventListener ? 'addEventListener' : 'attachEvent',
- unbind = window.removeEventListener ? 'removeEventListener' : 'detachEvent',
- prefix = bind !== 'addEventListener' ? 'on' : '',
- toArray = __webpack_require__(/*! ./to-array */ "./src/utils/to-array.js");
-/**
- * Bind `el` event `type` to `fn`.
- *
- * @param {Element} el, NodeList, HTMLCollection or Array
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @api public
- */
-
-
-exports.bind = function (el, type, fn, capture) {
- el = toArray(el);
-
- for (var i = 0, il = el.length; i < il; i++) {
- el[i][bind](prefix + type, fn, capture || false);
- }
-};
-/**
- * Unbind `el` event `type`'s callback `fn`.
- *
- * @param {Element} el, NodeList, HTMLCollection or Array
- * @param {String} type
- * @param {Function} fn
- * @param {Boolean} capture
- * @api public
- */
-
-
-exports.unbind = function (el, type, fn, capture) {
- el = toArray(el);
-
- for (var i = 0, il = el.length; i < il; i++) {
- el[i][unbind](prefix + type, fn, capture || false);
- }
-};
-/**
- * Returns a function, that, as long as it continues to be invoked, will not
- * be triggered. The function will be called after it stops being called for
- * `wait` milliseconds. If `immediate` is true, trigger the function on the
- * leading edge, instead of the trailing.
- *
- * @param {Function} fn
- * @param {Integer} wait
- * @param {Boolean} immediate
- * @api public
- */
-
-
-exports.debounce = function (fn, wait, immediate) {
- var timeout;
- return wait ? function () {
- var context = this,
- args = arguments;
-
- var later = function later() {
- timeout = null;
- if (!immediate) fn.apply(context, args);
- };
-
- var callNow = immediate && !timeout;
- clearTimeout(timeout);
- timeout = setTimeout(later, wait);
- if (callNow) fn.apply(context, args);
- } : fn;
-};
-
-/***/ }),
-
-/***/ "./src/utils/extend.js":
-/*!*****************************!*\
- !*** ./src/utils/extend.js ***!
- \*****************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 4:0-14 */
-/***/ (function(module) {
-
-/*
- * Source: https://github.com/segmentio/extend
- */
-module.exports = function extend(object) {
- // Takes an unlimited number of extenders.
- var args = Array.prototype.slice.call(arguments, 1); // For each extender, copy their properties on our object.
-
- for (var i = 0, source; source = args[i]; i++) {
- if (!source) continue;
-
- for (var property in source) {
- object[property] = source[property];
- }
- }
-
- return object;
-};
-
-/***/ }),
-
-/***/ "./src/utils/fuzzy.js":
-/*!****************************!*\
- !*** ./src/utils/fuzzy.js ***!
- \****************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (text, pattern, options) {
- // Aproximately where in the text is the pattern expected to be found?
- var Match_Location = options.location || 0; //Determines how close the match must be to the fuzzy location (specified above). An exact letter match which is 'distance' characters away from the fuzzy location would score as a complete mismatch. A distance of '0' requires the match be at the exact location specified, a threshold of '1000' would require a perfect match to be within 800 characters of the fuzzy location to be found using a 0.8 threshold.
-
- var Match_Distance = options.distance || 100; // At what point does the match algorithm give up. A threshold of '0.0' requires a perfect match (of both letters and location), a threshold of '1.0' would match anything.
-
- var Match_Threshold = options.threshold || 0.4;
- if (pattern === text) return true; // Exact match
-
- if (pattern.length > 32) return false; // This algorithm cannot be used
- // Set starting location at beginning text and initialise the alphabet.
-
- var loc = Match_Location,
- s = function () {
- var q = {},
- i;
-
- for (i = 0; i < pattern.length; i++) {
- q[pattern.charAt(i)] = 0;
- }
-
- for (i = 0; i < pattern.length; i++) {
- q[pattern.charAt(i)] |= 1 << pattern.length - i - 1;
- }
-
- return q;
- }(); // Compute and return the score for a match with e errors and x location.
- // Accesses loc and pattern through being a closure.
-
-
- function match_bitapScore_(e, x) {
- var accuracy = e / pattern.length,
- proximity = Math.abs(loc - x);
-
- if (!Match_Distance) {
- // Dodge divide by zero error.
- return proximity ? 1.0 : accuracy;
- }
-
- return accuracy + proximity / Match_Distance;
- }
-
- var score_threshold = Match_Threshold,
- // Highest score beyond which we give up.
- best_loc = text.indexOf(pattern, loc); // Is there a nearby exact match? (speedup)
-
- if (best_loc != -1) {
- score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold); // What about in the other direction? (speedup)
-
- best_loc = text.lastIndexOf(pattern, loc + pattern.length);
-
- if (best_loc != -1) {
- score_threshold = Math.min(match_bitapScore_(0, best_loc), score_threshold);
- }
- } // Initialise the bit arrays.
-
-
- var matchmask = 1 << pattern.length - 1;
- best_loc = -1;
- var bin_min, bin_mid;
- var bin_max = pattern.length + text.length;
- var last_rd;
-
- for (var d = 0; d < pattern.length; d++) {
- // Scan for the best match; each iteration allows for one more error.
- // Run a binary search to determine how far from 'loc' we can stray at this
- // error level.
- bin_min = 0;
- bin_mid = bin_max;
-
- while (bin_min < bin_mid) {
- if (match_bitapScore_(d, loc + bin_mid) <= score_threshold) {
- bin_min = bin_mid;
- } else {
- bin_max = bin_mid;
- }
-
- bin_mid = Math.floor((bin_max - bin_min) / 2 + bin_min);
- } // Use the result from this iteration as the maximum for the next.
-
-
- bin_max = bin_mid;
- var start = Math.max(1, loc - bin_mid + 1);
- var finish = Math.min(loc + bin_mid, text.length) + pattern.length;
- var rd = Array(finish + 2);
- rd[finish + 1] = (1 << d) - 1;
-
- for (var j = finish; j >= start; j--) {
- // The alphabet (s) is a sparse hash, so the following line generates
- // warnings.
- var charMatch = s[text.charAt(j - 1)];
-
- if (d === 0) {
- // First pass: exact match.
- rd[j] = (rd[j + 1] << 1 | 1) & charMatch;
- } else {
- // Subsequent passes: fuzzy match.
- rd[j] = (rd[j + 1] << 1 | 1) & charMatch | ((last_rd[j + 1] | last_rd[j]) << 1 | 1) | last_rd[j + 1];
- }
-
- if (rd[j] & matchmask) {
- var score = match_bitapScore_(d, j - 1); // This match will almost certainly be better than any existing match.
- // But check anyway.
-
- if (score <= score_threshold) {
- // Told you so.
- score_threshold = score;
- best_loc = j - 1;
-
- if (best_loc > loc) {
- // When passing loc, don't exceed our current distance from loc.
- start = Math.max(1, 2 * loc - best_loc);
- } else {
- // Already passed loc, downhill from here on in.
- break;
- }
- }
- }
- } // No hope for a (better) match at greater error levels.
-
-
- if (match_bitapScore_(d + 1, loc) > score_threshold) {
- break;
- }
-
- last_rd = rd;
- }
-
- return best_loc < 0 ? false : true;
-};
-
-/***/ }),
-
-/***/ "./src/utils/get-attribute.js":
-/*!************************************!*\
- !*** ./src/utils/get-attribute.js ***!
- \************************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 11:0-14 */
-/***/ (function(module) {
-
-/**
- * A cross-browser implementation of getAttribute.
- * Source found here: http://stackoverflow.com/a/3755343/361337 written by Vivin Paliath
- *
- * Return the value for `attr` at `element`.
- *
- * @param {Element} el
- * @param {String} attr
- * @api public
- */
-module.exports = function (el, attr) {
- var result = el.getAttribute && el.getAttribute(attr) || null;
-
- if (!result) {
- var attrs = el.attributes;
- var length = attrs.length;
-
- for (var i = 0; i < length; i++) {
- if (attrs[i] !== undefined) {
- if (attrs[i].nodeName === attr) {
- result = attrs[i].nodeValue;
- }
- }
- }
- }
-
- return result;
-};
-
-/***/ }),
-
-/***/ "./src/utils/get-by-class.js":
-/*!***********************************!*\
- !*** ./src/utils/get-by-class.js ***!
- \***********************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 53:0-14 */
-/***/ (function(module) {
-
-/**
- * A cross-browser implementation of getElementsByClass.
- * Heavily based on Dustin Diaz's function: http://dustindiaz.com/getelementsbyclass.
- *
- * Find all elements with class `className` inside `container`.
- * Use `single = true` to increase performance in older browsers
- * when only one element is needed.
- *
- * @param {String} className
- * @param {Element} container
- * @param {Boolean} single
- * @api public
- */
-var getElementsByClassName = function getElementsByClassName(container, className, single) {
- if (single) {
- return container.getElementsByClassName(className)[0];
- } else {
- return container.getElementsByClassName(className);
- }
-};
-
-var querySelector = function querySelector(container, className, single) {
- className = '.' + className;
-
- if (single) {
- return container.querySelector(className);
- } else {
- return container.querySelectorAll(className);
- }
-};
-
-var polyfill = function polyfill(container, className, single) {
- var classElements = [],
- tag = '*';
- var els = container.getElementsByTagName(tag);
- var elsLen = els.length;
- var pattern = new RegExp('(^|\\s)' + className + '(\\s|$)');
-
- for (var i = 0, j = 0; i < elsLen; i++) {
- if (pattern.test(els[i].className)) {
- if (single) {
- return els[i];
- } else {
- classElements[j] = els[i];
- j++;
- }
- }
- }
-
- return classElements;
-};
-
-module.exports = function () {
- return function (container, className, single, options) {
- options = options || {};
-
- if (options.test && options.getElementsByClassName || !options.test && document.getElementsByClassName) {
- return getElementsByClassName(container, className, single);
- } else if (options.test && options.querySelector || !options.test && document.querySelector) {
- return querySelector(container, className, single);
- } else {
- return polyfill(container, className, single);
- }
- };
-}();
-
-/***/ }),
-
-/***/ "./src/utils/index-of.js":
-/*!*******************************!*\
- !*** ./src/utils/index-of.js ***!
- \*******************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 3:0-14 */
-/***/ (function(module) {
-
-var indexOf = [].indexOf;
-
-module.exports = function (arr, obj) {
- if (indexOf) return arr.indexOf(obj);
-
- for (var i = 0, il = arr.length; i < il; ++i) {
- if (arr[i] === obj) return i;
- }
-
- return -1;
-};
-
-/***/ }),
-
-/***/ "./src/utils/to-array.js":
-/*!*******************************!*\
- !*** ./src/utils/to-array.js ***!
- \*******************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 11:0-14 */
-/***/ (function(module) {
-
-/**
- * Source: https://github.com/timoxley/to-array
- *
- * Convert an array-like object into an `Array`.
- * If `collection` is already an `Array`, then will return a clone of `collection`.
- *
- * @param {Array | Mixed} collection An `Array` or array-like object to convert e.g. `arguments` or `NodeList`
- * @return {Array} Naive conversion of `collection` to a new `Array`.
- * @api public
- */
-module.exports = function toArray(collection) {
- if (typeof collection === 'undefined') return [];
- if (collection === null) return [null];
- if (collection === window) return [window];
- if (typeof collection === 'string') return [collection];
- if (isArray(collection)) return collection;
- if (typeof collection.length != 'number') return [collection];
- if (typeof collection === 'function' && collection instanceof Function) return [collection];
- var arr = [];
-
- for (var i = 0, il = collection.length; i < il; i++) {
- if (Object.prototype.hasOwnProperty.call(collection, i) || i in collection) {
- arr.push(collection[i]);
- }
- }
-
- if (!arr.length) return [];
- return arr;
-};
-
-function isArray(arr) {
- return Object.prototype.toString.call(arr) === '[object Array]';
-}
-
-/***/ }),
-
-/***/ "./src/utils/to-string.js":
-/*!********************************!*\
- !*** ./src/utils/to-string.js ***!
- \********************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 1:0-14 */
-/***/ (function(module) {
-
-module.exports = function (s) {
- s = s === undefined ? '' : s;
- s = s === null ? '' : s;
- s = s.toString();
- return s;
-};
-
-/***/ }),
-
-/***/ "./node_modules/string-natural-compare/natural-compare.js":
-/*!****************************************************************!*\
- !*** ./node_modules/string-natural-compare/natural-compare.js ***!
- \****************************************************************/
-/*! unknown exports (runtime-defined) */
-/*! runtime requirements: module */
-/*! CommonJS bailout: module.exports is used directly at 124:0-14 */
-/***/ (function(module) {
-
-"use strict";
-
-
-var alphabet;
-var alphabetIndexMap;
-var alphabetIndexMapLength = 0;
-
-function isNumberCode(code) {
- return code >= 48 && code <= 57;
-}
-
-function naturalCompare(a, b) {
- var lengthA = (a += '').length;
- var lengthB = (b += '').length;
- var aIndex = 0;
- var bIndex = 0;
-
- while (aIndex < lengthA && bIndex < lengthB) {
- var charCodeA = a.charCodeAt(aIndex);
- var charCodeB = b.charCodeAt(bIndex);
-
- if (isNumberCode(charCodeA)) {
- if (!isNumberCode(charCodeB)) {
- return charCodeA - charCodeB;
- }
-
- var numStartA = aIndex;
- var numStartB = bIndex;
-
- while (charCodeA === 48 && ++numStartA < lengthA) {
- charCodeA = a.charCodeAt(numStartA);
- }
- while (charCodeB === 48 && ++numStartB < lengthB) {
- charCodeB = b.charCodeAt(numStartB);
- }
-
- var numEndA = numStartA;
- var numEndB = numStartB;
-
- while (numEndA < lengthA && isNumberCode(a.charCodeAt(numEndA))) {
- ++numEndA;
- }
- while (numEndB < lengthB && isNumberCode(b.charCodeAt(numEndB))) {
- ++numEndB;
- }
-
- var difference = numEndA - numStartA - numEndB + numStartB; // numA length - numB length
- if (difference) {
- return difference;
- }
-
- while (numStartA < numEndA) {
- difference = a.charCodeAt(numStartA++) - b.charCodeAt(numStartB++);
- if (difference) {
- return difference;
- }
- }
-
- aIndex = numEndA;
- bIndex = numEndB;
- continue;
- }
-
- if (charCodeA !== charCodeB) {
- if (
- charCodeA < alphabetIndexMapLength &&
- charCodeB < alphabetIndexMapLength &&
- alphabetIndexMap[charCodeA] !== -1 &&
- alphabetIndexMap[charCodeB] !== -1
- ) {
- return alphabetIndexMap[charCodeA] - alphabetIndexMap[charCodeB];
- }
-
- return charCodeA - charCodeB;
- }
-
- ++aIndex;
- ++bIndex;
- }
-
- if (aIndex >= lengthA && bIndex < lengthB && lengthA >= lengthB) {
- return -1;
- }
-
- if (bIndex >= lengthB && aIndex < lengthA && lengthB >= lengthA) {
- return 1;
- }
-
- return lengthA - lengthB;
-}
-
-naturalCompare.caseInsensitive = naturalCompare.i = function(a, b) {
- return naturalCompare(('' + a).toLowerCase(), ('' + b).toLowerCase());
-};
-
-Object.defineProperties(naturalCompare, {
- alphabet: {
- get: function() {
- return alphabet;
- },
-
- set: function(value) {
- alphabet = value;
- alphabetIndexMap = [];
-
- var i = 0;
-
- if (alphabet) {
- for (; i < alphabet.length; i++) {
- alphabetIndexMap[alphabet.charCodeAt(i)] = i;
- }
- }
-
- alphabetIndexMapLength = alphabetIndexMap.length;
-
- for (i = 0; i < alphabetIndexMapLength; i++) {
- if (alphabetIndexMap[i] === undefined) {
- alphabetIndexMap[i] = -1;
- }
- }
- },
- },
-});
-
-module.exports = naturalCompare;
-
-
-/***/ })
-
-/******/ });
-/************************************************************************/
-/******/ // The module cache
-/******/ var __webpack_module_cache__ = {};
-/******/
-/******/ // The require function
-/******/ function __webpack_require__(moduleId) {
-/******/ // Check if module is in cache
-/******/ if(__webpack_module_cache__[moduleId]) {
-/******/ return __webpack_module_cache__[moduleId].exports;
-/******/ }
-/******/ // Create a new module (and put it into the cache)
-/******/ var module = __webpack_module_cache__[moduleId] = {
-/******/ // no module.id needed
-/******/ // no module.loaded needed
-/******/ exports: {}
-/******/ };
-/******/
-/******/ // Execute the module function
-/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__);
-/******/
-/******/ // Return the exports of the module
-/******/ return module.exports;
-/******/ }
-/******/
-/************************************************************************/
-/******/ // module exports must be returned from runtime so entry inlining is disabled
-/******/ // startup
-/******/ // Load entry module and return exports
-/******/ return __webpack_require__("./src/index.js");
-/******/ })()
-;
-//# sourceMappingURL=list.js.map
\ No newline at end of file
diff --git a/docs/layouts/partials/icons.html b/docs/layouts/partials/icons.html
index b9c9b26ac8..0c54fa3d04 100644
--- a/docs/layouts/partials/icons.html
+++ b/docs/layouts/partials/icons.html
@@ -6,11 +6,11 @@ Icons
-
+
{{ range (where .Site.RegularPages "Type" "icons") -}}
{{- $filename := .File.TranslationBaseName -}}
{{- with .Site.GetPage .File.Path }}
- -
+
-
{{ if $.IsHome -}}
diff --git a/docs/layouts/partials/scripts.html b/docs/layouts/partials/scripts.html
index 736695c2ff..fecc99d52c 100644
--- a/docs/layouts/partials/scripts.html
+++ b/docs/layouts/partials/scripts.html
@@ -2,14 +2,14 @@
{{- if or .IsHome (eq .Page.Layout "sprite") -}}
- {{- $listVendor := resources.Get "js/vendor/list.js" -}}
- {{- $listJs := resources.Get "js/list.js" -}}
- {{- $listBundle := slice $listVendor $listJs | resources.Concat "assets/js/list.js" -}}
+ {{- $fuseVendor := resources.Get "js/vendor/fuse.min.js" -}}
+ {{- $searchJs := resources.Get "js/search.js" -}}
+ {{- $searchBundle := slice $fuseVendor $searchJs | resources.Concat "assets/js/search.js" -}}
{{- if eq hugo.Environment "production" -}}
- {{- $listBundle = $listBundle | resources.Minify -}}
+ {{- $searchBundle = $searchBundle | resources.Minify -}}
{{- end }}
-
+
{{- end }}
{{- $clipboardVendor := resources.Get "js/vendor/clipboard.min.js" -}}
diff --git a/package-lock.json b/package-lock.json
index 9ea3d845d8..c6cf9132e3 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -16,6 +16,7 @@
"cross-env": "^7.0.3",
"eslint": "^8.36.0",
"find-unused-sass-variables": "^4.0.6",
+ "fuse.js": "^6.6.2",
"hugo-bin": "^0.101.4",
"lockfile-lint": "^4.10.1",
"npm-run-all": "^4.1.5",
@@ -3254,6 +3255,15 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/fuse.js": {
+ "version": "6.6.2",
+ "resolved": "https://registry.npmjs.org/fuse.js/-/fuse.js-6.6.2.tgz",
+ "integrity": "sha512-cJaJkxCCxC8qIIcPBF9yGxY0W/tVZS3uEISDxhYIdtk8OL93pe+6Zj7LjCqVV4dzbqcriOZ+kQ/NE4RXZHsIGA==",
+ "dev": true,
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/gauge": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/gauge/-/gauge-4.0.4.tgz",
diff --git a/package.json b/package.json
index cfb8e13ae9..af52d8af4f 100644
--- a/package.json
+++ b/package.json
@@ -45,6 +45,7 @@
"cross-env": "^7.0.3",
"eslint": "^8.36.0",
"find-unused-sass-variables": "^4.0.6",
+ "fuse.js": "^6.6.2",
"hugo-bin": "^0.101.4",
"lockfile-lint": "^4.10.1",
"npm-run-all": "^4.1.5",