diff --git a/anchors.min.js b/anchors.min.js index c62c9fdb..4a4bb24a 100644 --- a/anchors.min.js +++ b/anchors.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,l=r,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?i:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),l=t=>t*t,c=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,l=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);l.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},y=(t,e,r,s,n,i,o=!1)=>{const l=u.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;l.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,c),s.call(p,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:n,context:i,capture:l}),s._delegateListener=c,t.addEventListener(r,c,l)},g={},b=t=>e(g,t)&&g[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;g[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},E=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),L=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),$=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},T=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},x=(r,s,i)=>{const o="outline-heading",l=i.hasAnchor||!0,c=i.isAtStart||!0,a=i.showCode||!1,h=i.chapterCode||"",d=i.anchorURL||"",u=`heading-${s}`,p={id:u,className:c?`${o} ${o}_start`:o,"data-id":s},m=Object.keys(p),f=L(r.innerHTML);let y,g;if(m.forEach((t=>{T(r,t,p[t])})),a&&(r.innerHTML=h+" "+f),!l)return!1;g=((t,e=0,r="",s="outline")=>{const n=s?`xlink:href="#${s}-icon-${t}"`:`xlink:href="#icon-${t}"`,i=E(e)?e[0]:e,o=E(e)?e[1]:e,l=e?`width:${i}px;height:${o}px;`:"",c=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=c,a})("hash"),y=((r,s,i)=>{const o=document.createDocumentFragment(),l=document.createElement(r),c=e=>$(e)||t(e),a=e=>{let r;if(!c(e))return!1;$(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&T(l,t,s[t])})):E(s)&&s.every((t=>c(t)))&&s.forEach((t=>{a(t)})),E(i)?i.forEach((t=>{a(t)})):a(i),l.appendChild(o),l})("a",{id:`anchor-${s}`,className:`${o}__anchor anchor-${s}`,href:d||`#${u}`,target:d?"_blank":"self","data-id":s},[g]),r.appendChild(y)},M=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=L(s.replace(e,"")),t.className=s)},z=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),M(e,n),!r)return!1;var l;o=e.querySelector(`.${n}__anchor`),s&&M(e,`${n}_start`),l=L(e.className),t(l)&&""===l&&e.removeAttribute("class"),e.removeChild(o)},j=(e,r=!0)=>{let s=1,n=0;const i=[];return e.forEach(((e,r)=>{const o=e.tagName.replace(/h/i,"");let l=parseInt(o,10),c=-1;var a;l>s?(n+=1,c=1===n?-1:r-1):l===s||ln?1===l?(n=1,c=-1):c=i[r-1].pid:l<=n&&(1===l?n=1:(n-=s-l,n<=1&&(n=1)),c=1===n?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"")})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((r=>{e[r].forEach((e=>{t.forEach((t=>{t.pid===e.id&&(t.code=e.code+"."+t.index)}))}))})),t})(i):i};class S extends i{constructor(t){super(),this.attrs=S.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let r,n,i,l,a;return this.attr(e),a=this.attr("articleElement"),n=this.attr("scrollElement"),i=this.attr("selector"),r=this.attr("created"),t(a)?l=document.querySelector(a):o(a)&&(l=a),l?(this.$articleElement=l,this.$scrollElement=c(n),this.$headings=[...l.querySelectorAll(i)],this.$headings.length<1||(this.chapters=j(this.$headings),s(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,l=this.getChapters();return((t=[])=>{const e=['','','','','','','','',''],r=E(t)&&t.length>0?e.concat(t):e,s=document.body;let n=document.querySelector("#svg-sprites");n?n.innerHTML=r.join(""):(n=document.createElement("div"),n.innerHTML=``,s.insertBefore(n.firstChild,s.firstChild))})(),o.forEach(((t,s)=>{const o=l[s].code;x(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=c(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=l(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=l(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{z(r,t,e)})),this.attr(S.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return S.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null},S})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Anchors=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const r=Object.prototype.hasOwnProperty;return t&&r.call(t,e)},r=t=>Object.prototype.toString.apply(t),s=t=>"function"==typeof t||"[object Function]"===r(t),n=t=>("[object Object]"===r(t)||"object"==typeof t||s(t))&&null!==t;class i{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(r,s){const i=this.attrs;return t(r)?s&&e(i,r)?(i[r]=s,this):i[r]:n(r)?(o=i,l=r,Object.keys(l).forEach((t=>{e(l,t)&&(o[t]=l[t])})),this):0===arguments.length?i:this;var o,l}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const o=t=>!!(n(t)&&t.nodeName&&t.tagName&&1===t.nodeType),l=t=>t*t,c=(e=null)=>{let r,s;return e?t(e)?s=document.querySelector(e):o(e)&&(s=e):(r=document.querySelectorAll("html,body"),s=r[0].scrollTop-r[1].scrollTop>=0?r[0]:r[1]),s},a=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=a(t.offsetParent)),e},h=(t,e="")=>{const r=e.replace(/^>/i,"");return!!(e&&r&&t)&&(t.matches?t.matches(r):!!t.msMatchesSelector&&t.msMatchesSelector(r))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,u=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],p=(t,e,r)=>{const s=u.indexOf(e)>-1;r._delegateListener&&delete(r=r._delegateListener)._delegateListener,function(t,e,r){const s=t._listeners;let n=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const i=t.fn;e===t.type&&(n=s,i===r&&(n=s))})),n>-1&&s.splice(n,1)}(t,e,r),t.removeEventListener(e,r,s)},m=function(e,r,s=!1){const n=t(e)?document.querySelector(e):e,i=n.childNodes,l=((e,r)=>{let s=e._listeners||[];return t(r)&&r&&(s=s.filter((t=>t.type===r))),s})(n,r);l.forEach((t=>{p(n,t.type,t.fn)})),(s||!0===r||1===arguments.length)&&n&&i&&i.forEach((t=>{o(t)&&m(t,r,s)}))},f=(t,e,r)=>{if(!s(r))return m(t,e);p(t,e,r)},y=(t,e,r,s,n,i,o=!1)=>{const l=u.indexOf(r)>-1,c=function(l){const a=function(t){const e=t.target;return(r=e)&&3===r.nodeType?r.parentNode:r;var r}(l),u=((t,e,r,s)=>{const n=r||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===n&&h(t,e):h(t,e))||s&&t===n)return t;if(t===n)break}while(t=d(t))})(a,e,t);let p=i||t;l.delegateTarget=u,!0===i&&(p=n),u&&(!0===o&&f(t,r,c),s.call(p,l,n))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:r,fn:c,data:n,context:i,capture:l}),s._delegateListener=c,t.addEventListener(r,c,l)},g={},b=t=>e(g,t)&&g[t].length>0,v=(t,e=!0)=>e?b(t):(t=>{let e=b(t),r=t.lastIndexOf(".");for(;!e&&-1!==r;)r=(t=t.substring(0,r)).lastIndexOf("."),e=b(t);return e})(t),A=(t,e,s=!0)=>{const n=t=>{if(!b(t))return!1;g[t].forEach((t=>{const s=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(r(e))>-1?e.toString():e;t.callback.call(t.context||t,s)}))},i=()=>{let e=t,r=t.lastIndexOf(".");for(;-1!==r;)e=e.substring(0,r),r=e.lastIndexOf("."),n(e);n(t),n("*")};if(!v(t))return!1;s?setTimeout(i,10):i()},E=t=>Array.isArray?Array.isArray(t):"[object Array]"===r(t),L=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),$=t=>{return!(!n(t)||!(o(t)||(t=>!(!n(t)||"[object NodeList]"!==r(t)))(t)||(e=t,n(e)&&"[object DocumentFragment]"===r(e))||(t=>!(!n(t)||!("[object Text]"===r(t)||t.tagName&&3===t.nodeType)))(t)));var e},T=(t,e,r)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=r;break;case"value":"input"===s||"textarea"===s?t.value=r:t.setAttribute(e,r);break;case"className":t.className=r;break;default:t.setAttribute(e,r)}},x=(r,s,i)=>{const o="outline-heading",l=i.hasAnchor||!0,c=i.isAtStart||!0,a=i.showCode||!1,h=i.chapterCode||"",d=i.anchorURL||"",u=`heading-${s}`,p={id:u,className:c?`${o} ${o}_start`:o,"data-id":s},m=Object.keys(p),f=L(r.innerHTML);let y,g;if(m.forEach((t=>{T(r,t,p[t])})),a&&(r.innerHTML=h+" "+f),!l)return!1;g=((t,e=0,r="",s="outline")=>{const n=s?`xlink:href="#${s}-icon-${t}"`:`xlink:href="#icon-${t}"`,i=E(e)?e[0]:e,o=E(e)?e[1]:e,l=e?`width:${i}px;height:${o}px;`:"",c=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=c,a})("hash"),y=((r,s,i)=>{const o=document.createDocumentFragment(),l=document.createElement(r),c=e=>$(e)||t(e),a=e=>{let r;if(!c(e))return!1;$(e)?r=e:t(e)&&(r=document.createTextNode(e)),o.appendChild(r)};return n(s)?Object.keys(s).forEach((t=>{e(s,t)&&T(l,t,s[t])})):E(s)&&s.every((t=>c(t)))&&s.forEach((t=>{a(t)})),E(i)?i.forEach((t=>{a(t)})):a(i),l.appendChild(o),l})("a",{id:`anchor-${s}`,className:`${o}__anchor anchor-${s}`,href:d||`#${u}`,target:d?"_blank":"self","data-id":s},[g]),r.appendChild(y)},M=(t,e)=>{let r,s=t.className;if(!s||!((t,e)=>{const r=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!o(t)&&(s=t.className,!!s&&(n=t.classList,n?.contains?t.classList.contains(e):!!r.exec(s)))})(t,e))return!1;r=t.classList,r?.remove?r.remove(e):(s=L(s.replace(e,"")),t.className=s)},z=(e,r=!0,s=!0)=>{const n="outline-heading",i=e.innerHTML;let o;if(e.innerHTML=i.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),M(e,n),!r)return!1;var l;o=e.querySelector(`.${n}__anchor`),s&&M(e,`${n}_start`),l=L(e.className),t(l)&&""===l&&e.removeAttribute("class"),e.removeChild(o)},j=(e,r=!0)=>{let s=1,n=0;const i=[];return e.forEach(((e,r)=>{const o=e.tagName.replace(/h/i,"");let l=parseInt(o,10),c=-1;var a;l>s?(n+=1,c=1===n?-1:r-1):l===s||ln?1===l?(n=1,c=-1):c=i[r-1].pid:l<=n&&(1===l?n=1:(n-=s-l,n<=1&&(n=1)),c=1===n?-1:((t,e,r)=>{let s,n,i=t[r-1];for(n=0;n]+(>|$)/g,""):"")})})),r?(t=>{const e={};return t.forEach((t=>{const r=JSON.stringify((t=>[t.pid])(t));e[r]=e[r]||[],e[r].push(t),t.index=e[r].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((r=>{e[r].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(i):i};class S extends i{constructor(t){super(),this.attrs=S.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let r,n,i,l,a;return this.attr(e),a=this.attr("articleElement"),n=this.attr("scrollElement"),i=this.attr("selector"),r=this.attr("created"),t(a)?l=document.querySelector(a):o(a)&&(l=a),l?(this.$articleElement=l,this.$scrollElement=c(n),this.$headings=[...l.querySelectorAll(i)],this.$headings.length<1||(this.chapters=j(this.$headings),s(r)&&r.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,r)=>{const s={},n=[];return t.forEach(((t,r)=>{s[t[e]]=r,t.children=[]})),t.forEach((e=>{const i=t[s[e[r]]];-1!==e[r]?i.children.push(e):n.push(e)})),n})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),r=this.attr("isAtStart"),n=this.attr("showCode"),i=this.attr("anchorURL"),o=this.$headings,l=this.getChapters();return((t=[])=>{const e=['','','','','','','','',''],r=E(t)&&t.length>0?e.concat(t):e,s=document.body;let n=document.querySelector("#svg-sprites");n?n.innerHTML=r.join(""):(n=document.createElement("div"),n.innerHTML=``,s.insertBefore(n.firstChild,s.firstChild))})(),o.forEach(((t,s)=>{const o=l[s].code;x(t,s,{hasAnchor:e,isAtStart:r,showCode:n,chapterCode:o,anchorURL:i})})),s(t)&&t.call(this),this}scrollTo(t,e){return((t,e,r)=>{const n=c(t);let i=n.scrollTop,o=0;const a=e-i,h=n.scrollHeight,d=e-h<=0?e:h,u=t=>(s(r)&&r(t),!1),p=()=>{if(o+=1,a<0){if(i-=l(o),n.scrollTop=i,i<=e)return n.scrollTop=e,u(e)}else if(i+=l(o),n.scrollTop=i,i>=d)return n.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)})(this.$scrollElement,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),r=this.attr("beforeDestroy"),n=this.attr("afterDestroy"),i=this.$headings;return s(r)&&r.call(this),this.removeListeners(),i.forEach((r=>{z(r,t,e)})),this.attr(S.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],s(n)&&n.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),i=t.delegateTarget.parentNode,o=a(i)-(n+10),l=this.$scrollElement,c=l.scrollHeight-l.clientHeight;return this.scrollTo(o,(()=>{s(r)&&r.call(this,"anchor"),((t,e=300)=>{!!s(t)&&setTimeout((()=>{t()}),e)})((()=>{A("toolbar:update",{top:o,min:0,max:c})}))})),e||function(t){t.stopPropagation(),t.preventDefault()}(t),this}addListeners(){const t=this.$articleElement;return y(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return f(t,"click",this.onAnchorTrigger),this}}return S.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null},S})); //# sourceMappingURL=anchors.min.js.map diff --git a/anchors.min.js.map b/anchors.min.js.map index 5cbbebde..c676d526 100644 --- a/anchors.min.js.map +++ b/anchors.min.js.map @@ -1 +1 @@ -{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/_updateHeading.js","src/utils/icons.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\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","/**\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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","/**\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","/**\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} 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 * @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","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 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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","import isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 chapters.forEach((o) => {\n if (o.pid === c.id) {\n o.code = c.code + '.' + o.index\n }\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\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"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","innerHTML","$anchor","$icon","name","size","color","iconSet","binds","width","height","defaultRules","svg","createElement","createSvgIcon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","pattern","RegExp","contains","exec","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","symbols","SYMBOLS","sprites","concat","$body","body","$icons","join","insertBefore","firstChild","paintSvgSprites","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"anchors.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/_updateHeading.js","src/utils/icons.js","src/utils/dom/createElement.js","src/utils/dom/removeClass.js","src/utils/dom/hasClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/utils/dom/scrollTo.js","src/utils/lang/later.js","src/utils/event/stop.js"],"sourcesContent":["/**\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","/**\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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","/**\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","/**\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} 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 * @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","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 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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","import isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\n","import removeClass from './utils/dom/removeClass'\nimport isEmpty from './utils/types/isEmpty'\nimport trim from './utils/lang/trim'\n\nconst _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 = chapters.filter((b) => b.pid === c.id)\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 Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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","/**\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\n * ========================================================================\n * @method stop\n * @param {Event} evt - 事件对象\n *\n * @example\n *
\n * Service\n * Help\n *
\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"],"names":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","offsetTop","el","top","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","fn","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","setTimeout","isArray","Array","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","className","_updateHeading","$heading","CLS_HEADING","hasAnchor","isAtStart","showCode","chapterCode","anchorURL","headingId","id","text","innerHTML","$anchor","$icon","name","size","color","iconSet","binds","width","height","defaultRules","svg","createElement","createSvgIcon","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","href","removeClass","classList","allClass","pattern","RegExp","contains","exec","hasClass","remove","_resetHeading","removeAttribute","removeChild","getChapters","headings","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","symbols","SYMBOLS","sprites","concat","$body","body","$icons","join","insertBefore","firstChild","paintSvgSprites","scrollTo","after","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","delay","later","publish","min","stopPropagation","preventDefault"],"mappings":"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"} \ No newline at end of file diff --git a/docs/js/outline.min.js b/docs/js/outline.min.js index 4d659d23..26921d39 100644 --- a/docs/js/outline.min.js +++ b/docs/js/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.forEach((t=>{t.pid===e.id&&(t.code=e.code+"."+t.index)}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted");let s,r;return this.$parentElement?(this._paintEdge(),r=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(r,this.chapters,t),N(r,"outline-chapters_fixed"),N(r,"outline-chapters_hidden"),this.positionPlaceholder(this.active),s=this.$el,this.offsetTop=d(s),this.offsetWidth=s.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver(),this):this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.anchors.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return s.playing=!0,this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&s.highlight(0),s.playing=!1,i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r.playing=!0,this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>1&&r.highlight(l-1),r.playing=!1,i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters,r=this.count();if("relative"!==t)i.toggle(),e.highlight("menu");else{if(e.toggle(),r<1)return this;o((()=>{i.isInside()?i.toggle():s.toggle()}))}return this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar;const r=e.isOutside(),l=this.count();return this.removeListeners(),l>0&&(e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted");let s,r;return this.$parentElement?(this._paintEdge(),r=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(r,this.chapters,t),N(r,"outline-chapters_fixed"),N(r,"outline-chapters_hidden"),this.positionPlaceholder(this.active),s=this.$el,this.offsetTop=d(s),this.offsetWidth=s.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver(),this):this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.anchors.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return s.playing=!0,this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&s.highlight(0),s.playing=!1,i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r.playing=!0,this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>1&&r.highlight(l-1),r.playing=!1,i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters,r=this.count();if("relative"!==t)i.toggle(),e.highlight("menu");else{if(e.toggle(),r<1)return this;o((()=>{i.isInside()?i.toggle():s.toggle()}))}return this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar;const r=e.isOutside(),l=this.count();return this.removeListeners(),l>0&&(e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n return typeof str === 'string'\n}\n\nexport default isString\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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 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","/**\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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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} 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 *
\n * Service\n * Help\n *
\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","/**\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","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 isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\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 _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 chapters.forEach((o) => {\n if (o.pid === c.id) {\n o.code = c.code + '.' + o.index\n }\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","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","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 isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\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 this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\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 const $fragment = document.createDocumentFragment()\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 paintSvgSprites()\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 [createSvgIcon('close', 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(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\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(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\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 $fragment.appendChild($el)\n document.body.appendChild($fragment)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\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()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\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 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 $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\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 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 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 publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\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.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\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 _paintEdge() {\n const STICKY = 'outline-chapters_sticky'\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\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()) {\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(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: 'outline-chapters'\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\n $parentElement.appendChild($el)\n\n return this\n }\n\n render() {\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n let $el\n let $list\n\n if (!$parentElement) {\n return this\n }\n\n this._paintEdge()\n\n $list = this.$list\n _paintChapters($list, this.chapters, showCode)\n removeClass($list, FIXED)\n removeClass($list, HIDDEN)\n this.positionPlaceholder(this.active)\n\n $el = this.$el\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 this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\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 (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 // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\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()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\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.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\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 (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\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 (timer) {\n clearTimeout(timer)\n }\n\n timer = 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 publish('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 publish('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 (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($element, 'resize', this.onResize, this, true)\n }\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 (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($element, 'resize', this.onResize)\n }\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 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'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.getElementById(id)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $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 [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\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 $link.insertBefore($code, $link.firstChild)\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 $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\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 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 { createSvgIcon } from './utils/icons'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = createSvgIcon(button.icon, button.size)\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 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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\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.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\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 rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paintSvgSprites()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\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 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 let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\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 publish(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","/**\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 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","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 Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n this._renderAnchors()._renderChapters()._renderToolbar()\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\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll\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 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 position,\n title,\n stickyHeight,\n chapters: this.anchors.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 customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\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 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 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 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 buttons.push(UP)\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 (count > 0) {\n buttons.push(MENU)\n }\n buttons.push(DOWN)\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\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 }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n chapters.playing = true\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 > 1) {\n chapters.highlight(count - 1)\n }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n chapters.playing = true\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 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 (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n if (count < 1) {\n return this\n }\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\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 toolbar = this.toolbar\n const isOutside = chapters.isOutside()\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(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 subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\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 showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: 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":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../src/utils/types/isString.js","../../src/utils/lang/hasOwn.js","../../src/utils/lang/toString.js","../../src/utils/types/isFunction.js","../../src/utils/types/isObject.js","../../src/base.js","../../src/utils/lang/extend.js","../../src/utils/types/isElement.js","../../src/utils/lang/later.js","../../src/utils/lang/easeInQuad.js","../../src/utils/dom/_getScrollElement.js","../../src/utils/dom/scrollTo.js","../../src/utils/dom/offsetTop.js","../../src/utils/dom/matches.js","../../src/utils/dom/getParentOrHost.js","../../src/utils/event/enum.js","../../src/utils/event/_off.js","../../src/utils/event/_delete.js","../../src/utils/event/purgeElement.js","../../src/utils/event/getListeners.js","../../src/utils/event/off.js","../../src/utils/event/on.js","../../src/utils/event/getTarget.js","../../src/utils/dom/resolveTextNode.js","../../src/utils/dom/closest.js","../../src/utils/event/stop.js","../../src/utils/observer/_subscribers.js","../../src/utils/observer/_hasDirectSubscribersFor.js","../../src/utils/observer/has.js","../../src/utils/observer/_hasSubscribers.js","../../src/utils/observer/emit.js","../../src/utils/types/isTypedArray.js","../../src/utils/types/isArray.js","../../src/utils/icons.js","../../src/utils/lang/trim.js","../../src/utils/types/isDOM.js","../../src/utils/types/isHTMLCollection.js","../../src/utils/types/isFragment.js","../../src/utils/types/isTextNode.js","../../src/utils/dom/setAttribute.js","../../src/utils/dom/createElement.js","../../src/utils/dom/hasClass.js","../../src/utils/dom/removeClass.js","../../src/_resetHeading.js","../../src/utils/types/isEmpty.js","../../src/getChapters.js","../../src/utils/lang/stripTags.js","../../src/_getChapterParentIdByDiffer.js","../../src/_getChaptersWithCode.js","../../src/anchors.js","../../src/utils/lang/toTree.js","../../src/_updateHeading.js","../../src/utils/dom/addClass.js","../../src/utils/dom/setProperty.js","../../src/zIndex.js","../../src/drawer.js","../../src/utils/event/at.js","../../src/utils/dom/getStyle.js","../../src/chapters.js","../../src/_paintChapters.js","../../src/utils/dom/intersection.js","../../src/_createButton.js","../../src/toolbar.js","../../src/utils/lang/guid.js","../../src/utils/observer/on.js","../../src/utils/observer/_removeSubscriber.js","../../src/utils/observer/off.js","../../src/utils/observer/_removeSubscriberByToken.js","../../src/outline.js"],"sourcesContent":["/**\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","/**\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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 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","/**\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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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} 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 *
\n * Service\n * Help\n *
\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","/**\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","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 isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\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 _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 = chapters.filter((b) => b.pid === c.id)\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 Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","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","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 isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\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 this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\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 const $fragment = document.createDocumentFragment()\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 paintSvgSprites()\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 [createSvgIcon('close', 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(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\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(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\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 $fragment.appendChild($el)\n document.body.appendChild($fragment)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\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()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\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 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 $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\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 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 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 publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\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.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\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 _paintEdge() {\n const STICKY = 'outline-chapters_sticky'\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\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()) {\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(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: 'outline-chapters'\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\n $parentElement.appendChild($el)\n\n return this\n }\n\n render() {\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n let $el\n let $list\n\n if (!$parentElement) {\n return this\n }\n\n this._paintEdge()\n\n $list = this.$list\n _paintChapters($list, this.chapters, showCode)\n removeClass($list, FIXED)\n removeClass($list, HIDDEN)\n this.positionPlaceholder(this.active)\n\n $el = this.$el\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 this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\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 (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 // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\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()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\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.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\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 (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\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 (timer) {\n clearTimeout(timer)\n }\n\n timer = 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 publish('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 publish('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 (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($element, 'resize', this.onResize, this, true)\n }\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 (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($element, 'resize', this.onResize)\n }\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 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'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.getElementById(id)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $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 [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\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 $link.insertBefore($code, $link.firstChild)\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 $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\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 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 { createSvgIcon } from './utils/icons'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = createSvgIcon(button.icon, button.size)\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 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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\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.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\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 rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paintSvgSprites()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\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 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 let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\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 publish(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","/**\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 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","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 Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n this._renderAnchors()._renderChapters()._renderToolbar()\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\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll\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 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 position,\n title,\n stickyHeight,\n chapters: this.anchors.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 customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\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 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 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 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 buttons.push(UP)\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 (count > 0) {\n buttons.push(MENU)\n }\n buttons.push(DOWN)\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\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 }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n chapters.playing = true\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 > 1) {\n chapters.highlight(count - 1)\n }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n chapters.playing = true\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 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 (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n if (count < 1) {\n return this\n }\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\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 toolbar = this.toolbar\n const isOutside = chapters.isOutside()\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(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 subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\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 showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: 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":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file diff --git a/outline.min.js b/outline.min.js index 4d659d23..26921d39 100644 --- a/outline.min.js +++ b/outline.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Outline=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.forEach((t=>{t.pid===e.id&&(t.code=e.code+"."+t.index)}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted");let s,r;return this.$parentElement?(this._paintEdge(),r=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(r,this.chapters,t),N(r,"outline-chapters_fixed"),N(r,"outline-chapters_hidden"),this.positionPlaceholder(this.active),s=this.$el,this.offsetTop=d(s),this.offsetWidth=s.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver(),this):this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.anchors.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return s.playing=!0,this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&s.highlight(0),s.playing=!1,i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r.playing=!0,this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>1&&r.highlight(l-1),r.playing=!1,i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters,r=this.count();if("relative"!==t)i.toggle(),e.highlight("menu");else{if(e.toggle(),r<1)return this;o((()=>{i.isInside()?i.toggle():s.toggle()}))}return this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar;const r=e.isOutside(),l=this.count();return this.removeListeners(),l>0&&(e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r"string"==typeof t,e=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},s=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===s(t),r=t=>("[object Object]"===s(t)||"object"==typeof t||i(t))&&null!==t;class l{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(s,i){const l=this.attrs;return t(s)?i&&e(l,s)?(l[s]=i,this):l[s]:r(s)?(n=l,o=s,Object.keys(o).forEach((t=>{e(o,t)&&(n[t]=o[t])})),this):0===arguments.length?l:this;var n,o}render(){return this}destroy(){return this.removeListeners(),this}reload(t){return this.destroy().initialize(this.attr(t)),this}addListeners(){return this}removeListeners(){return this}}const n=t=>!!(r(t)&&t.nodeName&&t.tagName&&1===t.nodeType),o=(t,e=300)=>!!i(t)&&setTimeout((()=>{t()}),e),h=t=>t*t,a=(e=null)=>{let s,i;return e?t(e)?i=document.querySelector(e):n(e)&&(i=e):(s=document.querySelectorAll("html,body"),i=s[0].scrollTop-s[1].scrollTop>=0?s[0]:s[1]),i},c=(t,e,s)=>{const r=a(t);let l=r.scrollTop,n=0;const o=e-l,c=r.scrollHeight,d=e-c<=0?e:c,u=t=>(i(s)&&s(t),!1),p=()=>{if(n+=1,o<0){if(l-=h(n),r.scrollTop=l,l<=e)return r.scrollTop=e,u(e)}else if(l+=h(n),r.scrollTop=l,l>=d)return r.scrollTop=d,u(d);requestAnimationFrame(p)};requestAnimationFrame(p)},d=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=d(t.offsetParent)),e},u=(t,e="")=>{const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},p=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,m=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],f=(t,e,s)=>{const i=m.indexOf(e)>-1;s._delegateListener&&delete(s=s._delegateListener)._delegateListener,function(t,e,s){const i=t._listeners;let r=-1;if(i.length<1)return!1;i.forEach(((t,i)=>{const l=t.fn;e===t.type&&(r=i,l===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},g=function(e,s,i=!1){const r=t(e)?document.querySelector(e):e,l=r.childNodes,o=((e,s)=>{let i=e._listeners||[];return t(s)&&s&&(i=i.filter((t=>t.type===s))),i})(r,s);o.forEach((t=>{f(r,t.type,t.fn)})),(i||!0===s||1===arguments.length)&&r&&l&&l.forEach((t=>{n(t)&&g(t,s,i)}))},y=(t,e,s)=>{if(!i(s))return g(t,e);f(t,e,s)},b=(t,e,s,i,r,l,n=!1)=>{const o=m.indexOf(s)>-1,h=function(o){const a=function(t){const e=t.target;return(s=e)&&3===s.nodeType?s.parentNode:s;var s}(o),c=((t,e,s,i)=>{const r=s||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||i&&t===r)return t;if(t===r)break}while(t=p(t))})(a,e,t);let d=l||t;o.delegateTarget=c,!0===l&&(d=r),c&&(!0===n&&y(t,s,h),i.call(d,o,r))};t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:h,data:r,context:l,capture:o}),i._delegateListener=h,t.addEventListener(s,h,o)},$=function(t){t.stopPropagation(),t.preventDefault()},v={},_=t=>e(v,t)&&v[t].length>0,E=(t,e=!0)=>e?_(t):(t=>{let e=_(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=_(t);return e})(t),T=(t,e,i=!0)=>{const r=t=>{if(!_(t))return!1;v[t].forEach((t=>{const i=["[object Int8Array]","[object Uint8Array]","[object Uint8ClampedArray]","[object Int16Array]","[object Uint16Array]","[object Int32Array]","[object Uint32Array]","[object Float32Array]","[object Float64Array]","[object BigInt64Array]","[object BigUint64Array]"].indexOf(s(e))>-1?e.toString():e;t.callback.call(t.context||t,i)}))},l=()=>{let e=t,s=t.lastIndexOf(".");for(;-1!==s;)e=e.substring(0,s),s=e.lastIndexOf("."),r(e);r(t),r("*")};if(!E(t))return!1;i?setTimeout(l,10):l()},w=t=>Array.isArray?Array.isArray(t):"[object Array]"===s(t),L=(t=[])=>{const e=['','','','','','','','',''],s=w(t)&&t.length>0?e.concat(t):e,i=document.body;let r=document.querySelector("#svg-sprites");r?r.innerHTML=s.join(""):(r=document.createElement("div"),r.innerHTML=``,i.insertBefore(r.firstChild,i.firstChild))},S=(t,e=0,s="",i="outline")=>{const r=i?`xlink:href="#${i}-icon-${t}"`:`xlink:href="#icon-${t}"`,l=w(e)?e[0]:e,n=w(e)?e[1]:e,o=e?`width:${l}px;height:${n}px;`:"",h=``,a=document.createElement("i");return a.className="outline-icon",a.innerHTML=h,a},x=e=>!!t(e)&&e.replace(/(^\s+)|(\s+$)/g,""),C=t=>{return!(!r(t)||!(n(t)||(t=>!(!r(t)||"[object NodeList]"!==s(t)))(t)||(e=t,r(e)&&"[object DocumentFragment]"===s(e))||(t=>!(!r(t)||!("[object Text]"===s(t)||t.tagName&&3===t.nodeType)))(t)));var e},z=(t,e,s)=>{let i=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=s;break;case"value":"input"===i||"textarea"===i?t.value=s:t.setAttribute(e,s);break;case"className":t.className=s;break;default:t.setAttribute(e,s)}},k=(s,i,l)=>{const n=document.createDocumentFragment(),o=document.createElement(s),h=e=>C(e)||t(e),a=e=>{let s;if(!h(e))return!1;C(e)?s=e:t(e)&&(s=document.createTextNode(e)),n.appendChild(s)};return r(i)?Object.keys(i).forEach((t=>{e(i,t)&&z(o,t,i[t])})):w(i)&&i.every((t=>h(t)))&&i.forEach((t=>{a(t)})),w(l)?l.forEach((t=>{a(t)})):a(l),o.appendChild(n),o},A=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!n(t)&&(i=t.className,!!i&&(r=t.classList,r?.contains?t.classList.contains(e):!!s.exec(i)))},N=(t,e)=>{let s,i=t.className;if(!i||!A(t,e))return!1;s=t.classList,s?.remove?s.remove(e):(i=x(i.replace(e,"")),t.className=i)},M=(e,s=!0,i=!0)=>{const r="outline-heading",l=e.innerHTML;let n;if(e.innerHTML=l.replace(/^\d+(?:(\.?\d*)*\s?)?/gi,""),e.removeAttribute("id"),e.removeAttribute("data-id"),N(e,r),!s)return!1;var o;n=e.querySelector(`.${r}__anchor`),i&&N(e,`${r}_start`),o=x(e.className),t(o)&&""===o&&e.removeAttribute("class"),e.removeChild(n)},O=(e,s=!0)=>{let i=1,r=0;const l=[];return e.forEach(((e,s)=>{const n=e.tagName.replace(/h/i,"");let o=parseInt(n,10),h=-1;var a;o>i?(r+=1,h=1===r?-1:s-1):o===i||or?1===o?(r=1,h=-1):h=l[s-1].pid:o<=r&&(1===o?r=1:(r-=i-o,r<=1&&(r=1)),h=1===r?-1:((t,e,s)=>{let i,r,l=t[s-1];for(r=0;r]+(>|$)/g,""):"")})})),s?(t=>{const e={};return t.forEach((t=>{const s=JSON.stringify((t=>[t.pid])(t));e[s]=e[s]||[],e[s].push(t),t.index=e[s].length,-1===t.pid&&(t.code=String(t.index))})),Object.keys(e).forEach((s=>{e[s].forEach((e=>{t.filter((t=>t.pid===e.id)).forEach((t=>{t.code=e.code+"."+t.index}))}))})),t})(l):l};class D extends l{constructor(t){super(),this.attrs=D.DEFAULTS,this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],t&&this.initialize(t)}initialize(e){let s,r,l,o,h;return this.attr(e),h=this.attr("articleElement"),r=this.attr("scrollElement"),l=this.attr("selector"),s=this.attr("created"),t(h)?o=document.querySelector(h):n(h)&&(o=h),o?(this.$articleElement=o,this.$scrollElement=a(r),this.$headings=[...o.querySelectorAll(l)],this.$headings.length<1||(this.chapters=O(this.$headings),i(s)&&s.call(this),this.render().addListeners()),this):this}getChapters(t=!1){const e=this.chapters;return t?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const l=t[i[e[s]]];-1!==e[s]?l.children.push(e):r.push(e)})),r})(e,"id","pid"):e}count(){return this.chapters.length}render(){const t=this.attr("mounted"),e=this.attr("hasAnchor"),s=this.attr("isAtStart"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.$headings,o=this.getChapters();return L(),n.forEach(((t,i)=>{const n=o[i].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,l=s.isAtStart||!0,n=s.showCode||!1,o=s.chapterCode||"",h=s.anchorURL||"",a=`heading-${e}`,c={id:a,className:l?`${i} ${i}_start`:i,"data-id":e},d=Object.keys(c),u=x(t.innerHTML);let p,m;if(d.forEach((e=>{z(t,e,c[e])})),n&&(t.innerHTML=o+" "+u),!r)return!1;m=S("hash"),p=k("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:h||`#${a}`,target:h?"_blank":"self","data-id":e},[m]),t.appendChild(p)})(t,i,{hasAnchor:e,isAtStart:s,showCode:r,chapterCode:n,anchorURL:l})})),i(t)&&t.call(this),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}destroy(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart"),s=this.attr("beforeDestroy"),r=this.attr("afterDestroy"),l=this.$headings;return i(s)&&s.call(this),this.removeListeners(),l.forEach((s=>{M(s,t,e)})),this.attr(D.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this.chapters=[],i(r)&&r.call(this),this}onAnchorTrigger(t){const e=this.attr("anchorURL"),s=this.attr("afterScroll"),r=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,n=d(l)-(r+10),h=this.$scrollElement,a=h.scrollHeight-h.clientHeight;return this.scrollTo(n,(()=>{i(s)&&s.call(this,"anchor"),o((()=>{T("toolbar:update",{top:n,min:0,max:a})}))})),e||$(t),this}addListeners(){const t=this.$articleElement;return b(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return y(t,"click",this.onAnchorTrigger),this}}D.DEFAULTS={scrollElement:"html,body",articleElement:"#article",selector:"h1,h2,h3,h4,h5,h6",stickyHeight:0,anchorURL:"",hasAnchor:!0,isAtStart:!0,showCode:!1,created:null,mounted:null,afterScroll:null,beforeDestroy:null,afterDestroy:null};const H=(t,e)=>{let s,i;if(A(t,e))return!1;s=t.classList,s?.add?s.add(e):(i=t.className,i+=i.length>0?" "+e:e,t.className=i)},j=(t,e)=>{document.documentElement.style.setProperty(t,e)};let F=2e3;const U=t=>(t?F=t:F+=1,j("--outline-zIndex",`${F}`),F);class I extends l{constructor(t){super(),this.attrs=I.DEFAULTS,this.title="",this.closed=!0,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,this.zIndex=0,t&&this.initialize(t)}initialize(t){let e;return this.attr(t),this.title=this.attr("title"),e=this.attr("created"),i(e)&&e.call(this),this.render().addListeners(),this}setTitle(t){return this.attr("title",t),this.title=t,this.$title.innerHTML=t,this}isClosed(){return this.closed}render(){const t=this.attr("mounted"),e=this.attr("size"),s=this.attr("placement"),r=this.attr("hasClose"),l=this.attr("hasOverlay"),n=this.attr("hasOffset"),o=this.attr("hasPadding"),h=this.attr("autoHeight"),a=this.attr("customClass"),c=document.createDocumentFragment();let d,u,p,m,f,g,y,b;return L(),this.zIndex=U(),m=k("h2",{className:"outline-drawer__title"},[this.title]),this.$title=m,r&&(f=k("div",{className:"outline-drawer__close"},[S("close",20)]),this.$close=f),p=k("header",{className:"outline-drawer__header"},[m,f]),this.$header=p,g=k("div",{className:"outline-drawer__main"},[""]),this.$main=g,o||H(g,"outline-drawer_full"),y=k("footer",{className:"outline-drawer__footer"},[""]),this.$footer=y,u=k("div",{className:`outline-drawer__modal outline-drawer_${s} outline-drawer_${e} outline-drawer_closed`},[p,g,y]),this.$modal=u,n&&H(u,"outline-drawer_offset"),h&&H(u,"outline-drawer_auto"),a&&H(u,a),l&&(b=k("div",{className:"outline-drawer__overlay"},[""]),this.$overlay=b),d=k("div",{className:"outline-drawer"},[u,b]),this.$el=d,c.appendChild(d),document.body.appendChild(c),i(t)&&t.call(this),this}open(){const t=this.attr("afterOpened"),e=this.$modal;return H(this.$el,"outline-drawer_opened"),N(e,"outline-drawer_closed"),H(e,"outline-drawer_opened"),o((()=>{this.closed=!1,i(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),e=this.$modal;return N(e,"outline-drawer_opened"),H(e,"outline-drawer_closed"),o((()=>{N(this.$el,"outline-drawer_opened"),this.closed=!0,i(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),e=this.isClosed();return e?this.open():this.close(),i(t)&&o((()=>{t.call(this,e)})),this}destroy(){const t=this.attr("afterDestroy"),e=this.attr("beforeDestroy");let s=this.zIndex;return i(e)&&e.call(this),this.removeListeners(),this.attrs=I.DEFAULTS,this.title="",this.closed=!1,this.$el=null,this.$modal=null,this.$header=null,this.$title=null,this.$close=null,this.$main=null,this.$footer=null,this.$overlay=null,s-=1,U(s),this.zIndex=0,i(t)&&t.call(this),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t&&b(s,".outline-drawer__close","click",this.onClose,this,!0),e&&b(s,".outline-drawer__overlay","click",this.onClose,this,!0),this}removeListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.$el;return t||e?(y(s,"click",this.onClose),this):this}onClose(){return this.close(),this}}I.DEFAULTS={placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null};const q=(t,e,s,r,l,n=!1)=>{const o=m.indexOf(e)>-1,h=function(i){let o=l||t;!0===l&&(o=r),!0===n&&y(t,e,h),s.call(o,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:h,data:r,context:l,capture:o}),s._delegateListener=h,t.addEventListener(e,h,o)},B=(t,e)=>getComputedStyle(t)[e];class R extends l{constructor(t){super(),this.attrs=R.DEFAULTS,this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.closed=!1,this.active=0,this.offsetTop=0,this.offsetWidth=0,this.$active=null,this.scrollTimer=null,this.resizeTimer=null,this.playing=!1,this.Observer=null,t&&this.initialize(t)}initialize(e){let s,r,l,o;return this.attr(e),s=this.attr("created"),r=this.attr("parentElement"),l=this.attr("scrollElement"),t(r)?o=document.querySelector(r):n(r)&&(o=r),this.$parentElement=o,this.$scrollElement=a(l),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),i(s)&&s.call(this),this.chapters.length<1||(this.render().addListeners(),this.$active=document.querySelector(`#chapter-${this.active}`)),this}isClosed(){return this.closed}isSticky(){return"sticky"===this.attr("position")}isFixed(){return"fixed"===this.attr("position")}isInside(){return this.isFixed()||this.isSticky()}isOutside(){return!this.isInside()}_paintEdge(){const t=this.attr("title"),e=this.attr("customClass"),s=this.$parentElement,i=[];let r,l,n,o,h=null;return s?(this.isInside()&&(h=k("h2",{className:"outline-chapters__title"},[t]),this.$title=h,i.push(h)),n=k("ul",{className:"outline-chapters__list outline-chapters_fixed outline-chapters_hidden"},[""]),this.$list=n,o=k("div",{className:"outline-chapters__placeholder"},[""]),this.$placeholder=o,l=k("div",{className:"outline-chapters__main"},[n,o]),this.$main=l,i.push(l),r=k("nav",{id:"outline-chapters",className:"outline-chapters"},i),this.$el=r,this.isSticky()&&(this.calculateStickyHeight(),H(r,"outline-chapters_sticky")),e&&H(r,e),s.appendChild(r),this):this}render(){const t=this.attr("showCode"),e=this.attr("mounted");let s,r;return this.$parentElement?(this._paintEdge(),r=this.$list,((t,e,s=!1)=>{const i=t=>document.getElementById(t);e.forEach((e=>{const r=e.pid,l=e.id,n=e.rel,o=k("span",{className:"outline-chapters__text"},[e.text]),h=k("a",{id:`chapter__anchor-${l}`,className:"outline-chapters__anchor",href:"#"+n,rel:n,"data-id":l},[o]);let a,c,d,u;s&&(a=k("span",{className:"outline-chapters__code","data-id":l},[e.code]),h.insertBefore(a,h.firstChild)),c=k("li",{id:`chapter-${l}`,className:"outline-chapters__item","data-id":l},[h]),-1===r?t.appendChild(c):(u=i(`chapter-${r}`),d=i(`subject-${r}`),d?d.appendChild(c):(d=k("ul",{id:"subject-"+r,className:"outline-chapters__subject"},[c]),u.appendChild(d)))}))})(r,this.chapters,t),N(r,"outline-chapters_fixed"),N(r,"outline-chapters_hidden"),this.positionPlaceholder(this.active),s=this.$el,this.offsetTop=d(s),this.offsetWidth=s.offsetWidth,this.isFixed()&&(this.sticky(),j("--outline-chapters-width",`${this.offsetWidth}px`)),i(e)&&e.call(this),this.onObserver(),this):this}positionPlaceholder(t){const e=this.$main,s=this.$list,i=this.$placeholder,r=s.querySelector(".outline-chapters__anchor"),l=parseInt(B(e,"padding-top"),10),n=parseInt(B(e,"border-top-width"),10),o=parseInt(B(s,"padding-top"),10),h=parseInt(B(s,"margin-top"),10),a=parseInt(B(s,"border-top-width"),10);let c,d=r.offsetHeight,u=0;return l&&(u+=l),o&&(u+=o),h&&(u+=h),n&&(u+=n),a&&(u+=a),c=d*t,i.style.cssText=`transform: translateY(${u+c}px);height:${d}px;`,this}highlight(t){const e=this.$el.querySelector(`#chapter__anchor-${t}`),s="outline-chapters_active";return e?(this.$active&&N(this.$active,s),this.active=parseInt(e.getAttribute("data-id"),10),this.$active=e,H(this.$active,s),this.positionPlaceholder(this.active),this):this}sticky(){const t=this.attr("afterSticky"),e="outline-chapters_fixed",s=this.$el,r=this.offsetTop,l=this.$scrollElement.scrollTop;let n;return this.isFixed()?(n=l>=r,n?H(s,e):N(s,e),i(t)&&t.call(this,this.isClosed(),n),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return j("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return c(s,t,e),this}show(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterOpened"),r=this.$el,l=this.$parentElement;return this.isInside()?(N(l,e),N(r,e),o((()=>{N(l,t),N(r,t)}),30)):N(r,e),this.closed=!1,i(s)&&s.call(this),this}hide(){const t="outline-chapters_folded",e="outline-chapters_hidden",s=this.attr("afterClosed"),r=this.$el,l=this.$parentElement;return this.isInside()?(H(l,t),H(r,t),o((()=>{H(l,e),H(r,e)}))):H(r,e),this.closed=!0,i(s)&&s.call(this),this}toggle(){const t=this.attr("afterToggle"),e=this.offsetTop,s=this.$scrollElement.scrollTop;let r;return this.isClosed()?this.show():this.hide(),i(t)&&o((()=>{r=s>=e,t.call(this,this.isClosed(),r)})),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");return i(t)&&t.call(this),this.removeListeners(),this.$parentElement.removeChild(this.$el),this.attr(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.chapters=[],this.active=0,this.offsetTop=0,this.$active=null,this.closed=!1,this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),i(e)&&e.call(this),this.Observer&&(this.Observer=null),this}onObserver(){const t=this.attr("selector");let e=null;return this.Observer=((t,e={})=>{const s=e.root||null,r=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},h=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),a=n(s)?s:document;return s&&(o.root=s),a.querySelectorAll(r).forEach((t=>{h.observe(t)})),h})((t=>{const s=t.getAttribute("data-id");if(this.playing)return!1;e&&clearTimeout(e),e=o((()=>{this.highlight(s)}),100)}),{selector:t,context:this}),this}onSelect(t){const e=this.attr("stickyHeight"),s=t.delegateTarget,r=s.getAttribute("data-id"),l=s.href.split("#")[1],n=document.querySelector(`#${l}`),h=d(n)-(e+10),a=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),o((()=>{this.playing=!1,T("toolbar:update",{top:h,min:0,max:a})}))};return this.playing=!0,this.isFixed()?(this.sticky(),o((()=>{this.scrollTo(h,u),this.highlight(r)}),10)):(this.scrollTo(h,u),this.highlight(r)),$(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=o((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),T("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=o((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return"html"!==s&&"body"!==s||(i=window),b(t,".outline-chapters__anchor","click",this.onSelect,this,!0),q(i,"scroll",this.onScroll,this,!0),this.isSticky()&&q(i,"resize",this.onResize,this,!0),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return"html"!==i&&"body"!==i||(r=window),y(e,"click",this.onSelect),y(r,"scroll",this.onScroll),this.isSticky()&&q(r,"resize",this.onResize),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)})),this}}R.DEFAULTS={parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null};const P=(t,e=!0)=>{const s=S(t.icon,t.size),i=k("a",{className:"outline-toolbar__anchor",href:t.link},[s]),r=k("div",{className:`outline-toolbar__button ${t.name}`},[t.link?i:s]);return H(s,"outline-toolbar__icon"),e&&H(r,"outline-toolbar_rounded"),t.disabled&&H(r,"outline-toolbar_disabled"),r},Q="outline-toolbar_disabled",W="outline-toolbar_hidden";class V extends l{constructor(t){super(),this.attrs=V.DEFAULTS,this.$el=null,this.disabled=!1,this.closed=!1,this.buttons=[],t&&this.initialize(t)}initialize(t){let e;return this.attr(t),e=this.attr("created"),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),i(e)&&e.call(this),this.render().addListeners(),this}isDisabled(t){const e=this.attr("buttons");let s;return t?(s=e.find((e=>e.name===t)),s?.disabled):this.disabled}isClosed(){return this.closed}highlight(t){const e=this.buttons.find((e=>e.name===t)),s="outline-toolbar_active";let i;return i||(i=e.$el,A(i,s)?N(i,s):H(i,s)),this}render(){const t=this.attr("mounted"),e=this.attr("buttons")||[],s=this.attr("rounded"),r=this.attr("placement"),l=document.createDocumentFragment(),n=document.createDocumentFragment();return L(),e.forEach((t=>{const e=P(t,s);l.appendChild(e),this.buttons.push({name:t.name,$el:e})})),this.$el=k("div",{id:"outline-toolbar",className:`outline-toolbar outline-toolbar_${r}`},[l]),n.appendChild(this.$el),document.body.appendChild(n),this.closed&&this.hide(),this.disabled&&this.disable(),i(t)&&t.call(this),this}add(t){const e=this.$el,s=this.attr("buttons"),l=t.action,n=document.createDocumentFragment();let o;return r(t)?(s.push(t),n.appendChild(P(t))):w(t)&&t.forEach((t=>{n.appendChild(P(t))})),e.appendChild(n),l&&i(l.handler)&&(o=l.type||"click",b(e,`.${t.name}`,o,l.handler)),this}remove(t){const e=this.$el,s=this.attr("buttons"),i=s.find((e=>e.name===t));let r,l=-1;return i?(s.forEach(((e,s)=>{e.name===t&&(l=s)})),l>-1&&this.attr().buttons.splice(l,1),r=e.querySelector(`.${t}`),this.switch(t,!1),e.removeChild(r),this):this}switch(t,e){const s=this.$el,i=this.attr("buttons"),r=i.find((e=>e.name===t));let l,n,o,h;return r?(i.forEach((s=>{s.name===t&&(r.disabled=!e)})),l=r.action,h=s.querySelector(`.${t}`),l&&(n=l.type||"click",o=l.handler),e?(N(h,Q),n&&o&&b(s,`.${t}`,n,o)):(H(h,Q),n&&o&&y(s,n,o)),this):this}disable(t){const e=this.attr("afterDisabled");return t?this.switch(t,!1):(H(this.$el,Q),this.removeListeners(),this.disabled=!0,i(e)&&e.call(this)),this}enable(t){const e=this.attr("afterEnabled");return t?this.switch(t,!0):(this.disabled=!1,N(this.$el,Q),this.addListeners(),i(e)&&e.call(this)),this}show(t){const e=this.attr("afterOpened"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),N(l,W)}else N(r,W),this.closed=!1,i(e)&&o((()=>{e.call(this)}),310);return this}hide(t){const e=this.attr("afterClosed"),s=this.attr("buttons").find((e=>e.name===t)),r=this.$el;let l;if(t){if(!s)return this;l=r.querySelector(`.${t}`),H(l,W)}else H(r,W),this.closed=!0,i(e)&&o((()=>{e.call(this)}),310);return this}toggle(){return this.isClosed()?this.show():this.hide(),this}destroy(){const t=this.attr("beforeDestroy"),e=this.attr("afterDestroy");let s=this.$el;return i(t)&&t.call(this),this.removeListeners(),document.body.removeChild(s),s=null,this.attr(V.DEFAULTS),this.disabled=!1,this.closed=!1,this.buttons=[],i(e)&&e.call(this),this}refresh(){const t=this.$el,e=this.attr("buttons")||[];return this.removeListeners(),t.innerHTML="",e.forEach((t=>{this.$el.appendChild(P(t))})),this.addListeners(),this}addListeners(){const e=this.attr("buttons"),s=this.$el;return!e||e.length<1||e.forEach((e=>{const r=e.action;let l,n,o,h;if(this.disabled)return!1;r&&(n=r.handler,t(n)&&(h=n,r.handler=function(){T(h,e.name)},n=r.handler),l=r.type||"click",o=r.context),i(n)&&b(s,`.${e.name}`,l,n,o||this,!0)})),this}removeListeners(){const t=this.attr("buttons"),e=this.$el;return!t||t.length<1||t.forEach((t=>{const s=t.action;let r,l;if(this.disabled)return!1;s&&(l=s.handler,r=s.type||"click"),i(l)&&y(e,r,l)})),this}}V.DEFAULTS={placement:"ltr",closed:!1,disabled:!1,rounded:!0,buttons:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterDisabled:null,afterEnabled:null,beforeDestroy:null,afterDestroy:null};const J=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),Y=(t,e,s=null)=>{const r=J();let l="symbol"==typeof t?t.toString():t;return i(e)?(v[l]||(v[l]=[]),v[l].push({topic:l,callback:e,context:s,token:r}),r):""},G=t=>{if(!e(v,t))return!1;delete v[t]},K=(t,e)=>{if(!E(t))return!1;e?(t=>{const e=Object.keys(v);if(!t||e.length<1)return!1;e.forEach((e=>{const s=v[e];let i;s.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(i=e.topic,s.splice(-1,r))})),s.length<1&&G(i)}))})(e):G(t)};class X extends l{constructor(t){super(),this.attrs=X.DEFAULTS,this.anchors=null,this.drawer=null,this.chapters=null,this.toolbar=null,t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}getChapters(t=!1){return this.anchors.getChapters(t)}count(){return this.anchors.count()}render(){return this._renderAnchors()._renderChapters()._renderToolbar(),this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),l=this.attr("anchorURL"),n=this.attr("afterScroll");return this.anchors=new D({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:l,afterScroll:n}),this}_renderChapters(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),l=this.attr("position"),n=this.attr("placement"),o=this.attr("afterSticky"),h=this.attr("afterToggle"),a=this.attr("afterScroll"),c=this.count();let d,u=this.attr("parentElement");return c<1||(d={scrollElement:s,showCode:r,position:l,title:t,stickyHeight:e,chapters:this.anchors.getChapters(),afterSticky:o,afterToggle:h,afterScroll:a},"relative"===l?(this.drawer=new I({placement:n,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),u=this.drawer.$main):d.customClass=i,d.parentElement=u,this.chapters=new R(d)),this}_renderToolbar(){const t=this.attr("placement"),e=this.attr("homepage"),s=this.attr("git"),i=this.attr("tags"),r=this.attr("issues"),l=this.count(),n={name:"homepage",icon:"homepage",size:20,link:e},o={name:"github",icon:"github",size:20,link:s},h={name:"tags",icon:"tags",size:20,link:i},a={name:"issues",icon:"issues",size:20,link:r},c={name:"menu",icon:"menu",size:18,action:{type:"click",handler:"toolbar:action:toggle"}},d=[];return d.push({name:"up",icon:"up",size:20,action:{type:"click",handler:"toolbar:action:up"}}),e&&d.push(n),s&&d.push(o),i&&d.push(h),r&&d.push(a),l>0&&d.push(c),d.push({name:"down",icon:"down",size:20,action:{type:"click",handler:"toolbar:action:down"}}),this.toolbar=new V({placement:t,buttons:d}),this}toTop(){const t=this.attr("afterScroll"),e=this.toolbar,s=this.chapters,r=this.count();return s.playing=!0,this.scrollTo(0,(()=>{e.hide("up"),e.show("down"),r>0&&s.highlight(0),s.playing=!1,i(t)&&t.call(e,"up")})),this}toBottom(){const t=this.attr("afterScroll"),e=a(this.attr("scrollElement")),s=this.toolbar,r=this.chapters,l=this.count(),n=Math.floor(e.scrollHeight-e.clientHeight);return r.playing=!0,this.scrollTo(n,(()=>{s.hide("down"),s.show("up"),l>1&&r.highlight(l-1),r.playing=!1,i(t)&&t.call(s,"bottom")})),this}scrollTo(t,e){const s=this.attr("scrollElement");return c(s,t,e),this}toggle(){const t=this.attr("position"),e=this.toolbar,s=this.drawer,i=this.chapters,r=this.count();if("relative"!==t)i.toggle(),e.highlight("menu");else{if(e.toggle(),r<1)return this;o((()=>{i.isInside()?i.toggle():s.toggle()}))}return this}destroy(){let t=this.anchors,e=this.chapters,s=this.drawer,i=this.toolbar;const r=e.isOutside(),l=this.count();return this.removeListeners(),l>0&&(e.destroy(),e=null,r&&(s.destroy(),s=null)),i.destroy(),i=null,t.destroy(),t=null,this.attr(X.DEFAULTS),this}onToggle(){return this.toggle(),this}onScrollTop(){return this.toTop(),this}onScrollBottom(){return this.toBottom(),this}onToolbarUpdate({top:t,min:e,max:s}){const i=this.toolbar,r=Math.ceil(t);return r<=e?(i.hide("up"),i.show("down")):r>=s?(i.hide("down"),i.show("up")):r>e&&r {\n return typeof str === 'string'\n}\n\nexport default isString\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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 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","/**\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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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} 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 *
\n * Service\n * Help\n *
\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","/**\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","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 isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\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 _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 chapters.forEach((o) => {\n if (o.pid === c.id) {\n o.code = c.code + '.' + o.index\n }\n })\n })\n })\n\n return chapters\n}\n\nexport default _getChaptersWithCode\n","import Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","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","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 isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\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 this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\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 const $fragment = document.createDocumentFragment()\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 paintSvgSprites()\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 [createSvgIcon('close', 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(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\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(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\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 $fragment.appendChild($el)\n document.body.appendChild($fragment)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\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()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\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 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 $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\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 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 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 publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\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.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\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 _paintEdge() {\n const STICKY = 'outline-chapters_sticky'\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\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()) {\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(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: 'outline-chapters'\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\n $parentElement.appendChild($el)\n\n return this\n }\n\n render() {\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n let $el\n let $list\n\n if (!$parentElement) {\n return this\n }\n\n this._paintEdge()\n\n $list = this.$list\n _paintChapters($list, this.chapters, showCode)\n removeClass($list, FIXED)\n removeClass($list, HIDDEN)\n this.positionPlaceholder(this.active)\n\n $el = this.$el\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 this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\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 (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 // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\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()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\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.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\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 (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\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 (timer) {\n clearTimeout(timer)\n }\n\n timer = 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 publish('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 publish('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 (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($element, 'resize', this.onResize, this, true)\n }\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 (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($element, 'resize', this.onResize)\n }\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 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'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.getElementById(id)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $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 [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\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 $link.insertBefore($code, $link.firstChild)\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 $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\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 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 { createSvgIcon } from './utils/icons'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = createSvgIcon(button.icon, button.size)\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 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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\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.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\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 rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paintSvgSprites()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\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 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 let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\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 publish(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","/**\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 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","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 Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n this._renderAnchors()._renderChapters()._renderToolbar()\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\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll\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 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 position,\n title,\n stickyHeight,\n chapters: this.anchors.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 customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\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 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 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 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 buttons.push(UP)\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 (count > 0) {\n buttons.push(MENU)\n }\n buttons.push(DOWN)\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\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 }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n chapters.playing = true\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 > 1) {\n chapters.highlight(count - 1)\n }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n chapters.playing = true\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 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 (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n if (count < 1) {\n return this\n }\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\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 toolbar = this.toolbar\n const isOutside = chapters.isOutside()\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(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 subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\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 showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: 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":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["src/utils/types/isString.js","src/utils/lang/hasOwn.js","src/utils/lang/toString.js","src/utils/types/isFunction.js","src/utils/types/isObject.js","src/base.js","src/utils/lang/extend.js","src/utils/types/isElement.js","src/utils/lang/later.js","src/utils/lang/easeInQuad.js","src/utils/dom/_getScrollElement.js","src/utils/dom/scrollTo.js","src/utils/dom/offsetTop.js","src/utils/dom/matches.js","src/utils/dom/getParentOrHost.js","src/utils/event/enum.js","src/utils/event/_off.js","src/utils/event/_delete.js","src/utils/event/purgeElement.js","src/utils/event/getListeners.js","src/utils/event/off.js","src/utils/event/on.js","src/utils/event/getTarget.js","src/utils/dom/resolveTextNode.js","src/utils/dom/closest.js","src/utils/event/stop.js","src/utils/observer/_subscribers.js","src/utils/observer/_hasDirectSubscribersFor.js","src/utils/observer/has.js","src/utils/observer/_hasSubscribers.js","src/utils/observer/emit.js","src/utils/types/isTypedArray.js","src/utils/types/isArray.js","src/utils/icons.js","src/utils/lang/trim.js","src/utils/types/isDOM.js","src/utils/types/isHTMLCollection.js","src/utils/types/isFragment.js","src/utils/types/isTextNode.js","src/utils/dom/setAttribute.js","src/utils/dom/createElement.js","src/utils/dom/hasClass.js","src/utils/dom/removeClass.js","src/_resetHeading.js","src/utils/types/isEmpty.js","src/getChapters.js","src/utils/lang/stripTags.js","src/_getChapterParentIdByDiffer.js","src/_getChaptersWithCode.js","src/anchors.js","src/utils/lang/toTree.js","src/_updateHeading.js","src/utils/dom/addClass.js","src/utils/dom/setProperty.js","src/zIndex.js","src/drawer.js","src/utils/event/at.js","src/utils/dom/getStyle.js","src/chapters.js","src/_paintChapters.js","src/utils/dom/intersection.js","src/_createButton.js","src/toolbar.js","src/utils/lang/guid.js","src/utils/observer/on.js","src/utils/observer/_removeSubscriber.js","src/utils/observer/off.js","src/utils/observer/_removeSubscriberByToken.js","src/outline.js"],"sourcesContent":["/**\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","/**\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","/**\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 toString from '../lang/toString'\nimport isFunction from '../types/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 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\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 destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n this.destroy().initialize(this.attr(options))\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 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","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 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","/**\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 requestAnimationFrame(play)\n }\n\n requestAnimationFrame(play)\n}\n\nexport default scrollTo\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} 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 *
\n * Service\n * Help\n *
\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","/**\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","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 isArray from './types/isArray'\n\n/**\n * 绘制 SVG Sprites 图标集\n * ========================================================================\n * @method paintSvgSprites\n * @param {Array} [symbols] - (可选)symbols 图标数组\n * 传递 symbols - 绘制 symbols + SYMBOLS 的图标集\n * 不传递 symbols - 仅绘制默认 SYMBOLS 图标集\n */\nexport const paintSvgSprites = (symbols = []) => {\n const SYMBOLS = [\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n '',\n ''\n ]\n const sprites =\n isArray(symbols) && symbols.length > 0 ? SYMBOLS.concat(symbols) : SYMBOLS\n const $body = document.body\n let $icons = document.querySelector('#svg-sprites')\n\n if ($icons) {\n $icons.innerHTML = sprites.join('')\n } else {\n $icons = document.createElement('div')\n $icons.innerHTML =\n ``\n $body.insertBefore($icons.firstChild, $body.firstChild)\n }\n}\n\n/**\n * 创建 SVG 图标 DOM 元素\n * ========================================================================\n * @method createSvgIcon\n * @param {String} name\n * @param {Number|String|Array} [size]\n * @param {String} [color]\n * @param {String} [iconSet]\n * @returns {HTMLElement}\n */\nexport const createSvgIcon = (\n name,\n size = 0,\n color = '',\n iconSet = 'outline'\n) => {\n const binds = iconSet\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\n : `xlink:href=\"#icon-${name}\"`\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 svg =\n `` +\n `` +\n ``\n const $icon = document.createElement('i')\n\n $icon.className = 'outline-icon'\n $icon.innerHTML = svg\n\n return $icon\n}\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 'className':\n el.className = value\n break\n default:\n el.setAttribute(attr, value)\n break\n }\n}\n\nexport default setAttribute\n","import hasOwn from '../lang/hasOwn'\nimport isObject from '../types/isObject'\nimport isString from '../types/isString'\nimport isArray from '../types/isArray'\nimport isDOM from '../types/isDOM'\nimport setAttribute from './setAttribute'\n\n/**\n * 创建 DOM 节点,并添加属性和子节点\n * ========================================================================\n * @method createElement\n * @param {String} tagName - 标签名称\n * @param {Object|Array} attrs - 属性对象或者子节点\n * @param {Array} [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 Object.keys(attrs).forEach((attr) => {\n if (hasOwn(attrs, attr)) {\n setAttribute($el, attr, attrs[attr])\n }\n })\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\n attrs.forEach((child) => {\n append(child)\n })\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 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?.contains) {\n return el.classList.contains(className)\n }\n\n return !!pattern.exec(allClass)\n}\n\nexport default hasClass\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 _resetHeading = ($heading, hasAnchor = true, isAtStart = true) => {\n const CLS_HEADING = 'outline-heading'\n const text = $heading.innerHTML\n let $anchor\n\n $heading.innerHTML = text.replace(/^\\d+(?:(\\.?\\d*)*\\s?)?/gi, '')\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 $heading.removeChild($anchor)\n}\n\nexport default _resetHeading\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'\n\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\nimport _getChaptersWithCode from './_getChaptersWithCode'\n\nconst getChapters = (headings, showCode = true) => {\n let previous = 1\n let level = 0\n const chapters = []\n\n headings.forEach((heading, i) => {\n const headingLevel = heading.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 chapters.push({\n id: i,\n pid: pid,\n level: level,\n rel: `heading-${i}`,\n text: stripTags(trim(heading.innerHTML))\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","const _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 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 = chapters.filter((b) => b.pid === c.id)\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 Base from './base'\n\n// 在文章的标题生成 anchor 链接\nimport isString from './utils/types/isString'\nimport isFunction from './utils/types/isFunction'\nimport isElement from './utils/types/isElement'\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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\n\nimport _updateHeading from './_updateHeading'\nimport _resetHeading from './_resetHeading'\nimport getChapters from './getChapters'\n\nclass Anchors extends Base {\n constructor(options) {\n super()\n\n this.attrs = Anchors.DEFAULTS\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n\n this.chapters = []\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\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(this.$headings)\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 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 $headings = this.$headings\n const chapters = this.getChapters()\n\n paintSvgSprites()\n\n $headings.forEach(($heading, i) => {\n const chapterCode = chapters[i].code\n _updateHeading($heading, i, {\n hasAnchor,\n isAtStart,\n showCode,\n chapterCode,\n anchorURL\n })\n })\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\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 hasAnchor = this.attr('hasAnchor')\n const isAtStart = this.attr('isAtStart')\n const beforeDestroy = this.attr('beforeDestroy')\n const afterDestroy = this.attr('afterDestroy')\n const $headings = this.$headings\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n $headings.forEach(($heading) => {\n _resetHeading($heading, hasAnchor, isAtStart)\n })\n\n this.attr(Anchors.DEFAULTS)\n this.$articleElement = null\n this.$scrollElement = null\n this.$headings = []\n this.chapters = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\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 publish('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 addListeners() {\n const $articleElement = this.$articleElement\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 off($articleElement, 'click', this.onAnchorTrigger)\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}\n\nexport default Anchors\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","import trim from './utils/lang/trim'\nimport createElement from './utils/dom/createElement'\nimport setAttribute from './utils/dom/setAttribute'\n\nimport { createSvgIcon } from './utils/icons'\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 keys = Object.keys(attrs)\n const text = trim($heading.innerHTML)\n let $anchor\n let $icon\n\n keys.forEach((prop) => {\n setAttribute($heading, prop, attrs[prop])\n })\n\n if (showCode) {\n $heading.innerHTML = chapterCode + ' ' + text\n }\n\n if (!hasAnchor) {\n return false\n }\n\n $icon = createSvgIcon('hash')\n $anchor = createElement(\n 'a',\n {\n id: `anchor-${i}`,\n className: `${CLS_HEADING}__anchor anchor-${i}`,\n href: anchorURL ? 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","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","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 isFunction from './utils/types/isFunction'\nimport addClass from './utils/dom/addClass'\nimport removeClass from './utils/dom/removeClass'\nimport createElement from './utils/dom/createElement'\nimport on from './utils/event/on'\nimport off from './utils/event/off'\n\nimport { paintSvgSprites, createSvgIcon } from './utils/icons'\nimport zIndex from './zIndex'\n\nclass Drawer extends Base {\n constructor(options) {\n super()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = true\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 this.zIndex = 0\n\n if (options) {\n this.initialize(options)\n }\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 const $fragment = document.createDocumentFragment()\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 paintSvgSprites()\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 [createSvgIcon('close', 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(\n 'div',\n {\n className: 'outline-drawer__main'\n },\n ['']\n )\n this.$main = $main\n\n if (!hasPadding) {\n addClass($main, 'outline-drawer_full')\n }\n\n $footer = createElement(\n 'footer',\n {\n className: 'outline-drawer__footer'\n },\n ['']\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(\n 'div',\n {\n className: 'outline-drawer__overlay'\n },\n ['']\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 $fragment.appendChild($el)\n document.body.appendChild($fragment)\n\n if (isFunction(mounted)) {\n mounted.call(this)\n }\n\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()\n\n this.attrs = Drawer.DEFAULTS\n this.title = ''\n this.closed = false\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 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 $el = this.$el\n\n if (hasClose) {\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\n }\n\n if (hasOverlay) {\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 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 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 publish from './utils/observer/emit'\n\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport _paintChapters from './_paintChapters'\n\nclass Chapters extends Base {\n constructor(options) {\n super()\n\n this.attrs = Chapters.DEFAULTS\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.chapters = []\n this.closed = false\n this.active = 0\n this.offsetTop = 0\n this.offsetWidth = 0\n this.$active = null\n this.scrollTimer = null\n this.resizeTimer = null\n this.playing = false\n this.Observer = null\n\n if (options) {\n this.initialize(options)\n }\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 _paintEdge() {\n const STICKY = 'outline-chapters_sticky'\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const title = this.attr('title')\n const customClass = this.attr('customClass')\n const $parentElement = this.$parentElement\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()) {\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(\n 'ul',\n {\n // 为优化性能,添加了 _fixed 和 _hidden\n // fixed 为了让 $list 脱离流布局\n // hidden 让 $list 不可见\n className: `outline-chapters__list ${FIXED} ${HIDDEN}`\n },\n ['']\n )\n this.$list = $list\n\n $placeholder = createElement(\n 'div',\n {\n className: 'outline-chapters__placeholder'\n },\n ['']\n )\n this.$placeholder = $placeholder\n\n $main = createElement(\n 'div',\n {\n className: 'outline-chapters__main'\n },\n [$list, $placeholder]\n )\n this.$main = $main\n contents.push($main)\n\n $el = createElement(\n 'nav',\n {\n id: 'outline-chapters',\n className: 'outline-chapters'\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\n $parentElement.appendChild($el)\n\n return this\n }\n\n render() {\n const FIXED = 'outline-chapters_fixed'\n const HIDDEN = 'outline-chapters_hidden'\n const showCode = this.attr('showCode')\n const mounted = this.attr('mounted')\n const $parentElement = this.$parentElement\n let $el\n let $list\n\n if (!$parentElement) {\n return this\n }\n\n this._paintEdge()\n\n $list = this.$list\n _paintChapters($list, this.chapters, showCode)\n removeClass($list, FIXED)\n removeClass($list, HIDDEN)\n this.positionPlaceholder(this.active)\n\n $el = this.$el\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 this.onObserver()\n\n return this\n }\n\n positionPlaceholder(index) {\n const $main = this.$main\n const $list = this.$list\n const $placeholder = this.$placeholder\n const $anchor = $list.querySelector('.outline-chapters__anchor')\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 (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 // top:calc(${offsetTop}px + ${top}px);\n $placeholder.style.cssText = `transform: translateY(${\n offsetTop + top\n }px);height:${height}px;`\n\n return this\n }\n\n highlight(id) {\n const $anchor = this.$el.querySelector(`#chapter__anchor-${id}`)\n const HIGHLIGHT = 'outline-chapters_active'\n\n if (!$anchor) {\n return this\n }\n\n if (this.$active) {\n removeClass(this.$active, HIGHLIGHT)\n }\n\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\n this.$active = $anchor\n addClass(this.$active, HIGHLIGHT)\n\n this.positionPlaceholder(this.active)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n removeClass($parent, HIDDEN)\n removeClass($el, HIDDEN)\n later(() => {\n removeClass($parent, FOLDED)\n removeClass($el, FOLDED)\n }, 30)\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 $el = this.$el\n const $parent = this.$parentElement\n\n if (this.isInside()) {\n addClass($parent, FOLDED)\n addClass($el, FOLDED)\n later(() => {\n addClass($parent, HIDDEN)\n addClass($el, HIDDEN)\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()\n this.$parentElement.removeChild(this.$el)\n\n this.attr(Chapters.DEFAULTS)\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.chapters = []\n this.active = 0\n this.offsetTop = 0\n this.$active = null\n this.closed = false\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 (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n if (this.Observer) {\n this.Observer = null\n }\n\n return this\n }\n\n onObserver() {\n const selector = this.attr('selector')\n let timer = null\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 (timer) {\n clearTimeout(timer)\n }\n\n timer = 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 publish('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 publish('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 (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($element, 'resize', this.onResize, this, true)\n }\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 (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($element, 'resize', this.onResize)\n }\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 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'\n\nconst _paintChapters = ($list, chapters, showCode = false) => {\n const byId = (id) => document.getElementById(id)\n\n chapters.forEach((chapter) => {\n const pid = chapter.pid\n const id = chapter.id\n const rel = chapter.rel\n const $text = createElement(\n 'span',\n {\n className: 'outline-chapters__text'\n },\n [chapter.text]\n )\n const $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 [$text]\n )\n let $code\n let $li\n let $ul\n let $parent\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 $link.insertBefore($code, $link.firstChild)\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 $parent = byId(`chapter-${pid}`)\n $ul = byId(`subject-${pid}`)\n\n if (!$ul) {\n $ul = createElement(\n 'ul',\n {\n id: 'subject-' + pid,\n className: 'outline-chapters__subject'\n },\n [$li]\n )\n\n $parent.appendChild($ul)\n } else {\n $ul.appendChild($li)\n }\n }\n })\n}\n\nexport default _paintChapters\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 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 { createSvgIcon } from './utils/icons'\nimport createElement from './utils/dom/createElement'\nimport addClass from './utils/dom/addClass'\n\nconst _createButton = (button, rounded = true) => {\n const $icon = createSvgIcon(button.icon, button.size)\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 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 publish from './utils/observer/emit'\nimport { paintSvgSprites } from './utils/icons'\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.attrs = Toolbar.DEFAULTS\n this.$el = null\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (options) {\n this.initialize(options)\n }\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 rounded = this.attr('rounded')\n const placement = this.attr('placement')\n const $buttons = document.createDocumentFragment()\n const $fragment = document.createDocumentFragment()\n\n paintSvgSprites()\n\n buttons.forEach((button) => {\n const $button = _createButton(button, rounded)\n\n $buttons.appendChild($button)\n this.buttons.push({\n name: button.name,\n $el: $button\n })\n })\n\n this.$el = createElement(\n 'div',\n {\n id: 'outline-toolbar',\n className: `outline-toolbar outline-toolbar_${placement}`\n },\n [$buttons]\n )\n $fragment.appendChild(this.$el)\n document.body.appendChild($fragment)\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 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 let $el = this.$el\n\n if (isFunction(beforeDestroy)) {\n beforeDestroy.call(this)\n }\n\n this.removeListeners()\n document.body.removeChild($el)\n $el = null\n\n this.attr(Toolbar.DEFAULTS)\n this.disabled = false\n this.closed = false\n this.buttons = []\n\n if (isFunction(afterDestroy)) {\n afterDestroy.call(this)\n }\n\n return this\n }\n\n refresh() {\n const $el = this.$el\n const buttons = this.attr('buttons') || []\n\n this.removeListeners()\n $el.innerHTML = ''\n\n buttons.forEach((button) => {\n this.$el.appendChild(_createButton(button))\n })\n\n this.addListeners()\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 publish(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","/**\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 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","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 Base from './base'\nimport Anchors from './anchors'\nimport Drawer from './drawer'\nimport Chapters from './chapters'\nimport Toolbar from './toolbar'\n\nimport later from './utils/lang/later'\nimport isFunction from './utils/types/isFunction'\nimport scrollTo from './utils/dom/scrollTo'\nimport _getScrollElement from './utils/dom/_getScrollElement'\nimport subscribe from './utils/observer/on'\nimport unsubscribe from './utils/observer/off'\n\nclass Outline extends Base {\n constructor(options) {\n super()\n\n this.attrs = Outline.DEFAULTS\n this.anchors = null\n this.drawer = null\n this.chapters = null\n this.toolbar = null\n\n if (options) {\n this.initialize(options)\n }\n }\n\n initialize(options) {\n this.attr(options).render().addListeners()\n return this\n }\n\n getChapters(isTreeStructured = false) {\n return this.anchors.getChapters(isTreeStructured)\n }\n\n count() {\n return this.anchors.count()\n }\n\n render() {\n this._renderAnchors()._renderChapters()._renderToolbar()\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\n this.anchors = new Anchors({\n articleElement,\n stickyHeight,\n scrollElement,\n selector,\n showCode,\n anchorURL,\n afterScroll\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 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 position,\n title,\n stickyHeight,\n chapters: this.anchors.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 customClass,\n afterClosed: () => {\n const toolbar = this.toolbar\n toolbar.toggle()\n }\n })\n parentElement = this.drawer.$main\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 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 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 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 buttons.push(UP)\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 (count > 0) {\n buttons.push(MENU)\n }\n buttons.push(DOWN)\n\n this.toolbar = new Toolbar({\n placement,\n buttons: buttons\n })\n\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 }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'up')\n }\n }\n\n chapters.playing = true\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 > 1) {\n chapters.highlight(count - 1)\n }\n chapters.playing = false\n\n if (isFunction(afterScroll)) {\n afterScroll.call(toolbar, 'bottom')\n }\n }\n\n chapters.playing = true\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 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 (position !== 'relative') {\n chapters.toggle()\n toolbar.highlight('menu')\n } else {\n toolbar.toggle()\n\n if (count < 1) {\n return this\n }\n\n later(() => {\n if (chapters.isInside()) {\n chapters.toggle()\n } else {\n drawer.toggle()\n }\n })\n }\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 toolbar = this.toolbar\n const isOutside = chapters.isOutside()\n const count = this.count()\n\n this.removeListeners()\n\n if (count > 0) {\n chapters.destroy()\n chapters = null\n\n if (isOutside) {\n drawer.destroy()\n drawer = null\n }\n }\n\n toolbar.destroy()\n toolbar = null\n\n anchors.destroy()\n anchors = null\n\n this.attr(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 subscribe('toolbar:update', this.onToolbarUpdate, this)\n subscribe('toolbar:action:up', this.onScrollTop, this)\n subscribe('toolbar:action:toggle', this.onToggle, this)\n subscribe('toolbar:action:down', this.onScrollBottom, this)\n return this\n }\n\n removeListeners() {\n unsubscribe('toolbar:update')\n unsubscribe('toolbar:action:up')\n unsubscribe('toolbar:action:toggle')\n unsubscribe('toolbar:action:down')\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 showCode: true,\n anchorURL: '',\n stickyHeight: 0,\n homepage: '',\n git: '',\n tags: '',\n issues: '',\n customClass: '',\n afterSticky: null,\n afterToggle: null,\n afterScroll: 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":["isString","str","hasOwn","obj","prop","hasOwnProperty","Object","prototype","call","toString","val","apply","isFunction","isObject","o","Base","constructor","options","this","attrs","initialize","attr","render","addListeners","value","origin","source","keys","forEach","arguments","length","destroy","removeListeners","reload","isElement","nodeName","tagName","nodeType","later","fn","delay","setTimeout","easeInQuad","x","_getScrollElement","scrollElement","$rootElements","$scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","offsetTop","el","offsetParent","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","indexOf","_delegateListener","listeners","_listeners","index","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","filter","getListeners","$child","off","on","data","context","once","evt","target","getTarget","delegateTarget","ctx","includeCTX","startsWith","closest","overrideContext","push","addEventListener","stopPropagation","preventDefault","_subscribers","_hasDirectSubscribersFor","topic","has","isDirect","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","isArray","Array","paintSvgSprites","symbols","SYMBOLS","sprites","concat","$body","body","$icons","innerHTML","join","createElement","insertBefore","firstChild","createSvgIcon","name","size","color","iconSet","binds","width","height","defaultRules","svg","$icon","className","trim","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","hasClass","pattern","RegExp","allClass","classList","contains","exec","removeClass","remove","_resetHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","text","$anchor","removeAttribute","removeChild","getChapters","headings","showCode","previous","level","chapters","heading","headingLevel","current","parseInt","pid","differ","_getChapterParentIdByDiffer","id","rel","groups","group","JSON","stringify","cb","code","String","c","b","_getChaptersWithCode","Anchors","super","DEFAULTS","$articleElement","$headings","created","articleElement","isTreeStructured","list","nodeKey","parentKey","map","roots","item","node","toTree","count","mounted","anchorURL","chapterCode","headingId","href","_updateHeading","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","max","clientHeight","publish","min","addClass","add","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","open","opened","close","toggle","afterToggle","onClose","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Chapters","$list","$placeholder","$parentElement","active","offsetWidth","$active","scrollTimer","resizeTimer","playing","Observer","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","contents","calculateStickyHeight","byId","getElementById","chapter","$text","$link","$code","$li","$ul","_paintChapters","positionPlaceholder","sticky","onObserver","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","highlight","HIGHLIGHT","getAttribute","afterSticky","FIXED","isStickying","Math","window","innerHeight","show","FOLDED","HIDDEN","hide","clearTimeout","timer","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","_createButton","button","rounded","icon","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","find","option","ACTIVE","$buttons","disable","action","switch","enabled","enable","refresh","command","afterDisabled","afterEnabled","guid","uuid","prefix","token","subject","_removeSubscriber","execution","j","_removeSubscriberByToken","Outline","anchors","drawer","toolbar","_renderAnchors","_renderChapters","_renderToolbar","CHAPTERS_OPTIONS","homepage","git","tags","issues","HOME","GIT","TAGS","ISSUES","MENU","toTop","toBottom","floor","onToggle","onScrollTop","onScrollBottom","onToolbarUpdate","ceil","subscribe","unsubscribe","jQuery","extend","outline","$article"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 971b5483..50c17847 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@yaohaixiao/outline.js", - "version": "3.11.0", + "version": "3.12.0", "description": "outline.js - 自动生成文章导读(Table of Contents)导航的 JavaScript 工具。", "main": "outline.min.js", "scripts": { diff --git a/src/_getChaptersWithCode.js b/src/_getChaptersWithCode.js index bfc153d0..f2f93321 100644 --- a/src/_getChaptersWithCode.js +++ b/src/_getChaptersWithCode.js @@ -18,10 +18,9 @@ const _getChaptersWithCode = (chapters) => { Object.keys(groups).forEach((group) => { groups[group].forEach((c) => { - chapters.forEach((o) => { - if (o.pid === c.id) { - o.code = c.code + '.' + o.index - } + const subjects = chapters.filter((b) => b.pid === c.id) + subjects.forEach((o) => { + o.code = c.code + '.' + o.index }) }) })