1 Star 0 Fork 34

堪培拉的风/outline.js

forked from Yaohaixiao/outline.js 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
outline.min.js.map 212.12 KB
一键复制 编辑 原始数据 按行查看 历史
{"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/toTree.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/lang/hasOwn.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.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/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/lang/trim.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","_removeHeading.js","utils/types/isEmpty.js","getChapters.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","anchors.js","_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","zIndex.js","drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","chapters.js","_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/encodeHTML.js","message.js","reader.js","_createButton.js","toolbar.js","outline.js"],"sourcesContent":["/**\n * Object 对象原型上的 toString 方法\n * ========================================================================\n * @method toString\n * @param {*} val\n * @returns {string}\n */\nconst toString = (val) => {\n return Object.prototype.toString.apply(val)\n}\n\nexport default toString\n","import toString from '../lang/toString'\n\n/**\n * 检测测试数据是否为 Function 类型\n * ========================================================================\n * @method isFunction\n * @param {*} val - (必须)待检测的数据\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\n */\nconst isFunction = (val) => {\n return typeof val === 'function' || toString(val) === '[object Function]'\n}\n\nexport default isFunction\n","import isFunction from '../types/isFunction'\n\n/**\n * later - 延迟执行方法\n * ========================================================================\n * @method later\n * @param {Function} fn\n * @param {Number} [delay]\n * @returns {number|boolean}\n */\nconst later = (fn, delay = 300) => {\n if (!isFunction(fn)) {\n return false\n }\n\n return setTimeout(() => {\n fn()\n }, delay)\n}\n\nexport default later\n","import toString from '../lang/toString'\nimport isFunction from './isFunction'\n\n/**\n * 检测数据是否为 Object 类型\n * ========================================================================\n * @method isObject\n * @param {*} o\n * @returns {boolean}\n */\nconst isObject = (o) => {\n return (\n (toString(o) === '[object Object]' ||\n typeof o === 'object' ||\n isFunction(o)) &&\n o !== null\n )\n}\n\nexport default isObject\n","import toString from '../lang/toString'\n\n/**\n * 检测数据是否为 Array 类型\n * ========================================================================\n * @method isArray\n * @param {*} o\n * @returns {boolean}\n */\nconst isArray = (o) => {\n if (Array.isArray) {\n return Array.isArray(o)\n } else {\n return toString(o) === '[object Array]'\n }\n}\n\nexport default isArray\n","import isObject from '../types/isObject'\r\nimport isArray from '../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","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","/**\n * 检测数据是否为 String 类型\n * ========================================================================\n * @method isArray\n * @param {*} str\n * @returns {boolean}\n */\nconst isString = (str) => {\n return typeof str === 'string'\n}\n\nexport default isString\n","import isObject from './isObject'\n\n/**\n * 检测数据是否为 HTMLElement DOM 节点\n * ========================================================================\n * @method isElement\n * @param {*} o\n * @returns {boolean}\n */\nconst isElement = (o) => {\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\n}\n\nexport default isElement\n","import isElement from '../types/isElement'\n/**\n * 检测 DOM 节点是否包含名为 className 的样式\n * ========================================================================\n * @method hasClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst hasClass = (el, className) => {\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\n let allClass\n let classList\n\n if (!isElement(el)) {\n return false\n }\n\n allClass = el.className\n\n if (!allClass) {\n return false\n }\n\n classList = el.classList\n\n if (classList && classList.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import hasClass from './hasClass'\n\n/**\n * 给 DOM 节点添加名为 className 的样式\n * ========================================================================\n * @method addClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst addClass = (el, className) => {\n let classList\n let allClass\n\n if (hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.add) {\n classList.add(className)\n } else {\n allClass = el.className\n allClass += allClass.length > 0 ? ' ' + className : className\n el.className = allClass\n }\n}\n\nexport default addClass\n","/**\n * 返回给定值的平方值\n * ========================================================================\n * @method easeInQuad\n * @param {Number} x\n * @returns {number}\n */\nconst easeInQuad = (x) => {\n return x * x\n}\n\nexport default easeInQuad\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\n\n/**\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\n * ========================================================================\n * @method _getScrollElement\n * @param {String|HTMLElement} scrollElement\n * @returns {Element}\n * @private\n */\nconst _getScrollElement = (scrollElement = null) => {\n let $rootElements\n let $scrollElement\n\n if (!scrollElement) {\n $rootElements = document.querySelectorAll('html,body')\n $scrollElement =\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\n ? $rootElements[0]\n : $rootElements[1]\n } else {\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n }\n\n return $scrollElement\n}\n\nexport default _getScrollElement\n","import easeInQuad from '../lang/easeInQuad'\nimport isFunction from '../types/isFunction'\nimport _getScrollElement from './_getScrollElement'\n\n/**\n * 指定 rootElement DOM 节点滚动到指定 top 位置\n * ========================================================================\n * @method scrollTo\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\n * @param {Number} top - (必须)滚动的 scrollTop 数值\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\n */\nconst scrollTo = (scrollElement, top, afterStop) => {\n const $scrollElement = _getScrollElement(scrollElement)\n let scrollTop = $scrollElement.scrollTop\n let step = 0\n const distance = top - scrollTop\n const MAX_HEIGHT = $scrollElement.scrollHeight\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\n const stop = (top) => {\n if (isFunction(afterStop)) {\n afterStop(top)\n }\n\n return false\n }\n const play = () => {\n step += 1\n\n // 向上滚动\n if (distance < 0) {\n scrollTop -= easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop <= top) {\n $scrollElement.scrollTop = top\n return stop(top)\n }\n } else {\n scrollTop += easeInQuad(step)\n $scrollElement.scrollTop = scrollTop\n\n if (scrollTop >= MAX_TOP) {\n $scrollElement.scrollTop = MAX_TOP\n return stop(MAX_TOP)\n }\n }\n\n // eslint-disable-next-line compat/compat\n requestAnimationFrame(play)\n }\n\n // eslint-disable-next-line compat/compat\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\n","/**\n * 检测对象自身属性中是否具有指定的属性。\n * ========================================================================\n * @method hasOwn\n * @param {Object} obj - (必须)检测的目标对象\n * @param {String} prop - (必须)属性名\n * @returns {Boolean}\n */\nconst hasOwn = (obj, prop) => {\n const hasOwnProperty = Object.prototype.hasOwnProperty\n return obj && hasOwnProperty.call(obj, prop)\n}\n\nexport default hasOwn\n","import hasOwn from './hasOwn'\n\n/**\n * 扩展对象\n * ========================================================================\n * @method extend\n * @param {Object} origin\n * @param {Object} source\n */\nconst extend = (origin, source) => {\n const keys = Object.keys(source)\n\n keys.forEach((prop) => {\n if (hasOwn(source, prop)) {\n origin[prop] = source[prop]\n }\n })\n}\n\nexport default extend\n","/**\n * 存储订阅者(主题和处理器的)私有对象\n * ========================================================================\n * @type {{}}\n * @private\n */\nconst _subscribers = {}\n\nexport default _subscribers\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\n * ========================================================================\n * @method _hasDirectSubscribersFor\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasDirectSubscribersFor = (topic) => {\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\n}\n\nexport default _hasDirectSubscribersFor\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\nimport _hasSubscribers from './_hasSubscribers'\n\n/**\n * 判断是否存在包含 topic 指定的订阅者信息\n * ========================================================================\n * @method has\n * @param {String} topic - (必须)主题名称\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\n * @returns {Boolean}\n */\nconst has = (topic, isDirect = true) => {\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\n}\n\nexport default has\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * 判断是否存在包含给定 topic 相关的订阅者信息\n * ========================================================================\n * @method _hasSubscribers\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _hasSubscribers = (topic) => {\n let found = _hasDirectSubscribersFor(topic)\n let position = topic.lastIndexOf('.')\n\n while (!found && position !== -1) {\n topic = topic.substring(0, position)\n position = topic.lastIndexOf('.')\n found = _hasDirectSubscribersFor(topic)\n }\n\n return found\n}\n\nexport default _hasSubscribers\n","import isTypedArray from '../types/isTypedArray'\nimport _subscribers from './_subscribers'\nimport has from './has'\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\n\n/**\n * (异步)发布订阅主题信息\n * ========================================================================\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\n * ========================================================================\n * @method emit\n * @param {String} topic - (必须)主题名称\n * @param {Object} [data] - (可选)数据对象\n * @param {Boolean} [async] - (可选) 是否异步发布\n */\nconst emit = (topic, data, async = true) => {\n const execute = (topic) => {\n if (!_hasDirectSubscribersFor(topic)) {\n return false\n }\n\n _subscribers[topic].forEach((subscriber) => {\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\n // 采用 toString() 方法转化为普通(JSON)字符串\n const message = isTypedArray(data) ? data.toString() : data\n\n subscriber.callback.call(subscriber.context || subscriber, message)\n })\n }\n const deliver = () => {\n let subscriber = topic\n let position = topic.lastIndexOf('.')\n\n while (position !== -1) {\n subscriber = subscriber.substring(0, position)\n position = subscriber.lastIndexOf('.')\n\n execute(subscriber)\n }\n\n // 执行 topic 对应的处理器\n execute(topic)\n // 执行特殊 topic:'*'(监听全部消息的发布)\n execute('*')\n }\n\n if (!has(topic)) {\n return false\n }\n\n if (async) {\n setTimeout(deliver, 10)\n } else {\n deliver()\n }\n}\n\nexport default emit\n","import toString from '../lang/toString'\n/**\n * 判断检测数据是否为 Typed Arrays 类型的数据\n * ========================================================================\n * @param {*} val\n * @returns {boolean}\n */\nconst isTypedArray = (val) => {\n const TYPES = [\n '[object Int8Array]',\n '[object Uint8Array]',\n '[object Uint8ClampedArray]',\n '[object Int16Array]',\n '[object Uint16Array]',\n '[object Int32Array]',\n '[object Uint32Array]',\n '[object Float32Array]',\n '[object Float64Array]',\n '[object BigInt64Array]',\n '[object BigUint64Array]'\n ]\n\n return TYPES.indexOf(toString(val)) > -1\n}\n\nexport default isTypedArray\n","/**\n * 生成唯一 id 字符串的函数\n * ========================================================================\n * @method guid\n * @param {String} [prefix] - 生成 id 的前缀字符串\n * @return {String} 返回一个表示唯一 id 的字符串\n */\nconst guid = (() => {\n let uuid = 0\n\n return (prefix) => {\n uuid += 1\n\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\n }\n})()\n\nexport default guid\n","import _subscribers from './_subscribers'\nimport hasOwn from '../lang/hasOwn'\n\n/**\n * 删除与给定 topic 相同的订阅者信息\n * ========================================================================\n * @method _removeSubscriber\n * @param {String} topic - (必须)订阅主题字符串\n * @returns {Boolean}\n */\nconst _removeSubscriber = (topic) => {\n if (!hasOwn(_subscribers, topic)) {\n return false\n }\n\n delete _subscribers[topic]\n}\n\nexport default _removeSubscriber\n","import has from './has'\nimport _removeSubscriber from './_removeSubscriber'\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\n\n/**\n * 取消订阅主题\n * ========================================================================\n * @method off\n * @param {String} topic - (必须)订阅的主题\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\n */\nconst off = (topic, token) => {\n if (!has(topic)) {\n return false\n }\n\n if (token) {\n _removeSubscriberByToken(token)\n } else {\n _removeSubscriber(topic)\n }\n}\n\nexport default off\n","import _subscribers from './_subscribers'\nimport _removeSubscriber from './_removeSubscriber'\n\n/**\n * 通过订阅者 token 值删除订阅者信息\n * ========================================================================\n * @method _removeSubscriberByToken\n * @param {String} token - 订阅者 token 字符串\n * @returns {boolean}\n * @private\n */\nconst _removeSubscriberByToken = (token) => {\n const keys = Object.keys(_subscribers)\n let index = -1\n\n if (!token || keys.length < 1) {\n return false\n }\n\n keys.forEach((subject) => {\n const subscriber = _subscribers[subject]\n let topic\n\n subscriber.forEach((execution, j) => {\n if (execution.callback === token || execution.token === token) {\n topic = execution.topic\n subscriber.splice(index, j)\n }\n })\n\n /* istanbul ignore else */\n if (subscriber.length < 1) {\n _removeSubscriber(topic)\n }\n })\n}\n\nexport default _removeSubscriberByToken\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\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 Base {\r\n constructor(options) {\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 this.destroy().initialize(options)\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 Base\r\n","import _subscribers from './_subscribers'\nimport isFunction from '../types/isFunction'\nimport guid from '../lang/guid'\n\n/**\n * 订阅主题并给出处理器函数\n * ========================================================================\n * @method on\n * @param {String} topic - 必须主题名称\n * @param {Function} handler - 必须主题的处理器函数\n * @param {Object} [context] - 可选指定 this 执行上下文\n * @return {String} - 唯一的 token 字符串例如:'guid-1'。\n */\nconst on = (topic, handler, context = null) => {\n const token = guid()\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\n\n if (!isFunction(handler)) {\n return ''\n }\n\n /* istanbul ignore else */\n if (!_subscribers[subject]) {\n _subscribers[subject] = []\n }\n\n _subscribers[subject].push({\n topic: subject,\n callback: handler,\n context,\n token\n })\n\n return token\n}\n\nexport default on\n","/**\n * timeSlice.js 时间切片功能函数\n * ====================================================\n * Created By: Yaohaixiao\n * Update: 2023.09.04\n */\nimport isFunction from '../types/isFunction'\nimport later from './later'\n\nconst queue = []\nlet isHandling\nlet done\n\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\nif (typeof window.requestIdleCallback === 'undefined') {\n window.requestIdleCallback = function (cb) {\n const start = Date.now()\n return later(function () {\n cb({\n didTimeout: false,\n timeRemaining: function () {\n return Math.max(0, 50 - (Date.now() - start))\n }\n })\n }, 10)\n }\n\n window.cancelIdleCallback = function (id) {\n clearTimeout(id)\n }\n}\n\nfunction runIdle(idleDeadline) {\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\n const fn = queue.shift()\n\n if (!isFunction(fn)) {\n return false\n }\n\n fn()\n }\n\n if (queue.length) {\n isHandling = requestIdleCallback(runIdle)\n } else {\n isHandling = 0\n\n if (isFunction(done)) {\n done()\n done = null\n }\n }\n}\n\n/**\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\n * 多个短时间任务\n * ====================================================\n * @param {Function} fn - 需要在空闲时执行的回调函数\n * @param {Function} afterComplete - queen 的\n * @return {(function(): (boolean|undefined))|*|boolean}\n */\nconst timeSlice = (fn, afterComplete = null) => {\n queue.push(fn)\n\n if (isFunction(afterComplete)) {\n done = afterComplete\n }\n\n if (!isHandling) {\n requestIdleCallback(runIdle)\n }\n}\n\nexport default timeSlice\n","/**\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\n * ========================================================================\n * @method offsetTop\n * @param {HTMLElement} el - DOM 节点\n * @returns {Number}\n */\nconst offsetTop = (el) => {\n let top = el.offsetTop\n\n if (el.offsetParent !== null) {\n top += offsetTop(el.offsetParent)\n }\n\n return top\n}\n\nexport default offsetTop\n","/**\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\n * ========================================================================\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\n * 标 DOM 元素是否为事件代理所期望触发的目标。\n * ========================================================================\n * @method matches\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\n * @returns {Boolean}\n */\nconst matches = (el, selector = '') => {\n const sel = selector.replace(/^>/i, '')\n\n if (!selector || !sel || !el) {\n return false\n }\n\n /* istanbul ignore else */\n if (el.matches) {\n return el.matches(sel)\n } else if (el.msMatchesSelector) {\n return el.msMatchesSelector(sel)\n } else {\n return false\n }\n}\n\nexport default matches\n","/**\n * 获取 DOM 元素的父节点\n * ========================================================================\n * @method getParentOrHost\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\n * @returns {*|HTMLElement}\n */\nconst getParentOrHost = (el) => {\n return el.host && el !== document && el.host.nodeType\n ? el.host\n : el.parentNode\n}\n\nexport default getParentOrHost\n","export const CAPTURE_EVENTS = [\n 'focusout',\n 'blur',\n 'focusin',\n 'focus',\n 'load',\n 'unload',\n 'mouseenter',\n 'mouseleave'\n]\n","import { CAPTURE_EVENTS } from './enum'\nimport _delete from './_delete'\n\n/**\n * (私有方法)取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method _off\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} fn - (必须)事件处理器回调函数\n * @private\n */\nconst _off = (el, type, fn) => {\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n /* istanbul ignore else */\n if (fn._delegateListener) {\n fn = fn._delegateListener\n delete fn._delegateListener\n }\n\n // 移除缓存的 _listeners 数据\n _delete(el, type, fn)\n\n el.removeEventListener(type, fn, capture)\n}\n\nexport default _off\n","/**\n * 删除 DOM 元素缓存的 _listeners 数据\n * ========================================================================\n * @method _delete\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\n * @param {String} type - 事件类型(名称)\n * @param {Function} [fn] - 事件处理器回调函数\n */\nconst _delete = function (el, type, fn) {\n const listeners = el._listeners\n let index = -1\n\n if (listeners.length < 1) {\n return false\n }\n\n // 移除缓存的 _listeners 数据\n listeners.forEach((listener, i) => {\n const handler = listener.fn\n\n if (type === listener.type) {\n index = i\n\n if (handler === fn) {\n index = i\n }\n }\n })\n\n /* istanbul ignore else */\n if (index > -1) {\n listeners.splice(index, 1)\n }\n}\n\nexport default _delete\n","import isString from '../types/isString'\nimport isElement from '../types/isElement'\nimport getListeners from './getListeners'\nimport _off from './_off'\n\n/**\n * 销毁(type 类型的)代理事件绑定\n * ========================================================================\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\n * ========================================================================\n * @method purgeElement\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\n * @param {String|Boolean} type - (必须)事件类型\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\n */\nconst purgeElement = function (el, type, recurse = false) {\n const $element = isString(el) ? document.querySelector(el) : el\n const $children = $element.childNodes\n const listeners = getListeners($element, type)\n\n listeners.forEach((listener) => {\n _off($element, listener.type, listener.fn)\n })\n\n if (\n (recurse || type === true || arguments.length === 1) &&\n $element &&\n $children\n ) {\n $children.forEach(($child) => {\n if (isElement($child)) {\n purgeElement($child, type, recurse)\n }\n })\n }\n}\n\nexport default purgeElement\n","import isString from '../types/isString'\n\n/**\n * 获取 DOM 元素(type 事件类型)事件绑定信息\n * ========================================================================\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\n * ========================================================================\n * @methods getListeners\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\n * @param {String} [type] - (可选)事件类型\n * @returns {Array} - 已绑定的事件信息\n */\nconst getListeners = (el, type) => {\n let listeners = el._listeners || []\n\n if (isString(type) && type) {\n listeners = listeners.filter((listener) => {\n return listener.type === type\n })\n }\n\n return listeners\n}\n\nexport default getListeners\n","import purgeElement from './purgeElement'\nimport isFunction from '../types/isFunction'\nimport _off from './_off'\n\n/**\n * 取消 type 类型的代理事件绑定\n * ========================================================================\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\n * ========================================================================\n * @method off\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\n * @param {String} type - (必须)事件类型\n * @param {Function} [fn] - (可选)事件处理器回调函数\n */\nconst off = (el, type, fn) => {\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\n if (!isFunction(fn)) {\n return purgeElement(el, type)\n }\n\n _off(el, type, fn)\n}\n\nexport default off\n","import closest from '../dom/closest'\nimport off from './off'\nimport getTarget from './getTarget'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定代理事件\n * ========================================================================\n * @method on\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst on = (el, selector, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n\n const listener = function (evt) {\n const target = getTarget(evt)\n // 通过 Element.matches 方法获得点击的目标元素\n const delegateTarget = closest(target, selector, el)\n let overrideContext = context || el\n\n evt.delegateTarget = delegateTarget\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n /* istanbul ignore else */\n if (delegateTarget) {\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n selector,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default on\n","import resolveTextNode from '../dom/resolveTextNode'\n\n/**\n * 返回触发事件的 target DOM 元素\n * ========================================================================\n * @method getTarget\n * @param {Event} evt - Event 对象\n * @return {HTMLElement} - Event 对象的 target DOM 元素\n */\nconst getTarget = function (evt) {\n const target = evt.target\n\n return resolveTextNode(target)\n}\n\nexport default getTarget\n","/**\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\n * resolveTextNode() 方法则会返回实际的目标节点。\n * ========================================================================\n * @method resolveTextNode\n * @param {HTMLElement|Text} el - 要解析的节点\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\n */\nconst resolveTextNode = function (el) {\n if (el && el.nodeType === 3) {\n return el.parentNode\n }\n\n return el\n}\n\nexport default resolveTextNode\n","import matches from './matches'\nimport getParentOrHost from './getParentOrHost'\n\n/**\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\n * ========================================================================\n * @method closest\n * @param {HTMLElement} el - (必须)DOM 元素\n * @param {String} selector - (必须)DOM 元素的选择其\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\n */\nconst closest = (el, selector, ctx, includeCTX) => {\n const context = ctx || document\n\n if (!el) {\n return null\n }\n\n do {\n /* istanbul ignore else */\n if (\n (selector != null &&\n (selector.startsWith('>')\n ? el.parentNode === context && matches(el, selector)\n : matches(el, selector))) ||\n (includeCTX && el === context)\n ) {\n return el\n }\n\n /* istanbul ignore else */\n if (el === context) {\n break\n }\n\n /* jshint boss:true */\n } while ((el = getParentOrHost(el)))\n}\n\nexport default closest\n","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n * <div id=\"nav\" class=\"nav\">\n * <a id=\"service\" class=\"anchor\" href=\"https://www.yaohaixiao.com/serivce\">Service</a>\n * <a id=\"help\" class=\"anchor\" href=\"https://www.yaohaixiao.com/help\">Help</a>\n * </div>\n *\n * const $nav = document.querySelector('#nav')\n * const $service = document.querySelector('.anchor')\n *\n * on($nav, 'click', function(evt) {\n * console.log('你点击了导航栏')\n * })\n *\n * on($anchor, 'click', function(evt) {\n * console.log('tagName', this.tagName)\n *\n * // 工作台输出:'a'\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\n * stopEvent(evt)\n * })\n */\nconst stop = function (evt) {\n evt.stopPropagation()\n evt.preventDefault()\n}\n\nexport default stop\n","import DEFAULTS from './defaults'\n\nconst SYMBOLS = [...DEFAULTS]\n\nexport default SYMBOLS\n","const DEFAULTS = [\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>',\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>',\n '<symbol id=\"outline-icon-menu\" viewBox=\"0 0 1024 1024\"><path d=\"M320 256h640V128H320zM320 576h640V448H320zM320 896h640v-128H320zM64 256h128V128H64zM64 576h128V448H64zM64 896h128v-128H64z\"></path></symbol>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>',\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>'\n]\n\nexport default DEFAULTS\n","import isString from '../types/isString'\nimport getSymbol from './getSymbol'\nimport SYMBOLS from './symbols'\n\n/**\n *\n * @method getSymbols\n * @param {String} [name]\n * @param {String} [iconSet]\n * @returns {string[]|*}\n */\nconst getSymbols = (name, iconSet = 'icon') => {\n if (isString(name)) {\n return getSymbol(name, iconSet)\n }\n\n return [...SYMBOLS]\n}\n\nexport default getSymbols\n","import SYMBOLS from './symbols'\n\n/**\n * @method getSymbol\n * @param {String} name\n * @param {String} [iconSet]\n * @returns {String}\n */\nconst getSymbol = (name, iconSet = 'icon') => {\n const patternName = /id=\"(.*?)\"/\n const patternSet = /^(\\w+)-/\n const symbols = SYMBOLS\n\n return symbols.find((symbol) => {\n const names = patternName.exec(symbol)\n const fullName = names[1]\n const sets = patternSet.exec(fullName)\n const setName = sets[1]\n const iconName =\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\n\n return setName === iconSet && fullName === iconName\n })\n}\n\nexport default getSymbol\n","import add from './add'\nimport getSymbols from './getSymbols'\n\n/**\n * 绘制 SVG 图标集\n * ========================================================================\n * @method paint\n * @param {String|Array} symbol\n */\nconst paint = (symbol = '') => {\n const $body = document.body\n let $icons = document.querySelector('#outline-icons')\n let symbols = []\n\n add(symbol)\n symbols = getSymbols()\n\n if ($icons) {\n $icons.innerHTML = symbols.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n `<svg id=\"outline-icons\" aria-hidden=\"true\" style=\"position:absolute;display:none;width:0;height:0;overflow:hidden;\">` +\n `${symbols.join('')}` +\n `</svg>`\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\nexport default paint\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport SYMBOLS from './symbols'\n\n/**\n * @method add\n * @param {Array|String} symbols\n * @return {Boolean}\n */\nconst add = (symbols) => {\n if (!symbols) {\n return false\n }\n\n if (isArray(symbols) && symbols.length > 0) {\n symbols.forEach((symbol) => {\n /* istanbul ignore else */\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\n SYMBOLS.push(symbol)\n }\n })\n } else {\n /* istanbul ignore else */\n if (isString(symbols)) {\n SYMBOLS.push(symbols)\n }\n }\n}\n\nexport default add\n","import isString from '../types/isString'\n\n/**\n * 清楚字符串起始位置所有的空格\n * ========================================================================\n * @method trim\n * @param {string} str\n * @returns {string|Boolean}\n */\nconst trim = (str) => {\n if (!isString(str)) {\n return false\n }\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\n}\n\nexport default trim\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 '../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 '../lang/toString'\nimport isObject from './isObject'\n\nconst isFragment = (fragment) => {\n return !!(\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\n )\n}\n\nexport default isFragment\n","import toString from '../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","/**\n * 给 DOM 节点设置属性/值\n * ========================================================================\n * @method setAttribute\n * @param {HTMLElement} el - DOM 节点\n * @param {String} attr - 属性名称\n * @param {String|Number|Boolean} value - 属性值\n */\nconst setAttribute = (el, attr, value) => {\n let tagName = el.tagName.toLowerCase()\n\n switch (attr) {\n case 'style':\n el.style.cssText = value\n break\n case 'value':\n if (tagName === 'input' || tagName === 'textarea') {\n el.value = value\n } else {\n el.setAttribute(attr, value)\n }\n break\n case 'htmlFor':\n el.setAttribute('for', value)\n break\n case 'className':\n el.className = value\n break\n case 'innerHTML':\n el.innerHTML = value\n break\n case 'innerText':\n el.innerText = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import isObject from '../types/isObject'\nimport hasOwn from '../lang/hasOwn'\nimport setAttribute from './setAttribute'\n\nconst setAttributes = (el, attrs) => {\n if (!el || !isObject(attrs)) {\n return false\n }\n\n Object.keys(attrs).forEach((attr) => {\n const value = attrs[attr]\n if (hasOwn(attrs, attr)) {\n setAttribute(el, attr, value)\n }\n })\n}\n\nexport default setAttributes\n","import isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttributes from './setAttributes'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\n * @returns {HTMLElement}\n */\nconst createElement = (tagName, attrs, children) => {\n const $fragment = document.createDocumentFragment()\n const $el = document.createElement(tagName)\n const isValidChild = (child) => {\n return isDOM(child) || isString(child)\n }\n const append = (child) => {\n let $child\n\n if (!isValidChild(child)) {\n return false\n }\n\n if (isDOM(child)) {\n $child = child\n } else if (isString(child)) {\n $child = document.createTextNode(child)\n }\n\n $fragment.appendChild($child)\n }\n\n if (isObject(attrs)) {\n setAttributes($el, attrs)\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\n } else if (isDOM(attrs)) {\n append(attrs)\n } else if (isString(attrs)) {\n append(document.createTextNode(attrs))\n }\n\n if (isArray(children)) {\n children.forEach((child) => {\n append(child)\n })\n } else {\n append(children)\n }\n\n $el.appendChild($fragment)\n\n return $el\n}\n\nexport default createElement\n","import isArray from '../types/isArray'\nimport isString from '../types/isString'\nimport isSVG from '../types/isSVG'\nimport setAttributes from '../dom/setAttributes'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @param {Object} [options.attrs]\n * @returns {HTMLElement}\n */\nconst createElement = (name, options = {}) => {\n const ICON = 'outline-icon'\n const size = options.size || 0\n const color = options.color || ''\n const iconSet = options.iconSet || ''\n const width = isArray(size) ? size[0] : size\n const height = isArray(size) ? size[1] : size\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\n const attrs = options.attrs || {}\n const $icon = document.createElement('i')\n let binds = ''\n let svg = ''\n let $svg\n\n if (!isString(name)) {\n return null\n }\n\n if (isSVG(name)) {\n svg = name\n } else {\n binds =\n iconSet && iconSet !== 'icon'\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\n svg = `<svg><use ${binds}></use></svg>`\n }\n\n $icon.innerHTML = svg\n\n if (attrs.className) {\n attrs.className = `${ICON} ${attrs.className}`\n } else {\n attrs.className = ICON\n }\n\n setAttributes($icon, attrs)\n\n $svg = $icon.querySelector('svg')\n setAttributes($svg, {\n 'aria-hidden': true,\n xmlns: 'http://www.w3.org/2000/svg',\n class: 'outline-icon__svg',\n width: 200,\n height: 200,\n style: cssRules\n })\n\n return $icon\n}\n\nexport default createElement\n","import isString from './isString'\n\nconst isSVG = (str) => {\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\n const doctype =\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*<![^>]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\n const content = '<svg[^>]*>[^]*<\\\\/svg>\\\\s*$'\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\n const pattern = new RegExp(svg, 'i')\n\n return isString(str) && pattern.test(str)\n}\n\nexport default isSVG\n","import createElement from './createElement'\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method icon\n * @alias createElement\n * @see createElement\n * @param {String} name\n * @param {Object} [options]\n * @param {Number|Array} [options.size]\n * @param {String} [options.color]\n * @param {String} [options.iconSet]\n * @returns {HTMLElement}\n */\nconst icon = (name, options = {}) => {\n return createElement(name, options)\n}\n\nexport default icon\n","import trim from '../lang/trim'\nimport hasClass from './hasClass'\n\n/**\n * 移除 DOM 节点的 className 样式\n * ========================================================================\n * @method removeClass\n * @param {HTMLElement} el - DOM 节点\n * @param {String} className - 样式名称\n * @returns {Boolean}\n */\nconst removeClass = (el, className) => {\n let allClass = el.className\n let classList\n\n if (!allClass || !hasClass(el, className)) {\n return false\n }\n\n classList = el.classList\n\n if (classList?.remove) {\n classList.remove(className)\n } else {\n allClass = trim(allClass.replace(className, ''))\n el.className = allClass\n }\n}\n\nexport default removeClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\n let $anchor\n\n $heading.innerHTML = text.replace(pattern, '')\n $heading.removeAttribute('id')\n $heading.removeAttribute('data-id')\n\n removeClass($heading, CLS_HEADING)\n\n if (!hasAnchor) {\n return false\n }\n\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\n\n if (isAtStart) {\n removeClass($heading, `${CLS_HEADING}_start`)\n }\n\n if (isEmpty(trim($heading.className))) {\n $heading.removeAttribute('class')\n }\n\n // 存在锚点才移除\n if ($anchor) {\n $heading.removeChild($anchor)\n }\n}\n\nexport default _removeHeading\n","import isString from './isString'\n/**\n * 检测数据是否为空字符串\n * ========================================================================\n * @method isEmpty\n * @param {String} str\n * @returns {boolean}\n */\nconst isEmpty = (str) => {\n return isString(str) && str === ''\n}\n\nexport default isEmpty\n","import trim from './utils/lang/trim'\nimport stripTags from './utils/lang/stripTags'\nimport isFunction from './utils/types/isFunction'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\n/**\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\n * ========================================================================\n * @method getChapters\n * @param {Array} headings\n * @param {Boolean} [showCode]\n * @param {Function} [chapterTextFilter]\n * @return {*|*[]}\n */\nconst getChapters = (headings, showCode = true, chapterTextFilter = null) => {\n let previous = 1\n let level = 0\n let text = ''\n const chapters = []\n\n headings.forEach((heading, i) => {\n const tagName = heading.tagName\n const headingLevel = tagName.replace(/h/i, '')\n let current = parseInt(headingLevel, 10)\n let pid = -1\n\n // 场景1:当前标题是前一个标题的子标题\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\n // h2 (前一个标题)\n // h3 (当前标题)\n if (current > previous) {\n level += 1\n\n // 第一层级的 pid 是 -1\n if (level === 1) {\n pid = -1\n } else {\n pid = i - 1\n }\n }\n // 场景2:当前标题和前一个标题层级相同\n // 当前标题的(标题标签)序号 = 前一个标题的序号\n // h2 (前一个标题)\n // h2 (当前标题)\n // 当前标题的(标题标签)序号 < 前一个标题的序号并且当前标题序号 > 当前的级别\n // h2\n // h4 (前一个标题)\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\n else if (current === previous || (current < previous && current > level)) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n pid = -1\n } else {\n pid = chapters[i - 1].pid\n }\n }\n // 场景3:当前标题比前一个标题层级高\n else if (current <= level) {\n // H1 的层级肯定是 1\n if (current === 1) {\n level = 1\n } else {\n level = level - (previous - current)\n\n if (level <= 1) {\n level = 1\n }\n }\n\n // 第一级的标题\n if (level === 1) {\n pid = -1\n } else {\n // 通过当前标题和前一个标题之间的等级差获得当前标题的父标题ID\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\n }\n }\n\n previous = current\n\n text = stripTags(trim(heading.innerHTML))\n\n if (isFunction(chapterTextFilter)) {\n text = chapterTextFilter(text)\n }\n\n chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text,\n tagName\n })\n })\n\n return showCode ? _getChaptersWithCode(chapters) : chapters\n}\n\nexport default getChapters\n","import isString from '../types/isString'\n\n/**\n * 过滤所有 HTML 标签\n * ========================================================================\n * @method stripTags\n * @param {string} str\n * @returns {string}\n */\nconst stripTags = (str) => {\n if (!isString(str)) {\n return ''\n }\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\n}\n\nexport default stripTags\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\n let previous = chapters[index - 1]\n let pid\n let i\n\n for (i = 0; i < differ; i += 1) {\n pid = previous.pid\n previous = chapters[pid]\n }\n\n pid = previous.pid\n\n return pid\n}\n\nexport default _getChapterParentIdByDiffer\n","import isArray from './utils/types/isArray'\n\nconst _getChaptersWithCode = (chapters) => {\n const groups = {}\n const cb = (o) => {\n return [o.pid]\n }\n\n chapters.forEach((o) => {\n const group = JSON.stringify(cb(o))\n\n groups[group] = groups[group] || []\n groups[group].push(o)\n\n o.index = groups[group].length\n\n if (o.pid === -1) {\n o.code = String(o.index)\n }\n })\n\n Object.keys(groups).forEach((group) => {\n groups[group].forEach((c) => {\n const subjects = groups[`[${c.id}]`]\n\n if (!subjects || !isArray(subjects)) {\n return false\n }\n\n subjects.forEach((o) => {\n o.code = c.code + '.' + o.index\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport timeSlice from './utils/lang/timeSlice'\nimport toTree from './utils/lang/toTree'\nimport later from './utils/lang/later'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport offsetTop from './utils/dom/offsetTop'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport paint from './utils/icons/paint'\n\nimport _updateHeading from './_updateHeading'\nimport _removeHeading from './_removeHeading'\nimport getChapters from './getChapters'\n\nimport Base from './base'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this._default()\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _default() {\n this.attrs = cloneDeep(Anchors.DEFAULTS)\n\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n return this\n }\n\n initialize(options) {\n const showCode = this.attr('showCode') || true\n let created\n let scrollElement\n let selector\n let $articleElement\n let articleElement\n\n this.attr(options)\n articleElement = this.attr('articleElement')\n scrollElement = this.attr('scrollElement')\n selector = this.attr('selector')\n created = this.attr('created')\n\n if (isString(articleElement)) {\n $articleElement = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n $articleElement = articleElement\n }\n\n if (!$articleElement) {\n return this\n }\n\n this.$articleElement = $articleElement\n this.$scrollElement = _getScrollElement(scrollElement)\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n\n if (this.$headings.length < 1) {\n return this\n }\n\n this.chapters = getChapters(\n this.$headings,\n showCode,\n this.attr('chapterTextFilter')\n )\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const chapters = this.chapters\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.chapters.length\n }\n\n render() {\n const mounted = this.attr('mounted')\n\n paint()\n\n this._paint(this.chapters)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n erase() {\n this._remove()\n\n return this\n }\n\n _paint(chapters) {\n const LIMIT = 400\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const count = this.count()\n const $headings = [...this.$headings]\n const update = (headings, group) => {\n headings.forEach(($heading, i) => {\n const id = i + group * LIMIT\n const chapterCode = chapters[id].code\n _updateHeading($heading, id, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n }\n let groupIndex = -1\n\n // 针对超长的文章进行 timeSlice 处理\n if (count > LIMIT) {\n groupIndex += 1\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\n update($headings.splice(0, LIMIT), 0)\n // 采用 timeSlice 处理机制绘制剩余的标题\n while ($headings.length > 0) {\n const once = $headings.splice(0, LIMIT)\n timeSlice(\n () => {\n update(once, (groupIndex += 1))\n },\n () => {\n this.$emit('anchors:all:paint')\n }\n )\n }\n } else {\n update($headings, 0)\n }\n\n return this\n }\n\n _remove() {\n const hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const $headings = this.$headings\n\n $headings.forEach(($heading) => {\n _removeHeading($heading, hasAnchor, isAtStart)\n })\n\n return this\n }\n\n refresh(chapters) {\n const $articleElement = this.$articleElement\n const selector = this.attr('selector')\n\n this.$headings = [...$articleElement.querySelectorAll(selector)]\n this.chapters = chapters\n\n this.erase()._paint(chapters)\n\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()._remove()._default()\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const $articleElement = this.$articleElement\n\n if (this.count() < 1) {\n return this\n }\n\n on(\n $articleElement,\n '.outline-heading__anchor',\n 'click',\n this.onAnchorTrigger,\n this,\n true\n )\n\n return this\n }\n\n removeListeners() {\n const $articleElement = this.$articleElement\n\n if (this.count() < 1) {\n return this\n }\n\n off($articleElement, 'click', this.onAnchorTrigger)\n\n return this\n }\n\n onAnchorTrigger(evt) {\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const $heading = $anchor.parentNode\n const top = offsetTop($heading) - (stickyHeight + 10)\n const $scrollElement = this.$scrollElement\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'anchor')\n }\n\n later(() => {\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.scrollTo(top, after)\n\n if (!anchorURL) {\n stop(evt)\n }\n\n return this\n }\n}\n\nAnchors.DEFAULTS = {\n scrollElement: 'html,body',\n articleElement: '#article',\n selector: 'h1,h2,h3,h4,h5,h6',\n stickyHeight: 0,\n anchorURL: '',\n hasAnchor: true,\n isAtStart: true,\n showCode: false,\n created: null,\n mounted: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n chapterTextFilter: null\n}\n\nexport default Anchors\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttributes from './utils/dom/setAttributes'\n\nimport icon from './utils/icons/icon'\n\nconst _updateHeading = ($heading, i, options) => {\n const CLS_HEADING = 'outline-heading'\n const hasAnchor = options.hasAnchor || true\n const isAtStart = options.isAtStart || true\n const showCode = options.showCode || false\n const chapterCode = options.chapterCode || ''\n const anchorURL = options.anchorURL || ''\n const headingId = `heading-${i}`\n const attrs = {\n id: headingId,\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\n 'data-id': i\n }\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n if (showCode) {\n attrs.innerHTML = chapterCode + ' ' + text\n }\n setAttributes($heading, attrs)\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = icon('hash', { iconSet: 'outline' })\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL || `#${headingId}`,\n target: anchorURL ? '_blank' : 'self',\n 'data-id': i\n },\n $icon\n )\n $heading.appendChild($anchor)\n}\n\nexport default _updateHeading\n","// HTML 合法的标签\nconst TAGS = [\n 'a',\n 'abbr',\n 'address',\n 'area',\n 'article',\n 'aside',\n 'audio',\n 'b',\n 'base',\n 'bdi',\n 'bdo',\n 'blockquote',\n 'body',\n 'br',\n 'button',\n 'canvas',\n 'caption',\n 'cite',\n 'code',\n 'col',\n 'colgroup',\n 'data',\n 'datalist',\n 'dd',\n 'del',\n 'details',\n 'dfn',\n 'dialog',\n 'div',\n 'dl',\n 'dt',\n 'em',\n 'embed',\n 'fieldset',\n 'figcaption',\n 'figure',\n 'footer',\n 'form',\n 'h1',\n 'h2',\n 'h3',\n 'h4',\n 'h5',\n 'h6',\n 'head',\n 'header',\n 'hgroup',\n 'hr',\n 'html',\n 'i',\n 'iframe',\n 'img',\n 'input',\n 'ins',\n 'kbd',\n 'label',\n 'legend',\n 'li',\n 'link',\n 'main',\n 'map',\n 'mark',\n 'math',\n 'menu',\n 'menuitem',\n 'meta',\n 'meter',\n 'nav',\n 'noscript',\n 'object',\n 'ol',\n 'optgroup',\n 'option',\n 'output',\n 'p',\n 'param',\n 'picture',\n 'pre',\n 'progress',\n 'q',\n 'rb',\n 'rp',\n 'rt',\n 'rtc',\n 'ruby',\n 's',\n 'samp',\n 'script',\n 'search',\n 'section',\n 'select',\n 'slot',\n 'small',\n 'source',\n 'span',\n 'strong',\n 'style',\n 'sub',\n 'summary',\n 'sup',\n 'svg',\n 'table',\n 'tbody',\n 'td',\n 'template',\n 'textarea',\n 'tfoot',\n 'th',\n 'thead',\n 'time',\n 'title',\n 'tr',\n 'track',\n 'u',\n 'ul',\n 'var',\n 'video',\n 'wbr'\n]\n\nexport default TAGS\n","import isString from './isString'\nimport trim from '../lang/trim'\nimport TAGS from './tags'\n\n/**\n * 检测测试数据是否为合法的 HTML 代码\n * ========================================================================\n * @method isHTML\n * @category Lang\n * @see https://github.com/sindresorhus/html-tags\n * @see https://github.com/sindresorhus/is-html\n * @param {String} str - 要检测的数据\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\n */\nconst isHTML = (str) => {\n let html\n let basic\n let full\n\n if (!isString(str)) {\n return false\n }\n\n // 为了提高性能,我们将其限制在合理的长度内。\n html = trim(str).slice(0, 1000)\n basic = /\\s*<!doctype html>|<html\\b[^>]*>|<body\\b[^>]*>|<x-[^>]+>/i\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\n\n return basic.test(html) || full.test(html)\n}\n\nexport default isHTML\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 './utils/dom/setProperty'\n\nlet index = 2000\n\nconst zIndex = (idx) => {\n if (idx) {\n index = idx\n } else {\n index += 1\n }\n\n setProperty('--outline-zIndex', `${index}`)\n\n return index\n}\n\nexport default zIndex\n","import Base from './base'\n\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport isFunction from './utils/types/isFunction'\nimport isDOM from './utils/types/isDOM'\nimport isHTML from './utils/types/isHTML'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport html from './utils/dom/html'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport paint from './utils/icons/paint'\nimport icon from './utils/icons/icon'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this._default()\n\n this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _default() {\n this.attrs = cloneDeep(Drawer.DEFAULTS)\n this.title = ''\n this.closed = false\n\n this.$el = null\n this.$modal = null\n this.$header = null\n this.$title = null\n this.$close = null\n this.$main = null\n this.$footer = null\n this.$overlay = null\n\n return this\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n\n this.title = this.attr('title')\n created = this.attr('created')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n return this\n }\n\n setTitle(title) {\n this.attr('title', title)\n this.title = title\n this.$title.innerHTML = title\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n render() {\n const mounted = this.attr('mounted')\n const size = this.attr('size')\n const placement = this.attr('placement')\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const hasOffset = this.attr('hasOffset')\n const hasPadding = this.attr('hasPadding')\n const autoHeight = this.attr('autoHeight')\n const customClass = this.attr('customClass')\n let $el\n let $modal\n let $header\n let $title\n let $close\n let $main\n let $footer\n let $overlay\n\n paint()\n this.zIndex = zIndex()\n\n $title = createElement(\n 'h2',\n {\n className: 'outline-drawer__title'\n },\n this.title\n )\n this.$title = $title\n\n if (hasClose) {\n $close = createElement(\n 'div',\n {\n className: 'outline-drawer__close'\n },\n icon('close', { iconSet: 'outline', size: 20 })\n )\n this.$close = $close\n }\n\n $header = createElement(\n 'header',\n {\n className: 'outline-drawer__header'\n },\n [$title, $close]\n )\n this.$header = $header\n\n $main = createElement('div', {\n className: 'outline-drawer__main'\n })\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement('footer', {\n className: 'outline-drawer__footer'\n })\n this.$footer = $footer\n\n $modal = createElement(\n 'div',\n {\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\n },\n [$header, $main, $footer]\n )\n this.$modal = $modal\n\n if (hasOffset) {\n addClass($modal, 'outline-drawer_offset')\n }\n\n if (autoHeight) {\n addClass($modal, 'outline-drawer_auto')\n }\n\n if (customClass) {\n addClass($modal, customClass)\n }\n\n if (hasOverlay) {\n $overlay = createElement('div', {\n className: 'outline-drawer__overlay'\n })\n this.$overlay = $overlay\n }\n\n $el = createElement(\n 'div',\n {\n className: `outline-drawer`\n },\n [$modal, $overlay]\n )\n this.$el = $el\n document.body.appendChild($el)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n erase() {\n this.$main.innerHTML = ''\n return this\n }\n\n _paint(content) {\n let $content = null\n\n if (isFunction(content)) {\n $content = content()\n } else if (isDOM(content)) {\n $content = content\n } else if (isHTML(content)) {\n $content = html(content)\n }\n\n if ($content) {\n this.$main.appendChild($content)\n }\n\n return this\n }\n\n _remove() {\n document.body.removeChild(this.$el)\n return this\n }\n\n refresh(content) {\n this.erase()._paint(content)\n return this\n }\n\n open() {\n const opened = this.attr('afterOpened')\n const $modal = this.$modal\n\n addClass(this.$el, 'outline-drawer_opened')\n removeClass($modal, 'outline-drawer_closed')\n addClass($modal, 'outline-drawer_opened')\n\n later(() => {\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n })\n\n return this\n }\n\n close() {\n const closed = this.attr('afterClosed')\n const $modal = this.$modal\n\n removeClass($modal, 'outline-drawer_opened')\n addClass($modal, 'outline-drawer_closed')\n\n later(() => {\n removeClass(this.$el, 'outline-drawer_opened')\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n })\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const closed = this.isClosed()\n\n if (closed) {\n this.open()\n } else {\n this.close()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n afterToggle.call(this, closed)\n })\n }\n\n return this\n }\n\n destroy() {\n const afterDestroy = this.attr('afterDestroy')\n const beforeDestroy = this.attr('beforeDestroy')\n let index = this.zIndex\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()._remove()._default()\n\n index -= 1\n zIndex(index)\n this.zIndex = 0\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const closeOnClickModal = this.attr('closeOnClickModal')\n const $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay && closeOnClickModal) {\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\n }\n\n return this\n }\n\n removeListeners() {\n const hasClose = this.attr('hasClose')\n const hasOverlay = this.attr('hasOverlay')\n const $el = this.$el\n\n if (!hasClose && !hasOverlay) {\n return this\n }\n\n off($el, 'click', this.onClose)\n\n return this\n }\n\n onClose() {\n this.close()\n return this\n }\n}\n\nDrawer.DEFAULTS = {\n placement: 'rtl',\n title: '标题',\n size: 'regular',\n hasClose: true,\n hasOverlay: true,\n hasOffset: false,\n hasPadding: true,\n autoHeight: true,\n closeOnClickModal: true,\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterToggle: null\n}\n\nexport default Drawer\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 '../types/isFunction'\nimport off from './off'\n\nimport { CAPTURE_EVENTS } from './enum'\n\n/**\n * 绑定事件\n * ========================================================================\n * @method at\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\n * @param {Boolean} once - (可选)是否仅触发一次\n */\nconst at = (el, type, fn, data, context, once = false) => {\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\n const listener = function (evt) {\n let overrideContext = context || el\n\n // 当设置为 true 时,则事件处理器回调函数的\n // this 上下文指向为 data 对象\n if (context === true) {\n overrideContext = data\n }\n\n // 仅触发一次\n /* istanbul ignore else */\n if (once === true) {\n off(el, type, listener)\n }\n\n fn.call(overrideContext, evt, data)\n }\n\n if (!isFunction(fn)) {\n return false\n }\n\n if (!el._listeners) {\n el._listeners = []\n }\n\n // 缓存 options 元素绑定的事件处理器\n el._listeners.push({\n el,\n type,\n fn: listener,\n data,\n context,\n capture\n })\n\n // 缓存包装后的事件处理器\n fn._delegateListener = listener\n\n el.addEventListener(type, listener, capture)\n}\n\nexport default at\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 Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\nimport later from './utils/lang/later'\nimport at from './utils/event/at'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport stop from './utils/event/stop'\nimport createElement from './utils/dom/createElement'\nimport scrollTo from './utils/dom/scrollTo'\nimport addClass from './utils/dom/addClass'\nimport intersection from './utils/dom/intersection'\nimport removeClass from './utils/dom/removeClass'\nimport offsetTop from './utils/dom/offsetTop'\nimport getStyle from './utils/dom/getStyle'\nimport setProperty from './utils/dom/setProperty'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport cloneDeep from './utils/lang/cloneDeep'\n\nimport _paintChapters from './_paintChapters'\nimport inBounding from './utils/dom/inBounding'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this._default()\n\n this.scrollTimer = null\n this.resizeTimer = null\n this.observerTimer = null\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _default() {\n this.attrs = cloneDeep(Chapters.DEFAULTS)\n\n this.$el = null\n this.$title = null\n this.$main = null\n this.$list = null\n this.$placeholder = null\n this.$parentElement = null\n this.$scrollElement = null\n this.$active = null\n\n this.chapters = []\n this.active = 0\n this.offsetWidth = 0\n this.offsetTop = 0\n this.playing = false\n this.closed = false\n\n return this\n }\n\n initialize(options) {\n let created\n let parentElement\n let scrollElement\n let $parent\n\n this.attr(options)\n created = this.attr('created')\n parentElement = this.attr('parentElement')\n scrollElement = this.attr('scrollElement')\n\n if (isString(parentElement)) {\n $parent = document.querySelector(parentElement)\n } else if (isElement(parentElement)) {\n $parent = parentElement\n }\n this.$parentElement = $parent\n this.$scrollElement = _getScrollElement(scrollElement)\n\n this.chapters = this.attr('chapters')\n this.closed = this.attr('closed')\n this.active = this.attr('active')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n if (this.chapters.length < 1) {\n return this\n }\n\n this.render().addListeners()\n\n this.$active = document.querySelector(`#chapter-${this.active}`)\n\n return this\n }\n\n isClosed() {\n return this.closed\n }\n\n isSticky() {\n const position = this.attr('position')\n return position === 'sticky'\n }\n\n isFixed() {\n const position = this.attr('position')\n return position === 'fixed'\n }\n\n isInside() {\n return this.isFixed() || this.isSticky()\n }\n\n isOutside() {\n return !this.isInside()\n }\n\n count() {\n return this.chapters.length\n }\n\n _paintEdge() {\n const $fragment = document.createDocumentFragment()\n const STICKY = 'outline-chapters_sticky'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const animationCurrent = this.attr('animationCurrent')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\n const children = []\n const contents = []\n let $title = null\n let $el\n let $main\n let $list\n let $placeholder\n\n if (!$parentElement) {\n return this\n }\n\n if (this.isInside() && title) {\n $title = createElement(\n 'h2',\n {\n className: 'outline-chapters__title'\n },\n title\n )\n this.$title = $title\n contents.push($title)\n }\n\n $list = createElement('ul', {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list`\n })\n this.$list = $list\n children.push($list)\n\n if (animationCurrent) {\n $placeholder = createElement('div', {\n className: 'outline-chapters__placeholder'\n })\n this.$placeholder = $placeholder\n children.push($placeholder)\n }\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n children\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: `outline-chapters ${HIDDEN}`\n },\n contents\n )\n this.$el = $el\n\n if (this.isSticky()) {\n this.calculateStickyHeight()\n addClass($el, STICKY)\n }\n\n if (customClass) {\n addClass($el, customClass)\n }\n $fragment.appendChild($el)\n $parentElement.appendChild($fragment)\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n const chapters = this.chapters\n const count = this.count()\n let $el\n\n if (!$parentElement || chapters.length < 1) {\n return this\n }\n\n if (this.isInside()) {\n addClass($parentElement, 'outline-chapters-parent')\n }\n\n this._paintEdge()\n $el = this.$el\n\n this._paint(chapters)\n\n later(() => {\n this.highlight(this.active)\n }, 60)\n\n this.offsetTop = offsetTop($el)\n this.offsetWidth = $el.offsetWidth\n\n if (this.isFixed()) {\n this.sticky()\n setProperty('--outline-chapters-width', `${this.offsetWidth}px`)\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n if (count < 400) {\n this.onObserver()\n }\n\n return this\n }\n\n erase() {\n this.$list.innerHTML = ''\n\n return this\n }\n\n _paint(chapters) {\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const $el = this.$el\n const $list = this.$list\n\n _paintChapters($list, chapters, showCode)\n removeClass($el, HIDDEN)\n\n return this\n }\n\n _remove() {\n this.$parentElement.removeChild(this.$el)\n return this\n }\n\n refresh(chapters) {\n const HIDDEN = 'outline-chapters_hidden'\n const $el = this.$el\n\n removeClass($el, HIDDEN)\n this.erase()._paint(chapters)\n\n return this\n }\n\n _getPlaceholderOffset(index) {\n const $main = this.$main\n const $list = this.$list\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\n const placeholderBorderTop = parseInt(\n getStyle($list, 'border-top-width'),\n 10\n )\n let height = $anchor.offsetHeight\n let offsetTop = 0\n let top\n\n if (!animationCurrent) {\n return this\n }\n\n if (mainPaddingTop) {\n offsetTop += mainPaddingTop\n }\n\n if (placeholderPaddingTop) {\n offsetTop += placeholderPaddingTop\n }\n\n if (placeholderMarginTop) {\n offsetTop += placeholderMarginTop\n }\n\n if (mainBorderTop) {\n offsetTop += mainBorderTop\n }\n\n if (placeholderBorderTop) {\n offsetTop += placeholderBorderTop\n }\n\n top = height * index\n\n return offsetTop + top\n }\n\n positionPlaceholder(index) {\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\n const animationCurrent = this.attr('animationCurrent')\n const height = $anchor.offsetHeight\n let offsetTop = 0\n\n if (!animationCurrent) {\n return this\n }\n\n offsetTop = this._getPlaceholderOffset(index)\n\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $el = this.$el\n const animationCurrent = this.attr('animationCurrent')\n const ACTIVE = 'outline-chapters_active'\n const HIGHLIGHT = 'outline-chapters_highlight'\n let $anchor = null\n let placeholderOffsetTop = 0\n\n if (!$el) {\n return this\n }\n\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\n\n if (!$anchor) {\n return this\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n removeClass(this.$active, ACTIVE)\n }\n\n this.$active = $anchor\n addClass(this.$active, ACTIVE)\n\n if (animationCurrent) {\n this.positionPlaceholder(this.active)\n\n later(() => {\n if (!inBounding(this.$active, this.$parentElement)) {\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\n scrollTo(this.$main, placeholderOffsetTop)\n }\n })\n } else {\n addClass(this.$active, HIGHLIGHT)\n }\n\n return this\n }\n\n sticky() {\n const afterSticky = this.attr('afterSticky')\n const FIXED = 'outline-chapters_fixed'\n const $el = this.$el\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (!this.isFixed()) {\n return this\n }\n\n isStickying = scrollTop >= top\n\n if (isStickying) {\n addClass($el, FIXED)\n } else {\n removeClass($el, FIXED)\n }\n\n if (isFunction(afterSticky)) {\n afterSticky.call(this, this.isClosed(), isStickying)\n }\n\n return this\n }\n\n calculateStickyHeight() {\n const documentElement = document.documentElement\n const height = Math.max(\n documentElement.clientHeight || 0,\n window.innerHeight || 0\n )\n setProperty('--outline-sticky-height', `${height}px`)\n return this\n }\n\n scrollTo(top, after) {\n const el = this.$scrollElement\n\n scrollTo(el, top, after)\n\n return this\n }\n\n show() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const opened = this.attr('afterOpened')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n removeClass($parent, HIDDEN)\n } else {\n removeClass($parent, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n }, 30)\n }\n } else {\n removeClass($el, HIDDEN)\n }\n this.closed = false\n\n if (isFunction(opened)) {\n opened.call(this)\n }\n\n return this\n }\n\n hide() {\n const FOLDED = 'outline-chapters_folded'\n const HIDDEN = 'outline-chapters_hidden'\n const closed = this.attr('afterClosed')\n const count = this.count()\n const $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n if (count > 800) {\n addClass($parent, HIDDEN)\n } else {\n addClass($parent, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n })\n }\n } else {\n addClass($el, HIDDEN)\n }\n this.closed = true\n\n if (isFunction(closed)) {\n closed.call(this)\n }\n\n return this\n }\n\n toggle() {\n const afterToggle = this.attr('afterToggle')\n const top = this.offsetTop\n const scrollTop = this.$scrollElement.scrollTop\n let isStickying\n\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n if (isFunction(afterToggle)) {\n later(() => {\n isStickying = scrollTop >= top\n afterToggle.call(this, this.isClosed(), isStickying)\n })\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()._remove()._default()\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n this.scrollTimer = null\n }\n\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n this.resizeTimer = null\n }\n\n if (this.observerTimer) {\n clearTimeout(this.observerTimer)\n this.observerTimer = null\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n\n this.Observer = intersection(\n ($heading) => {\n const id = $heading.getAttribute('data-id')\n\n if (this.playing) {\n return false\n }\n\n if (this.observerTimer) {\n clearTimeout(this.observerTimer)\n }\n\n this.observerTimer = later(() => {\n this.highlight(id)\n }, 100)\n },\n {\n selector,\n context: this\n }\n )\n\n return this\n }\n\n onSelect(evt) {\n const stickyHeight = this.attr('stickyHeight')\n const $anchor = evt.delegateTarget\n const id = $anchor.getAttribute('data-id')\n const headingId = $anchor.href.split('#')[1]\n const $heading = document.querySelector(`#${headingId}`)\n const top = offsetTop($heading) - (stickyHeight + 10)\n const min = 0\n const max = this.$scrollElement.scrollHeight\n const afterScroll = this.attr('afterScroll')\n const after = () => {\n if (isFunction(afterScroll)) {\n afterScroll.call(this, 'chapter')\n }\n\n later(() => {\n this.playing = false\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n })\n }\n\n this.playing = true\n if (this.isFixed()) {\n this.sticky()\n later(() => {\n this.scrollTo(top, after)\n this.highlight(id)\n }, 10)\n } else {\n this.scrollTo(top, after)\n this.highlight(id)\n }\n\n stop(evt)\n\n return this\n }\n\n onScroll() {\n const $scrollElement = this.$scrollElement\n\n if (this.scrollTimer) {\n clearTimeout(this.scrollTimer)\n }\n\n this.scrollTimer = later(() => {\n const top = $scrollElement.scrollTop\n const min = 0\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\n\n if (this.isFixed()) {\n this.sticky()\n }\n\n this.$emit('toolbar:update', {\n top,\n min,\n max\n })\n }, 100)\n\n return this\n }\n\n onResize() {\n if (this.resizeTimer) {\n clearTimeout(this.resizeTimer)\n }\n\n this.resizeTimer = later(() => {\n this.calculateStickyHeight()\n })\n\n return this\n }\n\n addListeners() {\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (this.count() < 1) {\n return this\n }\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n on($el, '.outline-chapters__anchor', 'click', this.onSelect, this, true)\n at($element, 'scroll', this.onScroll, this, true)\n if (this.isSticky()) {\n at(window, 'resize', this.onResize, this, true)\n }\n this.$on('anchors:all:paint', this.onObserver, this)\n\n return this\n }\n\n removeListeners() {\n const selector = this.attr('selector')\n const $el = this.$el\n const $scrollElement = this.$scrollElement\n const tagName = $scrollElement.tagName.toLowerCase()\n let $element = $scrollElement\n\n if (this.count() < 1) {\n return this\n }\n\n if (tagName === 'html' || tagName === 'body') {\n $element = window\n }\n\n off($el, 'click', this.onSelect)\n off($element, 'scroll', this.onScroll)\n\n if (this.isSticky()) {\n at(window, 'resize', this.onResize)\n }\n\n this.$off('anchors:all:paint')\n\n if (this.Observer) {\n document.querySelectorAll(selector).forEach((section) => {\n this.Observer.unobserve(section)\n })\n }\n\n return this\n }\n}\n\nChapters.DEFAULTS = {\n parentElement: '',\n scrollElement: '',\n selector: '.outline-heading',\n active: 0,\n closed: false,\n showCode: true,\n animationCurrent: true,\n position: 'relative',\n stickyHeight: 0,\n chapters: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterScroll: null,\n beforeDestroy: null,\n afterDestroy: null,\n afterSticky: null\n}\n\nexport default Chapters\n","import createElement from './utils/dom/createElement'\nimport timeSlice from './utils/lang/timeSlice'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const LIMIT = 400\n const count = chapters.length\n const clones = [...chapters]\n const paint = (parts) => {\n const byId = (id) => $list.querySelector(`#${id}`)\n parts.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const children = []\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n chapter.text\n )\n let $link\n let $code\n let $li\n let $subject\n let $chapter\n\n if (showCode) {\n $code = createElement(\n 'span',\n {\n className: 'outline-chapters__code',\n 'data-id': id\n },\n chapter.code\n )\n\n children.push($code)\n }\n\n children.push($text)\n\n $link = createElement(\n 'a',\n {\n id: `chapter__anchor-${id}`,\n className: 'outline-chapters__anchor',\n href: '#' + rel,\n rel: rel,\n 'data-id': id\n },\n children\n )\n\n $li = createElement(\n 'li',\n {\n id: `chapter-${id}`,\n className: 'outline-chapters__item',\n 'data-id': id\n },\n $link\n )\n\n if (pid === -1) {\n $list.appendChild($li)\n } else {\n $chapter = byId(`chapter-${pid}`)\n $subject = byId(`subject-${pid}`)\n\n if (!$subject) {\n $subject = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n $li\n )\n\n $chapter.appendChild($subject)\n } else {\n $subject.appendChild($li)\n }\n }\n })\n }\n\n if (count > LIMIT) {\n // 同步绘制\n paint(clones.splice(0, LIMIT))\n // 剩余的采用 timeSlice 机制绘制\n while (clones.length > 0) {\n const once = clones.splice(0, LIMIT)\n timeSlice(() => {\n paint(once)\n })\n }\n } else {\n paint(clones)\n }\n}\n\nexport default _paintChapters\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 parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\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\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\nimport isElement from '../types/isElement'\n\n/**\n * 通用的 IntersectionObserver 观察者处理器\n * ========================================================================\n * @method intersection\n * @param {Function} fn\n * @param {Object} [props]\n * @param {Object|HTMLElement} [props.root]\n * @param {String} [props.selector]\n * @param {Object} [props.context]\n * @param {String} [props.attr]\n * @param {String} [props.rootMargin]\n */\nconst intersection = (fn, props = {}) => {\n const root = props.root || null\n const selector = props.selector || '.outline-heading'\n const context = props.context || null\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\n const options = {\n rootMargin: rootMargin\n }\n // eslint-disable-next-line compat/compat\n const Observer = new IntersectionObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.intersectionRatio > 0) {\n if (isFunction(fn)) {\n fn.call(context || entry.target, entry.target)\n }\n }\n })\n }, options)\n const $root = isElement(root) ? root : document\n\n if (root) {\n options.root = root\n }\n\n $root.querySelectorAll(selector).forEach((section) => {\n Observer.observe(section)\n })\n\n return Observer\n}\n\nexport default intersection\n","import isObject from './isObject'\n\n/**\n * 检测测试数据是否为类似 Object 类型\n * ========================================================================\n * @method isObjectLike\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\n */\nconst isObjectLike = (val) => {\n return isObject(val) && val !== null\n}\n\nexport default isObjectLike\n","import isObjectLike from './isObjectLike'\n\n/**\n * 检测测试数据是否为普通对象\n * ========================================================================\n * @method isPlainObject\n * @param {Object} val - 要检测的数据\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\n */\nconst isPlainObject = (val) => {\n const getPrototypeOf = Object.getPrototypeOf\n let proto\n\n // Detect obvious negatives\n if (!isObjectLike(val)) {\n return false\n }\n\n proto = val.prototype\n\n // JavaScript 对象分为两种:普通对象和函数对象\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\n if (!proto) {\n return true\n }\n\n proto = val\n\n while (getPrototypeOf(proto) !== null) {\n proto = getPrototypeOf(proto)\n }\n\n return getPrototypeOf(val) === proto\n}\n\nexport default isPlainObject\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 '&': '&amp;',\r\n '<': '&lt;',\r\n '>': '&gt;',\r\n \"'\": '&#39;',\r\n '\"': '&quot;'\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 icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\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(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\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\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 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 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: true,\r\n beforeClose: null\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 = options.beforeClose || null\r\n let 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 config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\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 instance.open()\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","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 icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\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\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\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.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$icon = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target = null\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 this.render().addListeners()\r\n\r\n return this\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 $paper = this.$paper\r\n\r\n if ($paper) {\r\n document.body.removeChild($paper)\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 _renderEdge() {\r\n const $target = this.$target\r\n let title = this.attr('title')\r\n let $paper\r\n let $title\r\n let $article\r\n let $icon\r\n let $sibling\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('article', {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n })\r\n this.$article = $article\r\n\r\n $icon = icon('close', {\r\n iconSet: 'outline',\r\n size: 20,\r\n attrs: {\r\n className: 'outline-reader__close'\r\n }\r\n })\r\n this.$icon = $icon\r\n\r\n $paper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$icon, $title, $article]\r\n )\r\n this.$paper = $paper\r\n\r\n document.body.appendChild($paper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $paper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $paper.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 $paper = this.$paper\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 || !$paper) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($paper, READING)\r\n removeClass($paper, HIDDEN)\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('enterReading')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n\r\n if (!this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n addClass($paper, HIDDEN)\r\n removeClass($paper, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n this.reading = false\r\n\r\n this.$emit('exitReading')\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 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 $paper = this.$paper\r\n\r\n if (!$paper) {\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 addListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n on($paper, '.outline-reader__close', 'click', this.exit, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n off($paper, 'click', this.exit)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\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\r\nReader.DEFAULTS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP\r\n}\r\n\r\nexport default Reader\r\n","import icon from './utils/icons/icon'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = icon(button.icon, {\n iconSet: button.iconSet || 'outline',\n color: button.color || '',\n size: button.size\n })\n const $anchor = createElement(\n 'a',\n {\n className: `outline-toolbar__anchor`,\n href: button.link\n },\n $icon\n )\n const $button = createElement(\n 'div',\n {\n className: `outline-toolbar__button ${button.name}`\n },\n [button.link ? $anchor : $icon]\n )\n\n addClass($icon, 'outline-toolbar__icon')\n\n if (rounded) {\n addClass($button, 'outline-toolbar_rounded')\n }\n\n if (button.disabled) {\n addClass($button, 'outline-toolbar_disabled')\n }\n\n return $button\n}\n\nexport default _createButton\n","import Base from './base'\n\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isObject from './utils/types/isObject'\nimport isArray from './utils/types/isArray'\nimport later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\nimport hasClass from './utils/dom/hasClass'\nimport removeClass from './utils/dom/removeClass'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\nimport paint from './utils/icons/paint'\n\nimport _createButton from './_createButton'\n\nconst DISABLED = 'outline-toolbar_disabled'\nconst HIDDEN = 'outline-toolbar_hidden'\n\nclass Toolbar extends Base {\n constructor(options) {\n super()\n\n this._default()\n\n if (options) {\n this.initialize(options)\n }\n }\n\n _default() {\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\n\n this.disabled = false\n this.closed = false\n\n this.$el = null\n this.buttons = []\n\n return this\n }\n\n initialize(options) {\n let created\n\n this.attr(options)\n created = this.attr('created')\n this.disabled = this.attr('disabled')\n this.closed = this.attr('closed')\n\n if (isFunction(created)) {\n created.call(this)\n }\n\n this.render().addListeners()\n\n return this\n }\n\n isDisabled(name) {\n const buttons = this.attr('buttons')\n let button\n\n if (name) {\n button = buttons.find((option) => option.name === name)\n\n return button?.disabled\n }\n\n return this.disabled\n }\n\n isClosed() {\n return this.closed\n }\n\n highlight(name) {\n const button = this.buttons.find((item) => item.name === name)\n const ACTIVE = 'outline-toolbar_active'\n let $button\n\n if ($button) {\n return this\n }\n\n $button = button.$el\n\n if (hasClass($button, ACTIVE)) {\n removeClass($button, ACTIVE)\n } else {\n addClass($button, ACTIVE)\n }\n\n return this\n }\n\n render() {\n const mounted = this.attr('mounted')\n const buttons = this.attr('buttons') || []\n const placement = this.attr('placement')\n\n paint()\n\n this.$el = createElement('div', {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n })\n this._paint(buttons)\n document.body.appendChild(this.$el)\n\n if (this.closed) {\n this.hide()\n }\n\n if (this.disabled) {\n this.disable()\n }\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\n return this\n }\n\n erase() {\n this.$el.innerHTML = ''\n return this\n }\n\n _paint(buttons) {\n const rounded = this.attr('rounded')\n const $fragment = document.createDocumentFragment()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $fragment.appendChild($button)\n\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el.appendChild($fragment)\n\n return this\n }\n\n _remove() {\n document.body.removeChild(this.$el)\n return this\n }\n\n refresh(buttons) {\n this.attr({ buttons }).erase()._paint(buttons)\n return this\n }\n\n add(button) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const action = button.action\n const $fragment = document.createDocumentFragment()\n let type\n\n if (isObject(button)) {\n buttons.push(button)\n $fragment.appendChild(_createButton(button))\n } else if (isArray(button)) {\n button.forEach((item) => {\n $fragment.appendChild(_createButton(item))\n })\n }\n $el.appendChild($fragment)\n\n if (action && isFunction(action.handler)) {\n type = action.type || 'click'\n on($el, `.${button.name}`, type, action.handler)\n }\n\n return this\n }\n\n remove(name) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let index = -1\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((button, i) => {\n if (button.name === name) {\n index = i\n }\n })\n\n if (index > -1) {\n this.attr().buttons.splice(index, 1)\n }\n\n $button = $el.querySelector(`.${name}`)\n this.switch(name, false)\n $el.removeChild($button)\n\n return this\n }\n\n switch(name, enabled) {\n const $el = this.$el\n const buttons = this.attr('buttons')\n const button = buttons.find((option) => option.name === name)\n let action\n let type\n let listener\n let $button\n\n if (!button) {\n return this\n }\n\n buttons.forEach((option) => {\n if (option.name === name) {\n button.disabled = !enabled\n }\n })\n\n action = button.action\n $button = $el.querySelector(`.${name}`)\n\n if (action) {\n type = action.type || 'click'\n listener = action.handler\n }\n\n if (enabled) {\n removeClass($button, DISABLED)\n\n if (type && listener) {\n on($el, `.${name}`, type, listener)\n }\n } else {\n addClass($button, DISABLED)\n\n if (type && listener) {\n off($el, type, listener)\n }\n }\n\n return this\n }\n\n disable(name) {\n const disabled = this.attr('afterDisabled')\n\n if (name) {\n this.switch(name, false)\n } else {\n addClass(this.$el, DISABLED)\n this.removeListeners()\n this.disabled = true\n\n if (isFunction(disabled)) {\n disabled.call(this)\n }\n }\n\n return this\n }\n\n enable(name) {\n const enabled = this.attr('afterEnabled')\n\n if (name) {\n this.switch(name, true)\n } else {\n this.disabled = false\n removeClass(this.$el, DISABLED)\n this.addListeners()\n\n if (isFunction(enabled)) {\n enabled.call(this)\n }\n }\n\n return this\n }\n\n show(name) {\n const opened = this.attr('afterOpened')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n\n $button = $el.querySelector(`.${name}`)\n removeClass($button, HIDDEN)\n } else {\n removeClass($el, HIDDEN)\n this.closed = false\n\n if (isFunction(opened)) {\n later(() => {\n opened.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n hide(name) {\n const closed = this.attr('afterClosed')\n const button = this.attr('buttons').find((option) => option.name === name)\n const $el = this.$el\n let $button\n\n if (name) {\n if (!button) {\n return this\n }\n $button = $el.querySelector(`.${name}`)\n addClass($button, HIDDEN)\n } else {\n addClass($el, HIDDEN)\n this.closed = true\n\n if (isFunction(closed)) {\n later(() => {\n closed.call(this)\n }, 310)\n }\n }\n\n return this\n }\n\n toggle() {\n if (this.isClosed()) {\n this.show()\n } else {\n this.hide()\n }\n\n return this\n }\n\n destroy() {\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()._remove()._default()\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n addListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n let context\n let command\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n if (isString(listener)) {\n command = listener\n action.handler = function () {\n this.$emit(command, button.name)\n }\n listener = action.handler\n }\n\n type = action.type || 'click'\n context = action.context\n }\n\n if (isFunction(listener)) {\n on($el, `.${button.name}`, type, listener, context || this, true)\n }\n })\n\n return this\n }\n\n removeListeners() {\n const buttons = this.attr('buttons')\n const $el = this.$el\n\n if (!buttons || buttons.length < 1) {\n return this\n }\n\n buttons.forEach((button) => {\n const action = button.action\n const disabled = this.disabled\n let type\n let listener\n\n if (disabled) {\n return false\n }\n\n if (action) {\n listener = action.handler\n type = action.type || 'click'\n }\n\n if (isFunction(listener)) {\n off($el, type, listener)\n }\n })\n\n return this\n }\n}\n\nToolbar.DEFAULTS = {\n placement: 'ltr',\n closed: false,\n disabled: false,\n rounded: true,\n buttons: [],\n created: null,\n mounted: null,\n afterClosed: null,\n afterOpened: null,\n afterDisabled: null,\n afterEnabled: null,\n beforeDestroy: null,\n afterDestroy: null\n}\n\nexport default Toolbar\n","import later from './utils/lang/later'\nimport cloneDeep from './utils/lang/cloneDeep'\nimport toTree from './utils/lang/toTree'\nimport isFunction from './utils/types/isFunction'\nimport isString from './utils/types/isString'\nimport isElement from './utils/types/isElement'\nimport addClass from './utils/dom/addClass'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\n\nimport Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Reader from './reader'\nimport Toolbar from './toolbar'\n\nimport getChapters from './getChapters'\n\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n this.$article = null\n this.buttons = []\n\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.reader = null\n this.toolbar = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n let articleElement = ''\n\n this.attr(options)\n\n articleElement = this.attr('articleElement')\n\n if (isString(articleElement)) {\n this.$article = document.querySelector(articleElement)\n } else if (isElement(articleElement)) {\n this.$article = articleElement\n }\n\n this.$emit('created', { ...this.attr() })\n this.render().addListeners()\n\n return this\n }\n\n getChapters(isTreeStructured = false) {\n const $article = this.$article\n const selector = this.attr('selector')\n const showCode = this.attr('showCode') || true\n const chapterTextFilter = this.attr('chapterTextFilter')\n let $headings = []\n let chapters = []\n\n if (!$article) {\n return chapters\n }\n\n $headings = [...$article.querySelectorAll(selector)]\n chapters = getChapters($headings, showCode, chapterTextFilter)\n\n return isTreeStructured ? toTree(chapters, 'id', 'pid') : chapters\n }\n\n count() {\n return this.getChapters().length\n }\n\n render() {\n const hasToolbar = this.attr('hasToolbar')\n const scrollElement = this.attr('scrollElement')\n let $scrollElement\n\n if (isString(scrollElement)) {\n $scrollElement = document.querySelector(scrollElement)\n } else if (isElement(scrollElement)) {\n $scrollElement = scrollElement\n }\n\n this._renderReader()._renderAnchors()._renderChapters()._renderToolbar()\n\n if ($scrollElement && hasToolbar) {\n this.onToolbarUpdate({\n top: $scrollElement.scrollTop,\n min: 0,\n max: $scrollElement.scrollHeight\n })\n }\n\n this.$emit('mounted')\n\n return this\n }\n\n refresh() {\n const chapters = this.getChapters()\n\n this.anchors.refresh(chapters)\n this.chapters.refresh(chapters)\n this.reader.refresh()\n\n return this\n }\n\n _renderReader() {\n const option = this.attr('reader')\n\n if (!option.target) {\n return this\n }\n\n addClass(this.$article, 'outline-article')\n\n this.reader = new Reader(option)\n\n return this\n }\n\n _renderAnchors() {\n const articleElement = this.attr('articleElement')\n const selector = this.attr('selector')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const showCode = this.attr('showCode')\n const anchorURL = this.attr('anchorURL')\n const afterScroll = this.attr('afterScroll')\n const chapterTextFilter = this.attr('chapterTextFilter')\n\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll,\n chapterTextFilter\n })\n\n return this\n }\n\n _renderChapters() {\n const title = this.attr('title')\n const stickyHeight = this.attr('stickyHeight')\n const scrollElement = this.attr('scrollElement')\n const customClass = this.attr('customClass')\n const showCode = this.attr('showCode')\n const animationCurrent = this.attr('animationCurrent')\n const closeOnClickModal = this.attr('closeOnClickModal')\n const showNavModalFirst = this.attr('showNavModalFirst')\n const position = this.attr('position')\n const placement = this.attr('placement')\n const afterSticky = this.attr('afterSticky')\n const afterToggle = this.attr('afterToggle')\n const afterScroll = this.attr('afterScroll')\n const count = this.count()\n let parentElement = this.attr('parentElement')\n let CHAPTERS_OPTIONS\n\n if (count < 1) {\n return this\n }\n\n CHAPTERS_OPTIONS = {\n scrollElement,\n showCode,\n animationCurrent,\n position,\n title,\n stickyHeight,\n chapters: this.getChapters(),\n afterSticky,\n afterToggle,\n afterScroll\n }\n\n if (position === 'relative') {\n this.drawer = new Drawer({\n placement,\n title,\n size: 'tiny',\n hasOffset: true,\n hasPadding: false,\n closeOnClickModal,\n customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\n\n if (showNavModalFirst) {\n this.drawer.open()\n }\n } else {\n CHAPTERS_OPTIONS.customClass = customClass\n }\n\n CHAPTERS_OPTIONS.parentElement = parentElement\n this.chapters = new Chapters(CHAPTERS_OPTIONS)\n\n return this\n }\n\n _renderToolbar() {\n const position = this.attr('position')\n const hasToolbar = this.attr('hasToolbar')\n const showNavModalFirst = this.attr('showNavModalFirst')\n const placement = this.attr('placement')\n const homepage = this.attr('homepage')\n const git = this.attr('git')\n const tags = this.attr('tags')\n const issues = this.attr('issues')\n const tools = this.attr('tools')\n const option = this.attr('reader')\n const count = this.count()\n const UP = {\n name: 'up',\n icon: 'up',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:up'\n }\n }\n const HOME = {\n name: 'homepage',\n icon: 'homepage',\n size: 20,\n link: homepage\n }\n const GIT = {\n name: 'github',\n icon: 'github',\n size: 20,\n link: git\n }\n const TAGS = {\n name: 'tags',\n icon: 'tags',\n size: 20,\n link: tags\n }\n const ISSUES = {\n name: 'issues',\n icon: 'issues',\n size: 20,\n link: issues\n }\n const MENU = {\n name: 'menu',\n icon: 'menu',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:toggle'\n }\n }\n const READING = {\n name: 'reading',\n icon: 'file',\n size: 18,\n action: {\n type: 'click',\n handler: 'toolbar:action:reading'\n }\n }\n const PRINT = {\n name: 'print',\n icon: 'print',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:print'\n }\n }\n const DOWN = {\n name: 'down',\n icon: 'down',\n size: 20,\n action: {\n type: 'click',\n handler: 'toolbar:action:down'\n }\n }\n const buttons = []\n\n if (!hasToolbar) {\n return this\n }\n\n buttons.push(UP)\n if (count > 0) {\n buttons.push(MENU)\n }\n if (homepage) {\n buttons.push(HOME)\n }\n if (git) {\n buttons.push(GIT)\n }\n if (tags) {\n buttons.push(TAGS)\n }\n if (issues) {\n buttons.push(ISSUES)\n }\n if (option.target) {\n buttons.push(READING)\n if (isFunction(print)) {\n buttons.push(PRINT)\n }\n }\n if (tools?.length > 0) {\n buttons.push(...tools)\n }\n buttons.push(DOWN)\n this.buttons = [...buttons]\n\n this.toolbar = new Toolbar({\n placement,\n buttons\n })\n\n if (position === 'relative' && showNavModalFirst) {\n this.toolbar.hide()\n }\n\n return this\n }\n\n addButton(button) {\n const toolbar = this.toolbar\n const buttons = this.buttons\n buttons.splice(-1, 0, button)\n toolbar.attr({\n buttons\n })\n toolbar.refresh()\n return this\n }\n\n removeButton(name) {\n this.toolbar.remove(name)\n return this\n }\n\n toTop() {\n const afterScroll = this.attr('afterScroll')\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const afterTop = () => {\n toolbar.hide('up')\n toolbar.show('down')\n\n if (count > 0) {\n chapters.highlight(0)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(0, afterTop)\n\n return this\n }\n\n toBottom() {\n const afterScroll = this.attr('afterScroll')\n const $scrollElement = _getScrollElement(this.attr('scrollElement'))\n const toolbar = this.toolbar\n const chapters = this.chapters\n const count = this.count()\n const top = Math.floor(\n $scrollElement.scrollHeight - $scrollElement.clientHeight\n )\n const afterDown = () => {\n toolbar.hide('down')\n toolbar.show('up')\n\n if (count > 0) {\n chapters.highlight(count - 1)\n chapters.playing = false\n }\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n if (count > 0) {\n chapters.playing = true\n }\n this.scrollTo(top, afterDown)\n\n return this\n }\n\n scrollTo(top, afterScroll) {\n const scrollElement = this.attr('scrollElement')\n scrollTo(scrollElement, top, afterScroll)\n return this\n }\n\n enterReading() {\n const reader = this.reader\n\n if (!reader || reader.reading) {\n return this\n }\n\n this.toolbar.toggle()\n reader.enter()\n\n return this\n }\n\n exitReading() {\n const reader = this.reader\n\n if (!reader || !reader.reading) {\n return this\n }\n\n this.toolbar.toggle()\n reader.exit()\n\n return this\n }\n\n switchReading() {\n const reader = this.reader\n\n if (!reader) {\n return this\n }\n\n reader.toggle()\n\n return this\n }\n\n toggle() {\n const position = this.attr('position')\n const toolbar = this.toolbar\n const drawer = this.drawer\n const chapters = this.chapters\n const count = this.count()\n\n if (count < 1) {\n return this\n }\n\n if (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n later(() => {\n drawer.toggle()\n })\n }\n\n return this\n }\n\n print() {\n this.reader.print()\n\n return this\n }\n\n destroy() {\n let anchors = this.anchors\n let chapters = this.chapters\n let drawer = this.drawer\n let reader = this.reader\n let toolbar = this.toolbar\n let isOutside = false\n const count = this.count()\n\n this.$emit('beforeDestroy')\n\n this.removeListeners()\n\n if (reader) {\n reader.destroy()\n reader = null\n }\n\n if (count > 0 && chapters) {\n isOutside = chapters.isOutside()\n\n chapters.destroy()\n chapters = null\n\n if (isOutside && drawer) {\n drawer.destroy()\n drawer = null\n }\n }\n\n if (anchors) {\n anchors.destroy()\n anchors = null\n }\n\n if (toolbar) {\n toolbar.destroy()\n toolbar = null\n }\n\n this.attrs = cloneDeep(Outline.DEFAULTS)\n\n return this\n }\n\n onToggle() {\n this.toggle()\n return this\n }\n\n onScrollTop() {\n this.toTop()\n return this\n }\n\n onScrollBottom() {\n this.toBottom()\n return this\n }\n\n onToolbarUpdate({ top, min, max }) {\n const toolbar = this.toolbar\n const current = Math.ceil(top)\n\n if (current <= min) {\n toolbar.hide('up')\n toolbar.show('down')\n } else if (current >= max) {\n toolbar.hide('down')\n toolbar.show('up')\n } else if (current > min && current < max) {\n toolbar.show('up')\n toolbar.show('down')\n }\n\n return this\n }\n\n addListeners() {\n const hasToolbar = this.attr('hasToolbar')\n\n if (!hasToolbar) {\n return this\n }\n\n this.$on('toolbar:update', this.onToolbarUpdate)\n this.$on('toolbar:action:up', this.onScrollTop)\n this.$on('toolbar:action:toggle', this.onToggle)\n this.$on('toolbar:action:down', this.onScrollBottom)\n\n return this\n }\n\n removeListeners() {\n const hasToolbar = this.attr('hasToolbar')\n\n if (!hasToolbar) {\n return this\n }\n\n this.$off('toolbar:update')\n this.$off('toolbar:action:up')\n this.$off('toolbar:action:toggle')\n this.$off('toolbar:action:down')\n\n return this\n }\n}\n\nOutline.DEFAULTS = {\n articleElement: '#article',\n selector: 'h2,h3,h4,h5,h6',\n title: '目录',\n scrollElement: 'html,body',\n position: 'relative',\n parentElement: '#aside',\n placement: 'rtl',\n animationCurrent: true,\n showCode: true,\n hasToolbar: true,\n closeOnClickModal: true,\n showNavModalFirst: false,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n tools: [],\n reader: {\n target: '',\n title: '',\n enterReadingTip: ENTER_READING_TIP\n },\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: null,\n chapterTextFilter: null\n}\n\nif (window.jQuery) {\n // 将 Outline 扩展为一个 jquery 插件\n // eslint-disable-next-line no-undef\n jQuery.extend(jQuery.fn, {\n outline: function (options) {\n // eslint-disable-next-line no-undef\n let $article = jQuery(this)\n\n return new Outline(\n // eslint-disable-next-line no-undef\n jQuery.extend({}, options, {\n articleElement: $article\n })\n )\n }\n })\n}\n\nexport default Outline\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","arguments","length","undefined","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","toTree","list","nodeKey","parentKey","map","roots","item","i","children","node","push","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","indexOf","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","index","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","filter","$child","on","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","getSymbol","paint","$body","body","$icons","symbols","innerHTML","join","createElement","insertBefore","firstChild","trim","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","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","chapterTextFilter","previous","level","chapters","heading","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","rel","groups","group","JSON","stringify","code","String","c","subjects","_getChaptersWithCode","Anchors","super","_default","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","update","chapterCode","_updateHeading","headingId","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","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","customClass","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","closeOnClickModal","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","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","ENTER_READING_TIP","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","Reader","reading","$target","$paper","$article","_renderEdge","cloneNode","enter","READER","READING","$siblings","enterReadingTip","info","exit","print","onExitReading","onPrint","onEnterReading","keyCode","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","_button","option","disable","action","switch","enabled","enable","command","afterDisabled","afterEnabled","Outline","anchors","drawer","reader","toolbar","hasToolbar","_renderReader","_renderAnchors","_renderChapters","_renderToolbar","onToolbarUpdate","showNavModalFirst","CHAPTERS_OPTIONS","homepage","git","tags","issues","tools","HOME","GIT","ISSUES","MENU","PRINT","addButton","removeButton","toTop","afterTop","toBottom","floor","afterDown","enterReading","exitReading","switchReading","onToggle","onScrollTop","onScrollBottom","_ref","ceil","jQuery","outline"],"mappings":"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IACT,CAEAK,eACE,MAAM6K,EAAkBlL,KAAKkL,gBAE7B,OAAIlL,KAAKuL,QAAU,GAInBlH,EACE6G,EACA,2BACA,QACAlL,KAAKuM,gBACLvM,MACA,GATOA,IAaX,CAEAS,kBACE,MAAMyK,EAAkBlL,KAAKkL,gBAE7B,OAAIlL,KAAKuL,QAAU,GAInBjM,EAAI4L,EAAiB,QAASlL,KAAKuM,iBAH1BvM,IAMX,CAEAuM,gBAAgBhI,GACd,MAAMsH,EAAY7L,KAAKG,KAAK,aACtBqM,EAAcxM,KAAKG,KAAK,eACxBsM,EAAezM,KAAKG,KAAK,gBAEzB2I,EADUvE,EAAIG,eACKzB,WACnBnG,EAAM0F,EAAUsG,IAAa2D,EAAe,IAC5ClQ,EAAiByD,KAAKzD,eAEtB2F,EAAM3F,EAAeY,aAAeZ,EAAemQ,aAqBzD,OANA1M,KAAKnD,SAASC,GAdAsP,KACRlT,EAAWsT,IACbA,EAAY7O,KAAKqC,KAAM,UAGzB7G,GAAM,KACJ6G,KAAKW,MAAM,iBAAkB,CAC3B7D,MACA6P,IAVM,EAWNzK,OACA,GACF,IAKC2J,GACHxO,EAAKkH,GAGAvE,IACT,EAGF8K,EAAQG,SAAW,CACjBzO,cAAe,YACf6O,eAAgB,WAChB1I,SAAU,oBACV8J,aAAc,EACdZ,UAAW,GACX9C,WAAW,EACXC,WAAW,EACXQ,UAAU,EACV4B,QAAS,KACTI,QAAS,KACTgB,YAAa,KACbH,cAAe,KACfC,aAAc,KACd7C,kBAAmB,MErSrB,MAAMmD,EAAO,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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"}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
JavaScript
1
https://gitee.com/lelezr/outline.js.git
git@gitee.com:lelezr/outline.js.git
lelezr
outline.js
outline.js
master

搜索帮助

0d507c66 1850385 C8b1a773 1850385