-
Notifications
You must be signed in to change notification settings - Fork 17
/
Copy pathoutline.min.js.map
1 lines (1 loc) · 251 KB
/
outline.min.js.map
1
{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/lang/hasOwn.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/scrollTo.js","navigator/utils/_getScrollElement.js","utils/dom/getScrollElement.js","utils/lang/trim.js","chapters/getChaptersByHeadings.js","utils/lang/stripTags.js","chapters/_getChapterParentIdByDiffer.js","chapters/_getChaptersWithCode.js","chapters/getChapters.js","utils/lang/toTree.js","base/plugin.js","base/command.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base/component.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/icons/symbols.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/dom/removeClass.js","anchors/utils/_removeHeading.js","utils/types/isEmpty.js","anchors/symbols.js","anchors/anchors.js","anchors/utils/_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","utils/dom/zIndex.js","drawer/symbols.js","drawer/drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","navigator/navigator.js","navigator/utils/_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/dom/isMobile.js","utils/types/isPlainObject.js","utils/types/isObjectLike.js","utils/lang/encodeHTML.js","message/message.js","message/symbols.js","base/commands.js","toolbar/utils/_createButton.js","toolbar/symbols.js","toolbar/toolbar.js","base/speech.js","reader/utils/_updateSiblingElements.js","reader/reader.js","outline.js","base/plugins.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../../utils/lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../../utils/types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../../utils/lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../../utils/types/isObject'\r\nimport isArray from '../../utils/types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n if (className.indexOf(' ') > -1) {\r\n className.split(' ').forEach((name) => {\r\n classList.add(name)\r\n })\r\n } else {\r\n classList.add(className)\r\n }\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from '../../navigator/utils/_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default getScrollElement\r\n","import isString from '../../utils/types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from '../utils/lang/trim'\r\nimport stripTags from '../utils/lang/stripTags'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = false,\r\n chapterTextFilter = null\r\n) => {\r\n const pattern = /^\\d(\\.|(\\.\\d+)*)\\s?/gi\r\n const chapters = []\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = trim(stripTags(heading.innerHTML))\r\n\r\n // 如果自动生成章节编号,则去掉标题中自带的编号文本\r\n if (showCode) {\r\n text = trim(text.replace(pattern, ''))\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../../utils/types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from '../utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport toTree from '../utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = null\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n } else {\r\n if (chapterTextFilter === true) {\r\n filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n }\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","class Plugin {\r\n constructor(name, module, options) {\r\n this.name = name\r\n this.module = module\r\n this.options = options\r\n this.instance = null\r\n\r\n return this\r\n }\r\n\r\n execute(options) {\r\n if (options) {\r\n this.options = options\r\n }\r\n\r\n this.instance = new this.module(this.options)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.instances = null\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Plugin\r\n","import isFunction from '../utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action, options) {\r\n this.name = name\r\n this.options = options\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute(options) {\r\n if (options) {\r\n this.options = options\r\n }\r\n\r\n this.action(options)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.name = ''\r\n this.options = null\r\n this.action = null\r\n }\r\n}\r\n\r\nexport default Command\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import hasOwn from '../../utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../../utils/types/isTypedArray'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../../utils/lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import hasOwn from '../../utils/lang/hasOwn'\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from '../utils/types/isString'\r\nimport isObject from '../utils/types/isObject'\r\n\r\nimport extend from '../utils/lang/extend'\r\nimport hasOwn from '../utils/lang/hasOwn'\r\n\r\nimport publish from '../utils/observer/emit'\r\nimport subscribe from '../utils/observer/on'\r\nimport unsubscribe from '../utils/observer/off'\r\n\r\nclass Component {\r\n constructor(options) {\r\n this.name = 'component'\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Component\r\n","import isFunction from '../../utils/types/isFunction'\r\nimport guid from '../../utils/lang/guid'\r\n\r\nimport _subscribers from './_subscribers'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../../utils/types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../../utils/types/isString'\r\nimport isElement from '../../utils/types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../../utils/types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../../utils/dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../../utils/dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n * <div id=\"nav\" class=\"nav\">\r\n * <a id=\"service\" class=\"anchor\" href=\"https://www.yaohaixiao.com/serivce\">Service</a>\r\n * <a id=\"help\" class=\"anchor\" href=\"https://www.yaohaixiao.com/help\">Help</a>\r\n * </div>\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","const SYMBOLS = []\r\n\r\nexport default SYMBOLS\r\n","import isString from '../../utils/types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n `<svg id=\"outline-icons\" aria-hidden=\"true\" style=\"position:absolute;display:none;width:0;height:0;overflow:hidden;\">` +\r\n `${symbols.join('')}` +\r\n `</svg>`\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../../utils/types/isArray'\r\nimport isString from '../../utils/types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../../utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isHTMLCollection = (el) => {\r\n return !!(isObject(el) && toString(el) === '[object NodeList]')\r\n}\r\n\r\nexport default isHTMLCollection\r\n","import toString from '../../utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../../utils/lang/toString'\r\nimport isObject from './isObject'\r\n\r\nconst isTextNode = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (toString(el) === '[object Text]' || (el.tagName && el.nodeType === 3))\r\n )\r\n}\r\n\r\nexport default isTextNode\r\n","import addClass from './addClass.js'\r\n\r\n/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n addClass(el, value)\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../../utils/types/isArray'\r\nimport isString from '../../utils/types/isString'\r\nimport isSVG from '../../utils/types/isSVG'\r\nimport setAttributes from '../../utils/dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = `<svg><use ${binds}></use></svg>`\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*<![^>]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = '<svg[^>]*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from '../../utils/dom/removeClass'\r\nimport isEmpty from '../../utils/types/isEmpty'\r\nimport trim from '../../utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","const SYMBOLS = [\r\n '<symbol id=\"outline-icon-hash\" viewBox=\"0 0 24 24\"><path d=\"M14.216 10l-0.444 4h-3.988l0.444-4zM15.006 2.89l-0.568 5.11h-3.988l0.543-4.89c0.061-0.549-0.335-1.043-0.883-1.104s-1.043 0.335-1.104 0.884l-0.568 5.11h-4.438c-0.552 0-1 0.448-1 1s0.448 1 1 1h4.216l-0.444 4h-3.772c-0.552 0-1 0.448-1 1s0.448 1 1 1h3.549l-0.543 4.89c-0.061 0.549 0.335 1.043 0.883 1.104s1.043-0.335 1.104-0.883l0.569-5.111h3.988l-0.543 4.89c-0.061 0.549 0.335 1.043 0.883 1.104s1.043-0.335 1.104-0.883l0.568-5.111h4.438c0.552 0 1-0.448 1-1s-0.448-1-1-1h-4.216l0.444-4h3.772c0.552 0 1-0.448 1-1s-0.448-1-1-1h-3.549l0.543-4.89c0.061-0.549-0.335-1.043-0.883-1.104s-1.043 0.335-1.104 0.883z\"></path></symbol>'\r\n]\r\n\r\nexport default SYMBOLS\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\n\r\nimport cloneDeep from '../utils/lang/cloneDeep'\r\nimport timeSlice from '../utils/lang/timeSlice'\r\nimport later from '../utils/lang/later'\r\n\r\nimport scrollTo from '../utils/dom/scrollTo'\r\nimport getScrollElement from '../utils/dom/getScrollElement'\r\nimport offsetTop from '../utils/dom/offsetTop'\r\n\r\nimport on from '../utils/event/on'\r\nimport off from '../utils/event/off'\r\nimport stop from '../utils/event/stop'\r\n\r\nimport paint from '../utils/icons/paint'\r\n\r\nimport getChapters from '../chapters/getChapters'\r\n\r\nimport Component from '../base/component'\r\n\r\nimport _updateHeading from './utils/_updateHeading'\r\nimport _removeHeading from './utils/_removeHeading'\r\n\r\nimport SYMBOLS from './symbols'\r\n\r\nclass Anchors extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.name = 'anchors'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint(SYMBOLS)\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL,\r\n anchorLinkFilter\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n this.$on('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n this.$off('anchors:refresh', this.onRefresh)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import isFunction from '../../utils/types/isFunction'\r\nimport trim from '../../utils/lang/trim'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport setAttributes from '../../utils/dom/setAttributes'\r\n\r\nimport icon from '../../utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const anchorLinkFilter = options.anchorLinkFilter || null\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let url\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n if (anchorURL) {\r\n url = anchorURL\r\n } else {\r\n if (isFunction(anchorLinkFilter)) {\r\n url = anchorLinkFilter($heading.tagName.toLowerCase(), text, i)\r\n } else {\r\n url = `#${headingId}`\r\n }\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: url,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import trim from '../../utils/lang/trim'\r\nimport isString from './isString'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*<!doctype html>|<html\\b[^>]*>|<body\\b[^>]*>|<x-[^>]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/<script[^>]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","const SYMBOLS = [\r\n '<symbol id=\"outline-icon-close\" viewBox=\"0 0 1024 1024\"><path d=\"M536.96 491.648L310.592 265.344a32 32 0 1 0-45.248 45.248L491.584 536.96l-226.304 226.304a32 32 0 0 0 45.312 45.248l226.24-226.304 226.304 226.304a32 32 0 0 0 45.248-45.248L582.144 536.896l226.304-226.24a32 32 0 0 0-45.248-45.248L536.896 491.584z\"></path></symbol>'\r\n]\r\n\r\nexport default SYMBOLS\r\n","import later from '../utils/lang/later'\r\nimport cloneDeep from '../utils/lang/cloneDeep'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isDOM from '../utils/types/isDOM'\r\nimport isHTML from '../utils/types/isHTML'\r\nimport addClass from '../utils/dom/addClass'\r\nimport removeClass from '../utils/dom/removeClass'\r\nimport html from '../utils/dom/html'\r\nimport createElement from '../utils/dom/createElement'\r\nimport zIndex from '../utils/dom/zIndex'\r\nimport on from '../utils/event/on'\r\nimport off from '../utils/event/off'\r\n\r\nimport paint from '../utils/icons/paint'\r\nimport icon from '../utils/icons/icon'\r\n\r\nimport Component from '../base/component'\r\n\r\nimport SYMBOLS from './symbols'\r\n\r\nclass Drawer extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.name = 'drawer'\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const overflow = this.attr('overflow')\r\n const customClass = this.attr('customClass')\r\n let mainClassName = 'outline-drawer__main'\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint(SYMBOLS)\r\n\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n if (overflow === 'hidden') {\r\n mainClassName += ' overflow-hidden'\r\n }\r\n\r\n $main = createElement('div', {\r\n className: mainClassName\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n overflow: 'auto',\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../../utils/types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isElement from '../utils/types/isElement'\r\nimport later from '../utils/lang/later'\r\nimport cloneDeep from '../utils/lang/cloneDeep'\r\n\r\nimport at from '../utils/event/at'\r\nimport on from '../utils/event/on'\r\nimport off from '../utils/event/off'\r\nimport stop from '../utils/event/stop'\r\n\r\nimport createElement from '../utils/dom/createElement'\r\nimport scrollTo from '../utils/dom/scrollTo'\r\nimport addClass from '../utils/dom/addClass'\r\nimport intersection from '../utils/dom/intersection'\r\nimport removeClass from '../utils/dom/removeClass'\r\nimport offsetTop from '../utils/dom/offsetTop'\r\nimport getStyle from '../utils/dom/getStyle'\r\nimport setProperty from '../utils/dom/setProperty'\r\nimport inBounding from '../utils/dom/inBounding'\r\nimport getScrollElement from '../utils/dom/getScrollElement'\r\n\r\nimport Component from '../base/component'\r\n\r\nimport _paintChapters from './utils/_paintChapters'\r\n\r\nconst HIDDEN = 'outline-navigator_hidden'\r\nconst EXPANDED = 'outline-navigator_expanded'\r\nconst FOLDED = 'outline-navigator_folded'\r\n\r\nclass Navigator extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.name = 'navigator'\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n addClass($el, EXPANDED)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const position = this.attr('position')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $parent = position === 'relative' ? this.$parentElement : this.$main\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, $parent)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo($parent, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n addClass($parent, EXPANDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n removeClass($parent, EXPANDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n // 添加判断\r\n if (!this.isSticky()) {\r\n return this\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n onRefresh(chapters) {\r\n this.refresh(chapters)\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n this.$on('navigator:refresh', this.onRefresh, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n this.$off('navigator:refresh')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from '../../utils/dom/createElement'\r\nimport timeSlice from '../../utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n // 在大量 DOM 菜单绘制的时候,使用 TIME SLICE 拆分绘制任务\r\n // 以避免一次绘制大量 DOM 导致占用资源过高,导致卡死\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let isInBounding = false\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return isInBounding\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n isInBounding = !!(\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n\r\n return isInBounding\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 检测当前设备是否为移动设备\r\n * ========================================================================\r\n * @method isMobile\r\n * @return {boolean}\r\n */\r\nconst isMobile = () => {\r\n const ua = navigator.userAgent\r\n\r\n return /Mobile|mini|Fennec|Android|iP(ad|od|hone)|NokiaN[^/]*/.test(ua)\r\n}\r\n\r\nexport default isMobile\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n * ========================================================================\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from '../utils/types/isString'\r\nimport isPlainObject from '../utils/types/isPlainObject'\r\nimport isFunction from '../utils/types/isFunction'\r\n\r\nimport extend from '../utils/lang/extend'\r\nimport later from '../utils/lang/later'\r\nimport stripScripts from '../utils/lang/stripScripts'\r\nimport encodeHTML from '../utils/lang/encodeHTML'\r\nimport cloneDeep from '../utils/lang/cloneDeep'\r\nimport guid from '../utils/lang/guid'\r\n\r\nimport createElement from '../utils/dom/createElement'\r\nimport addClass from '../utils/dom/addClass'\r\nimport removeClass from '../utils/dom/removeClass'\r\nimport setAttribute from '../utils/dom/setAttribute'\r\nimport setAttributes from '../utils/dom/setAttributes'\r\n\r\nimport paint from '../utils/icons/paint'\r\nimport icon from '../utils/icons/icon'\r\n\r\nimport on from '../utils/event/on'\r\nimport off from '../utils/event/off'\r\n\r\nimport Component from '../base/component'\r\n\r\nimport SYMBOLS from './symbols'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint(SYMBOLS)\r\n\r\nclass Message extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this._default().initialize(options)\r\n\r\n return this\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible') && this.getText()) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n getText() {\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n let message = this.attr('message')\r\n let text = ''\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n return text\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: false,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose =\r\n options && options.beforeClose ? options.beforeClose : null\r\n let offset = options && options.offset ? options.offset : 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.destroyAfterClosed = true\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n if (config.message) {\r\n instance.open()\r\n }\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","const SYMBOLS = [\r\n '<symbol id=\"outline-icon-warning\" viewBox=\"0 0 1024 1024\"><path d=\"M512 639.704018a95.994 95.994 0 0 1-95.994-95.994V95.994a95.994 95.994 0 0 1 191.988 0v447.716018a95.994 95.994 0 0 1-95.994 95.994z m0 128.375977A127.992 127.992 0 1 1 512 1023.936004a127.992 127.992 0 0 1 0-255.984001z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-error\" viewBox=\"0 0 1024 1024\"><path d=\"M512.64 376.96L263.744 128 128 263.744l248.96 248.96L128 761.472l135.744 135.808 248.96-248.96 248.832 248.96 135.808-135.808-248.96-248.896 248.96-248.896L761.536 128 512.64 376.96z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-success\" viewBox=\"0 0 1024 1024\"><path d=\"M426.368 580.864l-226.56-226.56L64 489.984l362.048 362.112 0.32-0.32 0.32 0.32 588.288-588.352L879.36 128 426.304 580.864z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-info\" viewBox=\"0 0 1024 1024\"><path d=\"M512 810.666667s-42.666667 4.266667-42.666667-42.666667v-341.333333c0-46.933333 42.666667-42.666667 42.666667-42.666667s42.666667-4.266667 42.666667 42.666667v341.333333c0 46.933333-42.666667 42.666667-42.666667 42.666667z m0 213.333333C228.949333 1024 0 795.050667 0 512S228.949333 0 512 0s512 228.949333 512 512-229.674667 512-512 512z m0-938.666667C276.608 85.333333 85.333333 276.608 85.333333 512s191.274667 426.666667 426.666667 426.666667 426.666667-191.274667 426.666667-426.666667S747.392 85.333333 512 85.333333z m0 213.333334c-23.466667 0-42.666667-19.2-42.666667-42.666667s19.2-42.666667 42.666667-42.666667 42.666667 19.2 42.666667 42.666667-19.2 42.666667-42.666667 42.666667z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-warning\" viewBox=\"0 0 1024 1024\"><path d=\"M512 213.333333s-42.666667-4.266667-42.666667 42.666667v341.333333c0 46.933333 42.666667 42.666667 42.666667 42.666667s42.666667 4.266667 42.666667-42.666667V256c0-46.933333-42.666667-42.666667-42.666667-42.666667z m0-213.333333C228.949333 0 0 228.949333 0 512s228.949333 512 512 512 512-228.949333 512-512S794.325333 0 512 0z m0 938.666667C276.608 938.666667 85.333333 747.392 85.333333 512S276.608 85.333333 512 85.333333s426.666667 191.274667 426.666667 426.666667-191.274667 426.666667-426.666667 426.666667z m0-213.333334c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666667 42.666667-19.2 42.666667-42.666667-19.2-42.666667-42.666667-42.666667z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-error\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0a512 512 0 1 0 512 512 512 512 0 0 0-512-512z m0 955.776A443.84 443.84 0 0 1 512 68.224a443.904 443.904 0 0 1 0 887.552z\"></path><path d=\"M641.664 326.144a32 32 0 0 1 50.304 39.168l-3.52 4.48-306.112 328.064a32 32 0 0 1-50.304-39.168l3.52-4.48 306.112-328.064z\"></path><path d=\"M324.608 337.088a32 32 0 0 1 40.704-5.12l4.48 3.584 328.064 306.112a32 32 0 0 1-39.168 50.304l-4.48-3.52-328.064-306.112a32 32 0 0 1-1.536-45.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-circle-success\" viewBox=\"0 0 1024 1024\"><path d=\"M512 0C228.949333 0 0 228.949333 0 512s228.949333 512 512 512 512-228.949333 512-512S794.325333 0 512 0z m0 950.869333C269.909333 950.869333 73.130667 754.090667 73.130667 512 73.130667 269.909333 269.909333 73.130667 512 73.130667c242.090667 0 438.869333 196.778667 438.869333 438.869333 0 242.090667-196.778667 438.869333-438.869333 438.869333z\"></path><path d=\"M737.834667 353.834667a42.666667 42.666667 0 0 1 63.872 56.32l-3.541334 4.010666L486.997333 725.333333a85.333333 85.333333 0 0 1-115.242666 4.992L366.336 725.333333l-140.501333-140.501333a42.666667 42.666667 0 0 1 56.32-63.872l4.010666 3.541333L426.666667 665.002667l311.168-311.168z\"></path></symbol>'\r\n]\r\n\r\nexport default SYMBOLS\r\n","import isFunction from '../utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n find(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n exists(name) {\r\n return !!this.find(name)\r\n }\r\n\r\n add(command) {\r\n if (this.exists(command)) {\r\n return this\r\n }\r\n\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const command = this.find(name)\r\n\r\n if (!command) {\r\n return this\r\n }\r\n\r\n const commands = this.commands\r\n\r\n commands.splice(commands.indexOf(command), 1)\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.find(name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from '../../utils/icons/icon'\r\nimport createElement from '../../utils/dom/createElement'\r\nimport addClass from '../../utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","const SYMBOLS = [\r\n '<symbol id=\"outline-icon-up\" viewBox=\"0 0 1024 1024\"><path d=\"M494.784 261.696c0.832-0.448 1.536-1.216 2.368-1.536a38.72 38.72 0 0 1 46.08 8.256l277.824 302.272a41.92 41.92 0 0 1-1.536 58.048 39.104 39.104 0 0 1-56.448-1.6L513.728 355.904 260.736 626.048a39.104 39.104 0 0 1-56.448 1.088 41.6 41.6 0 0 1-1.088-57.984L483.84 269.696c0.512-0.512 1.344-0.768 1.92-1.408l1.088-1.344c2.368-2.496 5.312-3.648 8-5.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-down\" viewBox=\"0 0 1024 1024\"><path d=\"M494.784 762.304c0.832 0.448 1.536 1.216 2.368 1.536 15.232 7.488 33.92 4.992 46.08-8.256l277.824-302.272a41.92 41.92 0 0 0-1.536-58.048 39.104 39.104 0 0 0-56.448 1.6l-249.344 271.232-252.992-270.144a39.104 39.104 0 0 0-56.448-1.088 41.6 41.6 0 0 0-1.088 57.984l280.576 299.456c0.512 0.512 1.344 0.768 1.92 1.408l1.088 1.344c2.368 2.496 5.312 3.648 8 5.248z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-menu\" viewBox=\"0 0 1024 1024\"><path d=\"M320 256h640V128H320zM320 576h640V448H320zM320 896h640v-128H320zM64 256h128V128H64zM64 576h128V448H64zM64 896h128v-128H64z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-file\" viewBox=\"0 0 1024 1024\"><path d=\"M320 640h256v128H320z\"></path><path d=\"M320 448h384v128H320z\"></path><path d=\"M640 0l320 320v557.696C960 958.528 909.824 1024 848 1024H176C114.176 1024 64 958.528 64 877.696V146.304C64 65.472 114.176 0 176 0H640z m0 128H192v768h640V320h-192V128z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-close\" viewBox=\"0 0 1024 1024\"><path d=\"M536.96 491.648L310.592 265.344a32 32 0 1 0-45.248 45.248L491.584 536.96l-226.304 226.304a32 32 0 0 0 45.312 45.248l226.24-226.304 226.304 226.304a32 32 0 0 0 45.248-45.248L582.144 536.896l226.304-226.24a32 32 0 0 0-45.248-45.248L536.896 491.584z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-homepage\" viewBox=\"0 0 26 28\"><path d=\"M22 15.5v7.5c0 0.547-0.453 1-1 1h-6v-6h-4v6h-6c-0.547 0-1-0.453-1-1v-7.5c0-0.031 0.016-0.063 0.016-0.094l8.984-7.406 8.984 7.406c0.016 0.031 0.016 0.063 0.016 0.094zM25.484 14.422l-0.969 1.156c-0.078 0.094-0.203 0.156-0.328 0.172h-0.047c-0.125 0-0.234-0.031-0.328-0.109l-10.813-9.016-10.813 9.016c-0.109 0.078-0.234 0.125-0.375 0.109-0.125-0.016-0.25-0.078-0.328-0.172l-0.969-1.156c-0.172-0.203-0.141-0.531 0.063-0.703l11.234-9.359c0.656-0.547 1.719-0.547 2.375 0l3.813 3.187v-3.047c0-0.281 0.219-0.5 0.5-0.5h3c0.281 0 0.5 0.219 0.5 0.5v6.375l3.422 2.844c0.203 0.172 0.234 0.5 0.063 0.703z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-github\" viewBox=\"0 0 24 28\"><path d=\"M12 2c6.625 0 12 5.375 12 12 0 5.297-3.437 9.797-8.203 11.391-0.609 0.109-0.828-0.266-0.828-0.578 0-0.391 0.016-1.687 0.016-3.297 0-1.125-0.375-1.844-0.812-2.219 2.672-0.297 5.484-1.313 5.484-5.922 0-1.313-0.469-2.375-1.234-3.219 0.125-0.313 0.531-1.531-0.125-3.187-1-0.313-3.297 1.234-3.297 1.234-0.953-0.266-1.984-0.406-3-0.406s-2.047 0.141-3 0.406c0 0-2.297-1.547-3.297-1.234-0.656 1.656-0.25 2.875-0.125 3.187-0.766 0.844-1.234 1.906-1.234 3.219 0 4.594 2.797 5.625 5.469 5.922-0.344 0.313-0.656 0.844-0.766 1.609-0.688 0.313-2.438 0.844-3.484-1-0.656-1.141-1.844-1.234-1.844-1.234-1.172-0.016-0.078 0.734-0.078 0.734 0.781 0.359 1.328 1.75 1.328 1.75 0.703 2.141 4.047 1.422 4.047 1.422 0 1 0.016 1.937 0.016 2.234 0 0.313-0.219 0.688-0.828 0.578-4.766-1.594-8.203-6.094-8.203-11.391 0-6.625 5.375-12 12-12zM4.547 19.234c0.031-0.063-0.016-0.141-0.109-0.187-0.094-0.031-0.172-0.016-0.203 0.031-0.031 0.063 0.016 0.141 0.109 0.187 0.078 0.047 0.172 0.031 0.203-0.031zM5.031 19.766c0.063-0.047 0.047-0.156-0.031-0.25-0.078-0.078-0.187-0.109-0.25-0.047-0.063 0.047-0.047 0.156 0.031 0.25 0.078 0.078 0.187 0.109 0.25 0.047zM5.5 20.469c0.078-0.063 0.078-0.187 0-0.297-0.063-0.109-0.187-0.156-0.266-0.094-0.078 0.047-0.078 0.172 0 0.281s0.203 0.156 0.266 0.109zM6.156 21.125c0.063-0.063 0.031-0.203-0.063-0.297-0.109-0.109-0.25-0.125-0.313-0.047-0.078 0.063-0.047 0.203 0.063 0.297 0.109 0.109 0.25 0.125 0.313 0.047zM7.047 21.516c0.031-0.094-0.063-0.203-0.203-0.25-0.125-0.031-0.266 0.016-0.297 0.109s0.063 0.203 0.203 0.234c0.125 0.047 0.266 0 0.297-0.094zM8.031 21.594c0-0.109-0.125-0.187-0.266-0.172-0.141 0-0.25 0.078-0.25 0.172 0 0.109 0.109 0.187 0.266 0.172 0.141 0 0.25-0.078 0.25-0.172zM8.937 21.438c-0.016-0.094-0.141-0.156-0.281-0.141-0.141 0.031-0.234 0.125-0.219 0.234 0.016 0.094 0.141 0.156 0.281 0.125s0.234-0.125 0.219-0.219z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-issues\" viewBox=\"0 0 24 28\"><path d=\"M25.5 15c0 0.547-0.453 1-1 1h-3.5c0 1.953-0.422 3.422-1.047 4.531l3.25 3.266c0.391 0.391 0.391 1.016 0 1.406-0.187 0.203-0.453 0.297-0.703 0.297s-0.516-0.094-0.703-0.297l-3.094-3.078s-2.047 1.875-4.703 1.875v-14h-2v14c-2.828 0-4.891-2.063-4.891-2.063l-2.859 3.234c-0.203 0.219-0.469 0.328-0.75 0.328-0.234 0-0.469-0.078-0.672-0.25-0.406-0.375-0.438-1-0.078-1.422l3.156-3.547c-0.547-1.078-0.906-2.469-0.906-4.281h-3.5c-0.547 0-1-0.453-1-1s0.453-1 1-1h3.5v-4.594l-2.703-2.703c-0.391-0.391-0.391-1.016 0-1.406s1.016-0.391 1.406 0l2.703 2.703h13.188l2.703-2.703c0.391-0.391 1.016-0.391 1.406 0s0.391 1.016 0 1.406l-2.703 2.703v4.594h3.5c0.547 0 1 0.453 1 1zM18 6h-10c0-2.766 2.234-5 5-5s5 2.234 5 5z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-tags\" viewBox=\"0 0 26 28\"><path d=\"M7 7c0-1.109-0.891-2-2-2s-2 0.891-2 2 0.891 2 2 2 2-0.891 2-2zM23.672 16c0 0.531-0.219 1.047-0.578 1.406l-7.672 7.688c-0.375 0.359-0.891 0.578-1.422 0.578s-1.047-0.219-1.406-0.578l-11.172-11.188c-0.797-0.781-1.422-2.297-1.422-3.406v-6.5c0-1.094 0.906-2 2-2h6.5c1.109 0 2.625 0.625 3.422 1.422l11.172 11.156c0.359 0.375 0.578 0.891 0.578 1.422zM29.672 16c0 0.531-0.219 1.047-0.578 1.406l-7.672 7.688c-0.375 0.359-0.891 0.578-1.422 0.578-0.812 0-1.219-0.375-1.75-0.922l7.344-7.344c0.359-0.359 0.578-0.875 0.578-1.406s-0.219-1.047-0.578-1.422l-11.172-11.156c-0.797-0.797-2.312-1.422-3.422-1.422h3.5c1.109 0 2.625 0.625 3.422 1.422l11.172 11.156c0.359 0.375 0.578 0.891 0.578 1.422z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-print\" viewBox=\"0 0 24 24\"><path d=\"M18 3v3.984h-12v-3.984h12zM18.984 12q0.422 0 0.727-0.281t0.305-0.703-0.305-0.727-0.727-0.305-0.703 0.305-0.281 0.727 0.281 0.703 0.703 0.281zM15.984 18.984v-4.969h-7.969v4.969h7.969zM18.984 8.016q1.219 0 2.109 0.891t0.891 2.109v6h-3.984v3.984h-12v-3.984h-3.984v-6q0-1.219 0.891-2.109t2.109-0.891h13.969z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-info\" viewBox=\"0 0 1024 1024\"><path d=\"M512 384.295982a95.994 95.994 0 0 1 95.994 95.994V928.006a95.994 95.994 0 0 1-191.988 0V480.289982a95.994 95.994 0 0 1 95.994-95.994z m0-128.375977A127.992 127.992 0 1 1 512 0.063996a127.992 127.992 0 0 1 0 255.984001z\"></path></symbol>',\r\n '<symbol id=\"outline-icon-sound\" viewBox=\"0 0 16 16\"><path d=\"M12.757 4.708c-0.406 0.405-1.062 0.405-1.468 0s-0.405-1.062 0-1.468l2.935-2.935c0.406-0.405 1.062-0.405 1.468 0 0.405 0.405 0.405 1.062 0 1.468l-2.935 2.935zM7.996 15.991l-3.996-3.996h-2.997c-0.552 0-0.999-0.447-0.999-0.999v-5.994c0-0.552 0.447-0.999 0.999-0.999h2.997l3.996-3.996c0 0 0.999-0.125 0.999 0.999 0 5.976 0 14.966 0 13.985 0 1.124-0.999 0.999-0.999 0.999zM6.997 4.004l-1.998 1.998h-2.997v3.996h2.997l1.998 1.998v-7.992zM11.992 8.999c-0.552 0-0.999-0.447-0.999-0.999s0.447-0.999 0.999-0.999h2.997c0.552 0 0.999 0.447 0.999 0.999s-0.447 0.999-0.999 0.999h-2.997zM12.757 11.292l2.935 2.935c0.405 0.406 0.405 1.063 0 1.468s-1.062 0.405-1.468 0l-2.935-2.935c-0.405-0.406-0.405-1.063 0-1.468s1.062-0.405 1.468 0z\"></path></symbol>'\r\n]\r\n\r\nexport default SYMBOLS\r\n","import isString from '../utils/types/isString'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport isObject from '../utils/types/isObject'\r\nimport isArray from '../utils/types/isArray'\r\n\r\nimport later from '../utils/lang/later'\r\nimport guid from '../utils/lang/guid'\r\nimport cloneDeep from '../utils/lang/cloneDeep'\r\n\r\nimport createElement from '../utils/dom/createElement'\r\nimport addClass from '../utils/dom/addClass'\r\nimport hasClass from '../utils/dom/hasClass'\r\nimport removeClass from '../utils/dom/removeClass'\r\n\r\nimport on from '../utils/event/on'\r\nimport off from '../utils/event/off'\r\n\r\nimport paint from '../utils/icons/paint'\r\n\r\nimport Component from '../base/component'\r\nimport Command from '../base/command'\r\nimport Commands from '../base/commands'\r\n\r\nimport _createButton from './utils/_createButton'\r\nimport SYMBOLS from './symbols'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\nconst ACTIVE = 'outline-toolbar_active'\r\n\r\nclass Toolbar extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.name = 'toolbar'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isHighlight(name) {\r\n const button = this.get(name)\r\n\r\n if (!button) {\r\n return false\r\n }\r\n\r\n return hasClass(button.$el, ACTIVE)\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint(SYMBOLS)\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attr('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.find(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.remove(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.find(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n updateUpAndDown({ top, min, max }) {\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n this.hide('up')\r\n this.show('down')\r\n } else if (current >= max) {\r\n this.hide('down')\r\n this.show('up')\r\n } else if (current > min && current < max) {\r\n this.show('up')\r\n this.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this.updateUpAndDown({ top, min, max })\r\n return this\r\n }\r\n\r\n onAddButton(buttons) {\r\n this.attr({\r\n buttons\r\n })\r\n this.refresh(buttons)\r\n\r\n return this\r\n }\r\n\r\n onRemoveButton(name) {\r\n this.remove(name)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n this.$on('toolbar:add:button', this.onAddButton)\r\n this.$on('toolbar:remove:button', this.onRemoveButton)\r\n this.$on('toolbar:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n this.$off('toolbar:update')\r\n this.$off('toolbar:add:button')\r\n this.$off('toolbar:remove:button')\r\n this.$off('toolbar:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from '../utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from '../../utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from '../utils/lang/cloneDeep'\r\nimport later from '../utils/lang/later'\r\nimport isString from '../utils/types/isString'\r\nimport isElement from '../utils/types/isElement'\r\nimport isFunction from '../utils/types/isFunction'\r\nimport createElement from '../utils/dom/createElement'\r\nimport addClass from '../utils/dom/addClass'\r\nimport removeClass from '../utils/dom/removeClass'\r\nimport isMobile from '../utils/dom/isMobile'\r\n\r\nimport at from '../utils/event/at'\r\nimport stop from '../utils/event/stop'\r\nimport off from '../utils/event/off'\r\n\r\nimport Message from '../message/message'\r\nimport Toolbar from '../toolbar/toolbar'\r\n\r\nimport Component from '../base/component'\r\nimport Speech from '../base/speech'\r\n\r\nimport _updateSiblingElements from './utils/_updateSiblingElements'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.name = 'reader'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$el = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $el = this.$el\r\n const toolbar = this.toolbar\r\n\r\n if ($el) {\r\n document.body.removeChild($el)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _animateTimeline() {\r\n // eslint-disable-next-line\r\n if (!window.ScrollTimeline || !isMobile()) {\r\n return this\r\n }\r\n\r\n this.$progress.animate(\r\n {\r\n // from\r\n scale: ['0 1', '1 1']\r\n },\r\n {\r\n // eslint-disable-next-line\r\n timeline: new ScrollTimeline({\r\n source: this.$article,\r\n axis: 'block'\r\n })\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n const mobile = isMobile()\r\n const size = mobile ? 26 : 20\r\n let title = this.attr('title')\r\n let $el\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement(\r\n 'article',\r\n {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n },\r\n isMobile() ? [] : [$progress.cloneNode()]\r\n )\r\n this.$article = $article\r\n\r\n $paper = createElement(\r\n 'div',\r\n {\r\n id: 'outline-reader__paper',\r\n className: 'outline-reader__paper'\r\n },\r\n [$title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n const buttons = []\r\n\r\n buttons.push({\r\n name: 'print',\r\n icon: 'print',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n })\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push({\r\n name: 'exit',\r\n icon: 'close',\r\n size,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n })\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $el = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $paper, this.toolbar.$el]\r\n )\r\n this.$el = $el\r\n\r\n document.body.appendChild($el)\r\n\r\n this._animateTimeline()\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $el.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $el.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$el) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($el, READING)\r\n removeClass($el, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('reader:enter')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const SPEAK = 'speak'\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $el = this.$el\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const speech = this.speech\r\n const toolbar = this.toolbar\r\n\r\n if (!this.reading || !$el) {\r\n return this\r\n }\r\n\r\n addClass($el, HIDDEN)\r\n removeClass($el, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n toolbar.hide()\r\n this.reading = false\r\n\r\n if (speech) {\r\n if (toolbar.isHighlight(SPEAK)) {\r\n toolbar.highlight(SPEAK)\r\n }\r\n\r\n speech.cancel()\r\n }\r\n\r\n this.$emit('reader:exit')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport || !speech) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onRefresh() {\r\n this.refresh()\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n this.$on('reader:print', this.onPrint)\r\n this.$on('reader:refresh', this.onRefresh)\r\n this.$on('reader:enter', this.enter)\r\n this.$on('reader:exit', this.exit)\r\n this.$on('reader:toggle', this.toggle)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n this.$off('reader:refresh')\r\n this.$off('reader:toggle')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport hasOwn from './utils/lang/hasOwn'\r\n\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\n\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport getScrollElement from './utils/dom/getScrollElement'\r\n\r\nimport getChapters from './chapters/getChapters'\r\n\r\nimport Plugins from './base/plugins'\r\nimport Plugin from './base/plugin'\r\n\r\nimport Command from './base/command'\r\n\r\nimport Component from './base/component'\r\n\r\nimport Anchors from './anchors/anchors'\r\nimport Drawer from './drawer/drawer'\r\nimport Navigator from './navigator/navigator'\r\nimport Reader from './reader/reader'\r\nimport Toolbar from './toolbar/toolbar'\r\n\r\nclass Outline extends Component {\r\n constructor(options) {\r\n super()\r\n\r\n this.version = '3.39.3'\r\n this.name = 'outline'\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = Outline.DEFAULTS\r\n this.$article = null\r\n this.$scrollElement = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render()\r\n\r\n return this\r\n }\r\n\r\n isExpanded() {\r\n const position = this.attr('position')\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 0) {\r\n return false\r\n }\r\n\r\n if (position === 'relative') {\r\n return !drawer.isClosed()\r\n } else {\r\n return !navigator.isClosed()\r\n }\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this.toolbar.updateUpAndDown({\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n Outline.plugins.executeAll()\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const anchorLinkFilter = this.attr('anchorLinkFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter,\r\n anchorLinkFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.anchors.refresh(chapters)\r\n this.navigator.refresh(chapters)\r\n this.reader.refresh()\r\n\r\n this.$emit('refresh', chapters)\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n this.toolbar.add(button)\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n\r\n return this\r\n }\r\n\r\n enterReading() {\r\n this.toolbar.toggle()\r\n this.reader.enter()\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n this.toolbar.toggle()\r\n this.reader.exit()\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n this.toolbar.toggle()\r\n this.reader.exit()\r\n\r\n return this\r\n }\r\n\r\n expand() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.show()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.hide()\r\n\r\n later(() => {\r\n drawer.open()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n collapses() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.hide()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.show()\r\n\r\n later(() => {\r\n drawer.close()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.isExpanded()) {\r\n this.collapses()\r\n } else {\r\n this.expand()\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.reader.print()\r\n\r\n return this\r\n }\r\n\r\n execute(name, options) {\r\n Outline.plugins.execute(name, options)\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n Outline.plugins.destroyAll()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.plugins = new Plugins()\r\nOutline.proto = (name, plugin, options) => {\r\n if (hasOwn(Outline.prototype, name)) {\r\n return false\r\n }\r\n\r\n let instance\r\n\r\n if (plugin.DEFAULTS) {\r\n instance = new plugin(options)\r\n } else {\r\n if (isFunction(plugin)) {\r\n instance = plugin\r\n }\r\n }\r\n\r\n Outline.prototype[name] = instance\r\n}\r\nOutline.cmd = (name, action, options) => {\r\n Outline.plugins.add(new Command(name, action, options))\r\n}\r\nOutline.plug = (name, plugin, options) => {\r\n Outline.plugins.add(new Plugin(name, plugin, options))\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: false,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null,\r\n anchorLinkFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n","class Plugins {\r\n constructor() {\r\n this.plugins = []\r\n\r\n return this\r\n }\r\n\r\n find(name) {\r\n return this.plugins.find((plugin) => plugin.name === name)\r\n }\r\n\r\n exists(name) {\r\n return !!this.find(name)\r\n }\r\n\r\n add(plugin) {\r\n const { name } = plugin\r\n\r\n if (!name) {\r\n throw new Error('Plugin name required')\r\n }\r\n\r\n if (this.exists(name)) {\r\n return this\r\n }\r\n\r\n this.plugins.push(plugin)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const plugin = this.find(name)\r\n\r\n if (!plugin) {\r\n return this\r\n }\r\n\r\n const plugins = this.plugins\r\n\r\n plugins.splice(plugins.indexOf(plugin), 1)\r\n\r\n return this\r\n }\r\n\r\n execute(name, options) {\r\n const plugin = this.find(name)\r\n\r\n if (!plugin) {\r\n return this\r\n }\r\n\r\n plugin.execute(options)\r\n\r\n return this\r\n }\r\n\r\n executeAll() {\r\n const plugins = this.plugins\r\n\r\n plugins.forEach((plugin) => {\r\n this.execute(plugin.name)\r\n })\r\n\r\n return this\r\n }\r\n\r\n destroy(name) {\r\n const plugin = this.find(name)\r\n\r\n if (!plugin) {\r\n return this\r\n }\r\n\r\n plugin.destroy()\r\n\r\n this.remove(name)\r\n\r\n return this\r\n }\r\n\r\n destroyAll() {\r\n const plugins = this.plugins.map((plugin) => plugin.name)\r\n\r\n plugins.forEach((name) => {\r\n this.destroy(name)\r\n })\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Plugins\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","hasOwn","prop","hasOwnProperty","call","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","indexOf","split","name","length","easeInQuad","x","scrollTo","scrollElement","top","afterStop","$scrollElement","_getScrollElement","$rootElements","document","querySelector","querySelectorAll","scrollTop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","getScrollElement","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","chapters","previous","level","text","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","_maybeArrayLike","_toConsumableArray","toTree","list","nodeKey","parentKey","map","roots","item","children","node","Plugin","constructor","module","this","instance","execute","destroy","instances","Command","action","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","subscriber","message","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Component","attrs","initialize","attr","render","addListeners","value","arguments","refresh","removeListeners","reload","$emit","event","publish","$on","on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","iconSet","getSymbol","patternName","patternSet","find","symbol","fullName","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","anchorLinkFilter","update","chapterCode","_updateHeading","headingId","url","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","onRefresh","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","overflow","customClass","mainClassName","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","HIDDEN","EXPANDED","FOLDED","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","_paintChapters","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","isInBounding","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","hide","intersection","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","onSelect","onScroll","onResize","unobserve","isMobile","ua","navigator","userAgent","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","Message","visible","offset","timer","destroyed","_objectSpread","getText","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Commands","commands","cmd","exists","command","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isHighlight","get","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","updateUpAndDown","ceil","onExecute","onToolbarUpdate","onAddButton","onRemoveButton","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","_animateTimeline","ScrollTimeline","animate","scale","timeline","axis","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","SPEAK","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","version","isExpanded","drawer","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","plugins","executeAll","option","reader","anchors","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","addButton","removeButton","afterTop","floor","afterDown","enterReading","exitReading","switchReading","expand","collapses","_destroy","destroyAll","plugin","Error","plug","_window","jQuery","$","outline"],"mappings":"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R,aAqBzD,OANA/M,KAAK3E,SAASE,GAdAkR,KACRjU,EAAWqU,IACbA,EAAYjT,KAAKoG,KAAM,UAGzBvH,GAAM,KACJuH,KAAKkD,MAAM,iBAAkB,CAC3B3H,MACAyR,IAVM,EAWNvI,OACA,GACF,IAKCuH,GACH3P,EAAKmK,GAGAxG,IACT,CAEAiN,SAAAA,CAAUlQ,GAGR,OAFAiD,KAAK+C,QAAQhG,GAENiD,IACT,CAEA4C,YAAAA,GACE,MAAM2I,EAAkBvL,KAAKuL,gBAE7B,OAAIvL,KAAK0L,QAAU,IAInBpI,EACEiI,EACA,2BACA,QACAvL,KAAK4M,gBACL5M,MACA,GAGFA,KAAKqD,IAAI,kBAAmBrD,KAAKiN,YAZxBjN,IAeX,CAEAgD,eAAAA,GACE,MAAMuI,EAAkBvL,KAAKuL,gBAE7B,OAAIvL,KAAK0L,QAAU,IAInB1J,EAAIuJ,EAAiB,QAASvL,KAAK4M,iBACnC5M,KAAKyD,KAAK,kBAAmBzD,KAAKiN,YAJzBjN,IAOX,EAGFmL,GAAQG,SAmBCrS,EAlBS,CACdqC,cAAe,YACfsD,eAAgB,WAChBC,SAAU,oBACViO,aAAc,EACdd,UAAW,GACXnB,WAAW,EACXC,WAAW,EACXjO,UAAU,EACV2O,QAAS,KACTG,QAAS,KACTkB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd7P,kBAAmB,KACnBmP,iBAAkB,OErUtB,MAAMiB,GAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KAC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"}