Vendored
+53
@@ -0,0 +1,53 @@
|
|||||||
|
:root {
|
||||||
|
--color-bg: #1f2428;
|
||||||
|
--color-text: #ddd;
|
||||||
|
--cover-bg-brightness: 0.75;
|
||||||
|
--codeblock-comment: #516e7a;
|
||||||
|
--codeblock-function: #f07178;
|
||||||
|
--codeblock-keyword: #c2e78c;
|
||||||
|
--codeblock-operator: #ffcb6b;
|
||||||
|
--codeblock-punctuation: #89ddff;
|
||||||
|
--codeblock-selector: #ffcb6b;
|
||||||
|
--codeblock-tag: #f07178;
|
||||||
|
--codeblock-variable: #ffcb6b;
|
||||||
|
--heading-color: var(--strong-color);
|
||||||
|
--mark-bg: #fde047;
|
||||||
|
--mark-color: var(--color-bg);
|
||||||
|
--strong-color: color-mix(in srgb, var(--color-text), #fff 35%);
|
||||||
|
--sidebar-toggle-bg: var(--color-mono-3);
|
||||||
|
--sidebar-toggle-color: var(--color-mono-5);
|
||||||
|
color-scheme: dark;
|
||||||
|
}
|
||||||
|
.cover-main a.button.secondary {
|
||||||
|
border-color: hsla(0, 0%, 100%, 0.5);
|
||||||
|
color: var(--color-text);
|
||||||
|
}
|
||||||
|
[class]:is(.markdown-section .callout) {
|
||||||
|
--callout-bg: unset;
|
||||||
|
}
|
||||||
|
.caution:is(.markdown-section .callout) {
|
||||||
|
--callout-border-color: #991b1b;
|
||||||
|
}
|
||||||
|
.important:is(.markdown-section .callout) {
|
||||||
|
--callout-border-color: #5b21b6;
|
||||||
|
}
|
||||||
|
.note:is(.markdown-section .callout) {
|
||||||
|
--callout-border-color: var(--theme-color-4);
|
||||||
|
}
|
||||||
|
.tip:is(.markdown-section .callout) {
|
||||||
|
--callout-border-color: #115e59;
|
||||||
|
}
|
||||||
|
.warning:is(.markdown-section .callout) {
|
||||||
|
--callout-border-color: #a16207;
|
||||||
|
}
|
||||||
|
:is(.markdown-section .callout) code,
|
||||||
|
:is(.markdown-section .callout) pre:where([data-lang]) {
|
||||||
|
background: var(--color-mono-min);
|
||||||
|
}
|
||||||
|
iframe,
|
||||||
|
iframe *,
|
||||||
|
iframe[src],
|
||||||
|
iframe[src] * {
|
||||||
|
color-scheme: light;
|
||||||
|
}
|
||||||
|
/*# sourceMappingURL=core-dark.min.css.map */
|
||||||
Vendored
+1678
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
+19
-14
@@ -14,15 +14,11 @@
|
|||||||
<link rel="icon" href="images/favicon.ico" />
|
<link rel="icon" href="images/favicon.ico" />
|
||||||
|
|
||||||
<!-- Themes (light + dark) -->
|
<!-- Themes (light + dark) -->
|
||||||
|
<link rel="stylesheet" href="./css/core.min.css" />
|
||||||
<link
|
<link
|
||||||
rel="stylesheet"
|
rel="stylesheet"
|
||||||
|
href="./css/addons/core-dark.min.css"
|
||||||
media="(prefers-color-scheme: dark)"
|
media="(prefers-color-scheme: dark)"
|
||||||
href="./css/theme-simple-dark.css"
|
|
||||||
/>
|
|
||||||
<link
|
|
||||||
rel="stylesheet"
|
|
||||||
media="(prefers-color-scheme: light)"
|
|
||||||
href="./css/theme-simple.css"
|
|
||||||
/>
|
/>
|
||||||
<style>
|
<style>
|
||||||
:root {
|
:root {
|
||||||
@@ -46,14 +42,24 @@
|
|||||||
transform: rotate(-360deg);
|
transform: rotate(-360deg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.app-name-link {
|
||||||
|
display: flex;
|
||||||
|
justify-content: center;
|
||||||
|
}
|
||||||
.app-name img,
|
.app-name img,
|
||||||
.spin {
|
.spin {
|
||||||
animation: spin 15s infinite linear;
|
animation: spin 15s infinite linear;
|
||||||
transform-origin: center;
|
transform-origin: center;
|
||||||
}
|
}
|
||||||
|
@media not (prefers-color-scheme: dark) {
|
||||||
|
.app-name img,
|
||||||
|
.spin {
|
||||||
|
filter: invert(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body class="sidebar-chevron-left sidebar-group-box sidebar-toggle-chevron">
|
||||||
<div id="app"></div>
|
<div id="app"></div>
|
||||||
<script>
|
<script>
|
||||||
window.$docsify = {
|
window.$docsify = {
|
||||||
@@ -89,6 +95,11 @@
|
|||||||
|
|
||||||
// Google tag (Google Analytics 4).
|
// Google tag (Google Analytics 4).
|
||||||
gtag: 'G-ZFD19QWCJP',
|
gtag: 'G-ZFD19QWCJP',
|
||||||
|
|
||||||
|
search: {
|
||||||
|
// Place search box after spinning logo.
|
||||||
|
insertAfter: '.app-name',
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
@@ -98,22 +109,16 @@
|
|||||||
<script src="./js/docsify.min.js"></script>
|
<script src="./js/docsify.min.js"></script>
|
||||||
<script src="./js/gtag.min.js"></script>
|
<script src="./js/gtag.min.js"></script>
|
||||||
|
|
||||||
<!-- Themeable -->
|
|
||||||
<script src="./js/docsify-themeable.min.js"></script>
|
|
||||||
|
|
||||||
<!-- Prism Syntax Highlighting for YAML -->
|
<!-- Prism Syntax Highlighting for YAML -->
|
||||||
<script src="./js/prism-yaml.min.js"></script>
|
<script src="./js/prism-yaml.min.js"></script>
|
||||||
|
|
||||||
<!-- Search plugin -->
|
<!-- Search plugin -->
|
||||||
<script src="./js/search.js"></script>
|
<script src="./js/search.min.js"></script>
|
||||||
|
|
||||||
<!-- Zoom in on images on click -->
|
<!-- Zoom in on images on click -->
|
||||||
<script src="./js/zoom-image.min.js"></script>
|
<script src="./js/zoom-image.min.js"></script>
|
||||||
|
|
||||||
<!-- Copy samples can copy to clipboard -->
|
<!-- Copy samples can copy to clipboard -->
|
||||||
<script src="./js/docsify-copy-code.min.js"></script>
|
<script src="./js/docsify-copy-code.min.js"></script>
|
||||||
|
|
||||||
<!-- Allow sidebar selections to collapse -->
|
|
||||||
<script src="./js/docsify-sidebar-collapse.min.js"></script>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
-1
@@ -1 +0,0 @@
|
|||||||
!function(e){("object"!=typeof exports||"undefined"==typeof module)&&"function"==typeof define&&define.amd?define(e):e()}(function(){"use strict";function e(e,n){var t,a=(n=void 0===n?{}:n).insertAt;e&&"undefined"!=typeof document&&(t=document.head||document.getElementsByTagName("head")[0],(n=document.createElement("style")).type="text/css","top"===a&&t.firstChild?t.insertBefore(n,t.firstChild):t.appendChild(n),n.styleSheet?n.styleSheet.cssText=e:n.appendChild(document.createTextNode(e)))}var t;function a(e){e&&null!=t&&(e=e.getBoundingClientRect().top,document.querySelector(".sidebar").scrollBy(0,e-t))}function n(){requestAnimationFrame(function(){var e=document.querySelector(".app-sub-sidebar > .active");if(e)for(e.parentNode.parentNode.querySelectorAll(".app-sub-sidebar").forEach(function(e){return e.classList.remove("open")});e.parentNode.classList.contains("app-sub-sidebar")&&!e.parentNode.classList.contains("open");)e.parentNode.classList.add("open"),e=e.parentNode})}function o(e){t=e.target.getBoundingClientRect().top;var n=d(e.target,"LI",2);n&&(n.classList.contains("open")?(n.classList.remove("open"),setTimeout(function(){n.classList.add("collapse")},0)):(function(e){if(e)for(e.classList.remove("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.remove("open"),e=e.parentNode}(s()),i(n),setTimeout(function(){n.classList.remove("collapse")},0)),a(n))}function s(){var e=document.querySelector(".sidebar-nav .active");return e||(e=d(document.querySelector('.sidebar-nav a[href="'.concat(decodeURIComponent(location.hash).replace(/ /gi,"%20"),'"]')),"LI",2))&&e.classList.add("active"),e}function i(e){if(e)for(e.classList.add("open","active");e&&"sidebar-nav"!==e.className&&e.parentNode;)"LI"!==e.parentNode.tagName&&"app-sub-sidebar"!==e.parentNode.className||e.parentNode.classList.add("open"),e=e.parentNode}function d(e,n,t){if(e&&e.tagName===n)return e;for(var a=0;e;){if(t<++a)return;if(e.parentNode.tagName===n)return e.parentNode;e=e.parentNode}}e(".sidebar-nav > ul > li ul {\n display: none;\n}\n\n.app-sub-sidebar {\n display: none;\n}\n\n.app-sub-sidebar.open {\n display: block;\n}\n\n.sidebar-nav .open > ul:not(.app-sub-sidebar),\n.sidebar-nav .active:not(.collapse) > ul {\n display: block;\n}\n\n/* 抖动 */\n.sidebar-nav li.open:not(.collapse) > ul {\n display: block;\n}\n\n.active + ul.app-sub-sidebar {\n display: block;\n}\n"),document.addEventListener("scroll",n);e("@media screen and (max-width: 768px) {\n /* 移动端适配 */\n .markdown-section {\n max-width: none;\n padding: 16px;\n }\n /* 改变原来按钮热区大小 */\n .sidebar-toggle {\n padding: 0 0 10px 10px;\n }\n /* my pin */\n .sidebar-pin {\n appearance: none;\n outline: none;\n position: fixed;\n bottom: 0;\n border: none;\n width: 40px;\n height: 40px;\n background: transparent;\n }\n}\n");var r,c="DOCSIFY_SIDEBAR_PIN_FLAG";function l(){var e="true"===(e=localStorage.getItem(c));localStorage.setItem(c,!e),e?(document.querySelector(".sidebar").style.transform="translateX(0)",document.querySelector(".content").style.transform="translateX(0)"):(document.querySelector(".sidebar").style.transform="translateX(300px)",document.querySelector(".content").style.transform="translateX(300px)")}768<document.documentElement.clientWidth||(localStorage.setItem(c,!1),(r=document.createElement("button")).classList.add("sidebar-pin"),r.onclick=l,document.body.append(r),window.addEventListener("load",function(){var n=document.querySelector(".content");document.body.onclick=n.onclick=function(e){e.target!==document.body&&e.currentTarget!==n||"true"===localStorage.getItem(c)&&l()}})),function(){if(window.$docsify){for(var e=arguments.length,n=new Array(e),t=0;t<e;t++)n[t]=arguments[t];$docsify.plugins=n.concat($docsify.plugins||[])}else console.error("这是一个docsify插件,请先引用docsify库!")}(function(e,n){e.doneEach(function(e,n){var t=s();i(t),document.querySelectorAll(".sidebar-nav li").forEach(function(e){e.querySelector("ul:not(.app-sub-sidebar)")?e.classList.add("folder"):e.classList.add("file")}),function n(e,t){e&&e.childNodes&&e.childNodes.forEach(function(e){e.classList&&e.classList.contains("folder")&&(e.classList.add("level-".concat(t)),window.$docsify&&window.$docsify.sidebarDisplayLevel&&"number"==typeof window.$docsify.sidebarDisplayLevel&&t<=window.$docsify.sidebarDisplayLevel&&e.classList.add("open"),e&&1<e.childNodes.length&&n(e.childNodes[1],t+1))})}(document.querySelector(".sidebar-nav > ul"),1),a(t),n(e)}),e.ready(function(){document.querySelector(".sidebar-nav").addEventListener("click",o)})})});
|
|
||||||
Vendored
-9
File diff suppressed because one or more lines are too long
Vendored
+3
-3
File diff suppressed because one or more lines are too long
Vendored
+3
-3
@@ -1,8 +1,8 @@
|
|||||||
/*!
|
/*!
|
||||||
* Docsify Plugin: gtag v4.13.0
|
* Docsify Plugin: gtag v5.0.0-rc.3
|
||||||
* https://docsify.js.org
|
* https://docsify.js.org
|
||||||
* (c) 2017-2024
|
* (c) 2017-2025
|
||||||
* MIT license
|
* MIT license
|
||||||
*/
|
*/
|
||||||
!function(){"use strict";function o(o){!function(o){const n=document.createElement("script");n.async=!0,n.src="https://www.googletagmanager.com/gtag/js?id="+o,document.body.appendChild(n)}(o),window.dataLayer=window.dataLayer||[],window.gtag=window.gtag||function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",o)}function n(n){Array.isArray(n)?(o(n[0]),n.forEach(((o,n)=>{n>0&&function(o){window.gtag("config",o)}(o)}))):o(n)}function t(){window.gtag||n($docsify.gtag),window.gtag("event","page_view",{page_title:document.title,page_location:location.href,page_path:location.pathname})}window.$docsify=window.$docsify||{},$docsify.plugins=[function(o){$docsify.gtag?o.beforeEach(t):console.error("[Docsify] gtag is required.")},...$docsify.plugins||[]]}();
|
!function(){"use strict";function t(t){return t&&t.__esModule&&Object.prototype.hasOwnProperty.call(t,"default")?t.default:t}var n,o={};var a=function(){if(n)return o;function t(t){!function(t){const n=document.createElement("script");n.async=!0,n.src="https://www.googletagmanager.com/gtag/js?id="+t,document.body.appendChild(n)}(t),window.dataLayer=window.dataLayer||[],window.gtag=window.gtag||function(){window.dataLayer.push(arguments)},window.gtag("js",new Date),window.gtag("config",t)}function a(n){Array.isArray(n)?(t(n[0]),n.forEach(((t,n)=>{n>0&&function(t){window.gtag("config",t)}(t)}))):t(n)}function i(){window.gtag||a($docsify.gtag),window.gtag("event","page_view",{page_title:document.title,page_location:location.href,page_path:location.pathname})}return n=1,window.$docsify=window.$docsify||{},$docsify.plugins=[function(t){$docsify.gtag?t.beforeEach(i):console.error("[Docsify] gtag is required.")},...$docsify.plugins||[]],o}()}();
|
||||||
//# sourceMappingURL=gtag.min.js.map
|
//# sourceMappingURL=gtag.min.js.map
|
||||||
@@ -1,540 +0,0 @@
|
|||||||
(function () {
|
|
||||||
/**
|
|
||||||
* Converts a colon formatted string to a object with properties.
|
|
||||||
*
|
|
||||||
* This is process a provided string and look for any tokens in the format
|
|
||||||
* of `:name[=value]` and then convert it to a object and return.
|
|
||||||
* An example of this is ':include :type=code :fragment=demo' is taken and
|
|
||||||
* then converted to:
|
|
||||||
*
|
|
||||||
* ```
|
|
||||||
* {
|
|
||||||
* include: '',
|
|
||||||
* type: 'code',
|
|
||||||
* fragment: 'demo'
|
|
||||||
* }
|
|
||||||
* ```
|
|
||||||
*
|
|
||||||
* @param {string} str The string to parse.
|
|
||||||
*
|
|
||||||
* @return {object} The original string and parsed object, { str, config }.
|
|
||||||
*/
|
|
||||||
function getAndRemoveConfig(str) {
|
|
||||||
if ( str === void 0 ) str = '';
|
|
||||||
|
|
||||||
var config = {};
|
|
||||||
|
|
||||||
if (str) {
|
|
||||||
str = str
|
|
||||||
.replace(/^('|")/, '')
|
|
||||||
.replace(/('|")$/, '')
|
|
||||||
.replace(/(?:^|\s):([\w-]+:?)=?([\w-%]+)?/g, function (m, key, value) {
|
|
||||||
if (key.indexOf(':') === -1) {
|
|
||||||
config[key] = (value && value.replace(/"/g, '')) || true;
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
|
|
||||||
return m;
|
|
||||||
})
|
|
||||||
.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
return { str: str, config: config };
|
|
||||||
}
|
|
||||||
|
|
||||||
function removeDocsifyIgnoreTag(str) {
|
|
||||||
return str
|
|
||||||
.replace(/<!-- {docsify-ignore} -->/, '')
|
|
||||||
.replace(/{docsify-ignore}/, '')
|
|
||||||
.replace(/<!-- {docsify-ignore-all} -->/, '')
|
|
||||||
.replace(/{docsify-ignore-all}/, '')
|
|
||||||
.trim();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* eslint-disable no-unused-vars */
|
|
||||||
|
|
||||||
var INDEXS = {};
|
|
||||||
|
|
||||||
var LOCAL_STORAGE = {
|
|
||||||
EXPIRE_KEY: 'docsify.search.expires',
|
|
||||||
INDEX_KEY: 'docsify.search.index',
|
|
||||||
};
|
|
||||||
|
|
||||||
function resolveExpireKey(namespace) {
|
|
||||||
return namespace
|
|
||||||
? ((LOCAL_STORAGE.EXPIRE_KEY) + "/" + namespace)
|
|
||||||
: LOCAL_STORAGE.EXPIRE_KEY;
|
|
||||||
}
|
|
||||||
|
|
||||||
function resolveIndexKey(namespace) {
|
|
||||||
return namespace
|
|
||||||
? ((LOCAL_STORAGE.INDEX_KEY) + "/" + namespace)
|
|
||||||
: LOCAL_STORAGE.INDEX_KEY;
|
|
||||||
}
|
|
||||||
|
|
||||||
function escapeHtml(string) {
|
|
||||||
var entityMap = {
|
|
||||||
'&': '&',
|
|
||||||
'<': '<',
|
|
||||||
'>': '>',
|
|
||||||
'"': '"',
|
|
||||||
"'": ''',
|
|
||||||
};
|
|
||||||
|
|
||||||
return String(string).replace(/[&<>"']/g, function (s) { return entityMap[s]; });
|
|
||||||
}
|
|
||||||
|
|
||||||
function getAllPaths(router) {
|
|
||||||
var paths = [];
|
|
||||||
|
|
||||||
Docsify.dom
|
|
||||||
.findAll('.sidebar-nav a:not(.section-link):not([data-nosearch])')
|
|
||||||
.forEach(function (node) {
|
|
||||||
var href = node.href;
|
|
||||||
var originHref = node.getAttribute('href');
|
|
||||||
var path = router.parse(href).path;
|
|
||||||
|
|
||||||
if (
|
|
||||||
path &&
|
|
||||||
paths.indexOf(path) === -1 &&
|
|
||||||
!Docsify.util.isAbsolutePath(originHref)
|
|
||||||
) {
|
|
||||||
paths.push(path);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return paths;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getTableData(token) {
|
|
||||||
if (!token.text && token.type === 'table') {
|
|
||||||
token.cells.unshift(token.header);
|
|
||||||
token.text = token.cells
|
|
||||||
.map(function (rows) {
|
|
||||||
return rows.join(' | ');
|
|
||||||
})
|
|
||||||
.join(' |\n ');
|
|
||||||
}
|
|
||||||
return token.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getListData(token) {
|
|
||||||
if (!token.text && token.type === 'list') {
|
|
||||||
token.text = token.raw;
|
|
||||||
}
|
|
||||||
return token.text;
|
|
||||||
}
|
|
||||||
|
|
||||||
function saveData(maxAge, expireKey, indexKey) {
|
|
||||||
localStorage.setItem(expireKey, Date.now() + maxAge);
|
|
||||||
localStorage.setItem(indexKey, JSON.stringify(INDEXS));
|
|
||||||
}
|
|
||||||
|
|
||||||
function genIndex(path, content, router, depth) {
|
|
||||||
if ( content === void 0 ) content = '';
|
|
||||||
|
|
||||||
var tokens = window.marked.lexer(content);
|
|
||||||
var slugify = window.Docsify.slugify;
|
|
||||||
var index = {};
|
|
||||||
var slug;
|
|
||||||
var title = '';
|
|
||||||
|
|
||||||
tokens.forEach(function (token, tokenIndex) {
|
|
||||||
if (token.type === 'heading' && token.depth <= depth) {
|
|
||||||
var ref = getAndRemoveConfig(token.text);
|
|
||||||
var str = ref.str;
|
|
||||||
var config = ref.config;
|
|
||||||
|
|
||||||
var text = removeDocsifyIgnoreTag(token.text);
|
|
||||||
|
|
||||||
if (config.id) {
|
|
||||||
slug = router.toURL(path, { id: slugify(config.id) });
|
|
||||||
} else {
|
|
||||||
slug = router.toURL(path, { id: slugify(escapeHtml(text)) });
|
|
||||||
}
|
|
||||||
|
|
||||||
if (str) {
|
|
||||||
title = removeDocsifyIgnoreTag(str);
|
|
||||||
}
|
|
||||||
|
|
||||||
index[slug] = { slug: slug, title: title, body: '' };
|
|
||||||
} else {
|
|
||||||
if (tokenIndex === 0) {
|
|
||||||
slug = router.toURL(path);
|
|
||||||
index[slug] = {
|
|
||||||
slug: slug,
|
|
||||||
title: path !== '/' ? path.slice(1) : 'Home Page',
|
|
||||||
body: token.text || '',
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!slug) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!index[slug]) {
|
|
||||||
index[slug] = { slug: slug, title: '', body: '' };
|
|
||||||
} else if (index[slug].body) {
|
|
||||||
token.text = getTableData(token);
|
|
||||||
token.text = getListData(token);
|
|
||||||
|
|
||||||
index[slug].body += '\n' + (token.text || '');
|
|
||||||
} else {
|
|
||||||
token.text = getTableData(token);
|
|
||||||
token.text = getListData(token);
|
|
||||||
|
|
||||||
index[slug].body = token.text || '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
slugify.clear();
|
|
||||||
return index;
|
|
||||||
}
|
|
||||||
|
|
||||||
function ignoreDiacriticalMarks(keyword) {
|
|
||||||
if (keyword && keyword.normalize) {
|
|
||||||
return keyword.normalize('NFD').replace(/[\u0300-\u036f]/g, '');
|
|
||||||
}
|
|
||||||
return keyword;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {String} query Search query
|
|
||||||
* @returns {Array} Array of results
|
|
||||||
*/
|
|
||||||
function search(query) {
|
|
||||||
var matchingResults = [];
|
|
||||||
var data = [];
|
|
||||||
Object.keys(INDEXS).forEach(function (key) {
|
|
||||||
data = data.concat(Object.keys(INDEXS[key]).map(function (page) { return INDEXS[key][page]; }));
|
|
||||||
});
|
|
||||||
|
|
||||||
query = query.trim();
|
|
||||||
var keywords = query.split(/[\s\-,\\/]+/);
|
|
||||||
if (keywords.length !== 1) {
|
|
||||||
keywords = [].concat(query, keywords);
|
|
||||||
}
|
|
||||||
|
|
||||||
var loop = function ( i ) {
|
|
||||||
var post = data[i];
|
|
||||||
var matchesScore = 0;
|
|
||||||
var resultStr = '';
|
|
||||||
var handlePostTitle = '';
|
|
||||||
var handlePostContent = '';
|
|
||||||
var postTitle = post.title && post.title.trim();
|
|
||||||
var postContent = post.body && post.body.trim();
|
|
||||||
var postUrl = post.slug || '';
|
|
||||||
|
|
||||||
if (postTitle) {
|
|
||||||
keywords.forEach(function (keyword) {
|
|
||||||
// From https://github.com/sindresorhus/escape-string-regexp
|
|
||||||
var regEx = new RegExp(
|
|
||||||
escapeHtml(ignoreDiacriticalMarks(keyword)).replace(
|
|
||||||
/[|\\{}()[\]^$+*?.]/g,
|
|
||||||
'\\$&'
|
|
||||||
),
|
|
||||||
'gi'
|
|
||||||
);
|
|
||||||
var indexTitle = -1;
|
|
||||||
var indexContent = -1;
|
|
||||||
handlePostTitle = postTitle
|
|
||||||
? escapeHtml(ignoreDiacriticalMarks(postTitle))
|
|
||||||
: postTitle;
|
|
||||||
handlePostContent = postContent
|
|
||||||
? escapeHtml(ignoreDiacriticalMarks(postContent))
|
|
||||||
: postContent;
|
|
||||||
|
|
||||||
indexTitle = postTitle ? handlePostTitle.search(regEx) : -1;
|
|
||||||
indexContent = postContent ? handlePostContent.search(regEx) : -1;
|
|
||||||
|
|
||||||
if (indexTitle >= 0 || indexContent >= 0) {
|
|
||||||
matchesScore += indexTitle >= 0 ? 3 : indexContent >= 0 ? 2 : 0;
|
|
||||||
if (indexContent < 0) {
|
|
||||||
indexContent = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
var start = 0;
|
|
||||||
var end = 0;
|
|
||||||
|
|
||||||
start = indexContent < 11 ? 0 : indexContent - 10;
|
|
||||||
end = start === 0 ? 70 : indexContent + keyword.length + 60;
|
|
||||||
|
|
||||||
if (postContent && end > postContent.length) {
|
|
||||||
end = postContent.length;
|
|
||||||
}
|
|
||||||
|
|
||||||
var matchContent =
|
|
||||||
handlePostContent &&
|
|
||||||
'...' +
|
|
||||||
handlePostContent
|
|
||||||
.substring(start, end)
|
|
||||||
.replace(
|
|
||||||
regEx,
|
|
||||||
function (word) { return ("<em class=\"search-keyword\">" + word + "</em>"); }
|
|
||||||
) +
|
|
||||||
'...';
|
|
||||||
|
|
||||||
resultStr += matchContent;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (matchesScore > 0) {
|
|
||||||
var matchingPost = {
|
|
||||||
title: handlePostTitle,
|
|
||||||
content: postContent ? resultStr : '',
|
|
||||||
url: postUrl,
|
|
||||||
score: matchesScore,
|
|
||||||
};
|
|
||||||
|
|
||||||
matchingResults.push(matchingPost);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
for (var i = 0; i < data.length; i++) loop( i );
|
|
||||||
|
|
||||||
return matchingResults.sort(function (r1, r2) { return r2.score - r1.score; });
|
|
||||||
}
|
|
||||||
|
|
||||||
function init(config, vm) {
|
|
||||||
var isAuto = config.paths === 'auto';
|
|
||||||
var paths = isAuto ? getAllPaths(vm.router) : config.paths;
|
|
||||||
|
|
||||||
var namespaceSuffix = '';
|
|
||||||
|
|
||||||
// only in auto mode
|
|
||||||
if (paths.length && isAuto && config.pathNamespaces) {
|
|
||||||
var path = paths[0];
|
|
||||||
|
|
||||||
if (Array.isArray(config.pathNamespaces)) {
|
|
||||||
namespaceSuffix =
|
|
||||||
config.pathNamespaces.filter(
|
|
||||||
function (prefix) { return path.slice(0, prefix.length) === prefix; }
|
|
||||||
)[0] || namespaceSuffix;
|
|
||||||
} else if (config.pathNamespaces instanceof RegExp) {
|
|
||||||
var matches = path.match(config.pathNamespaces);
|
|
||||||
|
|
||||||
if (matches) {
|
|
||||||
namespaceSuffix = matches[0];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
var isExistHome = paths.indexOf(namespaceSuffix + '/') === -1;
|
|
||||||
var isExistReadme = paths.indexOf(namespaceSuffix + '/README') === -1;
|
|
||||||
if (isExistHome && isExistReadme) {
|
|
||||||
paths.unshift(namespaceSuffix + '/');
|
|
||||||
}
|
|
||||||
} else if (paths.indexOf('/') === -1 && paths.indexOf('/README') === -1) {
|
|
||||||
paths.unshift('/');
|
|
||||||
}
|
|
||||||
|
|
||||||
var expireKey = resolveExpireKey(config.namespace) + namespaceSuffix;
|
|
||||||
var indexKey = resolveIndexKey(config.namespace) + namespaceSuffix;
|
|
||||||
|
|
||||||
var isExpired = localStorage.getItem(expireKey) < Date.now();
|
|
||||||
|
|
||||||
INDEXS = JSON.parse(localStorage.getItem(indexKey));
|
|
||||||
|
|
||||||
if (isExpired) {
|
|
||||||
INDEXS = {};
|
|
||||||
} else if (!isAuto) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var len = paths.length;
|
|
||||||
var count = 0;
|
|
||||||
|
|
||||||
paths.forEach(function (path) {
|
|
||||||
if (INDEXS[path]) {
|
|
||||||
return count++;
|
|
||||||
}
|
|
||||||
|
|
||||||
Docsify.get(vm.router.getFile(path), false, vm.config.requestHeaders).then(
|
|
||||||
function (result) {
|
|
||||||
INDEXS[path] = genIndex(path, result, vm.router, config.depth);
|
|
||||||
len === ++count && saveData(config.maxAge, expireKey, indexKey);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/* eslint-disable no-unused-vars */
|
|
||||||
|
|
||||||
var NO_DATA_TEXT = '';
|
|
||||||
var options;
|
|
||||||
|
|
||||||
function style() {
|
|
||||||
var code = "\n.sidebar {\n padding-top: 0;\n}\n\n.search {\n margin-bottom: 20px;\n padding: 6px;\n border-bottom: 1px solid #eee;\n}\n\n.search .input-wrap {\n display: flex;\n align-items: center;\n}\n\n.search .results-panel {\n display: none;\n}\n\n.search .results-panel.show {\n display: block;\n}\n\n.search input {\n outline: none;\n border: none;\n width: 100%;\n padding: 0.6em 7px;\n font-size: inherit;\n border: 1px solid transparent;\n}\n\n.search input:focus {\n box-shadow: 0 0 5px var(--theme-color, #42b983);\n border: 1px solid var(--theme-color, #42b983);\n}\n\n.search input::-webkit-search-decoration,\n.search input::-webkit-search-cancel-button,\n.search input {\n -webkit-appearance: none;\n -moz-appearance: none;\n appearance: none;\n}\n\n.search input::-ms-clear {\n display: none;\n height: 0;\n width: 0;\n}\n\n.search .clear-button {\n cursor: pointer;\n width: 36px;\n text-align: right;\n display: none;\n}\n\n.search .clear-button.show {\n display: block;\n}\n\n.search .clear-button svg {\n transform: scale(.5);\n}\n\n.search h2 {\n font-size: 17px;\n margin: 10px 0;\n}\n\n.search a {\n text-decoration: none;\n color: inherit;\n}\n\n.search .matching-post {\n border-bottom: 1px solid #eee;\n}\n\n.search .matching-post:last-child {\n border-bottom: 0;\n}\n\n.search p {\n font-size: 14px;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n}\n\n.search p.empty {\n text-align: center;\n}\n\n.app-name.hide, .sidebar-nav.hide {\n display: none;\n}";
|
|
||||||
|
|
||||||
Docsify.dom.style(code);
|
|
||||||
}
|
|
||||||
|
|
||||||
function tpl(defaultValue) {
|
|
||||||
if ( defaultValue === void 0 ) defaultValue = '';
|
|
||||||
|
|
||||||
var html = "<div class=\"input-wrap\">\n <input type=\"search\" value=\"" + defaultValue + "\" aria-label=\"Search text\" />\n <div class=\"clear-button\">\n <svg width=\"26\" height=\"24\">\n <circle cx=\"12\" cy=\"12\" r=\"11\" fill=\"#ccc\" />\n <path stroke=\"white\" stroke-width=\"2\" d=\"M8.25,8.25,15.75,15.75\" />\n <path stroke=\"white\" stroke-width=\"2\"d=\"M8.25,15.75,15.75,8.25\" />\n </svg>\n </div>\n </div>\n <div class=\"results-panel\"></div>\n </div>";
|
|
||||||
var el = Docsify.dom.create('div', html);
|
|
||||||
var aside = Docsify.dom.find('aside');
|
|
||||||
|
|
||||||
Docsify.dom.toggleClass(el, 'search');
|
|
||||||
Docsify.dom.before(aside, el);
|
|
||||||
}
|
|
||||||
|
|
||||||
function doSearch(value) {
|
|
||||||
var $search = Docsify.dom.find('div.search');
|
|
||||||
var $panel = Docsify.dom.find($search, '.results-panel');
|
|
||||||
var $clearBtn = Docsify.dom.find($search, '.clear-button');
|
|
||||||
var $sidebarNav = Docsify.dom.find('.sidebar-nav');
|
|
||||||
var $appName = Docsify.dom.find('.app-name');
|
|
||||||
|
|
||||||
if (!value) {
|
|
||||||
$panel.classList.remove('show');
|
|
||||||
$clearBtn.classList.remove('show');
|
|
||||||
$panel.innerHTML = '';
|
|
||||||
|
|
||||||
if (options.hideOtherSidebarContent) {
|
|
||||||
$sidebarNav && $sidebarNav.classList.remove('hide');
|
|
||||||
$appName && $appName.classList.remove('hide');
|
|
||||||
}
|
|
||||||
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
var matchs = search(value);
|
|
||||||
|
|
||||||
var html = '';
|
|
||||||
matchs.forEach(function (post) {
|
|
||||||
html += "<div class=\"matching-post\">\n<a href=\"" + (post.url) + "\">\n<h2>" + (post.title) + "</h2>\n<p>" + (post.content) + "</p>\n</a>\n</div>";
|
|
||||||
});
|
|
||||||
|
|
||||||
$panel.classList.add('show');
|
|
||||||
$clearBtn.classList.add('show');
|
|
||||||
$panel.innerHTML = html || ("<p class=\"empty\">" + NO_DATA_TEXT + "</p>");
|
|
||||||
if (options.hideOtherSidebarContent) {
|
|
||||||
$sidebarNav && $sidebarNav.classList.add('hide');
|
|
||||||
$appName && $appName.classList.add('hide');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function bindEvents() {
|
|
||||||
var $search = Docsify.dom.find('div.search');
|
|
||||||
var $input = Docsify.dom.find($search, 'input');
|
|
||||||
var $inputWrap = Docsify.dom.find($search, '.input-wrap');
|
|
||||||
|
|
||||||
var timeId;
|
|
||||||
|
|
||||||
/**
|
|
||||||
Prevent to Fold sidebar.
|
|
||||||
|
|
||||||
When searching on the mobile end,
|
|
||||||
the sidebar is collapsed when you click the INPUT box,
|
|
||||||
making it impossible to search.
|
|
||||||
*/
|
|
||||||
Docsify.dom.on(
|
|
||||||
$search,
|
|
||||||
'click',
|
|
||||||
function (e) { return ['A', 'H2', 'P', 'EM'].indexOf(e.target.tagName) === -1 &&
|
|
||||||
e.stopPropagation(); }
|
|
||||||
);
|
|
||||||
Docsify.dom.on($input, 'input', function (e) {
|
|
||||||
clearTimeout(timeId);
|
|
||||||
timeId = setTimeout(function (_) { return doSearch(e.target.value.trim()); }, 100);
|
|
||||||
});
|
|
||||||
Docsify.dom.on($inputWrap, 'click', function (e) {
|
|
||||||
// Click input outside
|
|
||||||
if (e.target.tagName !== 'INPUT') {
|
|
||||||
$input.value = '';
|
|
||||||
doSearch();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function updatePlaceholder(text, path) {
|
|
||||||
var $input = Docsify.dom.getNode('.search input[type="search"]');
|
|
||||||
|
|
||||||
if (!$input) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof text === 'string') {
|
|
||||||
$input.placeholder = text;
|
|
||||||
} else {
|
|
||||||
var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0];
|
|
||||||
$input.placeholder = text[match];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateNoData(text, path) {
|
|
||||||
if (typeof text === 'string') {
|
|
||||||
NO_DATA_TEXT = text;
|
|
||||||
} else {
|
|
||||||
var match = Object.keys(text).filter(function (key) { return path.indexOf(key) > -1; })[0];
|
|
||||||
NO_DATA_TEXT = text[match];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function updateOptions(opts) {
|
|
||||||
options = opts;
|
|
||||||
}
|
|
||||||
|
|
||||||
function init$1(opts, vm) {
|
|
||||||
var keywords = vm.router.parse().query.s;
|
|
||||||
|
|
||||||
updateOptions(opts);
|
|
||||||
style();
|
|
||||||
tpl(keywords);
|
|
||||||
bindEvents();
|
|
||||||
keywords && setTimeout(function (_) { return doSearch(keywords); }, 500);
|
|
||||||
}
|
|
||||||
|
|
||||||
function update(opts, vm) {
|
|
||||||
updateOptions(opts);
|
|
||||||
updatePlaceholder(opts.placeholder, vm.route.path);
|
|
||||||
updateNoData(opts.noData, vm.route.path);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* eslint-disable no-unused-vars */
|
|
||||||
|
|
||||||
var CONFIG = {
|
|
||||||
placeholder: 'Type to search',
|
|
||||||
noData: 'No Results!',
|
|
||||||
paths: 'auto',
|
|
||||||
depth: 2,
|
|
||||||
maxAge: 86400000, // 1 day
|
|
||||||
hideOtherSidebarContent: false,
|
|
||||||
namespace: undefined,
|
|
||||||
pathNamespaces: undefined,
|
|
||||||
};
|
|
||||||
|
|
||||||
var install = function (hook, vm) {
|
|
||||||
var util = Docsify.util;
|
|
||||||
var opts = vm.config.search || CONFIG;
|
|
||||||
|
|
||||||
if (Array.isArray(opts)) {
|
|
||||||
CONFIG.paths = opts;
|
|
||||||
} else if (typeof opts === 'object') {
|
|
||||||
CONFIG.paths = Array.isArray(opts.paths) ? opts.paths : 'auto';
|
|
||||||
CONFIG.maxAge = util.isPrimitive(opts.maxAge) ? opts.maxAge : CONFIG.maxAge;
|
|
||||||
CONFIG.placeholder = opts.placeholder || CONFIG.placeholder;
|
|
||||||
CONFIG.noData = opts.noData || CONFIG.noData;
|
|
||||||
CONFIG.depth = opts.depth || CONFIG.depth;
|
|
||||||
CONFIG.hideOtherSidebarContent =
|
|
||||||
opts.hideOtherSidebarContent || CONFIG.hideOtherSidebarContent;
|
|
||||||
CONFIG.namespace = opts.namespace || CONFIG.namespace;
|
|
||||||
CONFIG.pathNamespaces = opts.pathNamespaces || CONFIG.pathNamespaces;
|
|
||||||
}
|
|
||||||
|
|
||||||
var isAuto = CONFIG.paths === 'auto';
|
|
||||||
|
|
||||||
hook.mounted(function (_) {
|
|
||||||
init$1(CONFIG, vm);
|
|
||||||
!isAuto && init(CONFIG, vm);
|
|
||||||
});
|
|
||||||
hook.doneEach(function (_) {
|
|
||||||
update(CONFIG, vm);
|
|
||||||
isAuto && init(CONFIG, vm);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
$docsify.plugins = [].concat(install, $docsify.plugins);
|
|
||||||
|
|
||||||
}());
|
|
||||||
Vendored
+8
File diff suppressed because one or more lines are too long
Vendored
+9
-1
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user