diff --git a/docs/js/navigator.min.js b/docs/js/navigator.min.js index 0ab28b3..532db1e 100644 --- a/docs/js/navigator.min.js +++ b/docs/js/navigator.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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},C=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?C(t[i]):t[i]))),e)},w=[];let O,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?O=requestIdleCallback(j):(O=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),O||requestIdleCallback(j)},L={},I=t=>g(L,t)&&L[t].length>0,q=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?I(t):(t=>{let e=I(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=I(t);return e})(t)},z=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!I(t))return!1;L[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!q(t))return!1;s?setTimeout(n,10):n()},F=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),H=t=>{if(!g(L,t))return!1;delete L[t]},D=(t,e)=>{if(!q(t))return!1;e?(t=>{const e=Object.keys(L);if(!t||e.length<1)return!1;e.forEach((e=>{const i=L[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&H(s)}))})(e):H(t)};class P{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return z(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=F();let n="symbol"==typeof t?t.toString():t;i(e)&&(L[n]||(L[n]=[]),L[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return D(t,e),this}addListeners(){return this}removeListeners(){return this}}class M extends P{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=C(M.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=parseInt(k(e,"padding-top"),10),l=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),a=parseInt(k(i,"margin-top"),10),h=parseInt(k(i,"border-top-width"),10);let c,u=s.offsetHeight,d=0;return r?(n&&(d+=n),o&&(d+=o),a&&(d+=a),l&&(d+=l),h&&(d+=h),c=u*t,d+c):this}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",l="outline-navigator_highlight";let o=null,a=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(x(this.$active,l),x(this.$active,s)),this.$active=o,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,l),n((()=>{((t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)})(this.$active,this.$main)||(a=this._getPlaceholderOffset(this.active),$(this.$main,a))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return M.DEFAULTS=C({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),M})); +!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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},O=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?O(t[i]):t[i]))),e)},w=[];let C,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?C=requestIdleCallback(j):(C=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),C||requestIdleCallback(j)},L=(t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)},I={},q=t=>g(I,t)&&I[t].length>0,z=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?q(t):(t=>{let e=q(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=q(t);return e})(t)},F=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!q(t))return!1;I[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!z(t))return!1;s?setTimeout(n,10):n()},H=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),D=t=>{if(!g(I,t))return!1;delete I[t]},P=(t,e)=>{if(!z(t))return!1;e?(t=>{const e=Object.keys(I);if(!t||e.length<1)return!1;e.forEach((e=>{const i=I[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&D(s)}))})(e):D(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return F(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=H();let n="symbol"==typeof t?t.toString():t;i(e)&&(I[n]||(I[n]=[]),I[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return P(t,e),this}addListeners(){return this}removeListeners(){return this}}class R extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=O(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),l=parseInt(k(i,"padding-top"),10),o=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),l&&(c+=l),o&&(c+=o),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let l=null,o=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(x(this.$active,r),x(this.$active,s)),this.$active=l,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,r),n((()=>{console.log(!L(this.$active,this.$main)),L(this.$active,this.$main)||(o=this._getPlaceholderOffset(this.active),console.log("placeholderOffsetTop",o),$(this.$main,o))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return R.DEFAULTS=O({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),R})); //# sourceMappingURL=navigator.min.js.map diff --git a/docs/js/navigator.min.js.map b/docs/js/navigator.min.js.map index ebcd531..10acff0 100644 --- a/docs/js/navigator.min.js.map +++ b/docs/js/navigator.min.js.map @@ -1 +1 @@ -{"version":3,"file":"navigator.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/createElement.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取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","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 isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"navigator.min.js","sources":["../../utils/types/isString.js","../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/types/isObject.js","../../utils/types/isElement.js","../../utils/lang/later.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/at.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/types/isArray.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/lang/hasOwn.js","../../utils/dom/createElement.js","../../utils/dom/setAttributes.js","../../utils/dom/setAttribute.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/dom/removeClass.js","../../utils/lang/trim.js","../../utils/dom/offsetTop.js","../../utils/dom/getStyle.js","../../utils/dom/setProperty.js","../../utils/lang/cloneDeep.js","../../utils/lang/timeSlice.js","../../utils/dom/inBounding.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/lang/extend.js","../../utils/observer/on.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/intersection.js","../../utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取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","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 isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n console.log(!inBounding(this.$active, this.$main))\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n console.log('placeholderOffsetTop', placeholderOffsetTop)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","console","log","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"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 5e7bb36..2d56cfa 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=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!e(t)&&setTimeout((()=>{t()}),s)},i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),n=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?n(t[s]):t[s]))),e)},l=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),a=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},h=(t,e)=>{var s;let i,r;if(a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},c=t=>t*t,d=function(){let t,e,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?l(s)?e=document.querySelector(s):o(s)&&(e=s):(t=document.querySelectorAll("html,body"),e=t[0].scrollTop-t[1].scrollTop>=0?t[0]:t[1]),e},u=(t,s,i)=>{const r=d(t);let n=r.scrollTop,l=0;const o=s-n,a=r.scrollHeight,h=s-a<=0?s:a,u=t=>(e(i)&&i(t),!1),m=()=>{if(l+=1,o<0){if(n-=c(l),r.scrollTop=n,n<=s)return r.scrollTop=s,u(s)}else if(n+=c(l),r.scrollTop=n,n>=h)return r.scrollTop=h,u(h);requestAnimationFrame(m)};requestAnimationFrame(m)},m=t=>!!l(t)&&t.replace(/(^\s+)|(\s+$)/g,""),p=function(t){let s=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=1,o=0,a="";const h=[];return t.forEach(((t,s)=>{const r=t.tagName,c=r.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>n?(o+=1,u=1===o?-1:s-1):d===n||do?1===d?(o=1,u=-1):u=h[s-1].pid:d<=o&&(1===d?o=1:(o-=n-d,o<=1&&(o=1)),u=1===o?-1:((t,e,s)=>{let i,r,n=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(a=i(a)),h.push({id:s,pid:u,level:o,rel:`heading-${s}`,text:a,tagName:r})})),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((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h},g=t=>{const{articleElement:s,selector:i,showCode:r,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],d=[],u=t=>t.replace(/\(.*?\)/,"()");return l(s)?h=document.querySelector(s):o(s)&&(h=s),h?(e(n)&&(u=n),c=[...h.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")],d=p(c,r||!0,u),!0===a?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const n=t[i[e[s]]];-1!==e[s]?n.children.push(e):r.push(e)})),r})(d,"id","pid"):d):d},f=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},b=(t,e)=>{Object.keys(e).forEach((s=>{f(e,s)&&(t[s]=e[s])}))},v={},y=t=>f(v,t)&&v[t].length>0,$=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?y(t):(t=>{let e=y(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=y(t);return e})(t)},_=function(e,s){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=e=>{if(!y(e))return!1;v[e].forEach((e=>{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(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},n=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!$(e))return!1;i?setTimeout(n,10):n()},x=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),T=t=>{if(!f(v,t))return!1;delete v[t]},w=(t,e)=>{if(!$(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&&T(i)}))})(e):T(t)};class E{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return l(t)?e&&f(s,t)?(s[t]=e,this):s[t]:i(t)?(b(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return _(t,e),this}$on(t,s){return function(t,s){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=x();let n="symbol"==typeof t?t.toString():t;e(s)&&(v[n]||(v[n]=[]),v[n].push({topic:n,callback:s,context:i,token:r}))}(t,s,this),this}$off(t,e){return w(t,e),this}addListeners(){return this}removeListeners(){return this}}const C=[];let S,z;function L(t){for(;t.timeRemaining()>0&&C.length;){const t=C.shift();if(!e(t))return!1;t()}C.length?S=requestIdleCallback(L):(S=0,e(z)&&(z(),z=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const k=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;C.push(t),e(s)&&(z=s),S||requestIdleCallback(L)},M=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=M(t.offsetParent)),e},N=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},A=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,H=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],O=(t,e,s)=>{const i=H.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 n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},D=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=l(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return l(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{O(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&D(t,e,s)}))},F=(t,s,i)=>{if(!e(i))return D(t,s),!1;O(t,s,i)},q=function(t,e,s,i,r,n){let l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const o=H.indexOf(s)>-1,a=function(o){const h=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&&N(t,e):N(t,e))||i&&t===r)return t;if(t===r)break}while(t=A(t))})(h,e,t);let d=n||t;o.delegateTarget=c,!0===n&&(d=r),c&&(!0===l&&F(t,s,a),i.call(d,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},j=function(t){t.stopPropagation(),t.preventDefault()},R=['','','','','','','','','','','','','','','','','','','',''],I=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";return l(t)?function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";const s=/id="(.*?)"/,i=/^(\w+)-/;return R.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))}(t,e):[...R]},U=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===R.indexOf(t)&&l(t)&&R.push(t)})):l(t)&&R.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(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"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];f(e,s)&&P(t,s,i)}))},W=(t,e,s)=>{const n=document.createDocumentFragment(),o=document.createElement(t),a=t=>B(t)||l(t),h=t=>{let e;if(!a(t))return!1;B(t)?e=t:l(t)&&(e=document.createTextNode(t)),n.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>a(t)))?e.forEach((t=>{h(t)})):B(e)?h(e):l(e)&&h(document.createTextNode(e)),r(s)?s.forEach((t=>{h(t)})):h(s),o.appendChild(n),o},Q=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s="outline-icon",i=e.size||0,n=e.color||"",o=e.iconSet||"",a=r(i)?i[0]:i,h=r(i)?i[1]:i,c=i?`width:${a}px;height:${h}px;`:"",d=n?c+`color:${n}`:c,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return l(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return l(t)&&e.test(t)})(t)?f=t:(g=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${s} ${u.className}`:u.className=s,V(m,u),p=m.querySelector("svg"),V(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),m):null},J=function(t){return Q(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})},Y=(t,e)=>{var s;let i,r=t.className;if(!r||!a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(r=m(r.replace(e,"")),t.className=r)},G=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const i="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),Y(t,i),!e)return!1;var o;n=t.querySelector(`.${i}__anchor`),s&&Y(t,`${i}_start`),o=m(t.className),l(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class K extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let s,i,r,n;return this.attr(t),n=this.attr("articleElement"),i=this.attr("scrollElement"),s=this.attr("created"),l(n)?r=document.querySelector(n):o(n)&&(r=n),r?(this.$articleElement=r,this.$scrollElement=d(i),this.$headings=this.getHeadings(),this.$headings.length<1||(e(s)&&s.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return[...t.querySelectorAll(e)]}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter"),n=this.attr("mounted"),l=g({articleElement:t,selector:s,showCode:i,chapterTextFilter:r});return U(),this._paint(l),e(n)&&n.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),i=this.attr("isAtStart"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.count(),o=[...this.$headings],a=(l,o)=>{l.forEach(((l,a)=>{const h=a+o*e,c=t[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,n=s.isAtStart||!0,l=s.showCode||!1,o=s.chapterCode||"",a=s.anchorURL||"",h=`heading-${e}`,c={id:h,className:n?`${i} ${i}_start`:i,"data-id":e},d=m(t.innerHTML);let u,p;if(l&&(c.innerHTML=o+" "+d,c["data-code"]=o),V(t,c),!r)return!1;p=J("hash",{iconSet:"outline"}),u=W("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:a||`#${h}`,target:a?"_blank":"self","data-id":e},p),t.appendChild(u)})(l,h,{hasAnchor:s,isAtStart:i,showCode:r,chapterCode:c,anchorURL:n})}))};let h=-1;if(l>e)for(h+=1,a(o.splice(0,e),0);o.length>0;){const t=o.splice(0,e);k((()=>{a(t,h+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else a(o,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((s=>{G(s,t,e)})),this}refresh(t){const e=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r})),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=M(l)-(n+10),a=this.$scrollElement,h=a.scrollHeight-a.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:h})}))})),i||j(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||q(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return this.count()<1||F(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS=n({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,chapterTextFilter:null});const X=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],Z=t=>{let e,s,i;return!!l(t)&&(e=m(t).slice(0,1e3),s=/\s*|]*>|]*>|]+>/i,i=new RegExp(X.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),s.test(e)||i.test(e))},tt=t=>t.replace(/]*>.*?<\/script>/gi,""),et=(t,e)=>{document.documentElement.style.setProperty(t,e)};let st=2e3;const it=t=>(t?st=t:st+=1,et("--outline-zIndex",`${st}`),st);class rt extends E{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=n(rt.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,this}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.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"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),n=this.attr("hasOverlay"),l=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("customClass");let d,u,m,p,g,f,b,v;return U(),this.zIndex=it(),p=W("h2",{className:"outline-drawer__title"},this.title),this.$title=p,r&&(g=W("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=g),m=W("header",{className:"outline-drawer__header"},[p,g]),this.$header=m,f=W("div",{className:"outline-drawer__main"}),this.$main=f,o||h(f,"outline-drawer_full"),b=W("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=W("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[m,f,b]),this.$modal=u,l&&h(u,"outline-drawer_offset"),a&&h(u,"outline-drawer_auto"),c&&h(u,c),n&&(v=W("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=W("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),e(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let s=null;return e(t)?s=t():B(t)?s=t:Z(t)&&(s=((t,e)=>{const s=document.createDocumentFragment();if(!t||!Z(t)&&!l(t)&&!o(t))return null;if(Z(t)){const e=W("div");let i=[];return e.innerHTML=tt(t),i=[...e.childNodes],i.forEach((t=>{s.appendChild(t)})),s}if(!l(e))return t.innerHTML;t.innerHTML=tt(e)})(t)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return h(this.$el,"outline-drawer_opened"),Y(i,"outline-drawer_closed"),h(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return Y(i,"outline-drawer_opened"),h(i,"outline-drawer_closed"),s((()=>{Y(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners()._remove()._default(),i-=1,it(i),this.zIndex=0,e(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),i=this.$el;return t&&q(i,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&q(i,".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?(F(s,"click",this.onClose),this):this}}rt.DEFAULTS=n({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const nt=function(t,s,i,r,n){let l=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const o=H.indexOf(s)>-1,a=function(e){let o=n||t;!0===n&&(o=r),!0===l&&F(t,s,a),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},lt=(t,e)=>getComputedStyle(t)[e];class ot extends E{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=n(ot.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let s,i,r,n;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),l(i)?n=document.querySelector(i):o(i)&&(n=i),this.$parentElement=n,this.$scrollElement=d(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,c,d,u=null;return r?(this.isInside()&&e&&(u=W("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),c=W("ul",{className:"outline-navigator__list"}),this.$list=c,n.push(c),s&&(d=W("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,n.push(d)),a=W("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=W("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),h(o,"outline-navigator_sticky")),i&&h(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),i=this.$parentElement,r=this.chapters,n=this.count();let l;return!i||r.length<1||(this.isInside()&&h(i,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(r),s((()=>{this.highlight(this.active)}),60),this.offsetTop=M(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),et("--outline-navigator-width",`${this.offsetWidth}px`)),e(t)&&t.call(this),n<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=e.length,r=[...e],n=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=W("span",{className:"outline-navigator__text"},e.text);let c,d,u,m,p;s&&(d=W("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(d)),a.push(h),c=W("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),u=W("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(u):(m=W("ul",{id:"subject-"+r,className:"outline-navigator__subject"},u),p.appendChild(m)))}))};if(i>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);k((()=>{n(t)}))}else n(r)}(this.$list,t,e),Y(s,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return Y(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,s=this.$list,i=s.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=parseInt(lt(e,"padding-top"),10),l=parseInt(lt(e,"border-top-width"),10),o=parseInt(lt(s,"padding-top"),10),a=parseInt(lt(s,"margin-top"),10),h=parseInt(lt(s,"border-top-width"),10);let c,d=i.offsetHeight,u=0;return r?(n&&(u+=n),o&&(u+=o),a&&(u+=a),l&&(u+=l),h&&(u+=h),c=d*t,u+c):this}positionPlaceholder(t){const e=this.$list,s=this.$placeholder,i=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=i.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),s.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",n="outline-navigator_highlight";let l=null,a=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(Y(this.$active,n),Y(this.$active,r)),this.$active=l,h(this.$active,r),i?this.positionPlaceholder(this.active):h(this.$active,n),s((()=>{((t,e)=>{let s,i;return!(!o(t)||!o(e))&&(s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),i.top>=s.top&&i.right<=s.right&&i.bottom<=s.bottom&&i.left>=s.left)})(this.$active,this.$main)||(a=this._getPlaceholderOffset(this.active),u(this.$main,a))})),this):this):this}sticky(){const t=this.attr("afterSticky"),s="outline-navigator_fixed",i=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?h(i,s):Y(i,s),e(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return et("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}show(){const t="outline-navigator_hidden",i=this.attr("afterOpened"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?Y(l,t):(Y(l,t),s((()=>{Y(l,"outline-navigator_folded")}),30)):Y(n,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-navigator_hidden",i=this.attr("afterClosed"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?h(l,t):(h(l,"outline-navigator_folded"),s((()=>{h(l,t)}))):h(n,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{n=r>=i,t.call(this,this.isClosed(),n)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),e(s)&&s.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=s.root||null,r=s.selector||".outline-heading",n=s.context||null,l={rootMargin:s.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(n||s.target,s.target)}))}),l),h=o(i)?i:document;return i&&(l.root=i),h.querySelectorAll(r).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,n=r.getAttribute("data-id"),l=r.href.split("#")[1],o=document.querySelector(`#${l}`),a=M(o)-(i+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),d=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(a,d),this.highlight(n)}),10)):(this.scrollTo(a,d),this.highlight(n)),j(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return this.count()<1||("html"!==s&&"body"!==s||(i=window),q(t,".outline-navigator__anchor","click",this.onSelect,this,!0),nt(i,"scroll",this.onScroll,this,!0),this.isSticky()&&nt(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return this.count()<1||("html"!==i&&"body"!==i||(r=window),F(e,"click",this.onSelect),F(r,"scroll",this.onScroll),this.isSticky()&&F(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ot.DEFAULTS=n({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const at=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},ht=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ct=[];let dt;U();class ut extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(ut.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),l=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&l.push("outline-message_round"),i||l.push("outline-message_full-width"),r&&l.push("outline-message_visible"),n&&l.push(n),l}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),l=this._getClassName(),o=[];let a,c,d,u,m,p=20;return i&&"default"===s&&(p=12),"plain"!==s&&(a=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:p}),h(a,"outline-message__icon"),o.push(a)),n?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(ht(tt(e))),c=W("p",{className:"outline-message__content"},[d]),o.push(c),r&&(u=J("close",{iconSet:"outline",size:18}),h(u,"outline-message__close"),o.push(u)),m=W("div",{className:l.join(" ")},o),m.style.cssText="top:-50px;",this.$el=m,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,n,l,o,a,c=20;return this.isDestroyed()?this:(l=e.querySelector(".outline-icon"),l?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?h(l,t):(Y(l,t),r&&"default"===i&&(c=12)),o=l.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),a=o.querySelector("use"),n="light"===i?`circle-${s}`:s,P(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ht(tt(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?h(s,t):Y(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return at(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,n,l;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),n=i&&i>=this.offset?i:this.offset,l=`top:${n}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,h(e,"outline-message_visible"),e.style.cssText=l,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",Y(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return q(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),q(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),q(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return F(t,"mouseenter",this.onMouseEnter),F(t,"mouseleave",this.onMouseLeave),F(t,"click",this.onClose),this}}ut.DEFAULTS=n({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{ut[t]=e=>{const s={},i=x("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return l(e)?s.message=e:at(e)&&b(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{ut.close(i,r)},dt=new ut(s),ct.forEach((t=>{n+=t.$el.offsetHeight+16})),dt.offset=n,dt.open(),ct.push(dt),dt}})),ut.close=(t,s)=>{const i=ct.length;let r,n,l=-1;if(ct.forEach(((i,r)=>{t===i.id&&(n=i.$el.offsetHeight,l=r,e(s)&&s.call(i),ct.splice(r,1))})),i<=1||-1===l||l>ct.length-1)return!1;for(r=l;r{let t=ct.length-1;for(;t>=0;t-=1)ct[t].close()};class mt{constructor(t,s){this.name=t,e(s)&&(this.action=s)}execute(){return this.action(),this}}class pt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const s=this.commands.find((e=>e.name===t));return e(null==s?void 0:s.execute)&&s.execute(),this}}const gt=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=W("a",{className:"outline-toolbar__anchor",href:t.link},s),r=W("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":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},ft="outline-toolbar_disabled",bt="outline-toolbar_hidden";class vt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(vt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let s;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new pt,s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const s=this,{action:i,name:r}=t;let n,o,a=null,h=null;return i?(h=i.handler,n=i.context||this,e(h)?o=h:l(h)&&(o=function(){s.$emit(h,r)}),e(o)&&(a=new mt(r,o.bind(n))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("placement");return U(),this.$el=W("div",{id:x("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(s),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=gt(t,e),r=this._getCommand(t),{name:n,disabled:l,context:o}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:l||!1,context:o||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),n=this.attr("buttons")||[],{name:l,disabled:o,context:a}=t,h=this._getCommand(t),c=t=>{const e=gt(t);s.appendChild(e),n.push(t),this.buttons.push({$el:e,name:l,disabled:o||!1,context:a||this,command:h}),h&&this.commands.add(h)};return i(t)?c(t):r(t)&&t.forEach((t=>{i(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attrs("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),h(e.$el,ft)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),Y(e.$el,ft),this):this}disable(t){const s=this.attr("afterDisabled");return t?this._disable(t):(h(this.$el,ft),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,Y(this.$el,ft),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.get(t),n=this.$el;if(t){if(!r)return this;Y(r.$el,bt)}else Y(n,bt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.get(t),n=this.$el;if(t){if(!r)return this;h(r.$el,bt)}else h(n,bt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t),s="outline-toolbar_active";let i;return e?(i=e.$el,a(i,s)?Y(i,s):h(i,s),this):this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}addListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||q(e,".outline-toolbar__button","click",this.onExecute,this,!0),this}removeListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||F(e,".outline-toolbar__button",this.onExecute),this}}vt.DEFAULTS=n({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});class yt{constructor(t){this.utterance=new SpeechSynthesisUtterance,t&&this.initialize(t)}_initialize(t){return t.lang&&this.setLang(t.lang),t.pitch&&this.setPitch(t.pitch),t.rate&&this.setRate(t.rate),t.text&&this.setText(t.text),t.voice&&this.setVoice(t.voice),t.volume&&this.setVolume(t.volume),this}initialize(t){return this._initialize(t)._addListeners(),this}isSpeaking(){return speechSynthesis.speaking}isPending(){return speechSynthesis.pending}isPaused(){return speechSynthesis.paused}getVoices(){return speechSynthesis.getVoices()}setLang(t){return this.utterance.lang=t,this}setPitch(t){return this.utterance.pitch=t,this}setRate(t){return this.utterance.rate=t,this}setText(t){return this.utterance.text=t,this}setVoice(t){return this.utterance.voice=t,this}setVolume(t){return this.utterance.volume=t,this}speak(t){return t&&this.setText(t),speechSynthesis.speak(this.utterance),this}pause(){return speechSynthesis.pause(),this}resume(){return speechSynthesis.resume(),this}cancel(){return speechSynthesis.cancel(),this.setText(""),this}_addListeners(){const t=this.utterance,e=this;return["boundary","end","error","start","mark","pause","resume"].forEach((s=>{t[`on${s}`]=t=>{_(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{_("voiceschanged",{event:t,speech:e})},this}}yt.isSupport="speechSynthesis"in window;const $t=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&h(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},_t="进入阅读模式,按 ESC 键可退出阅读模式";class xt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(xt.DEFAULTS),this.reading=!1,this.$target=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e=null;return this.attr(t),e=this.attr("target"),l(e)?this.$target=document.querySelector(e):o(e)&&(this.$target=e),this.$target?(yt.isSupport&&(this.speech=new yt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=[...t.cloneNode(!0).children];return s((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$paper,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_renderEdge(){const t=this.$target;let e,i,r,n,l,a=this.attr("title");i=t.querySelector("h1"),o(a)&&(i=a),o(i)&&(a=i.innerText),i=W("h1",{className:"outline-reader__title"},a),this.$title=i,r=W("article",{id:"outline-reader__article",className:"outline-reader__article"}),this.$article=r,n=W("div",{className:"outline-reader__progress"}),this.$progress=n;const h=[];return yt.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:20,action:{context:this,handler:this.speak}}),h.push({name:"print",icon:"print",size:20,action:{context:this,handler:this.print}},{name:"exit",icon:"close",size:20,action:{context:this,handler:this.exit}}),this.toolbar=new vt({placement:"rtl",buttons:h}),e=W("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,i,r,this.toolbar.$el]),this.$paper=e,document.body.appendChild(e),s((()=>{l=e.previousElementSibling,$t(l,!0),l=e.nextElementSibling,$t(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||_t;return this.reading||!i||(r.forEach((t=>{h(t,s)})),h(i,e),Y(i,s),this.toolbar.show(),this.reading=!0,ut.info({round:!0,message:n}),this.$emit("enterReading")),this}exit(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling");return this.reading&&i?(h(i,s),Y(i,e),r.forEach((t=>{Y(t,s)})),this.toolbar.hide(),this.reading=!1,this.$emit("exitReading"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return yt.isSupport?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return e(print)?(print(),this):this}destroy(){return this.$paper?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),j(t)),this}addListeners(){return this.$paper?(nt(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this):this}removeListeners(){return this.$paper?(F(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this):this}}var Tt;xt.DEFAULTS=n({target:"",title:"",enterReadingTip:_t,allowSpeak:!1});class wt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){const t=wt.DEFAULTS;return this.attrs=n(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",s="",i=null;return this.attr(t),e=this.attr("articleElement"),s=this.attr("scrollElement"),l(e)?i=document.querySelector(e):o(e)&&(i=e),this.$article=i,this.$scrollElement=d(s),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const e=this.$article,s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this._updateToolbar({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}refresh(){const t=this.getChapters();return this.anchors.refresh(t),this.navigator.refresh(t),this.reader.refresh(),this}_renderReader(){const t=this.attr("reader");return t.target?(h(this.$article,"outline-article"),this.reader=new xt(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:n,afterScroll:l,chapterTextFilter:o}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),l=this.attr("closeOnClickModal"),o=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),d=this.attr("afterToggle"),u=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:s,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:d,afterScroll:u},"relative"===a?(this.drawer=new rt({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:l,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,o&&this.drawer.open()):p.customClass=i,p.parentElement=g,this.navigator=new ot(p)),this}_renderToolbar(){const t=this.attr("position"),s=this.attr("hasToolbar"),i=this.attr("showNavModalFirst"),r=this.attr("placement"),n=this.attr("homepage"),l=this.attr("git"),o=this.attr("tags"),a=this.attr("issues"),h=this.attr("tools"),c=this.attr("reader"),d=this.count(),u={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},m={name:"homepage",icon:"homepage",size:20,link:n},p={name:"github",icon:"github",size:20,link:l},g={name:"tags",icon:"tags",size:20,link:o},f={name:"issues",icon:"issues",size:20,link:a},b={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},y={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},$={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},_=[];return s?(_.push(u),d>0&&_.push(b),n&&_.push(m),l&&_.push(p),o&&_.push(g),a&&_.push(f),c.target&&(_.push(v),e(print)&&_.push(y)),(null==h?void 0:h.length)>0&&_.push(...h),_.push($),this.buttons=[..._],this.toolbar=new vt({placement:r,buttons:_}),"relative"===t&&i&&this.toolbar.hide(),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}_updateToolbar(t){let{top:e,min:s,max:i}=t;const r=this.toolbar,n=Math.ceil(e);return n<=s?(r.hide("up"),r.show("down")):n>=i?(r.hide("down"),r.show("up")):n>s&&n0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1,u(i.$main,0)),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=this.$scrollElement,i=this.toolbar,r=this.navigator,n=this.count(),l=Math.floor(s.scrollHeight-s.clientHeight);return n>0&&(r.playing=!0),this.scrollTo(l,(()=>{i.hide("down"),i.show("up"),n>0&&(r.highlight(n-1),u(r.$main,r.$main.scrollHeight),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return u(this.$scrollElement,t,e),this}enterReading(){const t=this.reader;return!t||t.reading||(this.toolbar.toggle(),t.enter()),this}exitReading(){const t=this.reader;return t&&t.reading?(this.toolbar.toggle(),t.exit(),this):this}switchReading(){const t=this.reader;return t?(t.toggle(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("toggle")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return this.reader.print(),this}_destroy(){const t=this.count();let e=this.anchors,s=this.navigator,i=this.drawer,r=this.reader,n=this.toolbar,l=!1;return this.removeListeners(),r&&r.destroy(),t>0&&s&&(l=s.isOutside(),s.destroy(),l&&i&&i.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}onToolbarUpdate(t){let{top:e,min:s,max:i}=t;return this._updateToolbar({top:e,min:s,max:i}),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(wt.DEFAULTS=n({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!0,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null}),null!==(Tt=window)&&void 0!==Tt&&Tt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let s=t(this);return new wt(t.extend({},e,{articleElement:s}))}})}return wt})); +!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=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!e(t)&&setTimeout((()=>{t()}),s)},i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),n=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?n(t[s]):t[s]))),e)},l=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),a=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},h=(t,e)=>{var s;let i,r;if(a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},c=t=>t*t,d=function(){let t,e,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?l(s)?e=document.querySelector(s):o(s)&&(e=s):(t=document.querySelectorAll("html,body"),e=t[0].scrollTop-t[1].scrollTop>=0?t[0]:t[1]),e},u=(t,s,i)=>{const r=d(t);let n=r.scrollTop,l=0;const o=s-n,a=r.scrollHeight,h=s-a<=0?s:a,u=t=>(e(i)&&i(t),!1),m=()=>{if(l+=1,o<0){if(n-=c(l),r.scrollTop=n,n<=s)return r.scrollTop=s,u(s)}else if(n+=c(l),r.scrollTop=n,n>=h)return r.scrollTop=h,u(h);requestAnimationFrame(m)};requestAnimationFrame(m)},m=t=>!!l(t)&&t.replace(/(^\s+)|(\s+$)/g,""),p=function(t){let s=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=1,o=0,a="";const h=[];return t.forEach(((t,s)=>{const r=t.tagName,c=r.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>n?(o+=1,u=1===o?-1:s-1):d===n||do?1===d?(o=1,u=-1):u=h[s-1].pid:d<=o&&(1===d?o=1:(o-=n-d,o<=1&&(o=1)),u=1===o?-1:((t,e,s)=>{let i,r,n=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(a=i(a)),h.push({id:s,pid:u,level:o,rel:`heading-${s}`,text:a,tagName:r})})),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((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h},g=t=>{const{articleElement:s,selector:i,showCode:r,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],d=[],u=t=>t.replace(/\(.*?\)/,"()");return l(s)?h=document.querySelector(s):o(s)&&(h=s),h?(e(n)&&(u=n),c=[...h.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")],d=p(c,r||!0,u),!0===a?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const n=t[i[e[s]]];-1!==e[s]?n.children.push(e):r.push(e)})),r})(d,"id","pid"):d):d},f=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},b=(t,e)=>{Object.keys(e).forEach((s=>{f(e,s)&&(t[s]=e[s])}))},v={},y=t=>f(v,t)&&v[t].length>0,$=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?y(t):(t=>{let e=y(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=y(t);return e})(t)},_=function(e,s){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=e=>{if(!y(e))return!1;v[e].forEach((e=>{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(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},n=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!$(e))return!1;i?setTimeout(n,10):n()},x=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),T=t=>{if(!f(v,t))return!1;delete v[t]},w=(t,e)=>{if(!$(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&&T(i)}))})(e):T(t)};class E{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return l(t)?e&&f(s,t)?(s[t]=e,this):s[t]:i(t)?(b(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return _(t,e),this}$on(t,s){return function(t,s){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=x();let n="symbol"==typeof t?t.toString():t;e(s)&&(v[n]||(v[n]=[]),v[n].push({topic:n,callback:s,context:i,token:r}))}(t,s,this),this}$off(t,e){return w(t,e),this}addListeners(){return this}removeListeners(){return this}}const C=[];let S,z;function L(t){for(;t.timeRemaining()>0&&C.length;){const t=C.shift();if(!e(t))return!1;t()}C.length?S=requestIdleCallback(L):(S=0,e(z)&&(z(),z=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const k=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;C.push(t),e(s)&&(z=s),S||requestIdleCallback(L)},M=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=M(t.offsetParent)),e},N=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},A=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,H=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],O=(t,e,s)=>{const i=H.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 n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},D=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=l(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return l(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{O(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&D(t,e,s)}))},F=(t,s,i)=>{if(!e(i))return D(t,s),!1;O(t,s,i)},q=function(t,e,s,i,r,n){let l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const o=H.indexOf(s)>-1,a=function(o){const h=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&&N(t,e):N(t,e))||i&&t===r)return t;if(t===r)break}while(t=A(t))})(h,e,t);let d=n||t;o.delegateTarget=c,!0===n&&(d=r),c&&(!0===l&&F(t,s,a),i.call(d,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},j=function(t){t.stopPropagation(),t.preventDefault()},R=['','','','','','','','','','','','','','','','','','','',''],I=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";return l(t)?function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";const s=/id="(.*?)"/,i=/^(\w+)-/;return R.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))}(t,e):[...R]},U=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===R.indexOf(t)&&l(t)&&R.push(t)})):l(t)&&R.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(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"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];f(e,s)&&P(t,s,i)}))},W=(t,e,s)=>{const n=document.createDocumentFragment(),o=document.createElement(t),a=t=>B(t)||l(t),h=t=>{let e;if(!a(t))return!1;B(t)?e=t:l(t)&&(e=document.createTextNode(t)),n.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>a(t)))?e.forEach((t=>{h(t)})):B(e)?h(e):l(e)&&h(document.createTextNode(e)),r(s)?s.forEach((t=>{h(t)})):h(s),o.appendChild(n),o},Q=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s="outline-icon",i=e.size||0,n=e.color||"",o=e.iconSet||"",a=r(i)?i[0]:i,h=r(i)?i[1]:i,c=i?`width:${a}px;height:${h}px;`:"",d=n?c+`color:${n}`:c,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return l(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return l(t)&&e.test(t)})(t)?f=t:(g=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${s} ${u.className}`:u.className=s,V(m,u),p=m.querySelector("svg"),V(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),m):null},J=function(t){return Q(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})},Y=(t,e)=>{var s;let i,r=t.className;if(!r||!a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(r=m(r.replace(e,"")),t.className=r)},G=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const i="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),Y(t,i),!e)return!1;var o;n=t.querySelector(`.${i}__anchor`),s&&Y(t,`${i}_start`),o=m(t.className),l(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class K extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let s,i,r,n;return this.attr(t),n=this.attr("articleElement"),i=this.attr("scrollElement"),s=this.attr("created"),l(n)?r=document.querySelector(n):o(n)&&(r=n),r?(this.$articleElement=r,this.$scrollElement=d(i),this.$headings=this.getHeadings(),this.$headings.length<1||(e(s)&&s.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return[...t.querySelectorAll(e)]}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter"),n=this.attr("mounted"),l=g({articleElement:t,selector:s,showCode:i,chapterTextFilter:r});return U(),this._paint(l),e(n)&&n.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),i=this.attr("isAtStart"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.count(),o=[...this.$headings],a=(l,o)=>{l.forEach(((l,a)=>{const h=a+o*e,c=t[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,n=s.isAtStart||!0,l=s.showCode||!1,o=s.chapterCode||"",a=s.anchorURL||"",h=`heading-${e}`,c={id:h,className:n?`${i} ${i}_start`:i,"data-id":e},d=m(t.innerHTML);let u,p;if(l&&(c.innerHTML=o+" "+d,c["data-code"]=o),V(t,c),!r)return!1;p=J("hash",{iconSet:"outline"}),u=W("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:a||`#${h}`,target:a?"_blank":"self","data-id":e},p),t.appendChild(u)})(l,h,{hasAnchor:s,isAtStart:i,showCode:r,chapterCode:c,anchorURL:n})}))};let h=-1;if(l>e)for(h+=1,a(o.splice(0,e),0);o.length>0;){const t=o.splice(0,e);k((()=>{a(t,h+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else a(o,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((s=>{G(s,t,e)})),this}refresh(t){const e=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r})),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=M(l)-(n+10),a=this.$scrollElement,h=a.scrollHeight-a.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:h})}))})),i||j(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||q(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return this.count()<1||F(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS=n({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,chapterTextFilter:null});const X=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],Z=t=>{let e,s,i;return!!l(t)&&(e=m(t).slice(0,1e3),s=/\s*|]*>|]*>|]+>/i,i=new RegExp(X.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),s.test(e)||i.test(e))},tt=t=>t.replace(/]*>.*?<\/script>/gi,""),et=(t,e)=>{document.documentElement.style.setProperty(t,e)};let st=2e3;const it=t=>(t?st=t:st+=1,et("--outline-zIndex",`${st}`),st);class rt extends E{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=n(rt.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,this}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.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"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),n=this.attr("hasOverlay"),l=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("customClass");let d,u,m,p,g,f,b,v;return U(),this.zIndex=it(),p=W("h2",{className:"outline-drawer__title"},this.title),this.$title=p,r&&(g=W("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=g),m=W("header",{className:"outline-drawer__header"},[p,g]),this.$header=m,f=W("div",{className:"outline-drawer__main"}),this.$main=f,o||h(f,"outline-drawer_full"),b=W("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=W("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[m,f,b]),this.$modal=u,l&&h(u,"outline-drawer_offset"),a&&h(u,"outline-drawer_auto"),c&&h(u,c),n&&(v=W("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=W("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),e(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let s=null;return e(t)?s=t():B(t)?s=t:Z(t)&&(s=((t,e)=>{const s=document.createDocumentFragment();if(!t||!Z(t)&&!l(t)&&!o(t))return null;if(Z(t)){const e=W("div");let i=[];return e.innerHTML=tt(t),i=[...e.childNodes],i.forEach((t=>{s.appendChild(t)})),s}if(!l(e))return t.innerHTML;t.innerHTML=tt(e)})(t)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return h(this.$el,"outline-drawer_opened"),Y(i,"outline-drawer_closed"),h(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return Y(i,"outline-drawer_opened"),h(i,"outline-drawer_closed"),s((()=>{Y(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners()._remove()._default(),i-=1,it(i),this.zIndex=0,e(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),i=this.$el;return t&&q(i,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&q(i,".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?(F(s,"click",this.onClose),this):this}}rt.DEFAULTS=n({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const nt=function(t,s,i,r,n){let l=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const o=H.indexOf(s)>-1,a=function(e){let o=n||t;!0===n&&(o=r),!0===l&&F(t,s,a),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},lt=(t,e)=>getComputedStyle(t)[e],ot=(t,e)=>{let s,i;return!(!o(t)||!o(e))&&(s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),i.top>=s.top&&i.right<=s.right&&i.bottom<=s.bottom&&i.left>=s.left)};class at extends E{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=n(at.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let s,i,r,n;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),l(i)?n=document.querySelector(i):o(i)&&(n=i),this.$parentElement=n,this.$scrollElement=d(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,c,d,u=null;return r?(this.isInside()&&e&&(u=W("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),c=W("ul",{className:"outline-navigator__list"}),this.$list=c,n.push(c),s&&(d=W("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,n.push(d)),a=W("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=W("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),h(o,"outline-navigator_sticky")),i&&h(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),i=this.$parentElement,r=this.chapters,n=this.count();let l;return!i||r.length<1||(this.isInside()&&h(i,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(r),s((()=>{this.highlight(this.active)}),60),this.offsetTop=M(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),et("--outline-navigator-width",`${this.offsetWidth}px`)),e(t)&&t.call(this),n<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=e.length,r=[...e],n=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=W("span",{className:"outline-navigator__text"},e.text);let c,d,u,m,p;s&&(d=W("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(d)),a.push(h),c=W("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),u=W("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(u):(m=W("ul",{id:"subject-"+r,className:"outline-navigator__subject"},u),p.appendChild(m)))}))};if(i>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);k((()=>{n(t)}))}else n(r)}(this.$list,t,e),Y(s,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return Y(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,s=this.$list,i=s.querySelector(".outline-navigator__anchor"),r=parseInt(lt(e,"padding-top"),10),n=parseInt(lt(e,"border-top-width"),10),l=parseInt(lt(s,"padding-top"),10),o=parseInt(lt(s,"margin-top"),10),a=parseInt(lt(s,"border-top-width"),10);let h,c=0;return r&&(c+=r),l&&(c+=l),o&&(c+=o),n&&(c+=n),a&&(c+=a),h=i.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,s=this.$placeholder,i=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=i.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),s.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",n="outline-navigator_highlight";let l=null,o=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(Y(this.$active,n),Y(this.$active,r)),this.$active=l,h(this.$active,r),i?this.positionPlaceholder(this.active):h(this.$active,n),s((()=>{console.log(!ot(this.$active,this.$main)),ot(this.$active,this.$main)||(o=this._getPlaceholderOffset(this.active),console.log("placeholderOffsetTop",o),u(this.$main,o))})),this):this):this}sticky(){const t=this.attr("afterSticky"),s="outline-navigator_fixed",i=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?h(i,s):Y(i,s),e(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return et("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}show(){const t="outline-navigator_hidden",i=this.attr("afterOpened"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?Y(l,t):(Y(l,t),s((()=>{Y(l,"outline-navigator_folded")}),30)):Y(n,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-navigator_hidden",i=this.attr("afterClosed"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?h(l,t):(h(l,"outline-navigator_folded"),s((()=>{h(l,t)}))):h(n,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{n=r>=i,t.call(this,this.isClosed(),n)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),e(s)&&s.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=s.root||null,r=s.selector||".outline-heading",n=s.context||null,l={rootMargin:s.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(n||s.target,s.target)}))}),l),h=o(i)?i:document;return i&&(l.root=i),h.querySelectorAll(r).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,n=r.getAttribute("data-id"),l=r.href.split("#")[1],o=document.querySelector(`#${l}`),a=M(o)-(i+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),d=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(a,d),this.highlight(n)}),10)):(this.scrollTo(a,d),this.highlight(n)),j(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return this.count()<1||("html"!==s&&"body"!==s||(i=window),q(t,".outline-navigator__anchor","click",this.onSelect,this,!0),nt(i,"scroll",this.onScroll,this,!0),this.isSticky()&&nt(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return this.count()<1||("html"!==i&&"body"!==i||(r=window),F(e,"click",this.onSelect),F(r,"scroll",this.onScroll),this.isSticky()&&F(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}at.DEFAULTS=n({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},dt=[];let ut;U();class mt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(mt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),l=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&l.push("outline-message_round"),i||l.push("outline-message_full-width"),r&&l.push("outline-message_visible"),n&&l.push(n),l}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),l=this._getClassName(),o=[];let a,c,d,u,m,p=20;return i&&"default"===s&&(p=12),"plain"!==s&&(a=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:p}),h(a,"outline-message__icon"),o.push(a)),n?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(ct(tt(e))),c=W("p",{className:"outline-message__content"},[d]),o.push(c),r&&(u=J("close",{iconSet:"outline",size:18}),h(u,"outline-message__close"),o.push(u)),m=W("div",{className:l.join(" ")},o),m.style.cssText="top:-50px;",this.$el=m,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,n,l,o,a,c=20;return this.isDestroyed()?this:(l=e.querySelector(".outline-icon"),l?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?h(l,t):(Y(l,t),r&&"default"===i&&(c=12)),o=l.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),a=o.querySelector("use"),n="light"===i?`circle-${s}`:s,P(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(tt(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?h(s,t):Y(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,n,l;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),n=i&&i>=this.offset?i:this.offset,l=`top:${n}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,h(e,"outline-message_visible"),e.style.cssText=l,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",Y(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return q(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),q(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),q(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return F(t,"mouseenter",this.onMouseEnter),F(t,"mouseleave",this.onMouseLeave),F(t,"click",this.onClose),this}}mt.DEFAULTS=n({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{mt[t]=e=>{const s={},i=x("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return l(e)?s.message=e:ht(e)&&b(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{mt.close(i,r)},ut=new mt(s),dt.forEach((t=>{n+=t.$el.offsetHeight+16})),ut.offset=n,ut.open(),dt.push(ut),ut}})),mt.close=(t,s)=>{const i=dt.length;let r,n,l=-1;if(dt.forEach(((i,r)=>{t===i.id&&(n=i.$el.offsetHeight,l=r,e(s)&&s.call(i),dt.splice(r,1))})),i<=1||-1===l||l>dt.length-1)return!1;for(r=l;r{let t=dt.length-1;for(;t>=0;t-=1)dt[t].close()};class pt{constructor(t,s){this.name=t,e(s)&&(this.action=s)}execute(){return this.action(),this}}class gt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const s=this.commands.find((e=>e.name===t));return e(null==s?void 0:s.execute)&&s.execute(),this}}const ft=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=W("a",{className:"outline-toolbar__anchor",href:t.link},s),r=W("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":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},bt="outline-toolbar_disabled",vt="outline-toolbar_hidden";class yt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(yt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let s;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new gt,s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const s=this,{action:i,name:r}=t;let n,o,a=null,h=null;return i?(h=i.handler,n=i.context||this,e(h)?o=h:l(h)&&(o=function(){s.$emit(h,r)}),e(o)&&(a=new pt(r,o.bind(n))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("placement");return U(),this.$el=W("div",{id:x("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(s),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=ft(t,e),r=this._getCommand(t),{name:n,disabled:l,context:o}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:l||!1,context:o||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),n=this.attr("buttons")||[],{name:l,disabled:o,context:a}=t,h=this._getCommand(t),c=t=>{const e=ft(t);s.appendChild(e),n.push(t),this.buttons.push({$el:e,name:l,disabled:o||!1,context:a||this,command:h}),h&&this.commands.add(h)};return i(t)?c(t):r(t)&&t.forEach((t=>{i(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attrs("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),h(e.$el,bt)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),Y(e.$el,bt),this):this}disable(t){const s=this.attr("afterDisabled");return t?this._disable(t):(h(this.$el,bt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,Y(this.$el,bt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.get(t),n=this.$el;if(t){if(!r)return this;Y(r.$el,vt)}else Y(n,vt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.get(t),n=this.$el;if(t){if(!r)return this;h(r.$el,vt)}else h(n,vt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t),s="outline-toolbar_active";let i;return e?(i=e.$el,a(i,s)?Y(i,s):h(i,s),this):this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}addListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||q(e,".outline-toolbar__button","click",this.onExecute,this,!0),this}removeListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||F(e,".outline-toolbar__button",this.onExecute),this}}yt.DEFAULTS=n({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});class $t{constructor(t){this.utterance=new SpeechSynthesisUtterance,t&&this.initialize(t)}_initialize(t){return t.lang&&this.setLang(t.lang),t.pitch&&this.setPitch(t.pitch),t.rate&&this.setRate(t.rate),t.text&&this.setText(t.text),t.voice&&this.setVoice(t.voice),t.volume&&this.setVolume(t.volume),this}initialize(t){return this._initialize(t)._addListeners(),this}isSpeaking(){return speechSynthesis.speaking}isPending(){return speechSynthesis.pending}isPaused(){return speechSynthesis.paused}getVoices(){return speechSynthesis.getVoices()}setLang(t){return this.utterance.lang=t,this}setPitch(t){return this.utterance.pitch=t,this}setRate(t){return this.utterance.rate=t,this}setText(t){return this.utterance.text=t,this}setVoice(t){return this.utterance.voice=t,this}setVolume(t){return this.utterance.volume=t,this}speak(t){return t&&this.setText(t),speechSynthesis.speak(this.utterance),this}pause(){return speechSynthesis.pause(),this}resume(){return speechSynthesis.resume(),this}cancel(){return speechSynthesis.cancel(),this.setText(""),this}_addListeners(){const t=this.utterance,e=this;return["boundary","end","error","start","mark","pause","resume"].forEach((s=>{t[`on${s}`]=t=>{_(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{_("voiceschanged",{event:t,speech:e})},this}}$t.isSupport="speechSynthesis"in window;const _t=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&h(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},xt="进入阅读模式,按 ESC 键可退出阅读模式";class Tt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(Tt.DEFAULTS),this.reading=!1,this.$target=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e=null;return this.attr(t),e=this.attr("target"),l(e)?this.$target=document.querySelector(e):o(e)&&(this.$target=e),this.$target?($t.isSupport&&(this.speech=new $t),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=[...t.cloneNode(!0).children];return s((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$paper,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_renderEdge(){const t=this.$target;let e,i,r,n,l,a=this.attr("title");i=t.querySelector("h1"),o(a)&&(i=a),o(i)&&(a=i.innerText),i=W("h1",{className:"outline-reader__title"},a),this.$title=i,r=W("article",{id:"outline-reader__article",className:"outline-reader__article"}),this.$article=r,n=W("div",{className:"outline-reader__progress"}),this.$progress=n;const h=[];return $t.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:20,action:{context:this,handler:this.speak}}),h.push({name:"print",icon:"print",size:20,action:{context:this,handler:this.print}},{name:"exit",icon:"close",size:20,action:{context:this,handler:this.exit}}),this.toolbar=new yt({placement:"rtl",buttons:h}),e=W("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,i,r,this.toolbar.$el]),this.$paper=e,document.body.appendChild(e),s((()=>{l=e.previousElementSibling,_t(l,!0),l=e.nextElementSibling,_t(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||xt;return this.reading||!i||(r.forEach((t=>{h(t,s)})),h(i,e),Y(i,s),this.toolbar.show(),this.reading=!0,mt.info({round:!0,message:n}),this.$emit("enterReading")),this}exit(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling");return this.reading&&i?(h(i,s),Y(i,e),r.forEach((t=>{Y(t,s)})),this.toolbar.hide(),this.reading=!1,this.$emit("exitReading"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return $t.isSupport?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return e(print)?(print(),this):this}destroy(){return this.$paper?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),j(t)),this}addListeners(){return this.$paper?(nt(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this):this}removeListeners(){return this.$paper?(F(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this):this}}var wt;Tt.DEFAULTS=n({target:"",title:"",enterReadingTip:xt,allowSpeak:!1});class Et extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){const t=Et.DEFAULTS;return this.attrs=n(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",s="",i=null;return this.attr(t),e=this.attr("articleElement"),s=this.attr("scrollElement"),l(e)?i=document.querySelector(e):o(e)&&(i=e),this.$article=i,this.$scrollElement=d(s),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const e=this.$article,s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this._updateToolbar({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}refresh(){const t=this.getChapters();return this.anchors.refresh(t),this.navigator.refresh(t),this.reader.refresh(),this}_renderReader(){const t=this.attr("reader");return t.target?(h(this.$article,"outline-article"),this.reader=new Tt(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:n,afterScroll:l,chapterTextFilter:o}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),l=this.attr("closeOnClickModal"),o=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),d=this.attr("afterToggle"),u=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:s,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:d,afterScroll:u},"relative"===a?(this.drawer=new rt({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:l,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,o&&this.drawer.open()):p.customClass=i,p.parentElement=g,this.navigator=new at(p)),this}_renderToolbar(){const t=this.attr("position"),s=this.attr("hasToolbar"),i=this.attr("showNavModalFirst"),r=this.attr("placement"),n=this.attr("homepage"),l=this.attr("git"),o=this.attr("tags"),a=this.attr("issues"),h=this.attr("tools"),c=this.attr("reader"),d=this.count(),u={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},m={name:"homepage",icon:"homepage",size:20,link:n},p={name:"github",icon:"github",size:20,link:l},g={name:"tags",icon:"tags",size:20,link:o},f={name:"issues",icon:"issues",size:20,link:a},b={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},y={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},$={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},_=[];return s?(_.push(u),d>0&&_.push(b),n&&_.push(m),l&&_.push(p),o&&_.push(g),a&&_.push(f),c.target&&(_.push(v),e(print)&&_.push(y)),(null==h?void 0:h.length)>0&&_.push(...h),_.push($),this.buttons=[..._],this.toolbar=new yt({placement:r,buttons:_}),"relative"===t&&i&&this.toolbar.hide(),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}_updateToolbar(t){let{top:e,min:s,max:i}=t;const r=this.toolbar,n=Math.ceil(e);return n<=s?(r.hide("up"),r.show("down")):n>=i?(r.hide("down"),r.show("up")):n>s&&n0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1,u(i.$main,0)),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=this.$scrollElement,i=this.toolbar,r=this.navigator,n=this.count(),l=Math.floor(s.scrollHeight-s.clientHeight);return n>0&&(r.playing=!0),this.scrollTo(l,(()=>{const s=r.$main;i.hide("down"),i.show("up"),n>0&&(r.highlight(n-1),u(s,s.scrollHeight),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return u(this.$scrollElement,t,e),this}enterReading(){const t=this.reader;return!t||t.reading||(this.toolbar.toggle(),t.enter()),this}exitReading(){const t=this.reader;return t&&t.reading?(this.toolbar.toggle(),t.exit(),this):this}switchReading(){const t=this.reader;return t?(t.toggle(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("toggle")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return this.reader.print(),this}_destroy(){const t=this.count();let e=this.anchors,s=this.navigator,i=this.drawer,r=this.reader,n=this.toolbar,l=!1;return this.removeListeners(),r&&r.destroy(),t>0&&s&&(l=s.isOutside(),s.destroy(),l&&i&&i.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}onToolbarUpdate(t){let{top:e,min:s,max:i}=t;return this._updateToolbar({top:e,min:s,max:i}),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Et.DEFAULTS=n({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!0,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null}),null!==(wt=window)&&void 0!==wt&&wt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let s=t(this);return new Et(t.extend({},e,{articleElement:s}))}})}return Et})); //# sourceMappingURL=outline.min.js.map diff --git a/docs/js/outline.min.js.map b/docs/js/outline.min.js.map index e81c0ea..224f95a 100644 --- a/docs/js/outline.min.js.map +++ b/docs/js/outline.min.js.map @@ -1 +1 @@ -{"version":3,"file":"outline.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/lang/trim.js","../../getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../_removeHeading.js","../../utils/types/isEmpty.js","../../anchors.js","../../_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../zIndex.js","../../drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/inBounding.js","../../utils/dom/intersection.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/encodeHTML.js","../../message.js","../../command.js","../../commands.js","../../_createButton.js","../../toolbar.js","../../speech.js","../../_updateSiblingElements.js","../../reader.js","../../outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = true,\r\n chapterTextFilter = null\r\n) => {\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = stripTags(trim(heading.innerHTML))\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode || true, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL || `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement('div', {\r\n className: 'outline-drawer__main'\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attrs('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target = null\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $paper = this.$paper\r\n const toolbar = this.toolbar\r\n\r\n if ($paper) {\r\n document.body.removeChild($paper)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n let title = this.attr('title')\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement('article', {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n })\r\n this.$article = $article\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n const buttons = []\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push(\r\n ...[\r\n {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n },\r\n {\r\n name: 'exit',\r\n icon: 'close',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n }\r\n ]\r\n )\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $paper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $title, $article, this.toolbar.$el]\r\n )\r\n this.$paper = $paper\r\n\r\n document.body.appendChild($paper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $paper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $paper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($paper, READING)\r\n removeClass($paper, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('enterReading')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n\r\n if (!this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n addClass($paper, HIDDEN)\r\n removeClass($paper, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n this.toolbar.hide()\r\n this.reading = false\r\n\r\n this.$emit('exitReading')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this._updateToolbar({\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.anchors.refresh(chapters)\r\n this.navigator.refresh(chapters)\r\n this.reader.refresh()\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo(navigator.$main, navigator.$main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.enter()\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || !reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.exit()\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n const reader = this.reader\r\n\r\n if (!reader) {\r\n return this\r\n }\r\n\r\n reader.toggle()\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.toggle()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n drawer.toggle()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.reader.print()\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: true,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","arguments","length","undefined","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","previous","level","text","chapters","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","indexOf","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","on","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","getSymbol","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","update","chapterCode","_updateHeading","headingId","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","anchors","drawer","navigator","reader","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","_updateToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","addButton","removeButton","_ref","ceil","afterTop","floor","afterDown","enterReading","exitReading","switchReading","_destroy","onToolbarUpdate","_ref2","_window","jQuery","$","outline"],"mappings":"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AMX,EAGF6I,EAAQG,SAkBCxR,EAjBS,CACd+B,cAAe,YACfmD,eAAgB,WAChBC,SAAU,oBACV2N,aAAc,EACdZ,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX7N,UAAU,EACVuO,QAAS,KACTG,QAAS,KACTgB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdvP,kBAAmB,OEjTvB,MAAM6P,EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUzS,IACd,IAAI0S,EACAC,EACAC,EAEJ,QAAK7S,EAASC,KAKd0S,EAAOpQ,EAAKtC,GAAK6S,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAInS,OAAO+R,EAAKrN,KAAK2N,GAAS,IAAGA,eAAgBnF,KAAK,KAAM,KAE5DgF,EAAM9C,KAAK6C,IAASE,EAAK/C,KAAK6C,GAAK,ECtBtCK,GAAgB/S,GACbA,EAAIuC,QAAQ,+BAAgC,ICP/CyQ,GAAcA,CAACvN,EAAM4C,KACD9G,SAAS0R,gBACjB5E,MAAM2E,YAAYvN,EAAM4C,EAAM,ECAhD,IAAI7E,GAAQ,IAEZ,MAAM0P,GAAUC,IACVA,EACF3P,GAAQ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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["../../utils/lang/toString.js","../../utils/types/isFunction.js","../../utils/lang/later.js","../../utils/types/isObject.js","../../utils/types/isArray.js","../../utils/lang/cloneDeep.js","../../utils/types/isString.js","../../utils/types/isElement.js","../../utils/dom/hasClass.js","../../utils/dom/addClass.js","../../utils/lang/easeInQuad.js","../../utils/dom/_getScrollElement.js","../../utils/dom/scrollTo.js","../../utils/lang/trim.js","../../getChaptersByHeadings.js","../../utils/lang/stripTags.js","../../_getChapterParentIdByDiffer.js","../../_getChaptersWithCode.js","../../getChapters.js","../../utils/lang/toTree.js","../../utils/lang/hasOwn.js","../../utils/lang/extend.js","../../utils/observer/_subscribers.js","../../utils/observer/_hasDirectSubscribersFor.js","../../utils/observer/has.js","../../utils/observer/_hasSubscribers.js","../../utils/observer/emit.js","../../utils/types/isTypedArray.js","../../utils/lang/guid.js","../../utils/observer/_removeSubscriber.js","../../utils/observer/off.js","../../utils/observer/_removeSubscriberByToken.js","../../base.js","../../utils/observer/on.js","../../utils/lang/timeSlice.js","../../utils/dom/offsetTop.js","../../utils/dom/matches.js","../../utils/dom/getParentOrHost.js","../../utils/event/enum.js","../../utils/event/_off.js","../../utils/event/_delete.js","../../utils/event/purgeElement.js","../../utils/event/getListeners.js","../../utils/event/off.js","../../utils/event/on.js","../../utils/event/getTarget.js","../../utils/dom/resolveTextNode.js","../../utils/dom/closest.js","../../utils/event/stop.js","../../utils/icons/symbols.js","../../utils/icons/defaults.js","../../utils/icons/getSymbols.js","../../utils/icons/getSymbol.js","../../utils/icons/paint.js","../../utils/icons/add.js","../../utils/types/isDOM.js","../../utils/types/isHTMLCollection.js","../../utils/types/isFragment.js","../../utils/types/isTextNode.js","../../utils/dom/setAttribute.js","../../utils/dom/setAttributes.js","../../utils/dom/createElement.js","../../utils/icons/createElement.js","../../utils/types/isSVG.js","../../utils/icons/icon.js","../../utils/dom/removeClass.js","../../_removeHeading.js","../../utils/types/isEmpty.js","../../anchors.js","../../_updateHeading.js","../../utils/types/tags.js","../../utils/types/isHTML.js","../../utils/lang/stripScripts.js","../../utils/dom/setProperty.js","../../zIndex.js","../../drawer.js","../../utils/dom/html.js","../../utils/event/at.js","../../utils/dom/getStyle.js","../../utils/dom/inBounding.js","../../navigator.js","../../_paintChapters.js","../../utils/dom/intersection.js","../../utils/types/isObjectLike.js","../../utils/types/isPlainObject.js","../../utils/lang/encodeHTML.js","../../message.js","../../command.js","../../commands.js","../../_createButton.js","../../toolbar.js","../../speech.js","../../_updateSiblingElements.js","../../reader.js","../../outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = true,\r\n chapterTextFilter = null\r\n) => {\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = stripTags(trim(heading.innerHTML))\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode || true, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL || `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement('div', {\r\n className: 'outline-drawer__main'\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n console.log(!inBounding(this.$active, this.$main))\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n console.log('placeholderOffsetTop', placeholderOffsetTop)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attrs('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target = null\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $paper = this.$paper\r\n const toolbar = this.toolbar\r\n\r\n if ($paper) {\r\n document.body.removeChild($paper)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n let title = this.attr('title')\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement('article', {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n })\r\n this.$article = $article\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n const buttons = []\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push(\r\n ...[\r\n {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n },\r\n {\r\n name: 'exit',\r\n icon: 'close',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n }\r\n ]\r\n )\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $paper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $title, $article, this.toolbar.$el]\r\n )\r\n this.$paper = $paper\r\n\r\n document.body.appendChild($paper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $paper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $paper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($paper, READING)\r\n removeClass($paper, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('enterReading')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n\r\n if (!this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n addClass($paper, HIDDEN)\r\n removeClass($paper, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n this.toolbar.hide()\r\n this.reading = false\r\n\r\n this.$emit('exitReading')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this._updateToolbar({\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.anchors.refresh(chapters)\r\n this.navigator.refresh(chapters)\r\n this.reader.refresh()\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.enter()\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || !reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.exit()\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n const reader = this.reader\r\n\r\n if (!reader) {\r\n return this\r\n }\r\n\r\n reader.toggle()\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.toggle()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n drawer.toggle()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.reader.print()\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: true,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","arguments","length","undefined","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","previous","level","text","chapters","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","indexOf","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","on","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","getSymbol","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","update","chapterCode","_updateHeading","headingId","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","console","log","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","anchors","drawer","navigator","reader","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","_updateToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","addButton","removeButton","_ref","ceil","afterTop","floor","afterDown","enterReading","exitReading","switchReading","_destroy","onToolbarUpdate","_ref2","_window","jQuery","$","outline"],"mappings":"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AMX,EAGF6I,EAAQG,SAkBCxR,EAjBS,CACd+B,cAAe,YACfmD,eAAgB,WAChBC,SAAU,oBACV2N,aAAc,EACdZ,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX7N,UAAU,EACVuO,QAAS,KACTG,QAAS,KACTgB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdvP,kBAAmB,OEjTvB,MAAM6P,EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUzS,IACd,IAAI0S,EACAC,EACAC,EAEJ,QAAK7S,EAASC,KAKd0S,EAAOpQ,EAAKtC,GAAK6S,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAInS,OAAO+R,EAAKrN,KAAK2N,GAAS,IAAGA,eAAgBnF,KAAK,KAAM,KAE5DgF,EAAM9C,KAAK6C,IAASE,EAAK/C,KAAK6C,GAAK,ECtBtCK,GAAgB/S,GACbA,EAAIuC,QAAQ,+BAAgC,ICP/CyQ,GAAcA,CAACvN,EAAM4C,KACD9G,SAAS0R,gBACjB5E,MAAM2E,YAAYvN,EAAM4C,EAAM,ECAhD,IAAI7E,GAAQ,IAEZ,MAAM0P,GAAUC,IACVA,EACF3P,GAAQ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"} \ No newline at end of file diff --git a/navigator.js b/navigator.js index 77e77dc..2842a36 100644 --- a/navigator.js +++ b/navigator.js @@ -288,7 +288,6 @@ class Navigator extends Base { const $main = this.$main const $list = this.$list const $anchor = $list.querySelector('.outline-navigator__anchor') - const animationCurrent = this.attr('animationCurrent') const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10) const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10) const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10) @@ -301,10 +300,6 @@ class Navigator extends Base { let offsetTop = 0 let top - if (!animationCurrent) { - return this - } - if (mainPaddingTop) { offsetTop += mainPaddingTop } @@ -384,6 +379,7 @@ class Navigator extends Base { } later(() => { + console.log(!inBounding(this.$active, this.$main)) if (!inBounding(this.$active, this.$main)) { placeholderOffsetTop = this._getPlaceholderOffset(this.active) console.log('placeholderOffsetTop', placeholderOffsetTop) diff --git a/navigator.min.js b/navigator.min.js index 0ab28b3..532db1e 100644 --- a/navigator.min.js +++ b/navigator.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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},C=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?C(t[i]):t[i]))),e)},w=[];let O,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?O=requestIdleCallback(j):(O=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),O||requestIdleCallback(j)},L={},I=t=>g(L,t)&&L[t].length>0,q=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?I(t):(t=>{let e=I(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=I(t);return e})(t)},z=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!I(t))return!1;L[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!q(t))return!1;s?setTimeout(n,10):n()},F=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),H=t=>{if(!g(L,t))return!1;delete L[t]},D=(t,e)=>{if(!q(t))return!1;e?(t=>{const e=Object.keys(L);if(!t||e.length<1)return!1;e.forEach((e=>{const i=L[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&H(s)}))})(e):H(t)};class P{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return z(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=F();let n="symbol"==typeof t?t.toString():t;i(e)&&(L[n]||(L[n]=[]),L[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return D(t,e),this}addListeners(){return this}removeListeners(){return this}}class M extends P{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=C(M.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=parseInt(k(e,"padding-top"),10),l=parseInt(k(e,"border-top-width"),10),o=parseInt(k(i,"padding-top"),10),a=parseInt(k(i,"margin-top"),10),h=parseInt(k(i,"border-top-width"),10);let c,u=s.offsetHeight,d=0;return r?(n&&(d+=n),o&&(d+=o),a&&(d+=a),l&&(d+=l),h&&(d+=h),c=u*t,d+c):this}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",l="outline-navigator_highlight";let o=null,a=0;return e?(o=e.querySelector(`#chapter__anchor-${t}`),o?(this.active=parseInt(o.getAttribute("data-id"),10),this.$active&&(x(this.$active,l),x(this.$active,s)),this.$active=o,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,l),n((()=>{((t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)})(this.$active,this.$main)||(a=this._getPlaceholderOffset(this.active),$(this.$main,a))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return M.DEFAULTS=C({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),M})); +!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).Navigator=e()}(this,(function(){"use strict";const t=t=>"string"==typeof t,e=t=>Object.prototype.toString.apply(t),i=t=>"function"==typeof t||"[object Function]"===e(t),s=t=>("[object Object]"===e(t)||"object"==typeof t||i(t))&&null!==t,r=t=>!!(s(t)&&t.nodeName&&t.tagName&&1===t.nodeType),n=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!i(t)&&setTimeout((()=>{t()}),e)},l=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],o=(t,e,i)=>{const s=l.indexOf(e)>-1;i._delegateListener&&delete(i=i._delegateListener)._delegateListener,function(t,e,i){const s=t._listeners;let r=-1;if(s.length<1)return!1;s.forEach(((t,s)=>{const n=t.fn;e===t.type&&(r=s,n===i&&(r=s))})),r>-1&&s.splice(r,1)}(t,e,i),t.removeEventListener(e,i,s)},a=function(e,i){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const n=t(e)?document.querySelector(e):e,l=n.childNodes,h=((e,i)=>{let s=e._listeners||[];return t(i)&&i&&(s=s.filter((t=>t.type===i))),s})(n,i);h.forEach((t=>{o(n,t.type,t.fn)})),(s||!0===i||1===arguments.length)&&n&&l&&l.forEach((t=>{r(t)&&a(t,i,s)}))},h=(t,e,s)=>{if(!i(s))return a(t,e),!1;o(t,e,s)},c=function(t,e,s,r,n){let o=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const a=l.indexOf(e)>-1,c=function(i){let l=n||t;!0===n&&(l=r),!0===o&&h(t,e,c),s.call(l,i,r)};if(!i(s))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:e,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(e,c,a)},u=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const i=e.replace(/^>/i,"");return!!(e&&i&&t)&&(t.matches?t.matches(i):!!t.msMatchesSelector&&t.msMatchesSelector(i))},d=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,f=function(t,e,i,s,r,n){let o=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const a=l.indexOf(i)>-1,c=function(l){const a=function(t){const e=t.target;return(i=e)&&3===i.nodeType?i.parentNode:i;var i}(l),f=((t,e,i,s)=>{const r=i||document;if(!t)return null;do{if(null!=e&&(e.startsWith(">")?t.parentNode===r&&u(t,e):u(t,e))||s&&t===r)return t;if(t===r)break}while(t=d(t))})(a,e,t);let m=n||t;l.delegateTarget=f,!0===n&&(m=r),f&&(!0===o&&h(t,i,c),s.call(m,l,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:i,fn:c,data:r,context:n,capture:a}),s._delegateListener=c,t.addEventListener(i,c,a)},m=t=>Array.isArray?Array.isArray(t):"[object Array]"===e(t),p=t=>{return!(!s(t)||!(r(t)||(t=>!(!s(t)||"[object NodeList]"!==e(t)))(t)||(i=t,s(i)&&"[object DocumentFragment]"===e(i))||(t=>!(!s(t)||!("[object Text]"===e(t)||t.tagName&&3===t.nodeType)))(t)));var i},g=(t,e)=>{const i=Object.prototype.hasOwnProperty;return t&&i.call(t,e)},v=(e,i,r)=>{const n=document.createDocumentFragment(),l=document.createElement(e),o=e=>p(e)||t(e),a=e=>{let i;if(!o(e))return!1;p(e)?i=e:t(e)&&(i=document.createTextNode(e)),n.appendChild(i)};return s(i)?((t,e)=>{if(!t||!s(e))return!1;Object.keys(e).forEach((i=>{const s=e[i];g(e,i)&&((t,e,i)=>{let s=t.tagName.toLowerCase();switch(e){case"style":t.style.cssText=i;break;case"value":"input"===s||"textarea"===s?t.value=i:t.setAttribute(e,i);break;case"htmlFor":t.setAttribute("for",i);break;case"className":t.className=i;break;case"innerHTML":t.innerHTML=i;break;case"innerText":t.innerText=i;break;default:t.setAttribute(e,i)}})(t,i,s)}))})(l,i):m(i)&&i.every((t=>o(t)))?i.forEach((t=>{a(t)})):p(i)?a(i):t(i)&&a(document.createTextNode(i)),m(r)?r.forEach((t=>{a(t)})):a(r),l.appendChild(n),l},y=t=>t*t,b=function(){let e,i,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?t(s)?i=document.querySelector(s):r(s)&&(i=s):(e=document.querySelectorAll("html,body"),i=e[0].scrollTop-e[1].scrollTop>=0?e[0]:e[1]),i},$=(t,e,s)=>{const r=b(t);let n=r.scrollTop,l=0;const o=e-n,a=r.scrollHeight,h=e-a<=0?e:a,c=t=>(i(s)&&s(t),!1),u=()=>{if(l+=1,o<0){if(n-=y(l),r.scrollTop=n,n<=e)return r.scrollTop=e,c(e)}else if(n+=y(l),r.scrollTop=n,n>=h)return r.scrollTop=h,c(h);requestAnimationFrame(u)};requestAnimationFrame(u)},T=(t,e)=>{const i=new RegExp("(\\s|^)"+e+"(\\s|$)");let s,n;return!!r(t)&&(s=t.className,!!s&&(n=t.classList,n&&n.contains?t.classList.contains(e):!!i.exec(s)))},_=(t,e)=>{var i;let s,r;if(T(t,e))return!1;s=t.classList,null!==(i=s)&&void 0!==i&&i.add?s.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},x=(e,i)=>{var s;let r,n=e.className;if(!n||!T(e,i))return!1;var l;r=e.classList,null!==(s=r)&&void 0!==s&&s.remove?r.remove(i):(l=n.replace(i,""),n=!!t(l)&&l.replace(/(^\s+)|(\s+$)/g,""),e.className=n)},E=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=E(t.offsetParent)),e},k=(t,e)=>getComputedStyle(t)[e],S=(t,e)=>{document.documentElement.style.setProperty(t,e)},O=t=>{let e={};return null===t?null:(m(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((i=>e[i]=s(t[i])?O(t[i]):t[i]))),e)},w=[];let C,N;function j(t){for(;t.timeRemaining()>0&&w.length;){const t=w.shift();if(!i(t))return!1;t()}w.length?C=requestIdleCallback(j):(C=0,i(N)&&(N(),N=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return n((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const A=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;w.push(t),i(e)&&(N=e),C||requestIdleCallback(j)},L=(t,e)=>{let i,s;return!(!r(t)||!r(e))&&(i=e.getBoundingClientRect(),s=t.getBoundingClientRect(),s.top>=i.top&&s.right<=i.right&&s.bottom<=i.bottom&&s.left>=i.left)},I={},q=t=>g(I,t)&&I[t].length>0,z=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?q(t):(t=>{let e=q(t),i=t.lastIndexOf(".");for(;!e&&-1!==i;)i=(t=t.substring(0,i)).lastIndexOf("."),e=q(t);return e})(t)},F=function(t,i){let s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=t=>{if(!q(t))return!1;I[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(e(i))>-1?i.toString():i;t.callback.call(t.context||t,s)}))},n=()=>{let e=t,i=t.lastIndexOf(".");for(;-1!==i;)e=e.substring(0,i),i=e.lastIndexOf("."),r(e);r(t),r("*")};if(!z(t))return!1;s?setTimeout(n,10):n()},H=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),D=t=>{if(!g(I,t))return!1;delete I[t]},P=(t,e)=>{if(!z(t))return!1;e?(t=>{const e=Object.keys(I);if(!t||e.length<1)return!1;e.forEach((e=>{const i=I[e];let s;i.forEach(((e,r)=>{e.callback!==t&&e.token!==t||(s=e.topic,i.splice(-1,r))})),i.length<1&&D(s)}))})(e):D(t)};class M{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(e,i){const r=this.attrs;return t(e)?i&&g(r,e)?(r[e]=i,this):r[e]:s(e)?(n=r,l=e,Object.keys(l).forEach((t=>{g(l,t)&&(n[t]=l[t])})),this):0===arguments.length?r:this;var n,l}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return F(t,e),this}$on(t,e){return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=H();let n="symbol"==typeof t?t.toString():t;i(e)&&(I[n]||(I[n]=[]),I[n].push({topic:n,callback:e,context:s,token:r}))}(t,e,this),this}$off(t,e){return P(t,e),this}addListeners(){return this}removeListeners(){return this}}class R extends M{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=O(R.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(e){let s,n,l,o;return this.attr(e),s=this.attr("created"),n=this.attr("parentElement"),l=this.attr("scrollElement"),t(n)?o=document.querySelector(n):r(n)&&(o=n),this.$parentElement=o,this.$scrollElement=b(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),i=this.attr("animationCurrent"),s=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,h,c,u=null;return r?(this.isInside()&&e&&(u=v("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),h=v("ul",{className:"outline-navigator__list"}),this.$list=h,n.push(h),i&&(c=v("div",{className:"outline-navigator__placeholder"}),this.$placeholder=c,n.push(c)),a=v("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=v("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),_(o,"outline-navigator_sticky")),s&&_(o,s),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),e=this.$parentElement,s=this.chapters,r=this.count();let l;return!e||s.length<1||(this.isInside()&&_(e,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(s),n((()=>{this.highlight(this.active)}),60),this.offsetTop=E(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),S("--outline-navigator-width",`${this.offsetWidth}px`)),i(t)&&t.call(this),r<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),i=this.$el;return function(t,e){let i=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const s=e.length,r=[...e],n=e=>{const s=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=v("span",{className:"outline-navigator__text"},e.text);let c,u,d,f,m;i&&(u=v("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(u)),a.push(h),c=v("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),d=v("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(d):(m=s(`chapter-${r}`),f=s(`subject-${r}`),f?f.appendChild(d):(f=v("ul",{id:"subject-"+r,className:"outline-navigator__subject"},d),m.appendChild(f)))}))};if(s>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);A((()=>{n(t)}))}else n(r)}(this.$list,t,e),x(i,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return x(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,i=this.$list,s=i.querySelector(".outline-navigator__anchor"),r=parseInt(k(e,"padding-top"),10),n=parseInt(k(e,"border-top-width"),10),l=parseInt(k(i,"padding-top"),10),o=parseInt(k(i,"margin-top"),10),a=parseInt(k(i,"border-top-width"),10);let h,c=0;return r&&(c+=r),l&&(c+=l),o&&(c+=o),n&&(c+=n),a&&(c+=a),h=s.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,i=this.$placeholder,s=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=s.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),i.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),s="outline-navigator_active",r="outline-navigator_highlight";let l=null,o=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(x(this.$active,r),x(this.$active,s)),this.$active=l,_(this.$active,s),i?this.positionPlaceholder(this.active):_(this.$active,r),n((()=>{console.log(!L(this.$active,this.$main)),L(this.$active,this.$main)||(o=this._getPlaceholderOffset(this.active),console.log("placeholderOffsetTop",o),$(this.$main,o))})),this):this):this}sticky(){const t=this.attr("afterSticky"),e="outline-navigator_fixed",s=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?_(s,e):x(s,e),i(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return S("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const i=this.$scrollElement;return $(i,t,e),this}show(){const t="outline-navigator_hidden",e=this.attr("afterOpened"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?x(l,t):(x(l,t),n((()=>{x(l,"outline-navigator_folded")}),30)):x(r,t),this.closed=!1,i(e)&&e.call(this),this}hide(){const t="outline-navigator_hidden",e=this.attr("afterClosed"),s=this.count(),r=this.$el,l=this.$parentElement;return this.isInside()?s>800?_(l,t):(_(l,"outline-navigator_folded"),n((()=>{_(l,t)}))):_(r,t),this.closed=!0,i(e)&&e.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)&&n((()=>{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()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),i(e)&&e.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s=e.root||null,n=e.selector||".outline-heading",l=e.context||null,o={rootMargin:e.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((e=>{e.forEach((e=>{e.intersectionRatio>0&&i(t)&&t.call(l||e.target,e.target)}))}),o),h=r(s)?s:document;return s&&(o.root=s),h.querySelectorAll(n).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=n((()=>{this.highlight(e)}),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],o=document.querySelector(`#${l}`),a=E(o)-(e+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),u=()=>{i(c)&&c.call(this,"chapter"),n((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),n((()=>{this.scrollTo(a,u),this.highlight(r)}),10)):(this.scrollTo(a,u),this.highlight(r)),function(t){t.stopPropagation(),t.preventDefault()}(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=n((()=>{const e=t.scrollTop,i=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:i})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=n((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,i=e.tagName.toLowerCase();let s=e;return this.count()<1||("html"!==i&&"body"!==i||(s=window),f(t,".outline-navigator__anchor","click",this.onSelect,this,!0),c(s,"scroll",this.onScroll,this,!0),this.isSticky()&&c(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,i=this.$scrollElement,s=i.tagName.toLowerCase();let r=i;return this.count()<1||("html"!==s&&"body"!==s||(r=window),h(e,"click",this.onSelect),h(r,"scroll",this.onScroll),this.isSticky()&&h(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}return R.DEFAULTS=O({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null}),R})); //# sourceMappingURL=navigator.min.js.map diff --git a/navigator.min.js.map b/navigator.min.js.map index 4cbb9e5..f297a8f 100644 --- a/navigator.min.js.map +++ b/navigator.min.js.map @@ -1 +1 @@ -{"version":3,"file":"navigator.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isElement.js","utils/lang/later.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/types/isArray.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/createElement.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/offsetTop.js","utils/dom/getStyle.js","utils/dom/setProperty.js","utils/lang/cloneDeep.js","utils/lang/timeSlice.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","navigator.js","_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取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","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 isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","height","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"navigator.min.js","sources":["utils/types/isString.js","utils/lang/toString.js","utils/types/isFunction.js","utils/types/isObject.js","utils/types/isElement.js","utils/lang/later.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/at.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/types/isArray.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/lang/hasOwn.js","utils/dom/createElement.js","utils/dom/setAttributes.js","utils/dom/setAttribute.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/dom/removeClass.js","utils/lang/trim.js","utils/dom/offsetTop.js","utils/dom/getStyle.js","utils/dom/setProperty.js","utils/lang/cloneDeep.js","utils/lang/timeSlice.js","utils/dom/inBounding.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/lang/extend.js","utils/observer/on.js","navigator.js","_paintChapters.js","utils/dom/intersection.js","utils/event/stop.js"],"sourcesContent":["/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from './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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取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","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 isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n console.log(!inBounding(this.$active, this.$main))\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n console.log('placeholderOffsetTop', placeholderOffsetTop)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n"],"names":["isString","str","toString","val","Object","prototype","apply","isFunction","isObject","o","isElement","nodeName","tagName","nodeType","later","fn","delay","arguments","length","undefined","setTimeout","CAPTURE_EVENTS","_off","el","type","capture","indexOf","_delegateListener","listeners","_listeners","index","forEach","listener","i","handler","splice","_delete","removeEventListener","purgeElement","recurse","$element","document","querySelector","$children","childNodes","getListeners","filter","$child","off","at","data","context","once","evt","overrideContext","call","push","addEventListener","matches","selector","sel","replace","msMatchesSelector","getParentOrHost","host","parentNode","on","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","isArray","Array","isDOM","isHTMLCollection","fragment","isTextNode","hasOwn","obj","prop","hasOwnProperty","createElement","attrs","children","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","setAttributes","keys","attr","value","setAttribute","toLowerCase","style","cssText","className","innerHTML","innerText","every","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","hasClass","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","removeClass","remove","offsetTop","offsetParent","getStyle","ruleName","getComputedStyle","setProperty","documentElement","cloneDeep","clone","from","assign","key","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","cb","start","Date","now","didTimeout","Math","max","cancelIdleCallback","id","clearTimeout","timeSlice","afterComplete","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","async","execute","subscriber","message","callback","deliver","guid","uuid","prefix","_removeSubscriber","token","subject","execution","j","_removeSubscriberByToken","Base","constructor","options","this","initialize","render","addListeners","origin","source","extend","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","subscribe","$off","unsubscribe","Navigator","super","_default","scrollTimer","resizeTimer","observerTimer","Observer","DEFAULTS","$title","$main","$list","$placeholder","$parentElement","$active","chapters","active","offsetWidth","playing","closed","created","parentElement","$parent","isClosed","isSticky","isFixed","isInside","isOutside","count","_paintEdge","title","animationCurrent","customClass","contents","calculateStickyHeight","mounted","_paint","highlight","sticky","onObserver","erase","showCode","clones","paint","parts","byId","chapter","pid","code","rel","$text","text","$link","$code","$li","$subject","$chapter","href","_paintChapters","_remove","removeChild","_getPlaceholderOffset","$anchor","mainPaddingTop","parseInt","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","height","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","console","log","afterSticky","FIXED","isStickying","clientHeight","innerHeight","after","show","HIDDEN","opened","hide","toggle","afterToggle","beforeDestroy","afterDestroy","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","$heading","onSelect","stickyHeight","headingId","split","afterScroll","min","stopPropagation","preventDefault","onScroll","onResize","unobserve","afterClosed","afterOpened"],"mappings":"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"} \ No newline at end of file diff --git a/outline.min.js b/outline.min.js index 5e7bb36..2d56cfa 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=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!e(t)&&setTimeout((()=>{t()}),s)},i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),n=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?n(t[s]):t[s]))),e)},l=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),a=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},h=(t,e)=>{var s;let i,r;if(a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},c=t=>t*t,d=function(){let t,e,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?l(s)?e=document.querySelector(s):o(s)&&(e=s):(t=document.querySelectorAll("html,body"),e=t[0].scrollTop-t[1].scrollTop>=0?t[0]:t[1]),e},u=(t,s,i)=>{const r=d(t);let n=r.scrollTop,l=0;const o=s-n,a=r.scrollHeight,h=s-a<=0?s:a,u=t=>(e(i)&&i(t),!1),m=()=>{if(l+=1,o<0){if(n-=c(l),r.scrollTop=n,n<=s)return r.scrollTop=s,u(s)}else if(n+=c(l),r.scrollTop=n,n>=h)return r.scrollTop=h,u(h);requestAnimationFrame(m)};requestAnimationFrame(m)},m=t=>!!l(t)&&t.replace(/(^\s+)|(\s+$)/g,""),p=function(t){let s=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=1,o=0,a="";const h=[];return t.forEach(((t,s)=>{const r=t.tagName,c=r.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>n?(o+=1,u=1===o?-1:s-1):d===n||do?1===d?(o=1,u=-1):u=h[s-1].pid:d<=o&&(1===d?o=1:(o-=n-d,o<=1&&(o=1)),u=1===o?-1:((t,e,s)=>{let i,r,n=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(a=i(a)),h.push({id:s,pid:u,level:o,rel:`heading-${s}`,text:a,tagName:r})})),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((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h},g=t=>{const{articleElement:s,selector:i,showCode:r,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],d=[],u=t=>t.replace(/\(.*?\)/,"()");return l(s)?h=document.querySelector(s):o(s)&&(h=s),h?(e(n)&&(u=n),c=[...h.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")],d=p(c,r||!0,u),!0===a?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const n=t[i[e[s]]];-1!==e[s]?n.children.push(e):r.push(e)})),r})(d,"id","pid"):d):d},f=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},b=(t,e)=>{Object.keys(e).forEach((s=>{f(e,s)&&(t[s]=e[s])}))},v={},y=t=>f(v,t)&&v[t].length>0,$=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?y(t):(t=>{let e=y(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=y(t);return e})(t)},_=function(e,s){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=e=>{if(!y(e))return!1;v[e].forEach((e=>{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(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},n=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!$(e))return!1;i?setTimeout(n,10):n()},x=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),T=t=>{if(!f(v,t))return!1;delete v[t]},w=(t,e)=>{if(!$(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&&T(i)}))})(e):T(t)};class E{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return l(t)?e&&f(s,t)?(s[t]=e,this):s[t]:i(t)?(b(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return _(t,e),this}$on(t,s){return function(t,s){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=x();let n="symbol"==typeof t?t.toString():t;e(s)&&(v[n]||(v[n]=[]),v[n].push({topic:n,callback:s,context:i,token:r}))}(t,s,this),this}$off(t,e){return w(t,e),this}addListeners(){return this}removeListeners(){return this}}const C=[];let S,z;function L(t){for(;t.timeRemaining()>0&&C.length;){const t=C.shift();if(!e(t))return!1;t()}C.length?S=requestIdleCallback(L):(S=0,e(z)&&(z(),z=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const k=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;C.push(t),e(s)&&(z=s),S||requestIdleCallback(L)},M=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=M(t.offsetParent)),e},N=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},A=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,H=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],O=(t,e,s)=>{const i=H.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 n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},D=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=l(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return l(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{O(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&D(t,e,s)}))},F=(t,s,i)=>{if(!e(i))return D(t,s),!1;O(t,s,i)},q=function(t,e,s,i,r,n){let l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const o=H.indexOf(s)>-1,a=function(o){const h=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&&N(t,e):N(t,e))||i&&t===r)return t;if(t===r)break}while(t=A(t))})(h,e,t);let d=n||t;o.delegateTarget=c,!0===n&&(d=r),c&&(!0===l&&F(t,s,a),i.call(d,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},j=function(t){t.stopPropagation(),t.preventDefault()},R=['','','','','','','','','','','','','','','','','','','',''],I=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";return l(t)?function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";const s=/id="(.*?)"/,i=/^(\w+)-/;return R.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))}(t,e):[...R]},U=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===R.indexOf(t)&&l(t)&&R.push(t)})):l(t)&&R.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(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"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];f(e,s)&&P(t,s,i)}))},W=(t,e,s)=>{const n=document.createDocumentFragment(),o=document.createElement(t),a=t=>B(t)||l(t),h=t=>{let e;if(!a(t))return!1;B(t)?e=t:l(t)&&(e=document.createTextNode(t)),n.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>a(t)))?e.forEach((t=>{h(t)})):B(e)?h(e):l(e)&&h(document.createTextNode(e)),r(s)?s.forEach((t=>{h(t)})):h(s),o.appendChild(n),o},Q=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s="outline-icon",i=e.size||0,n=e.color||"",o=e.iconSet||"",a=r(i)?i[0]:i,h=r(i)?i[1]:i,c=i?`width:${a}px;height:${h}px;`:"",d=n?c+`color:${n}`:c,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return l(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return l(t)&&e.test(t)})(t)?f=t:(g=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${s} ${u.className}`:u.className=s,V(m,u),p=m.querySelector("svg"),V(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),m):null},J=function(t){return Q(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})},Y=(t,e)=>{var s;let i,r=t.className;if(!r||!a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(r=m(r.replace(e,"")),t.className=r)},G=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const i="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),Y(t,i),!e)return!1;var o;n=t.querySelector(`.${i}__anchor`),s&&Y(t,`${i}_start`),o=m(t.className),l(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class K extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let s,i,r,n;return this.attr(t),n=this.attr("articleElement"),i=this.attr("scrollElement"),s=this.attr("created"),l(n)?r=document.querySelector(n):o(n)&&(r=n),r?(this.$articleElement=r,this.$scrollElement=d(i),this.$headings=this.getHeadings(),this.$headings.length<1||(e(s)&&s.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return[...t.querySelectorAll(e)]}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter"),n=this.attr("mounted"),l=g({articleElement:t,selector:s,showCode:i,chapterTextFilter:r});return U(),this._paint(l),e(n)&&n.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),i=this.attr("isAtStart"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.count(),o=[...this.$headings],a=(l,o)=>{l.forEach(((l,a)=>{const h=a+o*e,c=t[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,n=s.isAtStart||!0,l=s.showCode||!1,o=s.chapterCode||"",a=s.anchorURL||"",h=`heading-${e}`,c={id:h,className:n?`${i} ${i}_start`:i,"data-id":e},d=m(t.innerHTML);let u,p;if(l&&(c.innerHTML=o+" "+d,c["data-code"]=o),V(t,c),!r)return!1;p=J("hash",{iconSet:"outline"}),u=W("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:a||`#${h}`,target:a?"_blank":"self","data-id":e},p),t.appendChild(u)})(l,h,{hasAnchor:s,isAtStart:i,showCode:r,chapterCode:c,anchorURL:n})}))};let h=-1;if(l>e)for(h+=1,a(o.splice(0,e),0);o.length>0;){const t=o.splice(0,e);k((()=>{a(t,h+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else a(o,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((s=>{G(s,t,e)})),this}refresh(t){const e=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r})),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=M(l)-(n+10),a=this.$scrollElement,h=a.scrollHeight-a.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:h})}))})),i||j(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||q(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return this.count()<1||F(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS=n({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,chapterTextFilter:null});const X=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],Z=t=>{let e,s,i;return!!l(t)&&(e=m(t).slice(0,1e3),s=/\s*|]*>|]*>|]+>/i,i=new RegExp(X.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),s.test(e)||i.test(e))},tt=t=>t.replace(/]*>.*?<\/script>/gi,""),et=(t,e)=>{document.documentElement.style.setProperty(t,e)};let st=2e3;const it=t=>(t?st=t:st+=1,et("--outline-zIndex",`${st}`),st);class rt extends E{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=n(rt.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,this}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.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"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),n=this.attr("hasOverlay"),l=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("customClass");let d,u,m,p,g,f,b,v;return U(),this.zIndex=it(),p=W("h2",{className:"outline-drawer__title"},this.title),this.$title=p,r&&(g=W("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=g),m=W("header",{className:"outline-drawer__header"},[p,g]),this.$header=m,f=W("div",{className:"outline-drawer__main"}),this.$main=f,o||h(f,"outline-drawer_full"),b=W("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=W("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[m,f,b]),this.$modal=u,l&&h(u,"outline-drawer_offset"),a&&h(u,"outline-drawer_auto"),c&&h(u,c),n&&(v=W("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=W("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),e(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let s=null;return e(t)?s=t():B(t)?s=t:Z(t)&&(s=((t,e)=>{const s=document.createDocumentFragment();if(!t||!Z(t)&&!l(t)&&!o(t))return null;if(Z(t)){const e=W("div");let i=[];return e.innerHTML=tt(t),i=[...e.childNodes],i.forEach((t=>{s.appendChild(t)})),s}if(!l(e))return t.innerHTML;t.innerHTML=tt(e)})(t)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return h(this.$el,"outline-drawer_opened"),Y(i,"outline-drawer_closed"),h(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return Y(i,"outline-drawer_opened"),h(i,"outline-drawer_closed"),s((()=>{Y(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners()._remove()._default(),i-=1,it(i),this.zIndex=0,e(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),i=this.$el;return t&&q(i,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&q(i,".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?(F(s,"click",this.onClose),this):this}}rt.DEFAULTS=n({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const nt=function(t,s,i,r,n){let l=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const o=H.indexOf(s)>-1,a=function(e){let o=n||t;!0===n&&(o=r),!0===l&&F(t,s,a),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},lt=(t,e)=>getComputedStyle(t)[e];class ot extends E{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=n(ot.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let s,i,r,n;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),l(i)?n=document.querySelector(i):o(i)&&(n=i),this.$parentElement=n,this.$scrollElement=d(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,c,d,u=null;return r?(this.isInside()&&e&&(u=W("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),c=W("ul",{className:"outline-navigator__list"}),this.$list=c,n.push(c),s&&(d=W("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,n.push(d)),a=W("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=W("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),h(o,"outline-navigator_sticky")),i&&h(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),i=this.$parentElement,r=this.chapters,n=this.count();let l;return!i||r.length<1||(this.isInside()&&h(i,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(r),s((()=>{this.highlight(this.active)}),60),this.offsetTop=M(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),et("--outline-navigator-width",`${this.offsetWidth}px`)),e(t)&&t.call(this),n<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=e.length,r=[...e],n=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=W("span",{className:"outline-navigator__text"},e.text);let c,d,u,m,p;s&&(d=W("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(d)),a.push(h),c=W("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),u=W("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(u):(m=W("ul",{id:"subject-"+r,className:"outline-navigator__subject"},u),p.appendChild(m)))}))};if(i>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);k((()=>{n(t)}))}else n(r)}(this.$list,t,e),Y(s,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return Y(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,s=this.$list,i=s.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=parseInt(lt(e,"padding-top"),10),l=parseInt(lt(e,"border-top-width"),10),o=parseInt(lt(s,"padding-top"),10),a=parseInt(lt(s,"margin-top"),10),h=parseInt(lt(s,"border-top-width"),10);let c,d=i.offsetHeight,u=0;return r?(n&&(u+=n),o&&(u+=o),a&&(u+=a),l&&(u+=l),h&&(u+=h),c=d*t,u+c):this}positionPlaceholder(t){const e=this.$list,s=this.$placeholder,i=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=i.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),s.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",n="outline-navigator_highlight";let l=null,a=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(Y(this.$active,n),Y(this.$active,r)),this.$active=l,h(this.$active,r),i?this.positionPlaceholder(this.active):h(this.$active,n),s((()=>{((t,e)=>{let s,i;return!(!o(t)||!o(e))&&(s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),i.top>=s.top&&i.right<=s.right&&i.bottom<=s.bottom&&i.left>=s.left)})(this.$active,this.$main)||(a=this._getPlaceholderOffset(this.active),u(this.$main,a))})),this):this):this}sticky(){const t=this.attr("afterSticky"),s="outline-navigator_fixed",i=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?h(i,s):Y(i,s),e(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return et("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}show(){const t="outline-navigator_hidden",i=this.attr("afterOpened"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?Y(l,t):(Y(l,t),s((()=>{Y(l,"outline-navigator_folded")}),30)):Y(n,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-navigator_hidden",i=this.attr("afterClosed"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?h(l,t):(h(l,"outline-navigator_folded"),s((()=>{h(l,t)}))):h(n,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{n=r>=i,t.call(this,this.isClosed(),n)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),e(s)&&s.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=s.root||null,r=s.selector||".outline-heading",n=s.context||null,l={rootMargin:s.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(n||s.target,s.target)}))}),l),h=o(i)?i:document;return i&&(l.root=i),h.querySelectorAll(r).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,n=r.getAttribute("data-id"),l=r.href.split("#")[1],o=document.querySelector(`#${l}`),a=M(o)-(i+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),d=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(a,d),this.highlight(n)}),10)):(this.scrollTo(a,d),this.highlight(n)),j(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return this.count()<1||("html"!==s&&"body"!==s||(i=window),q(t,".outline-navigator__anchor","click",this.onSelect,this,!0),nt(i,"scroll",this.onScroll,this,!0),this.isSticky()&&nt(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return this.count()<1||("html"!==i&&"body"!==i||(r=window),F(e,"click",this.onSelect),F(r,"scroll",this.onScroll),this.isSticky()&&F(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}ot.DEFAULTS=n({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const at=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},ht=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},ct=[];let dt;U();class ut extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(ut.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),l=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&l.push("outline-message_round"),i||l.push("outline-message_full-width"),r&&l.push("outline-message_visible"),n&&l.push(n),l}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),l=this._getClassName(),o=[];let a,c,d,u,m,p=20;return i&&"default"===s&&(p=12),"plain"!==s&&(a=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:p}),h(a,"outline-message__icon"),o.push(a)),n?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(ht(tt(e))),c=W("p",{className:"outline-message__content"},[d]),o.push(c),r&&(u=J("close",{iconSet:"outline",size:18}),h(u,"outline-message__close"),o.push(u)),m=W("div",{className:l.join(" ")},o),m.style.cssText="top:-50px;",this.$el=m,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,n,l,o,a,c=20;return this.isDestroyed()?this:(l=e.querySelector(".outline-icon"),l?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?h(l,t):(Y(l,t),r&&"default"===i&&(c=12)),o=l.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),a=o.querySelector("use"),n="light"===i?`circle-${s}`:s,P(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ht(tt(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?h(s,t):Y(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return at(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,n,l;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),n=i&&i>=this.offset?i:this.offset,l=`top:${n}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,h(e,"outline-message_visible"),e.style.cssText=l,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",Y(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return q(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),q(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),q(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return F(t,"mouseenter",this.onMouseEnter),F(t,"mouseleave",this.onMouseLeave),F(t,"click",this.onClose),this}}ut.DEFAULTS=n({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{ut[t]=e=>{const s={},i=x("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return l(e)?s.message=e:at(e)&&b(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{ut.close(i,r)},dt=new ut(s),ct.forEach((t=>{n+=t.$el.offsetHeight+16})),dt.offset=n,dt.open(),ct.push(dt),dt}})),ut.close=(t,s)=>{const i=ct.length;let r,n,l=-1;if(ct.forEach(((i,r)=>{t===i.id&&(n=i.$el.offsetHeight,l=r,e(s)&&s.call(i),ct.splice(r,1))})),i<=1||-1===l||l>ct.length-1)return!1;for(r=l;r{let t=ct.length-1;for(;t>=0;t-=1)ct[t].close()};class mt{constructor(t,s){this.name=t,e(s)&&(this.action=s)}execute(){return this.action(),this}}class pt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const s=this.commands.find((e=>e.name===t));return e(null==s?void 0:s.execute)&&s.execute(),this}}const gt=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=W("a",{className:"outline-toolbar__anchor",href:t.link},s),r=W("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":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},ft="outline-toolbar_disabled",bt="outline-toolbar_hidden";class vt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(vt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let s;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new pt,s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const s=this,{action:i,name:r}=t;let n,o,a=null,h=null;return i?(h=i.handler,n=i.context||this,e(h)?o=h:l(h)&&(o=function(){s.$emit(h,r)}),e(o)&&(a=new mt(r,o.bind(n))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("placement");return U(),this.$el=W("div",{id:x("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(s),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=gt(t,e),r=this._getCommand(t),{name:n,disabled:l,context:o}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:l||!1,context:o||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),n=this.attr("buttons")||[],{name:l,disabled:o,context:a}=t,h=this._getCommand(t),c=t=>{const e=gt(t);s.appendChild(e),n.push(t),this.buttons.push({$el:e,name:l,disabled:o||!1,context:a||this,command:h}),h&&this.commands.add(h)};return i(t)?c(t):r(t)&&t.forEach((t=>{i(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attrs("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),h(e.$el,ft)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),Y(e.$el,ft),this):this}disable(t){const s=this.attr("afterDisabled");return t?this._disable(t):(h(this.$el,ft),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,Y(this.$el,ft),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.get(t),n=this.$el;if(t){if(!r)return this;Y(r.$el,bt)}else Y(n,bt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.get(t),n=this.$el;if(t){if(!r)return this;h(r.$el,bt)}else h(n,bt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t),s="outline-toolbar_active";let i;return e?(i=e.$el,a(i,s)?Y(i,s):h(i,s),this):this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}addListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||q(e,".outline-toolbar__button","click",this.onExecute,this,!0),this}removeListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||F(e,".outline-toolbar__button",this.onExecute),this}}vt.DEFAULTS=n({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});class yt{constructor(t){this.utterance=new SpeechSynthesisUtterance,t&&this.initialize(t)}_initialize(t){return t.lang&&this.setLang(t.lang),t.pitch&&this.setPitch(t.pitch),t.rate&&this.setRate(t.rate),t.text&&this.setText(t.text),t.voice&&this.setVoice(t.voice),t.volume&&this.setVolume(t.volume),this}initialize(t){return this._initialize(t)._addListeners(),this}isSpeaking(){return speechSynthesis.speaking}isPending(){return speechSynthesis.pending}isPaused(){return speechSynthesis.paused}getVoices(){return speechSynthesis.getVoices()}setLang(t){return this.utterance.lang=t,this}setPitch(t){return this.utterance.pitch=t,this}setRate(t){return this.utterance.rate=t,this}setText(t){return this.utterance.text=t,this}setVoice(t){return this.utterance.voice=t,this}setVolume(t){return this.utterance.volume=t,this}speak(t){return t&&this.setText(t),speechSynthesis.speak(this.utterance),this}pause(){return speechSynthesis.pause(),this}resume(){return speechSynthesis.resume(),this}cancel(){return speechSynthesis.cancel(),this.setText(""),this}_addListeners(){const t=this.utterance,e=this;return["boundary","end","error","start","mark","pause","resume"].forEach((s=>{t[`on${s}`]=t=>{_(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{_("voiceschanged",{event:t,speech:e})},this}}yt.isSupport="speechSynthesis"in window;const $t=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&h(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},_t="进入阅读模式,按 ESC 键可退出阅读模式";class xt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(xt.DEFAULTS),this.reading=!1,this.$target=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e=null;return this.attr(t),e=this.attr("target"),l(e)?this.$target=document.querySelector(e):o(e)&&(this.$target=e),this.$target?(yt.isSupport&&(this.speech=new yt),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=[...t.cloneNode(!0).children];return s((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$paper,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_renderEdge(){const t=this.$target;let e,i,r,n,l,a=this.attr("title");i=t.querySelector("h1"),o(a)&&(i=a),o(i)&&(a=i.innerText),i=W("h1",{className:"outline-reader__title"},a),this.$title=i,r=W("article",{id:"outline-reader__article",className:"outline-reader__article"}),this.$article=r,n=W("div",{className:"outline-reader__progress"}),this.$progress=n;const h=[];return yt.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:20,action:{context:this,handler:this.speak}}),h.push({name:"print",icon:"print",size:20,action:{context:this,handler:this.print}},{name:"exit",icon:"close",size:20,action:{context:this,handler:this.exit}}),this.toolbar=new vt({placement:"rtl",buttons:h}),e=W("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,i,r,this.toolbar.$el]),this.$paper=e,document.body.appendChild(e),s((()=>{l=e.previousElementSibling,$t(l,!0),l=e.nextElementSibling,$t(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||_t;return this.reading||!i||(r.forEach((t=>{h(t,s)})),h(i,e),Y(i,s),this.toolbar.show(),this.reading=!0,ut.info({round:!0,message:n}),this.$emit("enterReading")),this}exit(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling");return this.reading&&i?(h(i,s),Y(i,e),r.forEach((t=>{Y(t,s)})),this.toolbar.hide(),this.reading=!1,this.$emit("exitReading"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return yt.isSupport?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return e(print)?(print(),this):this}destroy(){return this.$paper?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),j(t)),this}addListeners(){return this.$paper?(nt(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this):this}removeListeners(){return this.$paper?(F(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this):this}}var Tt;xt.DEFAULTS=n({target:"",title:"",enterReadingTip:_t,allowSpeak:!1});class wt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){const t=wt.DEFAULTS;return this.attrs=n(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",s="",i=null;return this.attr(t),e=this.attr("articleElement"),s=this.attr("scrollElement"),l(e)?i=document.querySelector(e):o(e)&&(i=e),this.$article=i,this.$scrollElement=d(s),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const e=this.$article,s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this._updateToolbar({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}refresh(){const t=this.getChapters();return this.anchors.refresh(t),this.navigator.refresh(t),this.reader.refresh(),this}_renderReader(){const t=this.attr("reader");return t.target?(h(this.$article,"outline-article"),this.reader=new xt(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:n,afterScroll:l,chapterTextFilter:o}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),l=this.attr("closeOnClickModal"),o=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),d=this.attr("afterToggle"),u=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:s,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:d,afterScroll:u},"relative"===a?(this.drawer=new rt({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:l,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,o&&this.drawer.open()):p.customClass=i,p.parentElement=g,this.navigator=new ot(p)),this}_renderToolbar(){const t=this.attr("position"),s=this.attr("hasToolbar"),i=this.attr("showNavModalFirst"),r=this.attr("placement"),n=this.attr("homepage"),l=this.attr("git"),o=this.attr("tags"),a=this.attr("issues"),h=this.attr("tools"),c=this.attr("reader"),d=this.count(),u={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},m={name:"homepage",icon:"homepage",size:20,link:n},p={name:"github",icon:"github",size:20,link:l},g={name:"tags",icon:"tags",size:20,link:o},f={name:"issues",icon:"issues",size:20,link:a},b={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},y={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},$={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},_=[];return s?(_.push(u),d>0&&_.push(b),n&&_.push(m),l&&_.push(p),o&&_.push(g),a&&_.push(f),c.target&&(_.push(v),e(print)&&_.push(y)),(null==h?void 0:h.length)>0&&_.push(...h),_.push($),this.buttons=[..._],this.toolbar=new vt({placement:r,buttons:_}),"relative"===t&&i&&this.toolbar.hide(),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}_updateToolbar(t){let{top:e,min:s,max:i}=t;const r=this.toolbar,n=Math.ceil(e);return n<=s?(r.hide("up"),r.show("down")):n>=i?(r.hide("down"),r.show("up")):n>s&&n0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1,u(i.$main,0)),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=this.$scrollElement,i=this.toolbar,r=this.navigator,n=this.count(),l=Math.floor(s.scrollHeight-s.clientHeight);return n>0&&(r.playing=!0),this.scrollTo(l,(()=>{i.hide("down"),i.show("up"),n>0&&(r.highlight(n-1),u(r.$main,r.$main.scrollHeight),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return u(this.$scrollElement,t,e),this}enterReading(){const t=this.reader;return!t||t.reading||(this.toolbar.toggle(),t.enter()),this}exitReading(){const t=this.reader;return t&&t.reading?(this.toolbar.toggle(),t.exit(),this):this}switchReading(){const t=this.reader;return t?(t.toggle(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("toggle")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return this.reader.print(),this}_destroy(){const t=this.count();let e=this.anchors,s=this.navigator,i=this.drawer,r=this.reader,n=this.toolbar,l=!1;return this.removeListeners(),r&&r.destroy(),t>0&&s&&(l=s.isOutside(),s.destroy(),l&&i&&i.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}onToolbarUpdate(t){let{top:e,min:s,max:i}=t;return this._updateToolbar({top:e,min:s,max:i}),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(wt.DEFAULTS=n({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!0,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null}),null!==(Tt=window)&&void 0!==Tt&&Tt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let s=t(this);return new wt(t.extend({},e,{articleElement:s}))}})}return wt})); +!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=>Object.prototype.toString.apply(t),e=e=>"function"==typeof e||"[object Function]"===t(e),s=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:300;return!!e(t)&&setTimeout((()=>{t()}),s)},i=s=>("[object Object]"===t(s)||"object"==typeof s||e(s))&&null!==s,r=e=>Array.isArray?Array.isArray(e):"[object Array]"===t(e),n=t=>{let e={};return null===t?null:(r(t)?e=Array.from(t):(e=Object.assign({},t),Object.keys(e).forEach((s=>e[s]=i(t[s])?n(t[s]):t[s]))),e)},l=t=>"string"==typeof t,o=t=>!!(i(t)&&t.nodeName&&t.tagName&&1===t.nodeType),a=(t,e)=>{const s=new RegExp("(\\s|^)"+e+"(\\s|$)");let i,r;return!!o(t)&&(i=t.className,!!i&&(r=t.classList,r&&r.contains?t.classList.contains(e):!!s.exec(i)))},h=(t,e)=>{var s;let i,r;if(a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.add?i.add(e):(r=t.className,r+=r.length>0?" "+e:e,t.className=r)},c=t=>t*t,d=function(){let t,e,s=arguments.length>0&&void 0!==arguments[0]?arguments[0]:null;return s?l(s)?e=document.querySelector(s):o(s)&&(e=s):(t=document.querySelectorAll("html,body"),e=t[0].scrollTop-t[1].scrollTop>=0?t[0]:t[1]),e},u=(t,s,i)=>{const r=d(t);let n=r.scrollTop,l=0;const o=s-n,a=r.scrollHeight,h=s-a<=0?s:a,u=t=>(e(i)&&i(t),!1),m=()=>{if(l+=1,o<0){if(n-=c(l),r.scrollTop=n,n<=s)return r.scrollTop=s,u(s)}else if(n+=c(l),r.scrollTop=n,n>=h)return r.scrollTop=h,u(h);requestAnimationFrame(m)};requestAnimationFrame(m)},m=t=>!!l(t)&&t.replace(/(^\s+)|(\s+$)/g,""),p=function(t){let s=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,n=1,o=0,a="";const h=[];return t.forEach(((t,s)=>{const r=t.tagName,c=r.replace(/h/i,"");let d=parseInt(c,10),u=-1;var p;d>n?(o+=1,u=1===o?-1:s-1):d===n||do?1===d?(o=1,u=-1):u=h[s-1].pid:d<=o&&(1===d?o=1:(o-=n-d,o<=1&&(o=1)),u=1===o?-1:((t,e,s)=>{let i,r,n=t[s-1];for(r=0;r]+(>|$)/g,""):"",e(i)&&(a=i(a)),h.push({id:s,pid:u,level:o,rel:`heading-${s}`,text:a,tagName:r})})),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((t=>{e[t].forEach((t=>{const s=e[`[${t.id}]`];if(!s||!r(s))return!1;s.forEach((e=>{e.code=t.code+"."+e.index}))}))})),t})(h):h},g=t=>{const{articleElement:s,selector:i,showCode:r,chapterTextFilter:n,isTreeStructured:a}=t;let h=document.querySelector("#article"),c=[],d=[],u=t=>t.replace(/\(.*?\)/,"()");return l(s)?h=document.querySelector(s):o(s)&&(h=s),h?(e(n)&&(u=n),c=[...h.querySelectorAll(i||"h1,h2,h3,h4,h5,h6")],d=p(c,r||!0,u),!0===a?((t,e,s)=>{const i={},r=[];return t.forEach(((t,s)=>{i[t[e]]=s,t.children=[]})),t.forEach((e=>{const n=t[i[e[s]]];-1!==e[s]?n.children.push(e):r.push(e)})),r})(d,"id","pid"):d):d},f=(t,e)=>{const s=Object.prototype.hasOwnProperty;return t&&s.call(t,e)},b=(t,e)=>{Object.keys(e).forEach((s=>{f(e,s)&&(t[s]=e[s])}))},v={},y=t=>f(v,t)&&v[t].length>0,$=function(t){return!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?y(t):(t=>{let e=y(t),s=t.lastIndexOf(".");for(;!e&&-1!==s;)s=(t=t.substring(0,s)).lastIndexOf("."),e=y(t);return e})(t)},_=function(e,s){let i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const r=e=>{if(!y(e))return!1;v[e].forEach((e=>{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(t(s))>-1?s.toString():s;e.callback.call(e.context||e,i)}))},n=()=>{let t=e,s=e.lastIndexOf(".");for(;-1!==s;)t=t.substring(0,s),s=t.lastIndexOf("."),r(t);r(e),r("*")};if(!$(e))return!1;i?setTimeout(n,10):n()},x=(()=>{let t=0;return e=>(t+=1,e?e+"-"+t:"guid-"+t)})(),T=t=>{if(!f(v,t))return!1;delete v[t]},w=(t,e)=>{if(!$(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&&T(i)}))})(e):T(t)};class E{constructor(t){this.attrs={},t&&this.initialize(t)}initialize(t){return this.attr(t).render().addListeners(),this}attr(t,e){const s=this.attrs;return l(t)?e&&f(s,t)?(s[t]=e,this):s[t]:i(t)?(b(s,t),this):0===arguments.length?s:this}render(){return this}refresh(){return this}destroy(){return this.removeListeners(),this}reload(t){let e=this.attr();return t&&(e=this.attr(t)),this.destroy().initialize(e),this}$emit(t,e){return _(t,e),this}$on(t,s){return function(t,s){let i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null;const r=x();let n="symbol"==typeof t?t.toString():t;e(s)&&(v[n]||(v[n]=[]),v[n].push({topic:n,callback:s,context:i,token:r}))}(t,s,this),this}$off(t,e){return w(t,e),this}addListeners(){return this}removeListeners(){return this}}const C=[];let S,z;function L(t){for(;t.timeRemaining()>0&&C.length;){const t=C.shift();if(!e(t))return!1;t()}C.length?S=requestIdleCallback(L):(S=0,e(z)&&(z(),z=null))}void 0===window.requestIdleCallback&&(window.requestIdleCallback=function(t){const e=Date.now();return s((function(){t({didTimeout:!1,timeRemaining:function(){return Math.max(0,50-(Date.now()-e))}})}),10)},window.cancelIdleCallback=function(t){clearTimeout(t)});const k=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;C.push(t),e(s)&&(z=s),S||requestIdleCallback(L)},M=t=>{let e=t.offsetTop;return null!==t.offsetParent&&(e+=M(t.offsetParent)),e},N=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";const s=e.replace(/^>/i,"");return!!(e&&s&&t)&&(t.matches?t.matches(s):!!t.msMatchesSelector&&t.msMatchesSelector(s))},A=t=>t.host&&t!==document&&t.host.nodeType?t.host:t.parentNode,H=["focusout","blur","focusin","focus","load","unload","mouseenter","mouseleave"],O=(t,e,s)=>{const i=H.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 n=t.fn;e===t.type&&(r=i,n===s&&(r=i))})),r>-1&&i.splice(r,1)}(t,e,s),t.removeEventListener(e,s,i)},D=function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=l(t)?document.querySelector(t):t,r=i.childNodes,n=((t,e)=>{let s=t._listeners||[];return l(e)&&e&&(s=s.filter((t=>t.type===e))),s})(i,e);n.forEach((t=>{O(i,t.type,t.fn)})),(s||!0===e||1===arguments.length)&&i&&r&&r.forEach((t=>{o(t)&&D(t,e,s)}))},F=(t,s,i)=>{if(!e(i))return D(t,s),!1;O(t,s,i)},q=function(t,e,s,i,r,n){let l=arguments.length>6&&void 0!==arguments[6]&&arguments[6];const o=H.indexOf(s)>-1,a=function(o){const h=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&&N(t,e):N(t,e))||i&&t===r)return t;if(t===r)break}while(t=A(t))})(h,e,t);let d=n||t;o.delegateTarget=c,!0===n&&(d=r),c&&(!0===l&&F(t,s,a),i.call(d,o,r))};if(!t)return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,selector:e,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},j=function(t){t.stopPropagation(),t.preventDefault()},R=['','','','','','','','','','','','','','','','','','','',''],I=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";return l(t)?function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"icon";const s=/id="(.*?)"/,i=/^(\w+)-/;return R.find((r=>{const n=s.exec(r)[1];return i.exec(n)[1]===e&&n===("icon"===e?`${e}-${t}`:`${e}-icon-${t}`)}))}(t,e):[...R]},U=function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"";const e=document.body;let s=document.querySelector("#outline-icons"),i=[];(t=>{if(!t)return!1;r(t)&&t.length>0?t.forEach((t=>{-1===R.indexOf(t)&&l(t)&&R.push(t)})):l(t)&&R.push(t)})(t),i=I(),s?s.innerHTML=i.join(""):(s=document.createElement("div"),s.innerHTML=``,e.insertBefore(s.firstChild,e.firstChild))},B=e=>{return!(!i(e)||!(o(e)||(e=>!(!i(e)||"[object NodeList]"!==t(e)))(e)||(s=e,i(s)&&"[object DocumentFragment]"===t(s))||(e=>!(!i(e)||!("[object Text]"===t(e)||e.tagName&&3===e.nodeType)))(e)));var s},P=(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"htmlFor":t.setAttribute("for",s);break;case"className":t.className=s;break;case"innerHTML":t.innerHTML=s;break;case"innerText":t.innerText=s;break;default:t.setAttribute(e,s)}},V=(t,e)=>{if(!t||!i(e))return!1;Object.keys(e).forEach((s=>{const i=e[s];f(e,s)&&P(t,s,i)}))},W=(t,e,s)=>{const n=document.createDocumentFragment(),o=document.createElement(t),a=t=>B(t)||l(t),h=t=>{let e;if(!a(t))return!1;B(t)?e=t:l(t)&&(e=document.createTextNode(t)),n.appendChild(e)};return i(e)?V(o,e):r(e)&&e.every((t=>a(t)))?e.forEach((t=>{h(t)})):B(e)?h(e):l(e)&&h(document.createTextNode(e)),r(s)?s.forEach((t=>{h(t)})):h(s),o.appendChild(n),o},Q=function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const s="outline-icon",i=e.size||0,n=e.color||"",o=e.iconSet||"",a=r(i)?i[0]:i,h=r(i)?i[1]:i,c=i?`width:${a}px;height:${h}px;`:"",d=n?c+`color:${n}`:c,u=e.attrs||{},m=document.createElement("i");let p,g="",f="";return l(t)?((t=>{const e=new RegExp("^\\s*(?:<\\?xml[^>]*>\\s*)?(?:<\\!doctype svg[^>]*\\s*(?:\\[?(?:\\s*]*>\\s*)*\\]?)*[^>]*>\\s*)?]*>[^]*<\\/svg>\\s*$\\s*$","i");return l(t)&&e.test(t)})(t)?f=t:(g=o&&"icon"!==o?`xlink:href="#${o}-icon-${t}"`:`xlink:href="#icon-${t}"`,f=``),m.innerHTML=f,u.className?u.className=`${s} ${u.className}`:u.className=s,V(m,u),p=m.querySelector("svg"),V(p,{"aria-hidden":!0,xmlns:"http://www.w3.org/2000/svg",class:"outline-icon__svg",width:200,height:200,style:d}),m):null},J=function(t){return Q(t,arguments.length>1&&void 0!==arguments[1]?arguments[1]:{})},Y=(t,e)=>{var s;let i,r=t.className;if(!r||!a(t,e))return!1;i=t.classList,null!==(s=i)&&void 0!==s&&s.remove?i.remove(e):(r=m(r.replace(e,"")),t.className=r)},G=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],s=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];const i="outline-heading",r=t.innerHTML;let n;if(t.innerHTML=r.replace(/^\d+(\.?\d+)*\s?/gi,""),t.removeAttribute("id"),t.removeAttribute("data-id"),Y(t,i),!e)return!1;var o;n=t.querySelector(`.${i}__anchor`),s&&Y(t,`${i}_start`),o=m(t.className),l(o)&&""===o&&t.removeAttribute("class"),n&&t.removeChild(n)};class K extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(K.DEFAULTS),this.$articleElement=null,this.$scrollElement=null,this.$headings=[],this}initialize(t){let s,i,r,n;return this.attr(t),n=this.attr("articleElement"),i=this.attr("scrollElement"),s=this.attr("created"),l(n)?r=document.querySelector(n):o(n)&&(r=n),r?(this.$articleElement=r,this.$scrollElement=d(i),this.$headings=this.getHeadings(),this.$headings.length<1||(e(s)&&s.call(this),this.render().addListeners()),this):this}getHeadings(){const t=this.$articleElement,e=this.attr("selector");return[...t.querySelectorAll(e)]}count(){return this.getHeadings().length}render(){const t=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter"),n=this.attr("mounted"),l=g({articleElement:t,selector:s,showCode:i,chapterTextFilter:r});return U(),this._paint(l),e(n)&&n.call(this),this}erase(){return this._remove(),this}_paint(t){const e=400,s=this.attr("hasAnchor"),i=this.attr("isAtStart"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.count(),o=[...this.$headings],a=(l,o)=>{l.forEach(((l,a)=>{const h=a+o*e,c=t[h].code;((t,e,s)=>{const i="outline-heading",r=s.hasAnchor||!0,n=s.isAtStart||!0,l=s.showCode||!1,o=s.chapterCode||"",a=s.anchorURL||"",h=`heading-${e}`,c={id:h,className:n?`${i} ${i}_start`:i,"data-id":e},d=m(t.innerHTML);let u,p;if(l&&(c.innerHTML=o+" "+d,c["data-code"]=o),V(t,c),!r)return!1;p=J("hash",{iconSet:"outline"}),u=W("a",{id:`anchor-${e}`,className:`${i}__anchor anchor-${e}`,href:a||`#${h}`,target:a?"_blank":"self","data-id":e},p),t.appendChild(u)})(l,h,{hasAnchor:s,isAtStart:i,showCode:r,chapterCode:c,anchorURL:n})}))};let h=-1;if(l>e)for(h+=1,a(o.splice(0,e),0);o.length>0;){const t=o.splice(0,e);k((()=>{a(t,h+=1)}),(()=>{this.$emit("anchors:all:paint")}))}else a(o,0);return this}_remove(){const t=this.attr("hasAnchor"),e=this.attr("isAtStart");return this.$headings.forEach((s=>{G(s,t,e)})),this}refresh(t){const e=this.attr("articleElement"),s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return this.$headings=this.getHeadings(),this.erase()._paint(t||g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r})),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}onAnchorTrigger(t){const i=this.attr("anchorURL"),r=this.attr("afterScroll"),n=this.attr("stickyHeight"),l=t.delegateTarget.parentNode,o=M(l)-(n+10),a=this.$scrollElement,h=a.scrollHeight-a.clientHeight;return this.scrollTo(o,(()=>{e(r)&&r.call(this,"anchor"),s((()=>{this.$emit("toolbar:update",{top:o,min:0,max:h})}))})),i||j(t),this}addListeners(){const t=this.$articleElement;return this.count()<1||q(t,".outline-heading__anchor","click",this.onAnchorTrigger,this,!0),this}removeListeners(){const t=this.$articleElement;return this.count()<1||F(t,"click",this.onAnchorTrigger),this}}K.DEFAULTS=n({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,chapterTextFilter:null});const X=["a","abbr","address","area","article","aside","audio","b","base","bdi","bdo","blockquote","body","br","button","canvas","caption","cite","code","col","colgroup","data","datalist","dd","del","details","dfn","dialog","div","dl","dt","em","embed","fieldset","figcaption","figure","footer","form","h1","h2","h3","h4","h5","h6","head","header","hgroup","hr","html","i","iframe","img","input","ins","kbd","label","legend","li","link","main","map","mark","math","menu","menuitem","meta","meter","nav","noscript","object","ol","optgroup","option","output","p","param","picture","pre","progress","q","rb","rp","rt","rtc","ruby","s","samp","script","search","section","select","slot","small","source","span","strong","style","sub","summary","sup","svg","table","tbody","td","template","textarea","tfoot","th","thead","time","title","tr","track","u","ul","var","video","wbr"],Z=t=>{let e,s,i;return!!l(t)&&(e=m(t).slice(0,1e3),s=/\s*|]*>|]*>|]+>/i,i=new RegExp(X.map((t=>`<${t}\\b[^>]*>`)).join("|"),"i"),s.test(e)||i.test(e))},tt=t=>t.replace(/]*>.*?<\/script>/gi,""),et=(t,e)=>{document.documentElement.style.setProperty(t,e)};let st=2e3;const it=t=>(t?st=t:st+=1,et("--outline-zIndex",`${st}`),st);class rt extends E{constructor(t){super(),this._default(),this.zIndex=0,t&&this.initialize(t)}_default(){return this.attrs=n(rt.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,this}initialize(t){let s;return this.attr(t),this.title=this.attr("title"),s=this.attr("created"),e(s)&&s.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"),s=this.attr("size"),i=this.attr("placement"),r=this.attr("hasClose"),n=this.attr("hasOverlay"),l=this.attr("hasOffset"),o=this.attr("hasPadding"),a=this.attr("autoHeight"),c=this.attr("customClass");let d,u,m,p,g,f,b,v;return U(),this.zIndex=it(),p=W("h2",{className:"outline-drawer__title"},this.title),this.$title=p,r&&(g=W("div",{className:"outline-drawer__close"},J("close",{iconSet:"outline",size:20})),this.$close=g),m=W("header",{className:"outline-drawer__header"},[p,g]),this.$header=m,f=W("div",{className:"outline-drawer__main"}),this.$main=f,o||h(f,"outline-drawer_full"),b=W("footer",{className:"outline-drawer__footer"}),this.$footer=b,u=W("div",{className:`outline-drawer__modal outline-drawer_${i} outline-drawer_${s} outline-drawer_closed`},[m,f,b]),this.$modal=u,l&&h(u,"outline-drawer_offset"),a&&h(u,"outline-drawer_auto"),c&&h(u,c),n&&(v=W("div",{className:"outline-drawer__overlay"}),this.$overlay=v),d=W("div",{className:"outline-drawer"},[u,v]),this.$el=d,document.body.appendChild(d),e(t)&&t.call(this),this}erase(){return this.$main.innerHTML="",this}_paint(t){let s=null;return e(t)?s=t():B(t)?s=t:Z(t)&&(s=((t,e)=>{const s=document.createDocumentFragment();if(!t||!Z(t)&&!l(t)&&!o(t))return null;if(Z(t)){const e=W("div");let i=[];return e.innerHTML=tt(t),i=[...e.childNodes],i.forEach((t=>{s.appendChild(t)})),s}if(!l(e))return t.innerHTML;t.innerHTML=tt(e)})(t)),s&&this.$main.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.erase()._paint(t),this}open(){const t=this.attr("afterOpened"),i=this.$modal;return h(this.$el,"outline-drawer_opened"),Y(i,"outline-drawer_closed"),h(i,"outline-drawer_opened"),s((()=>{this.closed=!1,e(t)&&t.call(this)})),this}close(){const t=this.attr("afterClosed"),i=this.$modal;return Y(i,"outline-drawer_opened"),h(i,"outline-drawer_closed"),s((()=>{Y(this.$el,"outline-drawer_opened"),this.closed=!0,e(t)&&t.call(this)})),this}toggle(){const t=this.attr("afterToggle"),i=this.isClosed();return i?this.open():this.close(),e(t)&&s((()=>{t.call(this,i)})),this}destroy(){const t=this.attr("afterDestroy"),s=this.attr("beforeDestroy");let i=this.zIndex;return e(s)&&s.call(this),this.removeListeners()._remove()._default(),i-=1,it(i),this.zIndex=0,e(t)&&t.call(this),this}onClose(){return this.close(),this}addListeners(){const t=this.attr("hasClose"),e=this.attr("hasOverlay"),s=this.attr("closeOnClickModal"),i=this.$el;return t&&q(i,".outline-drawer__close","click",this.onClose,this,!0),e&&s&&q(i,".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?(F(s,"click",this.onClose),this):this}}rt.DEFAULTS=n({placement:"rtl",title:"标题",size:"regular",hasClose:!0,hasOverlay:!0,hasOffset:!1,hasPadding:!0,autoHeight:!0,closeOnClickModal:!0,created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterToggle:null});const nt=function(t,s,i,r,n){let l=arguments.length>5&&void 0!==arguments[5]&&arguments[5];const o=H.indexOf(s)>-1,a=function(e){let o=n||t;!0===n&&(o=r),!0===l&&F(t,s,a),i.call(o,e,r)};if(!e(i))return!1;t._listeners||(t._listeners=[]),t._listeners.push({el:t,type:s,fn:a,data:r,context:n,capture:o}),i._delegateListener=a,t.addEventListener(s,a,o)},lt=(t,e)=>getComputedStyle(t)[e],ot=(t,e)=>{let s,i;return!(!o(t)||!o(e))&&(s=e.getBoundingClientRect(),i=t.getBoundingClientRect(),i.top>=s.top&&i.right<=s.right&&i.bottom<=s.bottom&&i.left>=s.left)};class at extends E{constructor(t){super(),this._default(),this.scrollTimer=null,this.resizeTimer=null,this.observerTimer=null,this.Observer=null,t&&this.initialize(t)}_default(){return this.attrs=n(at.DEFAULTS),this.$el=null,this.$title=null,this.$main=null,this.$list=null,this.$placeholder=null,this.$parentElement=null,this.$scrollElement=null,this.$active=null,this.chapters=[],this.active=0,this.offsetWidth=0,this.offsetTop=0,this.playing=!1,this.closed=!1,this}initialize(t){let s,i,r,n;return this.attr(t),s=this.attr("created"),i=this.attr("parentElement"),r=this.attr("scrollElement"),l(i)?n=document.querySelector(i):o(i)&&(n=i),this.$parentElement=n,this.$scrollElement=d(r),this.chapters=this.attr("chapters"),this.closed=this.attr("closed"),this.active=this.attr("active"),e(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()}count(){return this.chapters.length}_paintEdge(){const t=document.createDocumentFragment(),e=this.attr("title"),s=this.attr("animationCurrent"),i=this.attr("customClass"),r=this.$parentElement,n=[],l=[];let o,a,c,d,u=null;return r?(this.isInside()&&e&&(u=W("h2",{className:"outline-navigator__title"},e),this.$title=u,l.push(u)),c=W("ul",{className:"outline-navigator__list"}),this.$list=c,n.push(c),s&&(d=W("div",{className:"outline-navigator__placeholder"}),this.$placeholder=d,n.push(d)),a=W("div",{className:"outline-navigator__main"},n),this.$main=a,l.push(a),o=W("nav",{id:"outline-navigator",className:"outline-navigator outline-navigator_hidden"},l),this.$el=o,this.isSticky()&&(this.calculateStickyHeight(),h(o,"outline-navigator_sticky")),i&&h(o,i),t.appendChild(o),r.appendChild(t),this):this}render(){const t=this.attr("mounted"),i=this.$parentElement,r=this.chapters,n=this.count();let l;return!i||r.length<1||(this.isInside()&&h(i,"outline-navigator-parent"),this._paintEdge(),l=this.$el,this._paint(r),s((()=>{this.highlight(this.active)}),60),this.offsetTop=M(l),this.offsetWidth=l.offsetWidth,this.isFixed()&&(this.sticky(),et("--outline-navigator-width",`${this.offsetWidth}px`)),e(t)&&t.call(this),n<400&&this.onObserver()),this}erase(){return this.$list.innerHTML="",this}_paint(t){const e=this.attr("showCode"),s=this.$el;return function(t,e){let s=arguments.length>2&&void 0!==arguments[2]&&arguments[2];const i=e.length,r=[...e],n=e=>{const i=e=>t.querySelector(`#${e}`);e.forEach((e=>{const r=e.pid,n=e.id,l=e.code,o=e.rel,a=[],h=W("span",{className:"outline-navigator__text"},e.text);let c,d,u,m,p;s&&(d=W("span",{className:"outline-navigator__code","data-id":n},e.code),a.push(d)),a.push(h),c=W("a",{id:`chapter__anchor-${n}`,className:"outline-navigator__anchor",href:"#"+o,rel:o,"data-id":n,"data-code":l},a),u=W("li",{id:`chapter-${n}`,className:"outline-navigator__item","data-id":n,"data-code":l},c),-1===r?t.appendChild(u):(p=i(`chapter-${r}`),m=i(`subject-${r}`),m?m.appendChild(u):(m=W("ul",{id:"subject-"+r,className:"outline-navigator__subject"},u),p.appendChild(m)))}))};if(i>400)for(n(r.splice(0,400));r.length>0;){const t=r.splice(0,400);k((()=>{n(t)}))}else n(r)}(this.$list,t,e),Y(s,"outline-navigator_hidden"),this}_remove(){return this.$parentElement.removeChild(this.$el),this}refresh(t){const e=this.$el;return Y(e,"outline-navigator_hidden"),this.erase()._paint(t),this}_getPlaceholderOffset(t){const e=this.$main,s=this.$list,i=s.querySelector(".outline-navigator__anchor"),r=parseInt(lt(e,"padding-top"),10),n=parseInt(lt(e,"border-top-width"),10),l=parseInt(lt(s,"padding-top"),10),o=parseInt(lt(s,"margin-top"),10),a=parseInt(lt(s,"border-top-width"),10);let h,c=0;return r&&(c+=r),l&&(c+=l),o&&(c+=o),n&&(c+=n),a&&(c+=a),h=i.offsetHeight*t,c+h}positionPlaceholder(t){const e=this.$list,s=this.$placeholder,i=e.querySelector(".outline-navigator__anchor"),r=this.attr("animationCurrent"),n=i.offsetHeight;let l=0;return r?(l=this._getPlaceholderOffset(t),s.style.cssText=`transform: translateY(${l}px);height:${n}px;`,this):this}highlight(t){const e=this.$el,i=this.attr("animationCurrent"),r="outline-navigator_active",n="outline-navigator_highlight";let l=null,o=0;return e?(l=e.querySelector(`#chapter__anchor-${t}`),l?(this.active=parseInt(l.getAttribute("data-id"),10),this.$active&&(Y(this.$active,n),Y(this.$active,r)),this.$active=l,h(this.$active,r),i?this.positionPlaceholder(this.active):h(this.$active,n),s((()=>{console.log(!ot(this.$active,this.$main)),ot(this.$active,this.$main)||(o=this._getPlaceholderOffset(this.active),console.log("placeholderOffsetTop",o),u(this.$main,o))})),this):this):this}sticky(){const t=this.attr("afterSticky"),s="outline-navigator_fixed",i=this.$el,r=this.offsetTop,n=this.$scrollElement.scrollTop;let l;return this.isFixed()?(l=n>=r,l?h(i,s):Y(i,s),e(t)&&t.call(this,this.isClosed(),l),this):this}calculateStickyHeight(){const t=document.documentElement,e=Math.max(t.clientHeight||0,window.innerHeight||0);return et("--outline-sticky-height",`${e}px`),this}scrollTo(t,e){const s=this.$scrollElement;return u(s,t,e),this}show(){const t="outline-navigator_hidden",i=this.attr("afterOpened"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?Y(l,t):(Y(l,t),s((()=>{Y(l,"outline-navigator_folded")}),30)):Y(n,t),this.closed=!1,e(i)&&i.call(this),this}hide(){const t="outline-navigator_hidden",i=this.attr("afterClosed"),r=this.count(),n=this.$el,l=this.$parentElement;return this.isInside()?r>800?h(l,t):(h(l,"outline-navigator_folded"),s((()=>{h(l,t)}))):h(n,t),this.closed=!0,e(i)&&i.call(this),this}toggle(){const t=this.attr("afterToggle"),i=this.offsetTop,r=this.$scrollElement.scrollTop;let n;return this.isClosed()?this.show():this.hide(),e(t)&&s((()=>{n=r>=i,t.call(this,this.isClosed(),n)})),this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.removeListeners()._remove()._default(),this.scrollTimer&&(clearTimeout(this.scrollTimer),this.scrollTimer=null),this.resizeTimer&&(clearTimeout(this.resizeTimer),this.resizeTimer=null),this.observerTimer&&(clearTimeout(this.observerTimer),this.observerTimer=null),this.Observer&&(this.Observer=null),e(s)&&s.call(this),this}onObserver(){const t=this.attr("selector");return this.Observer=function(t){let s=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};const i=s.root||null,r=s.selector||".outline-heading",n=s.context||null,l={rootMargin:s.rootMargin||"0px 0px -90% 0px"},a=new IntersectionObserver((s=>{s.forEach((s=>{s.intersectionRatio>0&&e(t)&&t.call(n||s.target,s.target)}))}),l),h=o(i)?i:document;return i&&(l.root=i),h.querySelectorAll(r).forEach((t=>{a.observe(t)})),a}((t=>{const e=t.getAttribute("data-id");if(this.playing)return!1;this.observerTimer&&clearTimeout(this.observerTimer),this.observerTimer=s((()=>{this.highlight(e)}),100)}),{selector:t,context:this}),this}onSelect(t){const i=this.attr("stickyHeight"),r=t.delegateTarget,n=r.getAttribute("data-id"),l=r.href.split("#")[1],o=document.querySelector(`#${l}`),a=M(o)-(i+10),h=this.$scrollElement.scrollHeight,c=this.attr("afterScroll"),d=()=>{e(c)&&c.call(this,"chapter"),s((()=>{this.playing=!1,this.$emit("toolbar:update",{top:a,min:0,max:h})}))};return this.playing=!0,this.isFixed()?(this.sticky(),s((()=>{this.scrollTo(a,d),this.highlight(n)}),10)):(this.scrollTo(a,d),this.highlight(n)),j(t),this}onScroll(){const t=this.$scrollElement;return this.scrollTimer&&clearTimeout(this.scrollTimer),this.scrollTimer=s((()=>{const e=t.scrollTop,s=t.scrollHeight-t.clientHeight;this.isFixed()&&this.sticky(),this.$emit("toolbar:update",{top:e,min:0,max:s})}),100),this}onResize(){return this.resizeTimer&&clearTimeout(this.resizeTimer),this.resizeTimer=s((()=>{this.calculateStickyHeight()})),this}addListeners(){const t=this.$el,e=this.$scrollElement,s=e.tagName.toLowerCase();let i=e;return this.count()<1||("html"!==s&&"body"!==s||(i=window),q(t,".outline-navigator__anchor","click",this.onSelect,this,!0),nt(i,"scroll",this.onScroll,this,!0),this.isSticky()&&nt(window,"resize",this.onResize,this,!0),this.$on("anchors:all:paint",this.onObserver,this)),this}removeListeners(){const t=this.attr("selector"),e=this.$el,s=this.$scrollElement,i=s.tagName.toLowerCase();let r=s;return this.count()<1||("html"!==i&&"body"!==i||(r=window),F(e,"click",this.onSelect),F(r,"scroll",this.onScroll),this.isSticky()&&F(window,"resize",this.onResize),this.$off("anchors:all:paint"),this.Observer&&document.querySelectorAll(t).forEach((t=>{this.Observer.unobserve(t)}))),this}}at.DEFAULTS=n({parentElement:"",scrollElement:"",selector:".outline-heading",active:0,closed:!1,showCode:!0,animationCurrent:!0,position:"relative",stickyHeight:0,chapters:[],created:null,mounted:null,afterClosed:null,afterOpened:null,afterScroll:null,beforeDestroy:null,afterDestroy:null,afterSticky:null});const ht=t=>{const e=Object.getPrototypeOf;let s;if(!(t=>i(t)&&null!==t)(t))return!1;if(s=t.prototype,!s)return!0;for(s=t;null!==e(s);)s=e(s);return e(t)===s},ct=t=>{const e={"&":"&","<":"<",">":">","'":"'",'"':"""};return t.replace(/[&<>'"]/g,(t=>e[t]||t))},dt=[];let ut;U();class mt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(mt.DEFAULTS),this.$el=null,this.id="",this.closed=!1,this.visible=!1,this.offset=-50,this.timer=null,this.destroyed=!1,this}initialize(t){return this.attr(t),this.id=this.attr("id"),this.offset=this.attr("offset")||-50,this.$emit("created",{...this.attr()}),this.render().addListeners(),this.attr("visible")&&this.open(),this}isClosed(){return this.closed}isDestroyed(){return this.destroyed}_getClassName(){const t=this.attr("type"),e=this.attr("effect"),s=this.attr("round"),i=this.attr("closable"),r=this.attr("visible"),n=this.attr("customClass"),l=["outline-message",`outline-message_${t}`,`outline-message_${e}`];return s&&l.push("outline-message_round"),i||l.push("outline-message_full-width"),r&&l.push("outline-message_visible"),n&&l.push(n),l}render(){const t=this.attr("type"),e=this.attr("message"),s=this.attr("effect"),i=this.attr("round"),r=this.attr("closable"),n=this.attr("dangerouslyUseHTMLString"),l=this._getClassName(),o=[];let a,c,d,u,m,p=20;return i&&"default"===s&&(p=12),"plain"!==s&&(a=J("light"===s?`circle-${t}`:t,{iconSet:"outline",size:p}),h(a,"outline-message__icon"),o.push(a)),n?(d=document.createDocumentFragment(),d.innerHTML=e):d=document.createTextNode(ct(tt(e))),c=W("p",{className:"outline-message__content"},[d]),o.push(c),r&&(u=J("close",{iconSet:"outline",size:18}),h(u,"outline-message__close"),o.push(u)),m=W("div",{className:l.join(" ")},o),m.style.cssText="top:-50px;",this.$el=m,document.body.appendChild(this.$el),this.$emit("mounted"),this}_refreshIcon(){const t=".outline-message_hidden",e=this.$el;let s,i,r,n,l,o,a,c=20;return this.isDestroyed()?this:(l=e.querySelector(".outline-icon"),l?(s=this.attr("type"),i=this.attr("effect"),r=this.attr("round"),"plain"===i?h(l,t):(Y(l,t),r&&"default"===i&&(c=12)),o=l.querySelector(".outline-icon__svg"),V(o,{style:`width:${c}px;height:${c}px;`}),a=o.querySelector("use"),n="light"===i?`circle-${s}`:s,P(a,"xlink:href",`#outline-icon-${n}`),this):this)}_refreshMessage(){const t=this.$el;let e,s,i,r;return this.isDestroyed()||(e=t.querySelector(".outline-message__content"),s=this.attr("dangerouslyUseHTMLString"),i=this.attr("message"),r=s?i:ct(tt(i)),e.innerHTML=r),this}_refreshClose(){const t=".outline-message_hidden",e=this.$el;let s,i;return this.isDestroyed()||(s=e.querySelector(".outline-message__close"),i=this.attr("closable"),s&&(i?h(s,t):Y(s,t))),this}_refreshEl(){const t=this.$el;let e;return this.isDestroyed()||(e=this._getClassName(),P(t,"className",e.join(" "))),this}refresh(t){return ht(t)?(this.attr(t)._refreshIcon()._refreshMessage()._refreshClose()._refreshEl(),this):this}clearTimer(){return this.isDestroyed()||this.timer&&(clearTimeout(this.timer),this.timer=null),this}startTimer(t){return this.isDestroyed()||(this.timer=s((()=>{this.$emit("opened"),this.close()}),1e3*t)),this}open(t){const e=this.$el;let i,r,n,l;return this.isDestroyed()||(this.isClosed()&&this.refresh(t),i=this.attr("offset"),r=this.attr("duration"),n=i&&i>=this.offset?i:this.offset,l=`top:${n}px;`,this.clearTimer(),this.$emit("beforeOpen"),s((()=>{this.visible=!0,h(e,"outline-message_visible"),e.style.cssText=l,r>0&&this.startTimer(r)}),100)),this}close(){const t=this.$el;let i,r;return this.isDestroyed()||(i=this.attr("destroyAfterClosed"),r=this.attr("beforeClose"),e(r)&&r.call(this),t.style.cssText="top:-50px;",Y(t,"outline-message_visible"),this.visible=!1,this.closed=!0,s((()=>{this.$emit("closed"),i&&this.destroy()}),500)),this}destroy(){return this.$emit("beforeDestroy"),this.isDestroyed()||(this.removeListeners(),document.body.removeChild(this.$el),clearTimeout(this.timer),this._default(),this.$emit("afterDestroy")),this}onMouseEnter(){return this.clearTimer(),this}onMouseLeave(){const t=this.attr("duration"),e=this.attr("delay");return t<=0||this.startTimer(e),this}onClose(){return this.clearTimer(),this.close(),this}addListeners(){const t=this.$el;return q(t,".outline-message__content","mouseenter",this.onMouseEnter,this,!0),q(t,".outline-message__content","mouseleave",this.onMouseLeave,this,!0),q(t,".outline-message__close","click",this.onClose,this,!0),this}removeListeners(){const t=this.$el;return F(t,"mouseenter",this.onMouseEnter),F(t,"mouseleave",this.onMouseLeave),F(t,"click",this.onClose),this}}mt.DEFAULTS=n({id:"",type:"info",effect:"default",round:!1,offset:30,duration:3,delay:2,message:"",customClass:"",closable:!0,visible:!0,dangerouslyUseHTMLString:!1,destroyAfterClosed:!0,beforeClose:null}),["info","success","warning","error"].forEach((t=>{mt[t]=e=>{const s={},i=x("outline-message-"),r=e.beforeClose||null;let n=e.offset||30;return l(e)?s.message=e:ht(e)&&b(s,e),s.id=i,s.type=t,s.offset=n,s.visible=!1,s.beforeClose=()=>{mt.close(i,r)},ut=new mt(s),dt.forEach((t=>{n+=t.$el.offsetHeight+16})),ut.offset=n,ut.open(),dt.push(ut),ut}})),mt.close=(t,s)=>{const i=dt.length;let r,n,l=-1;if(dt.forEach(((i,r)=>{t===i.id&&(n=i.$el.offsetHeight,l=r,e(s)&&s.call(i),dt.splice(r,1))})),i<=1||-1===l||l>dt.length-1)return!1;for(r=l;r{let t=dt.length-1;for(;t>=0;t-=1)dt[t].close()};class pt{constructor(t,s){this.name=t,e(s)&&(this.action=s)}execute(){return this.action(),this}}class gt{constructor(){this.commands=[]}get(t){return this.commands.find((e=>e.name===t))}add(t){return this.commands.push(t),this}del(t){const e=this.commands,s=e.find((e=>e.name===t)),i=s?e.indexOf(s):-1;return i>-1&&e.splice(i,1),this}clear(){return this.commands=[],this}execute(t){const s=this.commands.find((e=>e.name===t));return e(null==s?void 0:s.execute)&&s.execute(),this}}const ft=function(t){let e=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const s=J(t.icon,{iconSet:t.iconSet||"outline",color:t.color||"",size:t.size}),i=W("a",{className:"outline-toolbar__anchor",href:t.link},s),r=W("div",{className:`outline-toolbar__button ${t.name}`,"data-cmd":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},bt="outline-toolbar_disabled",vt="outline-toolbar_hidden";class yt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(yt.DEFAULTS),this.disabled=!1,this.closed=!1,this.$el=null,this.buttons=[],this.commands=null,this}initialize(t){let s;return this.attr(t),this.disabled=this.attr("disabled"),this.closed=this.attr("closed"),this.commands=new gt,s=this.attr("created"),e(s)&&s.call(this),this.render().addListeners(),this}isDisabled(t){let e;return t?(e=this.get(t),e.disabled):this.disabled}isExist(t){return!!this.get(t)}isClosed(){return this.closed}_getCommand(t){const s=this,{action:i,name:r}=t;let n,o,a=null,h=null;return i?(h=i.handler,n=i.context||this,e(h)?o=h:l(h)&&(o=function(){s.$emit(h,r)}),e(o)&&(a=new pt(r,o.bind(n))),a):a}get(t){return this.buttons.find((e=>e.name===t))}render(){const t=this.attr("mounted"),s=this.attr("buttons")||[],i=this.attr("placement");return U(),this.$el=W("div",{id:x("outline-toolbar"),className:`outline-toolbar outline-toolbar_${i}`}),this._paint(s),document.body.appendChild(this.$el),this.closed&&this.hide(),this.disabled&&this.disable(),e(t)&&t.call(this),this}erase(){return this.$el.innerHTML="",this}_paint(t){const e=this.attr("rounded"),s=document.createDocumentFragment();return t.forEach((t=>{const i=ft(t,e),r=this._getCommand(t),{name:n,disabled:l,context:o}=t;s.appendChild(i),this.isExist(n)||(this.buttons.push({$el:i,name:n,disabled:l||!1,context:o||this}),r&&this.commands.add(r))})),this.$el.appendChild(s),this}_remove(){return document.body.removeChild(this.$el),this}refresh(t){return this.attr({buttons:t}),this.erase()._paint(t),this}add(t){const e=this.$el,s=document.createDocumentFragment(),n=this.attr("buttons")||[],{name:l,disabled:o,context:a}=t,h=this._getCommand(t),c=t=>{const e=ft(t);s.appendChild(e),n.push(t),this.buttons.push({$el:e,name:l,disabled:o||!1,context:a||this,command:h}),h&&this.commands.add(h)};return i(t)?c(t):r(t)&&t.forEach((t=>{i(t)&&c(t)})),e.appendChild(s),this}remove(t){const e=this.$el,s=this.buttons,i=this.get(t);let r=-1;return i?(r=s.indexOf(i),r>-1&&(s.splice(r,1),this.attrs("buttons").splice(r,1)),this._disable(t),e.removeChild(i.$el),this):this}_disable(t){const e=this.get(t),s=this.commands.get(t);return!e||e.disabled||(e.disabled=!0,s&&this.commands.del(s),h(e.$el,bt)),this}_enable(t){const e=this.get(t),s=this.commands.get(t);return e&&e.disabled?(e.disabled=!1,s&&this.commands.add(s),Y(e.$el,bt),this):this}disable(t){const s=this.attr("afterDisabled");return t?this._disable(t):(h(this.$el,bt),this.removeListeners(),this.disabled=!0,e(s)&&s.call(this)),this}enable(t){const s=this.attr("afterEnabled");return t?this._enable(t):(this.disabled=!1,Y(this.$el,bt),this.addListeners(),e(s)&&s.call(this)),this}show(t){const i=this.attr("afterOpened"),r=this.get(t),n=this.$el;if(t){if(!r)return this;Y(r.$el,vt)}else Y(n,vt),this.closed=!1,e(i)&&s((()=>{i.call(this)}),310);return this}hide(t){const i=this.attr("afterClosed"),r=this.get(t),n=this.$el;if(t){if(!r)return this;h(r.$el,vt)}else h(n,vt),this.closed=!0,e(i)&&s((()=>{i.call(this)}),310);return this}toggle(t){return this.isClosed()?this.show(t):this.hide(t),this}highlight(t){const e=this.get(t),s="outline-toolbar_active";let i;return e?(i=e.$el,a(i,s)?Y(i,s):h(i,s),this):this}destroy(){const t=this.attr("beforeDestroy"),s=this.attr("afterDestroy");return e(t)&&t.call(this),this.commands.clear(),this.removeListeners()._remove()._default(),e(s)&&s.call(this),this}execute(t){return this.isDisabled(t)||this.commands.execute(t),this}onExecute(t){const e=t.delegateTarget;let s="";return e&&(s=e.getAttribute("data-cmd"),s&&this.execute(s)),this}addListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||q(e,".outline-toolbar__button","click",this.onExecute,this,!0),this}removeListeners(){const t=this.attr("buttons")||[],e=this.$el;return!t||t.length<1||F(e,".outline-toolbar__button",this.onExecute),this}}yt.DEFAULTS=n({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});class $t{constructor(t){this.utterance=new SpeechSynthesisUtterance,t&&this.initialize(t)}_initialize(t){return t.lang&&this.setLang(t.lang),t.pitch&&this.setPitch(t.pitch),t.rate&&this.setRate(t.rate),t.text&&this.setText(t.text),t.voice&&this.setVoice(t.voice),t.volume&&this.setVolume(t.volume),this}initialize(t){return this._initialize(t)._addListeners(),this}isSpeaking(){return speechSynthesis.speaking}isPending(){return speechSynthesis.pending}isPaused(){return speechSynthesis.paused}getVoices(){return speechSynthesis.getVoices()}setLang(t){return this.utterance.lang=t,this}setPitch(t){return this.utterance.pitch=t,this}setRate(t){return this.utterance.rate=t,this}setText(t){return this.utterance.text=t,this}setVoice(t){return this.utterance.voice=t,this}setVolume(t){return this.utterance.volume=t,this}speak(t){return t&&this.setText(t),speechSynthesis.speak(this.utterance),this}pause(){return speechSynthesis.pause(),this}resume(){return speechSynthesis.resume(),this}cancel(){return speechSynthesis.cancel(),this.setText(""),this}_addListeners(){const t=this.utterance,e=this;return["boundary","end","error","start","mark","pause","resume"].forEach((s=>{t[`on${s}`]=t=>{_(s,{event:t,speech:e})}})),speechSynthesis.onvoiceschanged=t=>{_("voiceschanged",{event:t,speech:e})},this}}$t.isSupport="speechSynthesis"in window;const _t=(t,e)=>{let s,i=t;for(;i;)s=i.tagName.toLowerCase(),"script"!==s&&"style"!==s&&h(i,"outline-reader_sibling"),i=e?i.previousElementSibling:i.nextElementSibling},xt="进入阅读模式,按 ESC 键可退出阅读模式";class Tt extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){return this.attrs=n(Tt.DEFAULTS),this.reading=!1,this.$target=null,this.$paper=null,this.$title=null,this.$article=null,this.$progress=null,this.toolbar=null,this.speech=null,this}initialize(t){let e=null;return this.attr(t),e=this.attr("target"),l(e)?this.$target=document.querySelector(e):o(e)&&(this.$target=e),this.$target?($t.isSupport&&(this.speech=new $t),this.render().addListeners(),this):this}isSpeaking(){var t;return null==this||null===(t=this.speech)||void 0===t?void 0:t.isSpeaking()}render(){return this._renderEdge()._paint(this.$target),this}erase(){return this.$article.innerHTML="",this}_paint(t){const e=document.createDocumentFragment(),i=[...t.cloneNode(!0).children];return s((()=>{i.forEach((t=>{e.appendChild(t)})),this.$article.appendChild(e)})),this}_remove(){const t=this.$paper,e=this.toolbar;return t&&document.body.removeChild(t),e&&e.destroy(),this}refresh(){return this.erase()._paint(this.$target),this}_renderEdge(){const t=this.$target;let e,i,r,n,l,a=this.attr("title");i=t.querySelector("h1"),o(a)&&(i=a),o(i)&&(a=i.innerText),i=W("h1",{className:"outline-reader__title"},a),this.$title=i,r=W("article",{id:"outline-reader__article",className:"outline-reader__article"}),this.$article=r,n=W("div",{className:"outline-reader__progress"}),this.$progress=n;const h=[];return $t.isSupport&&this.attr("allowSpeak")&&h.push({name:"speak",icon:"sound",size:20,action:{context:this,handler:this.speak}}),h.push({name:"print",icon:"print",size:20,action:{context:this,handler:this.print}},{name:"exit",icon:"close",size:20,action:{context:this,handler:this.exit}}),this.toolbar=new yt({placement:"rtl",buttons:h}),e=W("section",{id:"outline-reader",className:"outline-reader outline-reader_hidden"},[n,i,r,this.toolbar.$el]),this.$paper=e,document.body.appendChild(e),s((()=>{l=e.previousElementSibling,_t(l,!0),l=e.nextElementSibling,_t(l)})),this}enter(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling"),n=this.attr("enterReadingTip")||xt;return this.reading||!i||(r.forEach((t=>{h(t,s)})),h(i,e),Y(i,s),this.toolbar.show(),this.reading=!0,mt.info({round:!0,message:n}),this.$emit("enterReading")),this}exit(){const t="outline-reader",e=`${t}--reading`,s=`${t}_hidden`,i=this.$paper,r=document.querySelectorAll(".outline-reader_sibling");return this.reading&&i?(h(i,s),Y(i,e),r.forEach((t=>{Y(t,s)})),this.toolbar.hide(),this.reading=!1,this.$emit("exitReading"),this):this}toggle(){return this.reading?this.exit():this.enter(),this}speak(){const t=this.$article.innerText,e=this.speech;return $t.isSupport?(this.toolbar.highlight("speak"),this.isSpeaking()?e.cancel():e.speak(t),this):this}print(){return e(print)?(print(),this):this}destroy(){return this.$paper?(this.removeListeners()._remove()._default(),this):this}onPrint(){return this.print(),this}onEnterReading(){return this.toggle(),this}onExitReading(t){return 27===t.keyCode&&this.reading&&(this.toggle(),j(t)),this}addListeners(){return this.$paper?(nt(document,"keyup",this.onExitReading,this,!0),this.$on("toolbar:action:print",this.onPrint),this.$on("toolbar:action:reading",this.onEnterReading),this):this}removeListeners(){return this.$paper?(F(document,"keyup",this.onExitReading),this.$off("toolbar:action:print"),this.$off("toolbar:action:reading"),this):this}}var wt;Tt.DEFAULTS=n({target:"",title:"",enterReadingTip:xt,allowSpeak:!1});class Et extends E{constructor(t){super(),this._default(),t&&this.initialize(t)}_default(){const t=Et.DEFAULTS;return this.attrs=n(t),this.$article=null,this.$scrollElement=null,this.buttons=[],this.anchors=null,this.drawer=null,this.navigator=null,this.reader=null,this.toolbar=null,this}initialize(t){let e="",s="",i=null;return this.attr(t),e=this.attr("articleElement"),s=this.attr("scrollElement"),l(e)?i=document.querySelector(e):o(e)&&(i=e),this.$article=i,this.$scrollElement=d(s),this.$emit("created",{...this.attr()}),this.render().addListeners(),this}getChapters(){let t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const e=this.$article,s=this.attr("selector"),i=this.attr("showCode")||!0,r=this.attr("chapterTextFilter");return g({articleElement:e,selector:s,showCode:i,chapterTextFilter:r,isTreeStructured:t})}count(){return this.getChapters().length}render(){const t=this.attr("hasToolbar"),e=this.$scrollElement;return this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar(),e&&t&&this._updateToolbar({top:e.scrollTop,min:0,max:e.scrollHeight}),this.$emit("mounted"),this}refresh(){const t=this.getChapters();return this.anchors.refresh(t),this.navigator.refresh(t),this.reader.refresh(),this}_renderReader(){const t=this.attr("reader");return t.target?(h(this.$article,"outline-article"),this.reader=new Tt(t),this):this}_renderAnchors(){const t=this.attr("articleElement"),e=this.attr("selector"),s=this.attr("stickyHeight"),i=this.attr("scrollElement"),r=this.attr("showCode"),n=this.attr("anchorURL"),l=this.attr("afterScroll"),o=this.attr("chapterTextFilter");return this.anchors=new K({articleElement:t,stickyHeight:s,scrollElement:i,selector:e,showCode:r,anchorURL:n,afterScroll:l,chapterTextFilter:o}),this}_renderNavigator(){const t=this.attr("title"),e=this.attr("stickyHeight"),s=this.attr("scrollElement"),i=this.attr("customClass"),r=this.attr("showCode"),n=this.attr("animationCurrent"),l=this.attr("closeOnClickModal"),o=this.attr("showNavModalFirst"),a=this.attr("position"),h=this.attr("placement"),c=this.attr("afterSticky"),d=this.attr("afterToggle"),u=this.attr("afterScroll"),m=this.count();let p,g=this.attr("parentElement");return m<1||(p={scrollElement:s,showCode:r,animationCurrent:n,position:a,title:t,stickyHeight:e,chapters:this.getChapters(),afterSticky:c,afterToggle:d,afterScroll:u},"relative"===a?(this.drawer=new rt({placement:h,title:t,size:"tiny",hasOffset:!0,hasPadding:!1,closeOnClickModal:l,customClass:i,afterClosed:()=>{this.toolbar.toggle()}}),g=this.drawer.$main,o&&this.drawer.open()):p.customClass=i,p.parentElement=g,this.navigator=new at(p)),this}_renderToolbar(){const t=this.attr("position"),s=this.attr("hasToolbar"),i=this.attr("showNavModalFirst"),r=this.attr("placement"),n=this.attr("homepage"),l=this.attr("git"),o=this.attr("tags"),a=this.attr("issues"),h=this.attr("tools"),c=this.attr("reader"),d=this.count(),u={name:"up",icon:"up",size:20,action:{context:this,handler:this.toTop}},m={name:"homepage",icon:"homepage",size:20,link:n},p={name:"github",icon:"github",size:20,link:l},g={name:"tags",icon:"tags",size:20,link:o},f={name:"issues",icon:"issues",size:20,link:a},b={name:"toggle",icon:"menu",size:18,action:{context:this,handler:this.toggle}},v={name:"reading",icon:"file",size:18,action:{context:this,handler:"toolbar:action:reading"}},y={name:"print",icon:"print",size:20,action:{handler:"toolbar:action:print"}},$={name:"down",icon:"down",size:20,action:{context:this,handler:this.toBottom}},_=[];return s?(_.push(u),d>0&&_.push(b),n&&_.push(m),l&&_.push(p),o&&_.push(g),a&&_.push(f),c.target&&(_.push(v),e(print)&&_.push(y)),(null==h?void 0:h.length)>0&&_.push(...h),_.push($),this.buttons=[..._],this.toolbar=new yt({placement:r,buttons:_}),"relative"===t&&i&&this.toolbar.hide(),this):this}addButton(t){const e=this.toolbar,s=this.buttons;return s.splice(-1,0,t),e.attr({buttons:s}),e.refresh(),this}removeButton(t){return this.toolbar.remove(t),this}_updateToolbar(t){let{top:e,min:s,max:i}=t;const r=this.toolbar,n=Math.ceil(e);return n<=s?(r.hide("up"),r.show("down")):n>=i?(r.hide("down"),r.show("up")):n>s&&n0&&(i.playing=!0),this.scrollTo(0,(()=>{s.hide("up"),s.show("down"),r>0&&(i.highlight(0),i.playing=!1,u(i.$main,0)),e(t)&&t.call(s,"up")})),this}toBottom(){const t=this.attr("afterScroll"),s=this.$scrollElement,i=this.toolbar,r=this.navigator,n=this.count(),l=Math.floor(s.scrollHeight-s.clientHeight);return n>0&&(r.playing=!0),this.scrollTo(l,(()=>{const s=r.$main;i.hide("down"),i.show("up"),n>0&&(r.highlight(n-1),u(s,s.scrollHeight),r.playing=!1),e(t)&&t.call(i,"bottom")})),this}scrollTo(t,e){return u(this.$scrollElement,t,e),this}enterReading(){const t=this.reader;return!t||t.reading||(this.toolbar.toggle(),t.enter()),this}exitReading(){const t=this.reader;return t&&t.reading?(this.toolbar.toggle(),t.exit(),this):this}switchReading(){const t=this.reader;return t?(t.toggle(),this):this}toggle(){const t=this.attr("position"),e=this.toolbar,i=this.drawer,r=this.navigator;return this.count()<1||("relative"!==t?(r.toggle(),e.highlight("toggle")):(e.toggle(),s((()=>{i.toggle()})))),this}print(){return this.reader.print(),this}_destroy(){const t=this.count();let e=this.anchors,s=this.navigator,i=this.drawer,r=this.reader,n=this.toolbar,l=!1;return this.removeListeners(),r&&r.destroy(),t>0&&s&&(l=s.isOutside(),s.destroy(),l&&i&&i.destroy()),e&&e.destroy(),n&&n.destroy(),this}destroy(){return this.$emit("beforeDestroy"),this._destroy()._default(),this.$emit("destroyed"),this}onToolbarUpdate(t){let{top:e,min:s,max:i}=t;return this._updateToolbar({top:e,min:s,max:i}),this}addListeners(){return this.attr("hasToolbar")?(this.$on("toolbar:update",this.onToolbarUpdate),this):this}removeListeners(){return this.attr("hasToolbar")?(this.$off("toolbar:update"),this):this}}if(Et.DEFAULTS=n({articleElement:"#article",selector:"h2,h3,h4,h5,h6",parentElement:"#aside",scrollElement:"html,body",title:"目录",position:"relative",placement:"rtl",animationCurrent:!0,showCode:!0,hasToolbar:!0,closeOnClickModal:!0,showNavModalFirst:!1,anchorURL:"",stickyHeight:0,homepage:"",git:"",tags:"",issues:"",tools:[],reader:{target:"",title:"",enterReadingTip:"进入阅读模式,按 ESC 键可退出阅读模式",allowSpeak:!1},customClass:"",afterSticky:null,afterToggle:null,afterScroll:null,chapterTextFilter:null}),null!==(wt=window)&&void 0!==wt&&wt.jQuery){const t=window.jQuery;t.extend(t.fn,{outline:function(e){let s=t(this);return new Et(t.extend({},e,{articleElement:s}))}})}return Et})); //# sourceMappingURL=outline.min.js.map diff --git a/outline.min.js.map b/outline.min.js.map index d2fb732..d20b25b 100644 --- a/outline.min.js.map +++ b/outline.min.js.map @@ -1 +1 @@ -{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/lang/trim.js","getChaptersByHeadings.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","getChapters.js","utils/lang/toTree.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/dom/removeClass.js","_removeHeading.js","utils/types/isEmpty.js","anchors.js","_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","zIndex.js","drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","navigator.js","_paintChapters.js","utils/dom/inBounding.js","utils/dom/intersection.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/encodeHTML.js","message.js","command.js","commands.js","_createButton.js","toolbar.js","speech.js","_updateSiblingElements.js","reader.js","outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = true,\r\n chapterTextFilter = null\r\n) => {\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = stripTags(trim(heading.innerHTML))\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode || true, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL || `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement('div', {\r\n className: 'outline-drawer__main'\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attrs('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target = null\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $paper = this.$paper\r\n const toolbar = this.toolbar\r\n\r\n if ($paper) {\r\n document.body.removeChild($paper)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n let title = this.attr('title')\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement('article', {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n })\r\n this.$article = $article\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n const buttons = []\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push(\r\n ...[\r\n {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n },\r\n {\r\n name: 'exit',\r\n icon: 'close',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n }\r\n ]\r\n )\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $paper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $title, $article, this.toolbar.$el]\r\n )\r\n this.$paper = $paper\r\n\r\n document.body.appendChild($paper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $paper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $paper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($paper, READING)\r\n removeClass($paper, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('enterReading')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n\r\n if (!this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n addClass($paper, HIDDEN)\r\n removeClass($paper, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n this.toolbar.hide()\r\n this.reading = false\r\n\r\n this.$emit('exitReading')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this._updateToolbar({\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.anchors.refresh(chapters)\r\n this.navigator.refresh(chapters)\r\n this.reader.refresh()\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo(navigator.$main, navigator.$main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.enter()\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || !reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.exit()\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n const reader = this.reader\r\n\r\n if (!reader) {\r\n return this\r\n }\r\n\r\n reader.toggle()\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.toggle()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n drawer.toggle()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.reader.print()\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: true,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","arguments","length","undefined","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","previous","level","text","chapters","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","indexOf","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","on","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","getSymbol","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","update","chapterCode","_updateHeading","headingId","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","anchors","drawer","navigator","reader","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","_updateToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","addButton","removeButton","_ref","ceil","afterTop","floor","afterDown","enterReading","exitReading","switchReading","_destroy","onToolbarUpdate","_ref2","_window","jQuery","$","outline"],"mappings":"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AMX,EAGF6I,EAAQG,SAkBCxR,EAjBS,CACd+B,cAAe,YACfmD,eAAgB,WAChBC,SAAU,oBACV2N,aAAc,EACdZ,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX7N,UAAU,EACVuO,QAAS,KACTG,QAAS,KACTgB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdvP,kBAAmB,OEjTvB,MAAM6P,EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUzS,IACd,IAAI0S,EACAC,EACAC,EAEJ,QAAK7S,EAASC,KAKd0S,EAAOpQ,EAAKtC,GAAK6S,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAInS,OAAO+R,EAAKrN,KAAK2N,GAAS,IAAGA,eAAgBnF,KAAK,KAAM,KAE5DgF,EAAM9C,KAAK6C,IAASE,EAAK/C,KAAK6C,GAAK,ECtBtCK,GAAgB/S,GACbA,EAAIuC,QAAQ,+BAAgC,ICP/CyQ,GAAcA,CAACvN,EAAM4C,KACD9G,SAAS0R,gBACjB5E,MAAM2E,YAAYvN,EAAM4C,EAAM,ECAhD,IAAI7E,GAAQ,IAEZ,MAAM0P,GAAUC,IACVA,EACF3P,GAAQ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"} \ No newline at end of file +{"version":3,"file":"outline.min.js","sources":["utils/lang/toString.js","utils/types/isFunction.js","utils/lang/later.js","utils/types/isObject.js","utils/types/isArray.js","utils/lang/cloneDeep.js","utils/types/isString.js","utils/types/isElement.js","utils/dom/hasClass.js","utils/dom/addClass.js","utils/lang/easeInQuad.js","utils/dom/_getScrollElement.js","utils/dom/scrollTo.js","utils/lang/trim.js","getChaptersByHeadings.js","utils/lang/stripTags.js","_getChapterParentIdByDiffer.js","_getChaptersWithCode.js","getChapters.js","utils/lang/toTree.js","utils/lang/hasOwn.js","utils/lang/extend.js","utils/observer/_subscribers.js","utils/observer/_hasDirectSubscribersFor.js","utils/observer/has.js","utils/observer/_hasSubscribers.js","utils/observer/emit.js","utils/types/isTypedArray.js","utils/lang/guid.js","utils/observer/_removeSubscriber.js","utils/observer/off.js","utils/observer/_removeSubscriberByToken.js","base.js","utils/observer/on.js","utils/lang/timeSlice.js","utils/dom/offsetTop.js","utils/dom/matches.js","utils/dom/getParentOrHost.js","utils/event/enum.js","utils/event/_off.js","utils/event/_delete.js","utils/event/purgeElement.js","utils/event/getListeners.js","utils/event/off.js","utils/event/on.js","utils/event/getTarget.js","utils/dom/resolveTextNode.js","utils/dom/closest.js","utils/event/stop.js","utils/icons/symbols.js","utils/icons/defaults.js","utils/icons/getSymbols.js","utils/icons/getSymbol.js","utils/icons/paint.js","utils/icons/add.js","utils/types/isDOM.js","utils/types/isHTMLCollection.js","utils/types/isFragment.js","utils/types/isTextNode.js","utils/dom/setAttribute.js","utils/dom/setAttributes.js","utils/dom/createElement.js","utils/icons/createElement.js","utils/types/isSVG.js","utils/icons/icon.js","utils/dom/removeClass.js","_removeHeading.js","utils/types/isEmpty.js","anchors.js","_updateHeading.js","utils/types/tags.js","utils/types/isHTML.js","utils/lang/stripScripts.js","utils/dom/setProperty.js","zIndex.js","drawer.js","utils/dom/html.js","utils/event/at.js","utils/dom/getStyle.js","utils/dom/inBounding.js","navigator.js","_paintChapters.js","utils/dom/intersection.js","utils/types/isObjectLike.js","utils/types/isPlainObject.js","utils/lang/encodeHTML.js","message.js","command.js","commands.js","_createButton.js","toolbar.js","speech.js","_updateSiblingElements.js","reader.js","outline.js"],"sourcesContent":["/**\r\n * Object 对象原型上的 toString 方法\r\n * ========================================================================\r\n * @method toString\r\n * @param {*} val\r\n * @returns {string}\r\n */\r\nconst toString = (val) => {\r\n return Object.prototype.toString.apply(val)\r\n}\r\n\r\nexport default toString\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测测试数据是否为 Function 类型\r\n * ========================================================================\r\n * @method isFunction\r\n * @param {*} val - (必须)待检测的数据\r\n * @returns {boolean} 'val' 是 Function 类型返回 true,否则返回 false\r\n */\r\nconst isFunction = (val) => {\r\n return typeof val === 'function' || toString(val) === '[object Function]'\r\n}\r\n\r\nexport default isFunction\r\n","import isFunction from '../types/isFunction'\r\n\r\n/**\r\n * later - 延迟执行方法\r\n * ========================================================================\r\n * @method later\r\n * @param {Function} fn\r\n * @param {Number} [delay]\r\n * @returns {number|boolean}\r\n */\r\nconst later = (fn, delay = 300) => {\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n return setTimeout(() => {\r\n fn()\r\n }, delay)\r\n}\r\n\r\nexport default later\r\n","import toString from '../lang/toString'\r\nimport isFunction from './isFunction'\r\n\r\n/**\r\n * 检测数据是否为 Object 类型\r\n * ========================================================================\r\n * @method isObject\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isObject = (o) => {\r\n return (\r\n (toString(o) === '[object Object]' ||\r\n typeof o === 'object' ||\r\n isFunction(o)) &&\r\n o !== null\r\n )\r\n}\r\n\r\nexport default isObject\r\n","import toString from '../lang/toString'\r\n\r\n/**\r\n * 检测数据是否为 Array 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isArray = (o) => {\r\n if (Array.isArray) {\r\n return Array.isArray(o)\r\n } else {\r\n return toString(o) === '[object Array]'\r\n }\r\n}\r\n\r\nexport default isArray\r\n","import isObject from '../types/isObject'\r\nimport isArray from '../types/isArray'\r\n\r\n/**\r\n * 深拷贝对象函数\r\n * ========================================================================\r\n * @methods cloneDeep\r\n * @param {Object} obj - 深拷贝的对象\r\n * @returns {Array|Object|*}\r\n *\r\n * @example\r\n * const arr = cloneDeep([2,3,4,6])\r\n * => [2,3,4,6]\r\n */\r\nconst cloneDeep = (obj) => {\r\n let clone = {}\r\n\r\n if (obj === null) {\r\n return null\r\n }\r\n\r\n if (isArray(obj)) {\r\n clone = Array.from(obj)\r\n } else {\r\n clone = Object.assign({}, obj)\r\n Object.keys(clone).forEach((key) => {\r\n return (clone[key] = isObject(obj[key]) ? cloneDeep(obj[key]) : obj[key])\r\n })\r\n }\r\n\r\n return clone\r\n}\r\n\r\nexport default cloneDeep\r\n","/**\r\n * 检测数据是否为 String 类型\r\n * ========================================================================\r\n * @method isArray\r\n * @param {*} str\r\n * @returns {boolean}\r\n */\r\nconst isString = (str) => {\r\n return typeof str === 'string'\r\n}\r\n\r\nexport default isString\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测数据是否为 HTMLElement DOM 节点\r\n * ========================================================================\r\n * @method isElement\r\n * @param {*} o\r\n * @returns {boolean}\r\n */\r\nconst isElement = (o) => {\r\n return !!(isObject(o) && o.nodeName && o.tagName && o.nodeType === 1)\r\n}\r\n\r\nexport default isElement\r\n","import isElement from '../types/isElement'\r\n/**\r\n * 检测 DOM 节点是否包含名为 className 的样式\r\n * ========================================================================\r\n * @method hasClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst hasClass = (el, className) => {\r\n const pattern = new RegExp('(\\\\s|^)' + className + '(\\\\s|$)')\r\n let allClass\r\n let classList\r\n\r\n if (!isElement(el)) {\r\n return false\r\n }\r\n\r\n allClass = el.className\r\n\r\n if (!allClass) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList && classList.contains) {\r\n return el.classList.contains(className)\r\n }\r\n\r\n return !!pattern.exec(allClass)\r\n}\r\n\r\nexport default hasClass\r\n","import hasClass from './hasClass'\r\n\r\n/**\r\n * 给 DOM 节点添加名为 className 的样式\r\n * ========================================================================\r\n * @method addClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst addClass = (el, className) => {\r\n let classList\r\n let allClass\r\n\r\n if (hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.add) {\r\n classList.add(className)\r\n } else {\r\n allClass = el.className\r\n allClass += allClass.length > 0 ? ' ' + className : className\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default addClass\r\n","/**\r\n * 返回给定值的平方值\r\n * ========================================================================\r\n * @method easeInQuad\r\n * @param {Number} x\r\n * @returns {number}\r\n */\r\nconst easeInQuad = (x) => {\r\n return x * x\r\n}\r\n\r\nexport default easeInQuad\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通过给的 scrollElement 参数,获取滚动 DOM 元素\r\n * ========================================================================\r\n * @method _getScrollElement\r\n * @param {String|HTMLElement} scrollElement\r\n * @returns {Element}\r\n * @private\r\n */\r\nconst _getScrollElement = (scrollElement = null) => {\r\n let $rootElements\r\n let $scrollElement\r\n\r\n if (!scrollElement) {\r\n $rootElements = document.querySelectorAll('html,body')\r\n $scrollElement =\r\n $rootElements[0].scrollTop - $rootElements[1].scrollTop >= 0\r\n ? $rootElements[0]\r\n : $rootElements[1]\r\n } else {\r\n if (isString(scrollElement)) {\r\n $scrollElement = document.querySelector(scrollElement)\r\n } else if (isElement(scrollElement)) {\r\n $scrollElement = scrollElement\r\n }\r\n }\r\n\r\n return $scrollElement\r\n}\r\n\r\nexport default _getScrollElement\r\n","import easeInQuad from '../lang/easeInQuad'\r\nimport isFunction from '../types/isFunction'\r\nimport _getScrollElement from './_getScrollElement'\r\n\r\n/**\r\n * 指定 rootElement DOM 节点滚动到指定 top 位置\r\n * ========================================================================\r\n * @method scrollTo\r\n * @param {HTMLElement|Object} [scrollElement] - (必须)要滚动的 DOM 节点\r\n * @param {Number} top - (必须)滚动的 scrollTop 数值\r\n * @param {Function} [afterStop] - (可选)滚动完成的回调函数\r\n */\r\nconst scrollTo = (scrollElement, top, afterStop) => {\r\n const $scrollElement = _getScrollElement(scrollElement)\r\n let scrollTop = $scrollElement.scrollTop\r\n let step = 0\r\n const distance = top - scrollTop\r\n const MAX_HEIGHT = $scrollElement.scrollHeight\r\n const MAX_TOP = top - MAX_HEIGHT <= 0 ? top : MAX_HEIGHT\r\n const stop = (top) => {\r\n if (isFunction(afterStop)) {\r\n afterStop(top)\r\n }\r\n\r\n return false\r\n }\r\n const play = () => {\r\n step += 1\r\n\r\n // 向上滚动\r\n if (distance < 0) {\r\n scrollTop -= easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop <= top) {\r\n $scrollElement.scrollTop = top\r\n return stop(top)\r\n }\r\n } else {\r\n scrollTop += easeInQuad(step)\r\n $scrollElement.scrollTop = scrollTop\r\n\r\n if (scrollTop >= MAX_TOP) {\r\n $scrollElement.scrollTop = MAX_TOP\r\n return stop(MAX_TOP)\r\n }\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n }\r\n\r\n // eslint-disable-next-line compat/compat\r\n requestAnimationFrame(play)\r\n}\r\n\r\nexport default scrollTo\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 清楚字符串起始位置所有的空格\r\n * ========================================================================\r\n * @method trim\r\n * @param {string} str\r\n * @returns {string|Boolean}\r\n */\r\nconst trim = (str) => {\r\n if (!isString(str)) {\r\n return false\r\n }\r\n return str.replace(/(^\\s+)|(\\s+$)/g, '')\r\n}\r\n\r\nexport default trim\r\n","import trim from './utils/lang/trim'\r\nimport stripTags from './utils/lang/stripTags'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport _getChapterParentIdByDiffer from './_getChapterParentIdByDiffer'\r\nimport _getChaptersWithCode from './_getChaptersWithCode'\r\n\r\n/**\r\n * 根据文章中的 h1~h6 标签,自动分析返回文章章节数据\r\n * ========================================================================\r\n * @method getChaptersByHeadings\r\n * @param {Array} headings\r\n * @param {Boolean} [showCode]\r\n * @param {Function} [chapterTextFilter]\r\n * @return {*|*[]}\r\n */\r\nconst getChaptersByHeadings = (\r\n headings,\r\n showCode = true,\r\n chapterTextFilter = null\r\n) => {\r\n let previous = 1\r\n let level = 0\r\n let text = ''\r\n const chapters = []\r\n\r\n headings.forEach((heading, i) => {\r\n const tagName = heading.tagName\r\n const headingLevel = tagName.replace(/h/i, '')\r\n let current = parseInt(headingLevel, 10)\r\n let pid = -1\r\n\r\n // 场景1:当前标题是前一个标题的子标题\r\n // 当前标题的(标题标签)序号 > 前一个标题的序号:两个相连的标题是父标题 -> 子标题关系;\r\n // h2 (前一个标题)\r\n // h3 (当前标题)\r\n if (current > previous) {\r\n level += 1\r\n\r\n // 第一层级的 pid 是 -1\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n pid = i - 1\r\n }\r\n }\r\n // 场景2:当前标题和前一个标题层级相同\r\n // 当前标题的(标题标签)序号 = 前一个标题的序号\r\n // h2 (前一个标题)\r\n // h2 (当前标题)\r\n // 当前标题的(标题标签)序号 < 前一个标题的序号,并且当前标题序号 > 当前的级别\r\n // h2\r\n // h4 (前一个标题)\r\n // h3 (当前标题:这种情况我们还是任务 h3 是 h2 的下一级章节)\r\n else if (current === previous || (current < previous && current > level)) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n pid = -1\r\n } else {\r\n pid = chapters[i - 1].pid\r\n }\r\n }\r\n // 场景3:当前标题比前一个标题层级高\r\n else if (current <= level) {\r\n // H1 的层级肯定是 1\r\n if (current === 1) {\r\n level = 1\r\n } else {\r\n level = level - (previous - current)\r\n\r\n if (level <= 1) {\r\n level = 1\r\n }\r\n }\r\n\r\n // 第一级的标题\r\n if (level === 1) {\r\n pid = -1\r\n } else {\r\n // 通过当前标题和前一个标题之间的等级差,获得当前标题的父标题ID\r\n pid = _getChapterParentIdByDiffer(chapters, previous - current, i)\r\n }\r\n }\r\n\r\n previous = current\r\n\r\n text = stripTags(trim(heading.innerHTML))\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n text = chapterTextFilter(text)\r\n }\r\n\r\n chapters.push({\r\n id: i,\r\n pid: pid,\r\n level: level,\r\n rel: `heading-${i}`,\r\n text,\r\n tagName\r\n })\r\n })\r\n\r\n return showCode ? _getChaptersWithCode(chapters) : chapters\r\n}\r\n\r\nexport default getChaptersByHeadings\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 过滤所有 HTML 标签\r\n * ========================================================================\r\n * @method stripTags\r\n * @param {string} str\r\n * @returns {string}\r\n */\r\nconst stripTags = (str) => {\r\n if (!isString(str)) {\r\n return ''\r\n }\r\n return str.replace(/<\\/?[^>]+(>|$)/g, '')\r\n}\r\n\r\nexport default stripTags\r\n","const _getChapterParentIdByDiffer = (chapters, differ, index) => {\r\n let previous = chapters[index - 1]\r\n let pid\r\n let i\r\n\r\n for (i = 0; i < differ; i += 1) {\r\n pid = previous.pid\r\n previous = chapters[pid]\r\n }\r\n\r\n pid = previous.pid\r\n\r\n return pid\r\n}\r\n\r\nexport default _getChapterParentIdByDiffer\r\n","import isArray from './utils/types/isArray'\r\n\r\nconst _getChaptersWithCode = (chapters) => {\r\n const groups = {}\r\n const cb = (o) => {\r\n return [o.pid]\r\n }\r\n\r\n chapters.forEach((o) => {\r\n const group = JSON.stringify(cb(o))\r\n\r\n groups[group] = groups[group] || []\r\n groups[group].push(o)\r\n\r\n o.index = groups[group].length\r\n\r\n if (o.pid === -1) {\r\n o.code = String(o.index)\r\n }\r\n })\r\n\r\n Object.keys(groups).forEach((group) => {\r\n groups[group].forEach((c) => {\r\n const subjects = groups[`[${c.id}]`]\r\n\r\n if (!subjects || !isArray(subjects)) {\r\n return false\r\n }\r\n\r\n subjects.forEach((o) => {\r\n o.code = c.code + '.' + o.index\r\n })\r\n })\r\n })\r\n\r\n return chapters\r\n}\r\n\r\nexport default _getChaptersWithCode\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport toTree from './utils/lang/toTree'\r\n\r\nimport getChaptersByHeadings from './getChaptersByHeadings'\r\n\r\n/**\r\n *\r\n * @param {Object} [options]\r\n * @param {String|HTMLElement} [options.articleElement]\r\n * @param {String} [options.selector]\r\n * @param {Boolean} [options.showCode]\r\n * @param {Function} [options.chapterTextFilter]\r\n * @param {Boolean} [options.isTreeStructured]\r\n * @returns {Array}\r\n */\r\nconst getChapters = (options) => {\r\n const {\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n } = options\r\n let $article = document.querySelector('#article')\r\n let $headings = []\r\n let chapters = []\r\n let filter = (text) => {\r\n return text.replace(/\\(.*?\\)/, '()')\r\n }\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n\r\n if (!$article) {\r\n return chapters\r\n }\r\n\r\n if (isFunction(chapterTextFilter)) {\r\n filter = chapterTextFilter\r\n }\r\n\r\n $headings = [...$article.querySelectorAll(selector || 'h1,h2,h3,h4,h5,h6')]\r\n chapters = getChaptersByHeadings($headings, showCode || true, filter)\r\n\r\n return isTreeStructured === true ? toTree(chapters, 'id', 'pid') : chapters\r\n}\r\n\r\nexport default getChapters\r\n","const toTree = (list, nodeKey, parentKey) => {\r\n const map = {}\r\n const roots = []\r\n\r\n list.forEach((item, i) => {\r\n // initialize the map\r\n map[item[nodeKey]] = i\r\n // initialize the children\r\n item.children = []\r\n })\r\n\r\n list.forEach((item) => {\r\n const node = list[map[item[parentKey]]]\r\n\r\n if (item[parentKey] !== -1) {\r\n // if you have dangling branches check that map[node.parentId] exists\r\n node.children.push(item)\r\n } else {\r\n roots.push(item)\r\n }\r\n })\r\n\r\n return roots\r\n}\r\n\r\nexport default toTree\r\n","/**\r\n * 检测对象自身属性中是否具有指定的属性。\r\n * ========================================================================\r\n * @method hasOwn\r\n * @param {Object} obj - (必须)检测的目标对象\r\n * @param {String} prop - (必须)属性名\r\n * @returns {Boolean}\r\n */\r\nconst hasOwn = (obj, prop) => {\r\n const hasOwnProperty = Object.prototype.hasOwnProperty\r\n return obj && hasOwnProperty.call(obj, prop)\r\n}\r\n\r\nexport default hasOwn\r\n","import hasOwn from './hasOwn'\r\n\r\n/**\r\n * 扩展对象\r\n * ========================================================================\r\n * @method extend\r\n * @param {Object} origin\r\n * @param {Object} source\r\n */\r\nconst extend = (origin, source) => {\r\n const keys = Object.keys(source)\r\n\r\n keys.forEach((prop) => {\r\n if (hasOwn(source, prop)) {\r\n origin[prop] = source[prop]\r\n }\r\n })\r\n}\r\n\r\nexport default extend\r\n","/**\r\n * 存储订阅者(主题和处理器的)私有对象\r\n * ========================================================================\r\n * @type {{}}\r\n * @private\r\n */\r\nconst _subscribers = {}\r\n\r\nexport default _subscribers\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 判断是否存在与给定 topic 完全匹配的订阅者信息\r\n * ========================================================================\r\n * @method _hasDirectSubscribersFor\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasDirectSubscribersFor = (topic) => {\r\n return hasOwn(_subscribers, topic) && _subscribers[topic].length > 0\r\n}\r\n\r\nexport default _hasDirectSubscribersFor\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\nimport _hasSubscribers from './_hasSubscribers'\r\n\r\n/**\r\n * 判断是否存在包含 topic 指定的订阅者信息\r\n * ========================================================================\r\n * @method has\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Boolean} [isDirect] - (可选)是否为直接的主题,默认值:true\r\n * @returns {Boolean}\r\n */\r\nconst has = (topic, isDirect = true) => {\r\n return isDirect ? _hasDirectSubscribersFor(topic) : _hasSubscribers(topic)\r\n}\r\n\r\nexport default has\r\n","import _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * 判断是否存在包含给定 topic 相关的订阅者信息\r\n * ========================================================================\r\n * @method _hasSubscribers\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _hasSubscribers = (topic) => {\r\n let found = _hasDirectSubscribersFor(topic)\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (!found && position !== -1) {\r\n topic = topic.substring(0, position)\r\n position = topic.lastIndexOf('.')\r\n found = _hasDirectSubscribersFor(topic)\r\n }\r\n\r\n return found\r\n}\r\n\r\nexport default _hasSubscribers\r\n","import isTypedArray from '../types/isTypedArray'\r\nimport _subscribers from './_subscribers'\r\nimport has from './has'\r\nimport _hasDirectSubscribersFor from './_hasDirectSubscribersFor'\r\n\r\n/**\r\n * (异步)发布订阅主题信息\r\n * ========================================================================\r\n * 主题默认是异步发布的。确保在消费者处理主题时,主题的发起者不会被阻止。\r\n * ========================================================================\r\n * @method emit\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Object} [data] - (可选)数据对象\r\n * @param {Boolean} [async] - (可选) 是否异步发布\r\n */\r\nconst emit = (topic, data, async = true) => {\r\n const execute = (topic) => {\r\n if (!_hasDirectSubscribersFor(topic)) {\r\n return false\r\n }\r\n\r\n _subscribers[topic].forEach((subscriber) => {\r\n // 针对 mqtt 消息服务返回的 Uint8Array 类似的 typed arrays 格式的数据\r\n // 采用 toString() 方法转化为普通(JSON)字符串\r\n const message = isTypedArray(data) ? data.toString() : data\r\n\r\n subscriber.callback.call(subscriber.context || subscriber, message)\r\n })\r\n }\r\n const deliver = () => {\r\n let subscriber = topic\r\n let position = topic.lastIndexOf('.')\r\n\r\n while (position !== -1) {\r\n subscriber = subscriber.substring(0, position)\r\n position = subscriber.lastIndexOf('.')\r\n\r\n execute(subscriber)\r\n }\r\n\r\n // 执行 topic 对应的处理器\r\n execute(topic)\r\n // 执行特殊 topic:'*'(监听全部消息的发布)\r\n execute('*')\r\n }\r\n\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (async) {\r\n setTimeout(deliver, 10)\r\n } else {\r\n deliver()\r\n }\r\n}\r\n\r\nexport default emit\r\n","import toString from '../lang/toString'\r\n/**\r\n * 判断检测数据是否为 Typed Arrays 类型的数据\r\n * ========================================================================\r\n * @param {*} val\r\n * @returns {boolean}\r\n */\r\nconst isTypedArray = (val) => {\r\n const TYPES = [\r\n '[object Int8Array]',\r\n '[object Uint8Array]',\r\n '[object Uint8ClampedArray]',\r\n '[object Int16Array]',\r\n '[object Uint16Array]',\r\n '[object Int32Array]',\r\n '[object Uint32Array]',\r\n '[object Float32Array]',\r\n '[object Float64Array]',\r\n '[object BigInt64Array]',\r\n '[object BigUint64Array]'\r\n ]\r\n\r\n return TYPES.indexOf(toString(val)) > -1\r\n}\r\n\r\nexport default isTypedArray\r\n","/**\r\n * 生成唯一 id 字符串的函数\r\n * ========================================================================\r\n * @method guid\r\n * @param {String} [prefix] - 生成 id 的前缀字符串\r\n * @return {String} 返回一个表示唯一 id 的字符串\r\n */\r\nconst guid = (() => {\r\n let uuid = 0\r\n\r\n return (prefix) => {\r\n uuid += 1\r\n\r\n return prefix ? prefix + '-' + uuid : 'guid-' + uuid\r\n }\r\n})()\r\n\r\nexport default guid\r\n","import _subscribers from './_subscribers'\r\nimport hasOwn from '../lang/hasOwn'\r\n\r\n/**\r\n * 删除与给定 topic 相同的订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriber\r\n * @param {String} topic - (必须)订阅主题字符串\r\n * @returns {Boolean}\r\n */\r\nconst _removeSubscriber = (topic) => {\r\n if (!hasOwn(_subscribers, topic)) {\r\n return false\r\n }\r\n\r\n delete _subscribers[topic]\r\n}\r\n\r\nexport default _removeSubscriber\r\n","import has from './has'\r\nimport _removeSubscriber from './_removeSubscriber'\r\nimport _removeSubscriberByToken from './_removeSubscriberByToken'\r\n\r\n/**\r\n * 取消订阅主题\r\n * ========================================================================\r\n * @method off\r\n * @param {String} topic - (必须)订阅的主题\r\n * @param {Function|String} [token] - (可选)订阅主题的处理器函数或者唯一 Id 值\r\n */\r\nconst off = (topic, token) => {\r\n if (!has(topic)) {\r\n return false\r\n }\r\n\r\n if (token) {\r\n _removeSubscriberByToken(token)\r\n } else {\r\n _removeSubscriber(topic)\r\n }\r\n}\r\n\r\nexport default off\r\n","import _subscribers from './_subscribers'\r\nimport _removeSubscriber from './_removeSubscriber'\r\n\r\n/**\r\n * 通过订阅者 token 值删除订阅者信息\r\n * ========================================================================\r\n * @method _removeSubscriberByToken\r\n * @param {String} token - 订阅者 token 字符串\r\n * @returns {boolean}\r\n * @private\r\n */\r\nconst _removeSubscriberByToken = (token) => {\r\n const keys = Object.keys(_subscribers)\r\n let index = -1\r\n\r\n if (!token || keys.length < 1) {\r\n return false\r\n }\r\n\r\n keys.forEach((subject) => {\r\n const subscriber = _subscribers[subject]\r\n let topic\r\n\r\n subscriber.forEach((execution, j) => {\r\n if (execution.callback === token || execution.token === token) {\r\n topic = execution.topic\r\n subscriber.splice(index, j)\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (subscriber.length < 1) {\r\n _removeSubscriber(topic)\r\n }\r\n })\r\n}\r\n\r\nexport default _removeSubscriberByToken\r\n","import isString from './utils/types/isString'\r\nimport hasOwn from './utils/lang/hasOwn'\r\nimport isObject from './utils/types/isObject'\r\nimport extend from './utils/lang/extend'\r\nimport publish from './utils/observer/emit'\r\nimport subscribe from './utils/observer/on'\r\nimport unsubscribe from './utils/observer/off'\r\n\r\nclass Base {\r\n constructor(options) {\r\n this.attrs = {}\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options).render().addListeners()\r\n return this\r\n }\r\n\r\n attr(prop, value) {\r\n const attrs = this.attrs\r\n\r\n if (isString(prop)) {\r\n // 只能扩展 attrs 中已有的属性\r\n if (value && hasOwn(attrs, prop)) {\r\n // 更新单个配置信息\r\n attrs[prop] = value\r\n return this\r\n }\r\n\r\n // 只传递 prop 参数,则返回对应的属性值\r\n return attrs[prop]\r\n } else if (isObject(prop)) {\r\n // 批量更新配置信息\r\n extend(attrs, prop)\r\n\r\n return this\r\n } else if (arguments.length === 0) {\r\n // 不传递参数,直接返回整个\r\n return attrs\r\n }\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n return this\r\n }\r\n\r\n refresh() {\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.removeListeners()\r\n return this\r\n }\r\n\r\n reload(options) {\r\n let attrs = this.attr()\r\n\r\n if (options) {\r\n attrs = this.attr(options)\r\n }\r\n\r\n this.destroy().initialize(attrs)\r\n\r\n return this\r\n }\r\n\r\n $emit(event, data) {\r\n publish(event, data)\r\n return this\r\n }\r\n\r\n $on(event, callback) {\r\n subscribe(event, callback, this)\r\n return this\r\n }\r\n\r\n $off(event, callback) {\r\n unsubscribe(event, callback)\r\n return this\r\n }\r\n\r\n addListeners() {\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n return this\r\n }\r\n}\r\n\r\nexport default Base\r\n","import _subscribers from './_subscribers'\r\nimport isFunction from '../types/isFunction'\r\nimport guid from '../lang/guid'\r\n\r\n/**\r\n * 订阅主题,并给出处理器函数\r\n * ========================================================================\r\n * @method on\r\n * @param {String} topic - (必须)主题名称\r\n * @param {Function} handler - (必须)主题的处理器函数\r\n * @param {Object} [context] - (可选)指定 this 执行上下文\r\n * @return {String} - 唯一的 token 字符串,例如:'guid-1'。\r\n */\r\nconst on = (topic, handler, context = null) => {\r\n const token = guid()\r\n let subject = typeof topic === 'symbol' ? topic.toString() : topic\r\n\r\n if (!isFunction(handler)) {\r\n return ''\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (!_subscribers[subject]) {\r\n _subscribers[subject] = []\r\n }\r\n\r\n _subscribers[subject].push({\r\n topic: subject,\r\n callback: handler,\r\n context,\r\n token\r\n })\r\n\r\n return token\r\n}\r\n\r\nexport default on\r\n","/**\r\n * timeSlice.js 时间切片功能函数\r\n * ====================================================\r\n * Created By: Yaohaixiao\r\n * Update: 2023.09.04\r\n */\r\nimport isFunction from '../types/isFunction'\r\nimport later from './later'\r\n\r\nconst queue = []\r\nlet isHandling\r\nlet done\r\n\r\n// Shim from https://developers.google.com/web/updates/2015/08/using-requestidlecallback\r\nif (typeof window.requestIdleCallback === 'undefined') {\r\n window.requestIdleCallback = function (cb) {\r\n const start = Date.now()\r\n return later(function () {\r\n cb({\r\n didTimeout: false,\r\n timeRemaining: function () {\r\n return Math.max(0, 50 - (Date.now() - start))\r\n }\r\n })\r\n }, 10)\r\n }\r\n\r\n window.cancelIdleCallback = function (id) {\r\n clearTimeout(id)\r\n }\r\n}\r\n\r\nfunction runIdle(idleDeadline) {\r\n while (idleDeadline.timeRemaining() > 0 && queue.length) {\r\n const fn = queue.shift()\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n fn()\r\n }\r\n\r\n if (queue.length) {\r\n isHandling = requestIdleCallback(runIdle)\r\n } else {\r\n isHandling = 0\r\n\r\n if (isFunction(done)) {\r\n done()\r\n done = null\r\n }\r\n }\r\n}\r\n\r\n/**\r\n * 时间切片功能函数:主要用于优化长时任务的性能,将长时任务分解成\r\n * 多个短时间任务\r\n * ====================================================\r\n * @param {Function} fn - 需要在空闲时执行的回调函数\r\n * @param {Function} afterComplete - queen 的\r\n * @return {(function(): (boolean|undefined))|*|boolean}\r\n */\r\nconst timeSlice = (fn, afterComplete = null) => {\r\n queue.push(fn)\r\n\r\n if (isFunction(afterComplete)) {\r\n done = afterComplete\r\n }\r\n\r\n if (!isHandling) {\r\n requestIdleCallback(runIdle)\r\n }\r\n}\r\n\r\nexport default timeSlice\r\n","/**\r\n * 获取 DOM 节点相对于窗口的 left (纵坐标)值\r\n * ========================================================================\r\n * @method offsetTop\r\n * @param {HTMLElement} el - DOM 节点\r\n * @returns {Number}\r\n */\r\nconst offsetTop = (el) => {\r\n let top = el.offsetTop\r\n\r\n if (el.offsetParent !== null) {\r\n top += offsetTop(el.offsetParent)\r\n }\r\n\r\n return top\r\n}\r\n\r\nexport default offsetTop\r\n","/**\r\n * 获取 options 节点下匹配 selector 选择器的 DOM 节点\r\n * ========================================================================\r\n * Element.matches() 方法可以用来判断 DOM 元素是否与给定的选择器匹配,事件代理判断是\r\n * 否触发绑定的代理事件回调函数,关键就是使用 Element.matches() 辨别当前事件触发的目\r\n * 标 DOM 元素是否为事件代理所期望触发的目标。\r\n * ========================================================================\r\n * @method matches\r\n * @see https://developer.mozilla.org/en-US/docs/web/api/element/matches\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)匹配 DOM 元素的选择器\r\n * @returns {Boolean}\r\n */\r\nconst matches = (el, selector = '') => {\r\n const sel = selector.replace(/^>/i, '')\r\n\r\n if (!selector || !sel || !el) {\r\n return false\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el.matches) {\r\n return el.matches(sel)\r\n } else if (el.msMatchesSelector) {\r\n return el.msMatchesSelector(sel)\r\n } else {\r\n return false\r\n }\r\n}\r\n\r\nexport default matches\r\n","/**\r\n * 获取 DOM 元素的父节点\r\n * ========================================================================\r\n * @method getParentOrHost\r\n * @param {*|HTMLElement} el - (必须)要获取父节点的 DOM 元素\r\n * @returns {*|HTMLElement}\r\n */\r\nconst getParentOrHost = (el) => {\r\n return el.host && el !== document && el.host.nodeType\r\n ? el.host\r\n : el.parentNode\r\n}\r\n\r\nexport default getParentOrHost\r\n","export const CAPTURE_EVENTS = [\r\n 'focusout',\r\n 'blur',\r\n 'focusin',\r\n 'focus',\r\n 'load',\r\n 'unload',\r\n 'mouseenter',\r\n 'mouseleave'\r\n]\r\n","import { CAPTURE_EVENTS } from './enum'\r\nimport _delete from './_delete'\r\n\r\n/**\r\n * (私有方法)取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method _off\r\n * @param {HTMLElement} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} fn - (必须)事件处理器回调函数\r\n * @private\r\n */\r\nconst _off = (el, type, fn) => {\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n /* istanbul ignore else */\r\n if (fn._delegateListener) {\r\n fn = fn._delegateListener\r\n delete fn._delegateListener\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n _delete(el, type, fn)\r\n\r\n el.removeEventListener(type, fn, capture)\r\n}\r\n\r\nexport default _off\r\n","/**\r\n * 删除 DOM 元素缓存的 _listeners 数据\r\n * ========================================================================\r\n * @method _delete\r\n * @param {HTMLElement} el - 要删除 listener 的 DOM 元素\r\n * @param {String} type - 事件类型(名称)\r\n * @param {Function} [fn] - 事件处理器回调函数\r\n */\r\nconst _delete = function (el, type, fn) {\r\n const listeners = el._listeners\r\n let index = -1\r\n\r\n if (listeners.length < 1) {\r\n return false\r\n }\r\n\r\n // 移除缓存的 _listeners 数据\r\n listeners.forEach((listener, i) => {\r\n const handler = listener.fn\r\n\r\n if (type === listener.type) {\r\n index = i\r\n\r\n if (handler === fn) {\r\n index = i\r\n }\r\n }\r\n })\r\n\r\n /* istanbul ignore else */\r\n if (index > -1) {\r\n listeners.splice(index, 1)\r\n }\r\n}\r\n\r\nexport default _delete\r\n","import isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport getListeners from './getListeners'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 销毁(type 类型的)代理事件绑定\r\n * ========================================================================\r\n * 1. 设置了事件类型 type,则销毁指定类型的事件绑定,否则清除所有代理事件绑定\r\n * 2. recurse 设置为 true,递归销毁子节点全部事件绑定\r\n * ========================================================================\r\n * @method purgeElement\r\n * @param {HTMLElement|String} el - (必须)DOM 元素或者其选择器\r\n * @param {String|Boolean} type - (必须)事件类型\r\n * @param {Boolean} [recurse] - (可选)是否递归销毁子节点所有事件绑定\r\n */\r\nconst purgeElement = function (el, type, recurse = false) {\r\n const $element = isString(el) ? document.querySelector(el) : el\r\n const $children = $element.childNodes\r\n const listeners = getListeners($element, type)\r\n\r\n listeners.forEach((listener) => {\r\n _off($element, listener.type, listener.fn)\r\n })\r\n\r\n if (\r\n (recurse || type === true || arguments.length === 1) &&\r\n $element &&\r\n $children\r\n ) {\r\n $children.forEach(($child) => {\r\n if (isElement($child)) {\r\n purgeElement($child, type, recurse)\r\n }\r\n })\r\n }\r\n}\r\n\r\nexport default purgeElement\r\n","import isString from '../types/isString'\r\n\r\n/**\r\n * 获取 DOM 元素(type 事件类型)事件绑定信息\r\n * ========================================================================\r\n * 如果设置了事件类型 type, 则返回指定类型的事件绑定信息,否则返回所有事件绑定信息\r\n * ========================================================================\r\n * @methods getListeners\r\n * @param {HTMLElement} el - (必须)要获取事件绑定信息的 DOM 元素\r\n * @param {String} [type] - (可选)事件类型\r\n * @returns {Array} - 已绑定的事件信息\r\n */\r\nconst getListeners = (el, type) => {\r\n let listeners = el._listeners || []\r\n\r\n if (isString(type) && type) {\r\n listeners = listeners.filter((listener) => {\r\n return listener.type === type\r\n })\r\n }\r\n\r\n return listeners\r\n}\r\n\r\nexport default getListeners\r\n","import purgeElement from './purgeElement'\r\nimport isFunction from '../types/isFunction'\r\nimport _off from './_off'\r\n\r\n/**\r\n * 取消 type 类型的代理事件绑定\r\n * ========================================================================\r\n * 如果没有设置 handler,则销毁 this.$options 绑定的所有符合 type 事件类型的事件绑定\r\n * ========================================================================\r\n * @method off\r\n * @param {HTMLElement|Object} el - (必须)取消事件绑定的 DOM 元素\r\n * @param {String} type - (必须)事件类型\r\n * @param {Function} [fn] - (可选)事件处理器回调函数\r\n */\r\nconst off = (el, type, fn) => {\r\n // 如果不设置 fn 参数,默认清除 el 元素上绑定的所有事件处理器\r\n if (!isFunction(fn)) {\r\n purgeElement(el, type)\r\n return false\r\n }\r\n\r\n _off(el, type, fn)\r\n}\r\n\r\nexport default off\r\n","import closest from '../dom/closest'\r\nimport off from './off'\r\nimport getTarget from './getTarget'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定代理事件\r\n * ========================================================================\r\n * @method on\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String} selector - (必须)事件代理目标 DOM 元素的选择器\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (可选) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst on = (el, selector, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n\r\n const listener = function (evt) {\r\n const target = getTarget(evt)\r\n // 通过 Element.matches 方法获得点击的目标元素\r\n const delegateTarget = closest(target, selector, el)\r\n let overrideContext = context || el\r\n\r\n evt.delegateTarget = delegateTarget\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (delegateTarget) {\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n }\r\n\r\n if (!el) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n selector,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default on\r\n","import resolveTextNode from '../dom/resolveTextNode'\r\n\r\n/**\r\n * 返回触发事件的 target DOM 元素\r\n * ========================================================================\r\n * @method getTarget\r\n * @param {Event} evt - Event 对象\r\n * @return {HTMLElement} - Event 对象的 target DOM 元素\r\n */\r\nconst getTarget = function (evt) {\r\n const target = evt.target\r\n\r\n return resolveTextNode(target)\r\n}\r\n\r\nexport default getTarget\r\n","/**\r\n * 在某些情况下,某些浏览器(例如:Safari 浏览器)会返回实际的目标元素内部的文本节点。\r\n * resolveTextNode() 方法则会返回实际的目标节点。\r\n * ========================================================================\r\n * @method resolveTextNode\r\n * @param {HTMLElement|Text} el - 要解析的节点\r\n * @return {*|HTMLElement} - 实际的目标 DOM 节点\r\n */\r\nconst resolveTextNode = function (el) {\r\n if (el && el.nodeType === 3) {\r\n return el.parentNode\r\n }\r\n\r\n return el\r\n}\r\n\r\nexport default resolveTextNode\r\n","import matches from './matches'\r\nimport getParentOrHost from './getParentOrHost'\r\n\r\n/**\r\n * 获取 options 元素父元素最近的包含 selector 选择器的元素\r\n * ========================================================================\r\n * @method closest\r\n * @param {HTMLElement} el - (必须)DOM 元素\r\n * @param {String} selector - (必须)DOM 元素的选择其\r\n * @param {HTMLElement} [ctx] - (必须)比对的 DOM 元素\r\n * @param {Boolean} [includeCTX] - (必须)是否包含 context DOM 元素\r\n * @returns {null|HTMLElement} - 返回最接近的 DOM 元素\r\n */\r\nconst closest = (el, selector, ctx, includeCTX) => {\r\n const context = ctx || document\r\n\r\n if (!el) {\r\n return null\r\n }\r\n\r\n do {\r\n /* istanbul ignore else */\r\n if (\r\n (selector != null &&\r\n (selector.startsWith('>')\r\n ? el.parentNode === context && matches(el, selector)\r\n : matches(el, selector))) ||\r\n (includeCTX && el === context)\r\n ) {\r\n return el\r\n }\r\n\r\n /* istanbul ignore else */\r\n if (el === context) {\r\n break\r\n }\r\n\r\n /* jshint boss:true */\r\n } while ((el = getParentOrHost(el)))\r\n}\r\n\r\nexport default closest\r\n","/**\r\n * 停止事件(阻止默认行为和阻止事件的捕获或冒泡)\r\n * ========================================================================\r\n * @method stop\r\n * @param {Event} evt - 事件对象\r\n *\r\n * @example\r\n *
\r\n * Service\r\n * Help\r\n *
\r\n *\r\n * const $nav = document.querySelector('#nav')\r\n * const $service = document.querySelector('.anchor')\r\n *\r\n * on($nav, 'click', function(evt) {\r\n * console.log('你点击了导航栏')\r\n * })\r\n *\r\n * on($anchor, 'click', function(evt) {\r\n * console.log('tagName', this.tagName)\r\n *\r\n * // 工作台输出:'a'\r\n * // 不会触发事件冒泡,输出:'你点击了导航栏'\r\n * // 也不会切换到 href 属性的页面,阻止了点击链接的默认行为\r\n * stopEvent(evt)\r\n * })\r\n */\r\nconst stop = function (evt) {\r\n evt.stopPropagation()\r\n evt.preventDefault()\r\n}\r\n\r\nexport default stop\r\n","import DEFAULTS from './defaults'\r\n\r\nconst SYMBOLS = [...DEFAULTS]\r\n\r\nexport default SYMBOLS\r\n","const DEFAULTS = [\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n '',\r\n ''\r\n]\r\n\r\nexport default DEFAULTS\r\n","import isString from '../types/isString'\r\nimport getSymbol from './getSymbol'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n *\r\n * @method getSymbols\r\n * @param {String} [name]\r\n * @param {String} [iconSet]\r\n * @returns {string[]|*}\r\n */\r\nconst getSymbols = (name, iconSet = 'icon') => {\r\n if (isString(name)) {\r\n return getSymbol(name, iconSet)\r\n }\r\n\r\n return [...SYMBOLS]\r\n}\r\n\r\nexport default getSymbols\r\n","import SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method getSymbol\r\n * @param {String} name\r\n * @param {String} [iconSet]\r\n * @returns {String}\r\n */\r\nconst getSymbol = (name, iconSet = 'icon') => {\r\n const patternName = /id=\"(.*?)\"/\r\n const patternSet = /^(\\w+)-/\r\n const symbols = SYMBOLS\r\n\r\n return symbols.find((symbol) => {\r\n const names = patternName.exec(symbol)\r\n const fullName = names[1]\r\n const sets = patternSet.exec(fullName)\r\n const setName = sets[1]\r\n const iconName =\r\n iconSet === 'icon' ? `${iconSet}-${name}` : `${iconSet}-icon-${name}`\r\n\r\n return setName === iconSet && fullName === iconName\r\n })\r\n}\r\n\r\nexport default getSymbol\r\n","import add from './add'\r\nimport getSymbols from './getSymbols'\r\n\r\n/**\r\n * 绘制 SVG 图标集\r\n * ========================================================================\r\n * @method paint\r\n * @param {String|Array} symbol\r\n */\r\nconst paint = (symbol = '') => {\r\n const $body = document.body\r\n let $icons = document.querySelector('#outline-icons')\r\n let symbols = []\r\n\r\n add(symbol)\r\n symbols = getSymbols()\r\n\r\n if ($icons) {\r\n $icons.innerHTML = symbols.join('')\r\n } else {\r\n $icons = document.createElement('div')\r\n $icons.innerHTML =\r\n ``\r\n $body.insertBefore($icons.firstChild, $body.firstChild)\r\n }\r\n}\r\n\r\nexport default paint\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport SYMBOLS from './symbols'\r\n\r\n/**\r\n * @method add\r\n * @param {Array|String} symbols\r\n * @return {Boolean}\r\n */\r\nconst add = (symbols) => {\r\n if (!symbols) {\r\n return false\r\n }\r\n\r\n if (isArray(symbols) && symbols.length > 0) {\r\n symbols.forEach((symbol) => {\r\n /* istanbul ignore else */\r\n if (SYMBOLS.indexOf(symbol) === -1 && isString(symbol)) {\r\n SYMBOLS.push(symbol)\r\n }\r\n })\r\n } else {\r\n /* istanbul ignore else */\r\n if (isString(symbols)) {\r\n SYMBOLS.push(symbols)\r\n }\r\n }\r\n}\r\n\r\nexport default add\r\n","import isObject from './isObject'\r\nimport isElement from './isElement'\r\nimport isHTMLCollection from './isHTMLCollection'\r\nimport isFragment from './isFragment'\r\nimport isTextNode from './isTextNode'\r\n\r\nconst isDOM = (el) => {\r\n return !!(\r\n isObject(el) &&\r\n (isElement(el) || isHTMLCollection(el) || isFragment(el) || isTextNode(el))\r\n )\r\n}\r\n\r\nexport default isDOM\r\n","import toString from '../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'\r\nimport isObject from './isObject'\r\n\r\nconst isFragment = (fragment) => {\r\n return !!(\r\n isObject(fragment) && toString(fragment) === '[object DocumentFragment]'\r\n )\r\n}\r\n\r\nexport default isFragment\r\n","import toString from '../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","/**\r\n * 给 DOM 节点设置属性/值\r\n * ========================================================================\r\n * @method setAttribute\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} attr - 属性名称\r\n * @param {String|Number|Boolean} value - 属性值\r\n */\r\nconst setAttribute = (el, attr, value) => {\r\n let tagName = el.tagName.toLowerCase()\r\n\r\n switch (attr) {\r\n case 'style':\r\n el.style.cssText = value\r\n break\r\n case 'value':\r\n if (tagName === 'input' || tagName === 'textarea') {\r\n el.value = value\r\n } else {\r\n el.setAttribute(attr, value)\r\n }\r\n break\r\n case 'htmlFor':\r\n el.setAttribute('for', value)\r\n break\r\n case 'className':\r\n el.className = value\r\n break\r\n case 'innerHTML':\r\n el.innerHTML = value\r\n break\r\n case 'innerText':\r\n el.innerText = value\r\n break\r\n default:\r\n el.setAttribute(attr, value)\r\n break\r\n }\r\n}\r\n\r\nexport default setAttribute\r\n","import isObject from '../types/isObject'\r\nimport hasOwn from '../lang/hasOwn'\r\nimport setAttribute from './setAttribute'\r\n\r\nconst setAttributes = (el, attrs) => {\r\n if (!el || !isObject(attrs)) {\r\n return false\r\n }\r\n\r\n Object.keys(attrs).forEach((attr) => {\r\n const value = attrs[attr]\r\n if (hasOwn(attrs, attr)) {\r\n setAttribute(el, attr, value)\r\n }\r\n })\r\n}\r\n\r\nexport default setAttributes\r\n","import isObject from '../types/isObject'\r\nimport isString from '../types/isString'\r\nimport isArray from '../types/isArray'\r\nimport isDOM from '../types/isDOM'\r\nimport setAttributes from './setAttributes'\r\n\r\n/**\r\n * 创建 DOM 节点,并添加属性和子节点\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} tagName - 标签名称\r\n * @param {Object|Array|HTMLElement|DocumentFragment|String} attrs - 属性对象或者子节点\r\n * @param {Array|HTMLElement|DocumentFragment|String} [children] - 子节点数组\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (tagName, attrs, children) => {\r\n const $fragment = document.createDocumentFragment()\r\n const $el = document.createElement(tagName)\r\n const isValidChild = (child) => {\r\n return isDOM(child) || isString(child)\r\n }\r\n const append = (child) => {\r\n let $child\r\n\r\n if (!isValidChild(child)) {\r\n return false\r\n }\r\n\r\n if (isDOM(child)) {\r\n $child = child\r\n } else if (isString(child)) {\r\n $child = document.createTextNode(child)\r\n }\r\n\r\n $fragment.appendChild($child)\r\n }\r\n\r\n if (isObject(attrs)) {\r\n setAttributes($el, attrs)\r\n } else if (isArray(attrs) && attrs.every((attr) => isValidChild(attr))) {\r\n attrs.forEach((child) => {\r\n append(child)\r\n })\r\n } else if (isDOM(attrs)) {\r\n append(attrs)\r\n } else if (isString(attrs)) {\r\n append(document.createTextNode(attrs))\r\n }\r\n\r\n if (isArray(children)) {\r\n children.forEach((child) => {\r\n append(child)\r\n })\r\n } else {\r\n append(children)\r\n }\r\n\r\n $el.appendChild($fragment)\r\n\r\n return $el\r\n}\r\n\r\nexport default createElement\r\n","import isArray from '../types/isArray'\r\nimport isString from '../types/isString'\r\nimport isSVG from '../types/isSVG'\r\nimport setAttributes from '../dom/setAttributes'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @param {Object} [options.attrs]\r\n * @returns {HTMLElement}\r\n */\r\nconst createElement = (name, options = {}) => {\r\n const ICON = 'outline-icon'\r\n const size = options.size || 0\r\n const color = options.color || ''\r\n const iconSet = options.iconSet || ''\r\n const width = isArray(size) ? size[0] : size\r\n const height = isArray(size) ? size[1] : size\r\n const defaultRules = size ? `width:${width}px;height:${height}px;` : ''\r\n const cssRules = color ? defaultRules + `color:${color}` : defaultRules\r\n const attrs = options.attrs || {}\r\n const $icon = document.createElement('i')\r\n let binds = ''\r\n let svg = ''\r\n let $svg\r\n\r\n if (!isString(name)) {\r\n return null\r\n }\r\n\r\n if (isSVG(name)) {\r\n svg = name\r\n } else {\r\n binds =\r\n iconSet && iconSet !== 'icon'\r\n ? `xlink:href=\"#${iconSet}-icon-${name}\"`\r\n : `xlink:href=\"#icon-${name}\"`\r\n svg = ``\r\n }\r\n\r\n $icon.innerHTML = svg\r\n\r\n if (attrs.className) {\r\n attrs.className = `${ICON} ${attrs.className}`\r\n } else {\r\n attrs.className = ICON\r\n }\r\n\r\n setAttributes($icon, attrs)\r\n\r\n $svg = $icon.querySelector('svg')\r\n setAttributes($svg, {\r\n 'aria-hidden': true,\r\n xmlns: 'http://www.w3.org/2000/svg',\r\n class: 'outline-icon__svg',\r\n width: 200,\r\n height: 200,\r\n style: cssRules\r\n })\r\n\r\n return $icon\r\n}\r\n\r\nexport default createElement\r\n","import isString from './isString'\r\n\r\nconst isSVG = (str) => {\r\n const declaration = '(?:<\\\\?xml[^>]*>\\\\s*)?'\r\n const doctype =\r\n '(?:<\\\\!doctype svg[^>]*\\\\s*(?:\\\\[?(?:\\\\s*]*>\\\\s*)*\\\\]?)*[^>]*>\\\\s*)?'\r\n const content = ']*>[^]*<\\\\/svg>\\\\s*$'\r\n const svg = `^\\\\s*${declaration}${doctype}${content}\\\\s*$`\r\n const pattern = new RegExp(svg, 'i')\r\n\r\n return isString(str) && pattern.test(str)\r\n}\r\n\r\nexport default isSVG\r\n","import createElement from './createElement'\r\n\r\n/**\r\n * 创建 SVG 图标 DOM 元素\r\n * ========================================================================\r\n * @method icon\r\n * @alias createElement\r\n * @see createElement\r\n * @param {String} name\r\n * @param {Object} [options]\r\n * @param {Number|Array} [options.size]\r\n * @param {String} [options.color]\r\n * @param {String} [options.iconSet]\r\n * @returns {HTMLElement}\r\n */\r\nconst icon = (name, options = {}) => {\r\n return createElement(name, options)\r\n}\r\n\r\nexport default icon\r\n","import trim from '../lang/trim'\r\nimport hasClass from './hasClass'\r\n\r\n/**\r\n * 移除 DOM 节点的 className 样式\r\n * ========================================================================\r\n * @method removeClass\r\n * @param {HTMLElement} el - DOM 节点\r\n * @param {String} className - 样式名称\r\n * @returns {Boolean}\r\n */\r\nconst removeClass = (el, className) => {\r\n let allClass = el.className\r\n let classList\r\n\r\n if (!allClass || !hasClass(el, className)) {\r\n return false\r\n }\r\n\r\n classList = el.classList\r\n\r\n if (classList?.remove) {\r\n classList.remove(className)\r\n } else {\r\n allClass = trim(allClass.replace(className, ''))\r\n el.className = allClass\r\n }\r\n}\r\n\r\nexport default removeClass\r\n","import removeClass from './utils/dom/removeClass'\r\nimport isEmpty from './utils/types/isEmpty'\r\nimport trim from './utils/lang/trim'\r\n\r\nconst _removeHeading = ($heading, hasAnchor = true, isAtStart = true) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const text = $heading.innerHTML\r\n const pattern = /^\\d+(\\.?\\d+)*\\s?/gi\r\n let $anchor\r\n\r\n $heading.innerHTML = text.replace(pattern, '')\r\n $heading.removeAttribute('id')\r\n $heading.removeAttribute('data-id')\r\n\r\n removeClass($heading, CLS_HEADING)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $anchor = $heading.querySelector(`.${CLS_HEADING}__anchor`)\r\n\r\n if (isAtStart) {\r\n removeClass($heading, `${CLS_HEADING}_start`)\r\n }\r\n\r\n if (isEmpty(trim($heading.className))) {\r\n $heading.removeAttribute('class')\r\n }\r\n\r\n // 存在锚点才移除\r\n if ($anchor) {\r\n $heading.removeChild($anchor)\r\n }\r\n}\r\n\r\nexport default _removeHeading\r\n","import isString from './isString'\r\n/**\r\n * 检测数据是否为空字符串\r\n * ========================================================================\r\n * @method isEmpty\r\n * @param {String} str\r\n * @returns {boolean}\r\n */\r\nconst isEmpty = (str) => {\r\n return isString(str) && str === ''\r\n}\r\n\r\nexport default isEmpty\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport timeSlice from './utils/lang/timeSlice'\r\nimport later from './utils/lang/later'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport _updateHeading from './_updateHeading'\r\nimport _removeHeading from './_removeHeading'\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\n\r\nclass Anchors extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Anchors.DEFAULTS)\r\n\r\n this.$articleElement = null\r\n this.$scrollElement = null\r\n this.$headings = []\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let scrollElement\r\n let $articleElement\r\n let articleElement\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n created = this.attr('created')\r\n\r\n if (isString(articleElement)) {\r\n $articleElement = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $articleElement = articleElement\r\n }\r\n\r\n if (!$articleElement) {\r\n return this\r\n }\r\n\r\n this.$articleElement = $articleElement\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n this.$headings = this.getHeadings()\r\n\r\n if (this.$headings.length < 1) {\r\n return this\r\n }\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getHeadings() {\r\n const $articleElement = this.$articleElement\r\n const selector = this.attr('selector')\r\n\r\n return [...$articleElement.querySelectorAll(selector)]\r\n }\r\n\r\n count() {\r\n return this.getHeadings().length\r\n }\r\n\r\n render() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n const mounted = this.attr('mounted')\r\n const chapters = getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n\r\n paint()\r\n\r\n this._paint(chapters)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this._remove()\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const LIMIT = 400\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const count = this.count()\r\n const $headings = [...this.$headings]\r\n const update = (headings, group) => {\r\n headings.forEach(($heading, i) => {\r\n const id = i + group * LIMIT\r\n const chapterCode = chapters[id].code\r\n _updateHeading($heading, id, {\r\n hasAnchor,\r\n isAtStart,\r\n showCode,\r\n chapterCode,\r\n anchorURL\r\n })\r\n })\r\n }\r\n let groupIndex = -1\r\n\r\n // 针对超长的文章,进行 timeSlice 处理\r\n if (count > LIMIT) {\r\n groupIndex += 1\r\n // 同步绘制 Limit 以内的标题链接(可以确保 50ms 完成绘制)\r\n update($headings.splice(0, LIMIT), 0)\r\n // 采用 timeSlice 处理机制绘制剩余的标题\r\n while ($headings.length > 0) {\r\n const once = $headings.splice(0, LIMIT)\r\n timeSlice(\r\n () => {\r\n update(once, (groupIndex += 1))\r\n },\r\n () => {\r\n this.$emit('anchors:all:paint')\r\n }\r\n )\r\n }\r\n } else {\r\n update($headings, 0)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const hasAnchor = this.attr('hasAnchor')\r\n const isAtStart = this.attr('isAtStart')\r\n const $headings = this.$headings\r\n\r\n $headings.forEach(($heading) => {\r\n _removeHeading($heading, hasAnchor, isAtStart)\r\n })\r\n\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.$headings = this.getHeadings()\r\n\r\n this.erase()._paint(\r\n chapters ||\r\n getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter\r\n })\r\n )\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onAnchorTrigger(evt) {\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const $heading = $anchor.parentNode\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const $scrollElement = this.$scrollElement\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'anchor')\r\n }\r\n\r\n later(() => {\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.scrollTo(top, after)\r\n\r\n if (!anchorURL) {\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n on(\r\n $articleElement,\r\n '.outline-heading__anchor',\r\n 'click',\r\n this.onAnchorTrigger,\r\n this,\r\n true\r\n )\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $articleElement = this.$articleElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n off($articleElement, 'click', this.onAnchorTrigger)\r\n\r\n return this\r\n }\r\n}\r\n\r\nAnchors.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n scrollElement: 'html,body',\r\n articleElement: '#article',\r\n selector: 'h1,h2,h3,h4,h5,h6',\r\n stickyHeight: 0,\r\n anchorURL: '',\r\n hasAnchor: true,\r\n isAtStart: true,\r\n showCode: false,\r\n created: null,\r\n mounted: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Anchors\r\n","import trim from './utils/lang/trim'\r\nimport createElement from './utils/dom/createElement'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\n\r\nconst _updateHeading = ($heading, i, options) => {\r\n const CLS_HEADING = 'outline-heading'\r\n const hasAnchor = options.hasAnchor || true\r\n const isAtStart = options.isAtStart || true\r\n const showCode = options.showCode || false\r\n const chapterCode = options.chapterCode || ''\r\n const anchorURL = options.anchorURL || ''\r\n const headingId = `heading-${i}`\r\n const attrs = {\r\n id: headingId,\r\n className: isAtStart ? `${CLS_HEADING} ${CLS_HEADING}_start` : CLS_HEADING,\r\n 'data-id': i\r\n }\r\n const text = trim($heading.innerHTML)\r\n let $anchor\r\n let $icon\r\n\r\n if (showCode) {\r\n attrs.innerHTML = chapterCode + ' ' + text\r\n attrs['data-code'] = chapterCode\r\n }\r\n setAttributes($heading, attrs)\r\n\r\n if (!hasAnchor) {\r\n return false\r\n }\r\n\r\n $icon = icon('hash', { iconSet: 'outline' })\r\n $anchor = createElement(\r\n 'a',\r\n {\r\n id: `anchor-${i}`,\r\n className: `${CLS_HEADING}__anchor anchor-${i}`,\r\n href: anchorURL || `#${headingId}`,\r\n target: anchorURL ? '_blank' : 'self',\r\n 'data-id': i\r\n },\r\n $icon\r\n )\r\n $heading.appendChild($anchor)\r\n}\r\n\r\nexport default _updateHeading\r\n","// HTML 合法的标签\r\nconst TAGS = [\r\n 'a',\r\n 'abbr',\r\n 'address',\r\n 'area',\r\n 'article',\r\n 'aside',\r\n 'audio',\r\n 'b',\r\n 'base',\r\n 'bdi',\r\n 'bdo',\r\n 'blockquote',\r\n 'body',\r\n 'br',\r\n 'button',\r\n 'canvas',\r\n 'caption',\r\n 'cite',\r\n 'code',\r\n 'col',\r\n 'colgroup',\r\n 'data',\r\n 'datalist',\r\n 'dd',\r\n 'del',\r\n 'details',\r\n 'dfn',\r\n 'dialog',\r\n 'div',\r\n 'dl',\r\n 'dt',\r\n 'em',\r\n 'embed',\r\n 'fieldset',\r\n 'figcaption',\r\n 'figure',\r\n 'footer',\r\n 'form',\r\n 'h1',\r\n 'h2',\r\n 'h3',\r\n 'h4',\r\n 'h5',\r\n 'h6',\r\n 'head',\r\n 'header',\r\n 'hgroup',\r\n 'hr',\r\n 'html',\r\n 'i',\r\n 'iframe',\r\n 'img',\r\n 'input',\r\n 'ins',\r\n 'kbd',\r\n 'label',\r\n 'legend',\r\n 'li',\r\n 'link',\r\n 'main',\r\n 'map',\r\n 'mark',\r\n 'math',\r\n 'menu',\r\n 'menuitem',\r\n 'meta',\r\n 'meter',\r\n 'nav',\r\n 'noscript',\r\n 'object',\r\n 'ol',\r\n 'optgroup',\r\n 'option',\r\n 'output',\r\n 'p',\r\n 'param',\r\n 'picture',\r\n 'pre',\r\n 'progress',\r\n 'q',\r\n 'rb',\r\n 'rp',\r\n 'rt',\r\n 'rtc',\r\n 'ruby',\r\n 's',\r\n 'samp',\r\n 'script',\r\n 'search',\r\n 'section',\r\n 'select',\r\n 'slot',\r\n 'small',\r\n 'source',\r\n 'span',\r\n 'strong',\r\n 'style',\r\n 'sub',\r\n 'summary',\r\n 'sup',\r\n 'svg',\r\n 'table',\r\n 'tbody',\r\n 'td',\r\n 'template',\r\n 'textarea',\r\n 'tfoot',\r\n 'th',\r\n 'thead',\r\n 'time',\r\n 'title',\r\n 'tr',\r\n 'track',\r\n 'u',\r\n 'ul',\r\n 'var',\r\n 'video',\r\n 'wbr'\r\n]\r\n\r\nexport default TAGS\r\n","import isString from './isString'\r\nimport trim from '../lang/trim'\r\nimport TAGS from './tags'\r\n\r\n/**\r\n * 检测测试数据是否为合法的 HTML 代码\r\n * ========================================================================\r\n * @method isHTML\r\n * @category Lang\r\n * @see https://github.com/sindresorhus/html-tags\r\n * @see https://github.com/sindresorhus/is-html\r\n * @param {String} str - 要检测的数据\r\n * @returns {Boolean} 'val' 为合法的 HTML 代码,返回 true,否则返回 false\r\n */\r\nconst isHTML = (str) => {\r\n let html\r\n let basic\r\n let full\r\n\r\n if (!isString(str)) {\r\n return false\r\n }\r\n\r\n // 为了提高性能,我们将其限制在合理的长度内。\r\n html = trim(str).slice(0, 1000)\r\n basic = /\\s*|]*>|]*>|]+>/i\r\n full = new RegExp(TAGS.map((tag) => `<${tag}\\\\b[^>]*>`).join('|'), 'i')\r\n\r\n return basic.test(html) || full.test(html)\r\n}\r\n\r\nexport default isHTML\r\n","/**\r\n * 移除字符串中的 JavaScript 代码\r\n * ====================================================\r\n * @param {String} str\r\n * @returns {String}\r\n */\r\nconst stripScripts = (str) => {\r\n return str.replace(/]*>.*?<\\/script>/gi, '')\r\n}\r\n\r\nexport default stripScripts\r\n","const setProperty = (prop, value) => {\r\n const documentElement = document.documentElement\r\n documentElement.style.setProperty(prop, value)\r\n}\r\n\r\nexport default setProperty\r\n","import setProperty from './utils/dom/setProperty'\r\n\r\nlet index = 2000\r\n\r\nconst zIndex = (idx) => {\r\n if (idx) {\r\n index = idx\r\n } else {\r\n index += 1\r\n }\r\n\r\n setProperty('--outline-zIndex', `${index}`)\r\n\r\n return index\r\n}\r\n\r\nexport default zIndex\r\n","import Base from './base'\r\n\r\nimport later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isDOM from './utils/types/isDOM'\r\nimport isHTML from './utils/types/isHTML'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport html from './utils/dom/html'\r\nimport createElement from './utils/dom/createElement'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport paint from './utils/icons/paint'\r\nimport icon from './utils/icons/icon'\r\nimport zIndex from './zIndex'\r\n\r\nclass Drawer extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.zIndex = 0\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Drawer.DEFAULTS)\r\n this.title = ''\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.$modal = null\r\n this.$header = null\r\n this.$title = null\r\n this.$close = null\r\n this.$main = null\r\n this.$footer = null\r\n this.$overlay = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.title = this.attr('title')\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n return this\r\n }\r\n\r\n setTitle(title) {\r\n this.attr('title', title)\r\n this.title = title\r\n this.$title.innerHTML = title\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const size = this.attr('size')\r\n const placement = this.attr('placement')\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const hasOffset = this.attr('hasOffset')\r\n const hasPadding = this.attr('hasPadding')\r\n const autoHeight = this.attr('autoHeight')\r\n const customClass = this.attr('customClass')\r\n let $el\r\n let $modal\r\n let $header\r\n let $title\r\n let $close\r\n let $main\r\n let $footer\r\n let $overlay\r\n\r\n paint()\r\n this.zIndex = zIndex()\r\n\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-drawer__title'\r\n },\r\n this.title\r\n )\r\n this.$title = $title\r\n\r\n if (hasClose) {\r\n $close = createElement(\r\n 'div',\r\n {\r\n className: 'outline-drawer__close'\r\n },\r\n icon('close', { iconSet: 'outline', size: 20 })\r\n )\r\n this.$close = $close\r\n }\r\n\r\n $header = createElement(\r\n 'header',\r\n {\r\n className: 'outline-drawer__header'\r\n },\r\n [$title, $close]\r\n )\r\n this.$header = $header\r\n\r\n $main = createElement('div', {\r\n className: 'outline-drawer__main'\r\n })\r\n this.$main = $main\r\n\r\n if (!hasPadding) {\r\n addClass($main, 'outline-drawer_full')\r\n }\r\n\r\n $footer = createElement('footer', {\r\n className: 'outline-drawer__footer'\r\n })\r\n this.$footer = $footer\r\n\r\n $modal = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer__modal outline-drawer_${placement} outline-drawer_${size} outline-drawer_closed`\r\n },\r\n [$header, $main, $footer]\r\n )\r\n this.$modal = $modal\r\n\r\n if (hasOffset) {\r\n addClass($modal, 'outline-drawer_offset')\r\n }\r\n\r\n if (autoHeight) {\r\n addClass($modal, 'outline-drawer_auto')\r\n }\r\n\r\n if (customClass) {\r\n addClass($modal, customClass)\r\n }\r\n\r\n if (hasOverlay) {\r\n $overlay = createElement('div', {\r\n className: 'outline-drawer__overlay'\r\n })\r\n this.$overlay = $overlay\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: `outline-drawer`\r\n },\r\n [$modal, $overlay]\r\n )\r\n this.$el = $el\r\n document.body.appendChild($el)\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$main.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(content) {\r\n let $content = null\r\n\r\n if (isFunction(content)) {\r\n $content = content()\r\n } else if (isDOM(content)) {\r\n $content = content\r\n } else if (isHTML(content)) {\r\n $content = html(content)\r\n }\r\n\r\n if ($content) {\r\n this.$main.appendChild($content)\r\n }\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(content) {\r\n this.erase()._paint(content)\r\n return this\r\n }\r\n\r\n open() {\r\n const opened = this.attr('afterOpened')\r\n const $modal = this.$modal\r\n\r\n addClass(this.$el, 'outline-drawer_opened')\r\n removeClass($modal, 'outline-drawer_closed')\r\n addClass($modal, 'outline-drawer_opened')\r\n\r\n later(() => {\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const closed = this.attr('afterClosed')\r\n const $modal = this.$modal\r\n\r\n removeClass($modal, 'outline-drawer_opened')\r\n addClass($modal, 'outline-drawer_closed')\r\n\r\n later(() => {\r\n removeClass(this.$el, 'outline-drawer_opened')\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const closed = this.isClosed()\r\n\r\n if (closed) {\r\n this.open()\r\n } else {\r\n this.close()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n afterToggle.call(this, closed)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const afterDestroy = this.attr('afterDestroy')\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n let index = this.zIndex\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n index -= 1\r\n zIndex(index)\r\n this.zIndex = 0\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const $el = this.$el\r\n\r\n if (hasClose) {\r\n on($el, '.outline-drawer__close', 'click', this.onClose, this, true)\r\n }\r\n\r\n if (hasOverlay && closeOnClickModal) {\r\n on($el, '.outline-drawer__overlay', 'click', this.onClose, this, true)\r\n }\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasClose = this.attr('hasClose')\r\n const hasOverlay = this.attr('hasOverlay')\r\n const $el = this.$el\r\n\r\n if (!hasClose && !hasOverlay) {\r\n return this\r\n }\r\n\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nDrawer.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'rtl',\r\n title: '标题',\r\n size: 'regular',\r\n hasClose: true,\r\n hasOverlay: true,\r\n hasOffset: false,\r\n hasPadding: true,\r\n autoHeight: true,\r\n closeOnClickModal: true,\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterToggle: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Drawer\r\n","import isHTML from '../types/isHTML'\r\nimport isString from '../types/isString'\r\nimport isElement from '../types/isElement'\r\nimport stripScripts from '../lang/stripScripts'\r\nimport createElement from './createElement'\r\n\r\n/**\r\n * 获取或者设置 DOM 元素的 innerHTML 属性值,或者通过 HTML 字符串,创建 DOM 元素\r\n * ========================================================================\r\n * @method html\r\n * @param {HTMLElement|String} el\r\n * @param {String} [strHTML]\r\n * @return {DocumentFragment|null|*}\r\n */\r\nconst html = (el, strHTML) => {\r\n const $fragment = document.createDocumentFragment()\r\n\r\n if (!el || (!isHTML(el) && !isString(el) && !isElement(el))) {\r\n return null\r\n }\r\n\r\n if (isHTML(el)) {\r\n const template = createElement('div')\r\n let children = []\r\n\r\n template.innerHTML = stripScripts(el)\r\n children = [...template.childNodes]\r\n children.forEach((child) => {\r\n $fragment.appendChild(child)\r\n })\r\n\r\n return $fragment\r\n } else if (isString(strHTML)) {\r\n el.innerHTML = stripScripts(strHTML)\r\n } else {\r\n return el.innerHTML\r\n }\r\n}\r\n\r\nexport default html\r\n","import isFunction from '../types/isFunction'\r\nimport off from './off'\r\n\r\nimport { CAPTURE_EVENTS } from './enum'\r\n\r\n/**\r\n * 绑定事件\r\n * ========================================================================\r\n * @method at\r\n * @param {HTMLElement|String|Object} el - (必须)绑定代理事件的 DOM 节点\r\n * @param {String|Function} type - (必须)事件类型或者事件处理器回调函数\r\n * @param {Function|Object} fn - (必须) 事件处理器回调函数或者传递给事件处理器回调函数的数据对象\r\n * @param {Object|Boolean} [data] - (可选)传递给事件处理器回调函数的数据对象或者事件处理器回调函数的 this 上下文指向,\r\n * @param {Object|Boolean} [context] - (可选)事件处理器回调函数的 this 上下文指向,或者是否仅触发一次\r\n * 当设置为 true 时,则事件处理器回调函数的 this 上下文指向为 data 对象\r\n * @param {Boolean} once - (可选)是否仅触发一次\r\n */\r\nconst at = (el, type, fn, data, context, once = false) => {\r\n // CAPTURE_EVENTS 中的特殊事件,采用事件捕获模型\r\n const capture = CAPTURE_EVENTS.indexOf(type) > -1\r\n const listener = function (evt) {\r\n let overrideContext = context || el\r\n\r\n // 当设置为 true 时,则事件处理器回调函数的\r\n // this 上下文指向为 data 对象\r\n if (context === true) {\r\n overrideContext = data\r\n }\r\n\r\n // 仅触发一次\r\n /* istanbul ignore else */\r\n if (once === true) {\r\n off(el, type, listener)\r\n }\r\n\r\n fn.call(overrideContext, evt, data)\r\n }\r\n\r\n if (!isFunction(fn)) {\r\n return false\r\n }\r\n\r\n if (!el._listeners) {\r\n el._listeners = []\r\n }\r\n\r\n // 缓存 options 元素绑定的事件处理器\r\n el._listeners.push({\r\n el,\r\n type,\r\n fn: listener,\r\n data,\r\n context,\r\n capture\r\n })\r\n\r\n // 缓存包装后的事件处理器\r\n fn._delegateListener = listener\r\n\r\n el.addEventListener(type, listener, capture)\r\n}\r\n\r\nexport default at\r\n","/**\r\n * 获取HTML元素的某个CSS样式值\r\n * ====================================================\r\n * @param el\r\n * @param ruleName\r\n * @returns {*}\r\n */\r\nconst getStyle = (el, ruleName) => {\r\n return getComputedStyle(el)[ruleName]\r\n}\r\n\r\nexport default getStyle\r\n","import isElement from '../types/isElement'\r\n\r\n/**\r\n * 检测某个 DOM 节点的位置是否在另个一个 DOM 节点范围内\r\n * ========================================================================\r\n * @method inBounding\r\n * @param {HTMLElement} child\r\n * @param {HTMLElement} parent\r\n * @return {Boolean}\r\n */\r\nconst inBounding = (child, parent) => {\r\n let parentRect\r\n let childRect\r\n\r\n if (!isElement(child) || !isElement(parent)) {\r\n return false\r\n }\r\n\r\n parentRect = parent.getBoundingClientRect()\r\n childRect = child.getBoundingClientRect()\r\n\r\n return (\r\n childRect.top >= parentRect.top &&\r\n childRect.right <= parentRect.right &&\r\n childRect.bottom <= parentRect.bottom &&\r\n childRect.left >= parentRect.left\r\n )\r\n}\r\n\r\nexport default inBounding\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isElement from './utils/types/isElement'\r\nimport later from './utils/lang/later'\r\nimport at from './utils/event/at'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport stop from './utils/event/stop'\r\nimport createElement from './utils/dom/createElement'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport addClass from './utils/dom/addClass'\r\nimport intersection from './utils/dom/intersection'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport offsetTop from './utils/dom/offsetTop'\r\nimport getStyle from './utils/dom/getStyle'\r\nimport setProperty from './utils/dom/setProperty'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\n\r\nimport _paintChapters from './_paintChapters'\r\nimport inBounding from './utils/dom/inBounding'\r\n\r\nimport Base from './base'\r\n\r\nclass Navigator extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n this.scrollTimer = null\r\n this.resizeTimer = null\r\n this.observerTimer = null\r\n this.Observer = null\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Navigator.DEFAULTS)\r\n\r\n this.$el = null\r\n this.$title = null\r\n this.$main = null\r\n this.$list = null\r\n this.$placeholder = null\r\n this.$parentElement = null\r\n this.$scrollElement = null\r\n this.$active = null\r\n\r\n this.chapters = []\r\n this.active = 0\r\n this.offsetWidth = 0\r\n this.offsetTop = 0\r\n this.playing = false\r\n this.closed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n let parentElement\r\n let scrollElement\r\n let $parent\r\n\r\n this.attr(options)\r\n\r\n created = this.attr('created')\r\n parentElement = this.attr('parentElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(parentElement)) {\r\n $parent = document.querySelector(parentElement)\r\n } else if (isElement(parentElement)) {\r\n $parent = parentElement\r\n }\r\n this.$parentElement = $parent\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.chapters = this.attr('chapters')\r\n this.closed = this.attr('closed')\r\n this.active = this.attr('active')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n if (this.chapters.length < 1) {\r\n return this\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n this.$active = document.querySelector(`#chapter-${this.active}`)\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isSticky() {\r\n const position = this.attr('position')\r\n return position === 'sticky'\r\n }\r\n\r\n isFixed() {\r\n const position = this.attr('position')\r\n return position === 'fixed'\r\n }\r\n\r\n isInside() {\r\n return this.isFixed() || this.isSticky()\r\n }\r\n\r\n isOutside() {\r\n return !this.isInside()\r\n }\r\n\r\n count() {\r\n return this.chapters.length\r\n }\r\n\r\n _paintEdge() {\r\n const $fragment = document.createDocumentFragment()\r\n const STICKY = 'outline-navigator_sticky'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const title = this.attr('title')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const customClass = this.attr('customClass')\r\n const $parentElement = this.$parentElement\r\n const children = []\r\n const contents = []\r\n let $title = null\r\n let $el\r\n let $main\r\n let $list\r\n let $placeholder\r\n\r\n if (!$parentElement) {\r\n return this\r\n }\r\n\r\n if (this.isInside() && title) {\r\n $title = createElement(\r\n 'h2',\r\n {\r\n className: 'outline-navigator__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n contents.push($title)\r\n }\r\n\r\n $list = createElement('ul', {\r\n // 为优化性能,添加了 _fixed 和 _hidden\r\n // fixed 为了让 $list 脱离流布局\r\n // hidden 让 $list 不可见\r\n className: `outline-navigator__list`\r\n })\r\n this.$list = $list\r\n children.push($list)\r\n\r\n if (animationCurrent) {\r\n $placeholder = createElement('div', {\r\n className: 'outline-navigator__placeholder'\r\n })\r\n this.$placeholder = $placeholder\r\n children.push($placeholder)\r\n }\r\n\r\n $main = createElement(\r\n 'div',\r\n {\r\n className: 'outline-navigator__main'\r\n },\r\n children\r\n )\r\n this.$main = $main\r\n contents.push($main)\r\n\r\n $el = createElement(\r\n 'nav',\r\n {\r\n id: 'outline-navigator',\r\n className: `outline-navigator ${HIDDEN}`\r\n },\r\n contents\r\n )\r\n this.$el = $el\r\n\r\n if (this.isSticky()) {\r\n this.calculateStickyHeight()\r\n addClass($el, STICKY)\r\n }\r\n\r\n if (customClass) {\r\n addClass($el, customClass)\r\n }\r\n $fragment.appendChild($el)\r\n $parentElement.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const $parentElement = this.$parentElement\r\n const chapters = this.chapters\r\n const count = this.count()\r\n let $el\r\n\r\n if (!$parentElement || chapters.length < 1) {\r\n return this\r\n }\r\n\r\n if (this.isInside()) {\r\n addClass($parentElement, 'outline-navigator-parent')\r\n }\r\n\r\n this._paintEdge()\r\n $el = this.$el\r\n\r\n this._paint(chapters)\r\n\r\n later(() => {\r\n this.highlight(this.active)\r\n }, 60)\r\n\r\n this.offsetTop = offsetTop($el)\r\n this.offsetWidth = $el.offsetWidth\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n setProperty('--outline-navigator-width', `${this.offsetWidth}px`)\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n if (count < 400) {\r\n this.onObserver()\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$list.innerHTML = ''\r\n\r\n return this\r\n }\r\n\r\n _paint(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const showCode = this.attr('showCode')\r\n const $el = this.$el\r\n const $list = this.$list\r\n\r\n _paintChapters($list, chapters, showCode)\r\n removeClass($el, HIDDEN)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n this.$parentElement.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(chapters) {\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const $el = this.$el\r\n\r\n removeClass($el, HIDDEN)\r\n this.erase()._paint(chapters)\r\n\r\n return this\r\n }\r\n\r\n _getPlaceholderOffset(index) {\r\n const $main = this.$main\r\n const $list = this.$list\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const mainPaddingTop = parseInt(getStyle($main, 'padding-top'), 10)\r\n const mainBorderTop = parseInt(getStyle($main, 'border-top-width'), 10)\r\n const placeholderPaddingTop = parseInt(getStyle($list, 'padding-top'), 10)\r\n const placeholderMarginTop = parseInt(getStyle($list, 'margin-top'), 10)\r\n const placeholderBorderTop = parseInt(\r\n getStyle($list, 'border-top-width'),\r\n 10\r\n )\r\n let height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n let top\r\n\r\n if (mainPaddingTop) {\r\n offsetTop += mainPaddingTop\r\n }\r\n\r\n if (placeholderPaddingTop) {\r\n offsetTop += placeholderPaddingTop\r\n }\r\n\r\n if (placeholderMarginTop) {\r\n offsetTop += placeholderMarginTop\r\n }\r\n\r\n if (mainBorderTop) {\r\n offsetTop += mainBorderTop\r\n }\r\n\r\n if (placeholderBorderTop) {\r\n offsetTop += placeholderBorderTop\r\n }\r\n\r\n top = height * index\r\n\r\n return offsetTop + top\r\n }\r\n\r\n positionPlaceholder(index) {\r\n const $list = this.$list\r\n const $placeholder = this.$placeholder\r\n const $anchor = $list.querySelector('.outline-navigator__anchor')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const height = $anchor.offsetHeight\r\n let offsetTop = 0\r\n\r\n if (!animationCurrent) {\r\n return this\r\n }\r\n\r\n offsetTop = this._getPlaceholderOffset(index)\r\n\r\n $placeholder.style.cssText = `transform: translateY(${offsetTop}px);height:${height}px;`\r\n\r\n return this\r\n }\r\n\r\n highlight(id) {\r\n const $el = this.$el\r\n const animationCurrent = this.attr('animationCurrent')\r\n const ACTIVE = 'outline-navigator_active'\r\n const HIGHLIGHT = 'outline-navigator_highlight'\r\n let $anchor = null\r\n let placeholderOffsetTop = 0\r\n\r\n if (!$el) {\r\n return this\r\n }\r\n\r\n $anchor = $el.querySelector(`#chapter__anchor-${id}`)\r\n\r\n if (!$anchor) {\r\n return this\r\n }\r\n\r\n this.active = parseInt($anchor.getAttribute('data-id'), 10)\r\n\r\n if (this.$active) {\r\n removeClass(this.$active, HIGHLIGHT)\r\n removeClass(this.$active, ACTIVE)\r\n }\r\n\r\n this.$active = $anchor\r\n addClass(this.$active, ACTIVE)\r\n\r\n if (animationCurrent) {\r\n this.positionPlaceholder(this.active)\r\n } else {\r\n addClass(this.$active, HIGHLIGHT)\r\n }\r\n\r\n later(() => {\r\n console.log(!inBounding(this.$active, this.$main))\r\n if (!inBounding(this.$active, this.$main)) {\r\n placeholderOffsetTop = this._getPlaceholderOffset(this.active)\r\n console.log('placeholderOffsetTop', placeholderOffsetTop)\r\n scrollTo(this.$main, placeholderOffsetTop)\r\n }\r\n })\r\n\r\n return this\r\n }\r\n\r\n sticky() {\r\n const afterSticky = this.attr('afterSticky')\r\n const FIXED = 'outline-navigator_fixed'\r\n const $el = this.$el\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (!this.isFixed()) {\r\n return this\r\n }\r\n\r\n isStickying = scrollTop >= top\r\n\r\n if (isStickying) {\r\n addClass($el, FIXED)\r\n } else {\r\n removeClass($el, FIXED)\r\n }\r\n\r\n if (isFunction(afterSticky)) {\r\n afterSticky.call(this, this.isClosed(), isStickying)\r\n }\r\n\r\n return this\r\n }\r\n\r\n calculateStickyHeight() {\r\n const documentElement = document.documentElement\r\n const height = Math.max(\r\n documentElement.clientHeight || 0,\r\n window.innerHeight || 0\r\n )\r\n setProperty('--outline-sticky-height', `${height}px`)\r\n return this\r\n }\r\n\r\n scrollTo(top, after) {\r\n const el = this.$scrollElement\r\n\r\n scrollTo(el, top, after)\r\n\r\n return this\r\n }\r\n\r\n show() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const opened = this.attr('afterOpened')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n removeClass($parent, HIDDEN)\r\n } else {\r\n removeClass($parent, HIDDEN)\r\n later(() => {\r\n removeClass($parent, FOLDED)\r\n }, 30)\r\n }\r\n } else {\r\n removeClass($el, HIDDEN)\r\n }\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n opened.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide() {\r\n const FOLDED = 'outline-navigator_folded'\r\n const HIDDEN = 'outline-navigator_hidden'\r\n const closed = this.attr('afterClosed')\r\n const count = this.count()\r\n const $el = this.$el\r\n const $parent = this.$parentElement\r\n\r\n if (this.isInside()) {\r\n if (count > 800) {\r\n addClass($parent, HIDDEN)\r\n } else {\r\n addClass($parent, FOLDED)\r\n later(() => {\r\n addClass($parent, HIDDEN)\r\n })\r\n }\r\n } else {\r\n addClass($el, HIDDEN)\r\n }\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n closed.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const afterToggle = this.attr('afterToggle')\r\n const top = this.offsetTop\r\n const scrollTop = this.$scrollElement.scrollTop\r\n let isStickying\r\n\r\n if (this.isClosed()) {\r\n this.show()\r\n } else {\r\n this.hide()\r\n }\r\n\r\n if (isFunction(afterToggle)) {\r\n later(() => {\r\n isStickying = scrollTop >= top\r\n afterToggle.call(this, this.isClosed(), isStickying)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n this.scrollTimer = null\r\n }\r\n\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n this.resizeTimer = null\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n this.observerTimer = null\r\n }\r\n\r\n if (this.Observer) {\r\n this.Observer = null\r\n }\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n onObserver() {\r\n const selector = this.attr('selector')\r\n\r\n this.Observer = intersection(\r\n ($heading) => {\r\n const id = $heading.getAttribute('data-id')\r\n\r\n if (this.playing) {\r\n return false\r\n }\r\n\r\n if (this.observerTimer) {\r\n clearTimeout(this.observerTimer)\r\n }\r\n\r\n this.observerTimer = later(() => {\r\n this.highlight(id)\r\n }, 100)\r\n },\r\n {\r\n selector,\r\n context: this\r\n }\r\n )\r\n\r\n return this\r\n }\r\n\r\n onSelect(evt) {\r\n const stickyHeight = this.attr('stickyHeight')\r\n const $anchor = evt.delegateTarget\r\n const id = $anchor.getAttribute('data-id')\r\n const headingId = $anchor.href.split('#')[1]\r\n const $heading = document.querySelector(`#${headingId}`)\r\n const top = offsetTop($heading) - (stickyHeight + 10)\r\n const min = 0\r\n const max = this.$scrollElement.scrollHeight\r\n const afterScroll = this.attr('afterScroll')\r\n const after = () => {\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(this, 'chapter')\r\n }\r\n\r\n later(() => {\r\n this.playing = false\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n })\r\n }\r\n\r\n this.playing = true\r\n if (this.isFixed()) {\r\n this.sticky()\r\n later(() => {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }, 10)\r\n } else {\r\n this.scrollTo(top, after)\r\n this.highlight(id)\r\n }\r\n\r\n stop(evt)\r\n\r\n return this\r\n }\r\n\r\n onScroll() {\r\n const $scrollElement = this.$scrollElement\r\n\r\n if (this.scrollTimer) {\r\n clearTimeout(this.scrollTimer)\r\n }\r\n\r\n this.scrollTimer = later(() => {\r\n const top = $scrollElement.scrollTop\r\n const min = 0\r\n const max = $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n\r\n if (this.isFixed()) {\r\n this.sticky()\r\n }\r\n\r\n this.$emit('toolbar:update', {\r\n top,\r\n min,\r\n max\r\n })\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n onResize() {\r\n if (this.resizeTimer) {\r\n clearTimeout(this.resizeTimer)\r\n }\r\n\r\n this.resizeTimer = later(() => {\r\n this.calculateStickyHeight()\r\n })\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n on($el, '.outline-navigator__anchor', 'click', this.onSelect, this, true)\r\n at($element, 'scroll', this.onScroll, this, true)\r\n if (this.isSticky()) {\r\n at(window, 'resize', this.onResize, this, true)\r\n }\r\n this.$on('anchors:all:paint', this.onObserver, this)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const selector = this.attr('selector')\r\n const $el = this.$el\r\n const $scrollElement = this.$scrollElement\r\n const tagName = $scrollElement.tagName.toLowerCase()\r\n let $element = $scrollElement\r\n\r\n if (this.count() < 1) {\r\n return this\r\n }\r\n\r\n if (tagName === 'html' || tagName === 'body') {\r\n $element = window\r\n }\r\n\r\n off($el, 'click', this.onSelect)\r\n off($element, 'scroll', this.onScroll)\r\n if (this.isSticky()) {\r\n off(window, 'resize', this.onResize)\r\n }\r\n this.$off('anchors:all:paint')\r\n\r\n if (this.Observer) {\r\n document.querySelectorAll(selector).forEach((section) => {\r\n this.Observer.unobserve(section)\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nNavigator.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n parentElement: '',\r\n scrollElement: '',\r\n selector: '.outline-heading',\r\n active: 0,\r\n closed: false,\r\n showCode: true,\r\n animationCurrent: true,\r\n position: 'relative',\r\n stickyHeight: 0,\r\n chapters: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterScroll: null,\r\n beforeDestroy: null,\r\n afterDestroy: null,\r\n afterSticky: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Navigator\r\n","import createElement from './utils/dom/createElement'\r\nimport timeSlice from './utils/lang/timeSlice'\r\n\r\nconst _paintChapters = ($list, chapters, showCode = false) => {\r\n const LIMIT = 400\r\n const count = chapters.length\r\n const clones = [...chapters]\r\n const paint = (parts) => {\r\n const byId = (id) => $list.querySelector(`#${id}`)\r\n parts.forEach((chapter) => {\r\n const pid = chapter.pid\r\n const id = chapter.id\r\n const code = chapter.code\r\n const rel = chapter.rel\r\n const children = []\r\n const $text = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__text'\r\n },\r\n chapter.text\r\n )\r\n let $link\r\n let $code\r\n let $li\r\n let $subject\r\n let $chapter\r\n\r\n if (showCode) {\r\n $code = createElement(\r\n 'span',\r\n {\r\n className: 'outline-navigator__code',\r\n 'data-id': id\r\n },\r\n chapter.code\r\n )\r\n\r\n children.push($code)\r\n }\r\n\r\n children.push($text)\r\n\r\n $link = createElement(\r\n 'a',\r\n {\r\n id: `chapter__anchor-${id}`,\r\n className: 'outline-navigator__anchor',\r\n href: '#' + rel,\r\n rel: rel,\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n children\r\n )\r\n\r\n $li = createElement(\r\n 'li',\r\n {\r\n id: `chapter-${id}`,\r\n className: 'outline-navigator__item',\r\n 'data-id': id,\r\n 'data-code': code\r\n },\r\n $link\r\n )\r\n\r\n if (pid === -1) {\r\n $list.appendChild($li)\r\n } else {\r\n $chapter = byId(`chapter-${pid}`)\r\n $subject = byId(`subject-${pid}`)\r\n\r\n if (!$subject) {\r\n $subject = createElement(\r\n 'ul',\r\n {\r\n id: 'subject-' + pid,\r\n className: 'outline-navigator__subject'\r\n },\r\n $li\r\n )\r\n\r\n $chapter.appendChild($subject)\r\n } else {\r\n $subject.appendChild($li)\r\n }\r\n }\r\n })\r\n }\r\n\r\n if (count > LIMIT) {\r\n // 同步绘制\r\n paint(clones.splice(0, LIMIT))\r\n // 剩余的采用 timeSlice 机制绘制\r\n while (clones.length > 0) {\r\n const once = clones.splice(0, LIMIT)\r\n timeSlice(() => {\r\n paint(once)\r\n })\r\n }\r\n } else {\r\n paint(clones)\r\n }\r\n}\r\n\r\nexport default _paintChapters\r\n","import isFunction from '../types/isFunction'\r\nimport isElement from '../types/isElement'\r\n\r\n/**\r\n * 通用的 IntersectionObserver 观察者处理器\r\n * ========================================================================\r\n * @method intersection\r\n * @param {Function} fn\r\n * @param {Object} [props]\r\n * @param {Object|HTMLElement} [props.root]\r\n * @param {String} [props.selector]\r\n * @param {Object} [props.context]\r\n * @param {String} [props.attr]\r\n * @param {String} [props.rootMargin]\r\n */\r\nconst intersection = (fn, props = {}) => {\r\n const root = props.root || null\r\n const selector = props.selector || '.outline-heading'\r\n const context = props.context || null\r\n const rootMargin = props.rootMargin || '0px 0px -90% 0px'\r\n const options = {\r\n rootMargin: rootMargin\r\n }\r\n // eslint-disable-next-line compat/compat\r\n const Observer = new IntersectionObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.intersectionRatio > 0) {\r\n if (isFunction(fn)) {\r\n fn.call(context || entry.target, entry.target)\r\n }\r\n }\r\n })\r\n }, options)\r\n const $root = isElement(root) ? root : document\r\n\r\n if (root) {\r\n options.root = root\r\n }\r\n\r\n $root.querySelectorAll(selector).forEach((section) => {\r\n Observer.observe(section)\r\n })\r\n\r\n return Observer\r\n}\r\n\r\nexport default intersection\r\n","import isObject from './isObject'\r\n\r\n/**\r\n * 检测测试数据是否为类似 Object 类型\r\n * ========================================================================\r\n * @method isObjectLike\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是类似 Object 类型,返回 true,否则返回 false\r\n */\r\nconst isObjectLike = (val) => {\r\n return isObject(val) && val !== null\r\n}\r\n\r\nexport default isObjectLike\r\n","import isObjectLike from './isObjectLike'\r\n\r\n/**\r\n * 检测测试数据是否为普通对象\r\n * ========================================================================\r\n * @method isPlainObject\r\n * @param {Object} val - 要检测的数据\r\n * @returns {Boolean} 'val' 是普通对象,返回 true,否则返回 false\r\n */\r\nconst isPlainObject = (val) => {\r\n const getPrototypeOf = Object.getPrototypeOf\r\n let proto\r\n\r\n // Detect obvious negatives\r\n if (!isObjectLike(val)) {\r\n return false\r\n }\r\n\r\n proto = val.prototype\r\n\r\n // JavaScript 对象分为两种:普通对象和函数对象\r\n // 普通对象:原型是 __proto__,没有 prototype 原型(属性)\r\n // 函数对象:原型是 prototype ,prototype 只存在于函数对象上\r\n if (!proto) {\r\n return true\r\n }\r\n\r\n proto = val\r\n\r\n while (getPrototypeOf(proto) !== null) {\r\n proto = getPrototypeOf(proto)\r\n }\r\n\r\n return getPrototypeOf(val) === proto\r\n}\r\n\r\nexport default isPlainObject\r\n","/**\r\n * 转义字符串中的 HTML 标签\r\n *\r\n * @param {String} str - 需要转义的字符串\r\n * @returns {String}\r\n */\r\nconst encodeHTML = (str) => {\r\n const CHARTS = {\r\n '&': '&',\r\n '<': '<',\r\n '>': '>',\r\n \"'\": ''',\r\n '\"': '"'\r\n }\r\n\r\n return str.replace(/[&<>'\"]/g, (tag) => {\r\n return CHARTS[tag] || tag\r\n })\r\n}\r\n\r\nexport default encodeHTML\r\n","import isString from './utils/types/isString'\r\nimport isPlainObject from './utils/types/isPlainObject'\r\nimport isFunction from './utils/types/isFunction'\r\n\r\nimport extend from './utils/lang/extend'\r\nimport later from './utils/lang/later'\r\nimport stripScripts from './utils/lang/stripScripts'\r\nimport encodeHTML from './utils/lang/encodeHTML'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport guid from './utils/lang/guid'\r\n\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport setAttribute from './utils/dom/setAttribute'\r\nimport setAttributes from './utils/dom/setAttributes'\r\n\r\nimport icon from './utils/icons/icon'\r\nimport paint from './utils/icons/paint'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\n\r\nconst TYPES = ['info', 'success', 'warning', 'error']\r\nconst instances = []\r\nlet instance\r\n\r\npaint()\r\n\r\nclass Message extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Message.DEFAULTS)\r\n\r\n this.$el = null\r\n this.id = ''\r\n this.closed = false\r\n this.visible = false\r\n this.offset = -50\r\n this.timer = null\r\n this.destroyed = false\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this.attr(options)\r\n this.id = this.attr('id')\r\n this.offset = this.attr('offset') || -50\r\n\r\n this.$emit('created', { ...this.attr() })\r\n\r\n this.render().addListeners()\r\n\r\n if (this.attr('visible')) {\r\n this.open()\r\n }\r\n\r\n return this\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n isDestroyed() {\r\n return this.destroyed\r\n }\r\n\r\n _getClassName() {\r\n const type = this.attr('type')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const visible = this.attr('visible')\r\n const customClass = this.attr('customClass')\r\n const className = [\r\n 'outline-message',\r\n `outline-message_${type}`,\r\n `outline-message_${effect}`\r\n ]\r\n\r\n if (round) {\r\n className.push('outline-message_round')\r\n }\r\n\r\n if (!closable) {\r\n className.push('outline-message_full-width')\r\n }\r\n\r\n if (visible) {\r\n className.push('outline-message_visible')\r\n }\r\n\r\n if (customClass) {\r\n className.push(customClass)\r\n }\r\n\r\n return className\r\n }\r\n\r\n render() {\r\n const type = this.attr('type')\r\n const message = this.attr('message')\r\n const effect = this.attr('effect')\r\n const round = this.attr('round')\r\n const closable = this.attr('closable')\r\n const dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n const className = this._getClassName()\r\n const iconName = effect === 'light' ? `circle-${type}` : type\r\n const children = []\r\n let iconSize = 20\r\n let $type\r\n let $message\r\n let $text\r\n let $close\r\n let $el\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n\r\n if (effect !== 'plain') {\r\n $type = icon(iconName, {\r\n iconSet: 'outline',\r\n size: iconSize\r\n })\r\n addClass($type, 'outline-message__icon')\r\n children.push($type)\r\n }\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n $text = document.createTextNode(encodeHTML(stripScripts(message)))\r\n } else {\r\n $text = document.createDocumentFragment()\r\n $text.innerHTML = message\r\n }\r\n $message = createElement(\r\n 'p',\r\n {\r\n className: 'outline-message__content'\r\n },\r\n [$text]\r\n )\r\n children.push($message)\r\n\r\n if (closable) {\r\n $close = icon('close', {\r\n iconSet: 'outline',\r\n size: 18\r\n })\r\n addClass($close, 'outline-message__close')\r\n children.push($close)\r\n }\r\n\r\n $el = createElement(\r\n 'div',\r\n {\r\n className: className.join(' ')\r\n },\r\n children\r\n )\r\n $el.style.cssText = `top:-50px;`\r\n this.$el = $el\r\n document.body.appendChild(this.$el)\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n _refreshIcon() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let iconSize = 20\r\n let type\r\n let effect\r\n let round\r\n let iconName\r\n let $icon\r\n let $svg\r\n let $use\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $icon = $el.querySelector('.outline-icon')\r\n\r\n if (!$icon) {\r\n return this\r\n }\r\n\r\n type = this.attr('type')\r\n effect = this.attr('effect')\r\n round = this.attr('round')\r\n\r\n if (effect === 'plain') {\r\n addClass($icon, HIDDEN)\r\n } else {\r\n removeClass($icon, HIDDEN)\r\n\r\n if (round && effect === 'default') {\r\n iconSize = 12\r\n }\r\n }\r\n\r\n $svg = $icon.querySelector('.outline-icon__svg')\r\n setAttributes($svg, {\r\n style: `width:${iconSize}px;height:${iconSize}px;`\r\n })\r\n\r\n $use = $svg.querySelector('use')\r\n iconName = effect === 'light' ? `circle-${type}` : type\r\n setAttribute($use, 'xlink:href', `#outline-icon-${iconName}`)\r\n\r\n return this\r\n }\r\n\r\n _refreshMessage() {\r\n const $el = this.$el\r\n let $message\r\n let dangerouslyUseHTMLString\r\n let message\r\n let text\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $message = $el.querySelector('.outline-message__content')\r\n dangerouslyUseHTMLString = this.attr('dangerouslyUseHTMLString')\r\n message = this.attr('message')\r\n\r\n if (!dangerouslyUseHTMLString) {\r\n text = encodeHTML(stripScripts(message))\r\n } else {\r\n text = message\r\n }\r\n\r\n $message.innerHTML = text\r\n\r\n return this\r\n }\r\n\r\n _refreshClose() {\r\n const HIDDEN = '.outline-message_hidden'\r\n const $el = this.$el\r\n let $close\r\n let closable\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n $close = $el.querySelector('.outline-message__close')\r\n closable = this.attr('closable')\r\n\r\n if ($close) {\r\n if (closable) {\r\n addClass($close, HIDDEN)\r\n } else {\r\n removeClass($close, HIDDEN)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n _refreshEl() {\r\n const $el = this.$el\r\n let className\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n className = this._getClassName()\r\n setAttribute($el, 'className', className.join(' '))\r\n\r\n return this\r\n }\r\n\r\n refresh(options) {\r\n if (!isPlainObject(options)) {\r\n return this\r\n }\r\n\r\n this.attr(options)\r\n ._refreshIcon()\r\n ._refreshMessage()\r\n ._refreshClose()\r\n ._refreshEl()\r\n\r\n return this\r\n }\r\n\r\n clearTimer() {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.timer) {\r\n clearTimeout(this.timer)\r\n this.timer = null\r\n }\r\n\r\n return this\r\n }\r\n\r\n startTimer(duration) {\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.timer = later(() => {\r\n this.$emit('opened')\r\n this.close()\r\n }, duration * 1000)\r\n\r\n return this\r\n }\r\n\r\n open(options) {\r\n const $el = this.$el\r\n let offset\r\n let duration\r\n let top\r\n let cssRules\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n if (this.isClosed()) {\r\n this.refresh(options)\r\n }\r\n\r\n offset = this.attr('offset')\r\n duration = this.attr('duration')\r\n top = offset && offset >= this.offset ? offset : this.offset\r\n cssRules = `top:${top}px;`\r\n\r\n this.clearTimer()\r\n\r\n this.$emit('beforeOpen')\r\n\r\n later(() => {\r\n this.visible = true\r\n\r\n addClass($el, 'outline-message_visible')\r\n $el.style.cssText = cssRules\r\n\r\n if (duration > 0) {\r\n this.startTimer(duration)\r\n }\r\n }, 100)\r\n\r\n return this\r\n }\r\n\r\n close() {\r\n const $el = this.$el\r\n const cssRules = `top:-50px;`\r\n let destroyAfterClosed\r\n let beforeClose\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n destroyAfterClosed = this.attr('destroyAfterClosed')\r\n beforeClose = this.attr('beforeClose')\r\n\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(this)\r\n }\r\n\r\n $el.style.cssText = cssRules\r\n removeClass($el, 'outline-message_visible')\r\n\r\n this.visible = false\r\n this.closed = true\r\n\r\n later(() => {\r\n this.$emit('closed')\r\n\r\n if (destroyAfterClosed) {\r\n this.destroy()\r\n }\r\n }, 500)\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n if (this.isDestroyed()) {\r\n return this\r\n }\r\n\r\n this.removeListeners()\r\n\r\n document.body.removeChild(this.$el)\r\n\r\n clearTimeout(this.timer)\r\n this._default()\r\n\r\n this.$emit('afterDestroy')\r\n\r\n return this\r\n }\r\n\r\n onMouseEnter() {\r\n this.clearTimer()\r\n return this\r\n }\r\n\r\n onMouseLeave() {\r\n const duration = this.attr('duration')\r\n const delay = this.attr('delay')\r\n\r\n if (duration <= 0) {\r\n return this\r\n }\r\n\r\n this.startTimer(delay)\r\n\r\n return this\r\n }\r\n\r\n onClose() {\r\n this.clearTimer()\r\n this.close()\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $el = this.$el\r\n\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseenter',\r\n this.onMouseEnter,\r\n this,\r\n true\r\n )\r\n on(\r\n $el,\r\n '.outline-message__content',\r\n 'mouseleave',\r\n this.onMouseLeave,\r\n this,\r\n true\r\n )\r\n on($el, '.outline-message__close', 'click', this.onClose, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $el = this.$el\r\n\r\n off($el, 'mouseenter', this.onMouseEnter)\r\n off($el, 'mouseleave', this.onMouseLeave)\r\n off($el, 'click', this.onClose)\r\n\r\n return this\r\n }\r\n}\r\n\r\nMessage.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n id: '',\r\n type: 'info',\r\n effect: 'default',\r\n round: false,\r\n offset: 30,\r\n duration: 3,\r\n delay: 2,\r\n message: '',\r\n customClass: '',\r\n closable: true,\r\n visible: true,\r\n dangerouslyUseHTMLString: false,\r\n destroyAfterClosed: true,\r\n beforeClose: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nTYPES.forEach((type) => {\r\n Message[type] = (options) => {\r\n const config = {}\r\n const id = guid(`outline-message-`)\r\n const beforeClose = options.beforeClose || null\r\n let offset = options.offset || 30\r\n\r\n if (isString(options)) {\r\n config.message = options\r\n } else {\r\n if (isPlainObject(options)) {\r\n extend(config, options)\r\n }\r\n }\r\n config.id = id\r\n config.type = type\r\n config.offset = offset\r\n config.visible = false\r\n config.beforeClose = () => {\r\n Message.close(id, beforeClose)\r\n }\r\n\r\n instance = new Message(config)\r\n instances.forEach((item) => {\r\n offset += item.$el.offsetHeight + 16\r\n })\r\n instance.offset = offset\r\n instance.open()\r\n instances.push(instance)\r\n\r\n return instance\r\n }\r\n})\r\n\r\n// 关闭指定 id 消息的静态方法\r\nMessage.close = (id, beforeClose) => {\r\n const len = instances.length\r\n let index = -1\r\n let i\r\n let offsetHeight\r\n\r\n instances.forEach((instance, i) => {\r\n // 在 instances 中通过 id 找到要关闭的消息\r\n if (id === instance.id) {\r\n offsetHeight = instance.$el.offsetHeight\r\n index = i\r\n\r\n // 关闭消息\r\n if (isFunction(beforeClose)) {\r\n beforeClose.call(instance)\r\n }\r\n\r\n instances.splice(i, 1)\r\n }\r\n })\r\n\r\n if (len <= 1 || index === -1 || index > instances.length - 1) {\r\n return false\r\n }\r\n\r\n i = index\r\n\r\n // 界面中的消息逐个向上收起\r\n for (; i < len - 1; i += 1) {\r\n const dom = instances[i].$el\r\n\r\n dom.style['top'] = parseInt(dom.style['top'], 10) - offsetHeight - 16 + 'px'\r\n }\r\n}\r\n\r\n// 关闭所有消息的静态方法\r\nMessage.clear = () => {\r\n let i = instances.length - 1\r\n for (; i >= 0; i -= 1) {\r\n instances[i].close()\r\n }\r\n}\r\n\r\nexport default Message\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Command {\r\n constructor(name, action) {\r\n this.name = name\r\n\r\n if (isFunction(action)) {\r\n this.action = action\r\n }\r\n }\r\n\r\n execute() {\r\n this.action()\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Command\r\n","import isFunction from './utils/types/isFunction'\r\n\r\nclass Commands {\r\n constructor() {\r\n this.commands = []\r\n }\r\n\r\n get(name) {\r\n return this.commands.find((cmd) => cmd.name === name)\r\n }\r\n\r\n add(command) {\r\n this.commands.push(command)\r\n\r\n return this\r\n }\r\n\r\n del(name) {\r\n const commands = this.commands\r\n const command = commands.find((cmd) => cmd.name === name)\r\n const index = command ? commands.indexOf(command) : -1\r\n\r\n if (index > -1) {\r\n commands.splice(index, 1)\r\n }\r\n\r\n return this\r\n }\r\n\r\n clear() {\r\n this.commands = []\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n const command = this.commands.find((cmd) => cmd.name === name)\r\n\r\n if (isFunction(command?.execute)) {\r\n command.execute()\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nexport default Commands\r\n","import icon from './utils/icons/icon'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\n\r\nconst _createButton = (button, rounded = true) => {\r\n const $icon = icon(button.icon, {\r\n iconSet: button.iconSet || 'outline',\r\n color: button.color || '',\r\n size: button.size\r\n })\r\n const $anchor = createElement(\r\n 'a',\r\n {\r\n className: `outline-toolbar__anchor`,\r\n href: button.link\r\n },\r\n $icon\r\n )\r\n const $button = createElement(\r\n 'div',\r\n {\r\n className: `outline-toolbar__button ${button.name}`,\r\n 'data-cmd': button.name\r\n },\r\n [button.link ? $anchor : $icon]\r\n )\r\n\r\n addClass($icon, 'outline-toolbar__icon')\r\n\r\n if (rounded) {\r\n addClass($button, 'outline-toolbar_rounded')\r\n }\r\n\r\n if (button.disabled) {\r\n addClass($button, 'outline-toolbar_disabled')\r\n }\r\n\r\n return $button\r\n}\r\n\r\nexport default _createButton\r\n","import isString from './utils/types/isString'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isObject from './utils/types/isObject'\r\nimport isArray from './utils/types/isArray'\r\nimport later from './utils/lang/later'\r\nimport guid from './utils/lang/guid'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport hasClass from './utils/dom/hasClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport on from './utils/event/on'\r\nimport off from './utils/event/off'\r\nimport paint from './utils/icons/paint'\r\n\r\nimport Base from './base'\r\nimport Command from './command'\r\nimport Commands from './commands'\r\n\r\nimport _createButton from './_createButton'\r\n\r\nconst DISABLED = 'outline-toolbar_disabled'\r\nconst HIDDEN = 'outline-toolbar_hidden'\r\n\r\nclass Toolbar extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Toolbar.DEFAULTS)\r\n\r\n this.disabled = false\r\n this.closed = false\r\n\r\n this.$el = null\r\n this.buttons = []\r\n this.commands = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let created\r\n\r\n this.attr(options)\r\n\r\n this.disabled = this.attr('disabled')\r\n this.closed = this.attr('closed')\r\n this.commands = new Commands()\r\n\r\n created = this.attr('created')\r\n\r\n if (isFunction(created)) {\r\n created.call(this)\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isDisabled(name) {\r\n let button\r\n\r\n if (name) {\r\n button = this.get(name)\r\n\r\n return button.disabled\r\n }\r\n\r\n return this.disabled\r\n }\r\n\r\n isExist(name) {\r\n const button = this.get(name)\r\n return !!button\r\n }\r\n\r\n isClosed() {\r\n return this.closed\r\n }\r\n\r\n _getCommand(button) {\r\n const _self = this\r\n const { action, name } = button\r\n let command = null\r\n let handler = null\r\n let context\r\n let listener\r\n\r\n if (!action) {\r\n return command\r\n }\r\n\r\n handler = action.handler\r\n context = action.context || this\r\n\r\n if (isFunction(handler)) {\r\n listener = handler\r\n } else if (isString(handler)) {\r\n listener = function () {\r\n _self.$emit(handler, name)\r\n }\r\n }\r\n\r\n if (isFunction(listener)) {\r\n command = new Command(name, listener.bind(context))\r\n }\r\n\r\n return command\r\n }\r\n\r\n get(name) {\r\n return this.buttons.find((button) => button.name === name)\r\n }\r\n\r\n render() {\r\n const mounted = this.attr('mounted')\r\n const buttons = this.attr('buttons') || []\r\n const placement = this.attr('placement')\r\n\r\n paint()\r\n\r\n this.$el = createElement('div', {\r\n id: guid('outline-toolbar'),\r\n className: `outline-toolbar outline-toolbar_${placement}`\r\n })\r\n this._paint(buttons)\r\n document.body.appendChild(this.$el)\r\n\r\n if (this.closed) {\r\n this.hide()\r\n }\r\n\r\n if (this.disabled) {\r\n this.disable()\r\n }\r\n\r\n if (isFunction(mounted)) {\r\n mounted.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$el.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint(buttons) {\r\n const rounded = this.attr('rounded')\r\n const $fragment = document.createDocumentFragment()\r\n\r\n buttons.forEach((button) => {\r\n const $button = _createButton(button, rounded)\r\n const command = this._getCommand(button)\r\n const { name, disabled, context } = button\r\n\r\n $fragment.appendChild($button)\r\n\r\n if (!this.isExist(name)) {\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n })\r\n\r\n this.$el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n document.body.removeChild(this.$el)\r\n return this\r\n }\r\n\r\n refresh(buttons) {\r\n this.attr({ buttons })\r\n this.erase()._paint(buttons)\r\n return this\r\n }\r\n\r\n add(button) {\r\n const $el = this.$el\r\n const $fragment = document.createDocumentFragment()\r\n const buttons = this.attr('buttons') || []\r\n const { name, disabled, context } = button\r\n const command = this._getCommand(button)\r\n const _add = (button) => {\r\n const $button = _createButton(button)\r\n\r\n $fragment.appendChild($button)\r\n\r\n buttons.push(button)\r\n this.buttons.push({\r\n $el: $button,\r\n name,\r\n disabled: disabled || false,\r\n context: context || this,\r\n command\r\n })\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n }\r\n\r\n if (isObject(button)) {\r\n _add(button)\r\n } else if (isArray(button)) {\r\n button.forEach((item) => {\r\n if (isObject(item)) {\r\n _add(item)\r\n }\r\n })\r\n }\r\n $el.appendChild($fragment)\r\n\r\n return this\r\n }\r\n\r\n remove(name) {\r\n const $el = this.$el\r\n const buttons = this.buttons\r\n const button = this.get(name)\r\n let index = -1\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n index = buttons.indexOf(button)\r\n\r\n if (index > -1) {\r\n buttons.splice(index, 1)\r\n this.attrs('buttons').splice(index, 1)\r\n }\r\n\r\n this._disable(name)\r\n $el.removeChild(button.$el)\r\n\r\n return this\r\n }\r\n\r\n _disable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = true\r\n\r\n if (command) {\r\n this.commands.del(command)\r\n }\r\n\r\n addClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n _enable(name) {\r\n const button = this.get(name)\r\n const command = this.commands.get(name)\r\n\r\n if (!button || !button.disabled) {\r\n return this\r\n }\r\n\r\n button.disabled = false\r\n\r\n if (command) {\r\n this.commands.add(command)\r\n }\r\n\r\n removeClass(button.$el, DISABLED)\r\n\r\n return this\r\n }\r\n\r\n disable(name) {\r\n const disabled = this.attr('afterDisabled')\r\n\r\n if (name) {\r\n this._disable(name)\r\n } else {\r\n addClass(this.$el, DISABLED)\r\n this.removeListeners()\r\n this.disabled = true\r\n\r\n if (isFunction(disabled)) {\r\n disabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n enable(name) {\r\n const enabled = this.attr('afterEnabled')\r\n\r\n if (name) {\r\n this._enable(name)\r\n } else {\r\n this.disabled = false\r\n removeClass(this.$el, DISABLED)\r\n this.addListeners()\r\n\r\n if (isFunction(enabled)) {\r\n enabled.call(this)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n show(name) {\r\n const opened = this.attr('afterOpened')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n removeClass(button.$el, HIDDEN)\r\n } else {\r\n removeClass($el, HIDDEN)\r\n this.closed = false\r\n\r\n if (isFunction(opened)) {\r\n later(() => {\r\n opened.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n hide(name) {\r\n const closed = this.attr('afterClosed')\r\n const button = this.get(name)\r\n const $el = this.$el\r\n\r\n if (name) {\r\n if (!button) {\r\n return this\r\n }\r\n\r\n addClass(button.$el, HIDDEN)\r\n } else {\r\n addClass($el, HIDDEN)\r\n this.closed = true\r\n\r\n if (isFunction(closed)) {\r\n later(() => {\r\n closed.call(this)\r\n }, 310)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n toggle(name) {\r\n if (this.isClosed()) {\r\n this.show(name)\r\n } else {\r\n this.hide(name)\r\n }\r\n\r\n return this\r\n }\r\n\r\n highlight(name) {\r\n const button = this.get(name)\r\n const ACTIVE = 'outline-toolbar_active'\r\n let $button\r\n\r\n if (!button) {\r\n return this\r\n }\r\n\r\n $button = button.$el\r\n\r\n if (hasClass($button, ACTIVE)) {\r\n removeClass($button, ACTIVE)\r\n } else {\r\n addClass($button, ACTIVE)\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const beforeDestroy = this.attr('beforeDestroy')\r\n const afterDestroy = this.attr('afterDestroy')\r\n\r\n if (isFunction(beforeDestroy)) {\r\n beforeDestroy.call(this)\r\n }\r\n\r\n this.commands.clear()\r\n this.removeListeners()._remove()._default()\r\n\r\n if (isFunction(afterDestroy)) {\r\n afterDestroy.call(this)\r\n }\r\n\r\n return this\r\n }\r\n\r\n execute(name) {\r\n if (this.isDisabled(name)) {\r\n return this\r\n }\r\n\r\n this.commands.execute(name)\r\n\r\n return this\r\n }\r\n\r\n onExecute(evt) {\r\n const $button = evt.delegateTarget\r\n let cmd = ''\r\n\r\n if ($button) {\r\n cmd = $button.getAttribute('data-cmd')\r\n\r\n if (cmd) {\r\n this.execute(cmd)\r\n }\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n on($el, `.outline-toolbar__button`, 'click', this.onExecute, this, true)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const buttons = this.attr('buttons') || []\r\n const $el = this.$el\r\n\r\n if (!buttons || buttons.length < 1) {\r\n return this\r\n }\r\n\r\n off($el, '.outline-toolbar__button', this.onExecute)\r\n\r\n return this\r\n }\r\n}\r\n\r\nToolbar.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n placement: 'ltr',\r\n closed: false,\r\n disabled: false,\r\n rounded: true,\r\n buttons: [],\r\n created: null,\r\n mounted: null,\r\n afterClosed: null,\r\n afterOpened: null,\r\n afterDisabled: null,\r\n afterEnabled: null,\r\n beforeDestroy: null,\r\n afterDestroy: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Toolbar\r\n","import publish from './utils/observer/emit'\r\n\r\nclass Speech {\r\n constructor(options) {\r\n this.utterance = new SpeechSynthesisUtterance()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _initialize(options) {\r\n if (options.lang) {\r\n this.setLang(options.lang)\r\n }\r\n\r\n if (options.pitch) {\r\n this.setPitch(options.pitch)\r\n }\r\n\r\n if (options.rate) {\r\n this.setRate(options.rate)\r\n }\r\n\r\n if (options.text) {\r\n this.setText(options.text)\r\n }\r\n\r\n if (options.voice) {\r\n this.setVoice(options.voice)\r\n }\r\n\r\n if (options.volume) {\r\n this.setVolume(options.volume)\r\n }\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n this._initialize(options)._addListeners()\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return speechSynthesis.speaking\r\n }\r\n\r\n isPending() {\r\n return speechSynthesis.pending\r\n }\r\n\r\n isPaused() {\r\n return speechSynthesis.paused\r\n }\r\n\r\n getVoices() {\r\n return speechSynthesis.getVoices()\r\n }\r\n\r\n setLang(lang) {\r\n this.utterance.lang = lang\r\n return this\r\n }\r\n\r\n setPitch(pitch) {\r\n this.utterance.pitch = pitch\r\n return this\r\n }\r\n\r\n setRate(rate) {\r\n this.utterance.rate = rate\r\n return this\r\n }\r\n\r\n setText(text) {\r\n this.utterance.text = text\r\n return this\r\n }\r\n\r\n setVoice(voice) {\r\n this.utterance.voice = voice\r\n return this\r\n }\r\n\r\n setVolume(volume) {\r\n this.utterance.volume = volume\r\n return this\r\n }\r\n\r\n speak(text) {\r\n if (text) {\r\n this.setText(text)\r\n }\r\n\r\n speechSynthesis.speak(this.utterance)\r\n\r\n return this\r\n }\r\n\r\n pause() {\r\n speechSynthesis.pause()\r\n return this\r\n }\r\n\r\n resume() {\r\n speechSynthesis.resume()\r\n return this\r\n }\r\n\r\n cancel() {\r\n speechSynthesis.cancel()\r\n this.setText('')\r\n return this\r\n }\r\n\r\n _addListeners() {\r\n const UTTERANCE_EVENTS = [\r\n 'boundary',\r\n 'end',\r\n 'error',\r\n 'start',\r\n 'mark',\r\n 'pause',\r\n 'resume'\r\n ]\r\n const utterance = this.utterance\r\n const speech = this\r\n\r\n UTTERANCE_EVENTS.forEach((name) => {\r\n utterance[`on${name}`] = (event) => {\r\n publish(name, {\r\n event,\r\n speech\r\n })\r\n }\r\n })\r\n\r\n speechSynthesis.onvoiceschanged = (event) => {\r\n publish('voiceschanged', {\r\n event,\r\n speech\r\n })\r\n }\r\n\r\n return this\r\n }\r\n}\r\n\r\nSpeech.isSupport = (() => {\r\n return 'speechSynthesis' in window\r\n})()\r\n\r\nexport default Speech\r\n","import addClass from './utils/dom/addClass'\r\n\r\nconst _updateSiblingElements = (siblingElement, isPrev) => {\r\n let tagName\r\n let $sibling = siblingElement\r\n\r\n while ($sibling) {\r\n tagName = $sibling.tagName.toLowerCase()\r\n\r\n if (tagName !== 'script' && tagName !== 'style') {\r\n addClass($sibling, 'outline-reader_sibling')\r\n }\r\n\r\n if (isPrev) {\r\n $sibling = $sibling.previousElementSibling\r\n } else {\r\n $sibling = $sibling.nextElementSibling\r\n }\r\n }\r\n}\r\n\r\nexport default _updateSiblingElements\r\n","import cloneDeep from './utils/lang/cloneDeep'\r\nimport later from './utils/lang/later'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport isFunction from './utils/types/isFunction'\r\nimport createElement from './utils/dom/createElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport removeClass from './utils/dom/removeClass'\r\nimport at from './utils/event/at'\r\nimport stop from './utils/event/stop'\r\nimport off from './utils/event/off'\r\n\r\nimport Base from './base'\r\nimport Message from './message'\r\nimport Toolbar from './toolbar'\r\nimport Speech from './speech'\r\n\r\nimport _updateSiblingElements from './_updateSiblingElements'\r\n\r\nconst ENTER_READING_TIP = '进入阅读模式,按 ESC 键可退出阅读模式'\r\n\r\nclass Reader extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n this.attrs = cloneDeep(Reader.DEFAULTS)\r\n this.reading = false\r\n\r\n this.$target = null\r\n this.$paper = null\r\n this.$title = null\r\n this.$article = null\r\n this.$progress = null\r\n\r\n this.toolbar = null\r\n this.speech = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let target = null\r\n\r\n this.attr(options)\r\n\r\n target = this.attr('target')\r\n\r\n if (isString(target)) {\r\n this.$target = document.querySelector(target)\r\n } else if (isElement(target)) {\r\n this.$target = target\r\n }\r\n\r\n if (!this.$target) {\r\n return this\r\n }\r\n\r\n if (Speech.isSupport) {\r\n this.speech = new Speech()\r\n }\r\n\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n isSpeaking() {\r\n return this?.speech?.isSpeaking()\r\n }\r\n\r\n render() {\r\n this._renderEdge()._paint(this.$target)\r\n return this\r\n }\r\n\r\n erase() {\r\n this.$article.innerHTML = ''\r\n return this\r\n }\r\n\r\n _paint($content) {\r\n const $fragment = document.createDocumentFragment()\r\n const $children = [...$content.cloneNode(true).children]\r\n\r\n later(() => {\r\n $children.forEach(($child) => {\r\n $fragment.appendChild($child)\r\n })\r\n\r\n this.$article.appendChild($fragment)\r\n })\r\n\r\n return this\r\n }\r\n\r\n _remove() {\r\n const $paper = this.$paper\r\n const toolbar = this.toolbar\r\n\r\n if ($paper) {\r\n document.body.removeChild($paper)\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n this.erase()._paint(this.$target)\r\n return this\r\n }\r\n\r\n _renderEdge() {\r\n const $target = this.$target\r\n let title = this.attr('title')\r\n let $paper\r\n let $title\r\n let $article\r\n let $progress\r\n let $sibling\r\n\r\n $title = $target.querySelector('h1')\r\n\r\n if (isElement(title)) {\r\n $title = title\r\n }\r\n\r\n if (isElement($title)) {\r\n title = $title.innerText\r\n }\r\n\r\n $title = createElement(\r\n 'h1',\r\n {\r\n className: 'outline-reader__title'\r\n },\r\n title\r\n )\r\n this.$title = $title\r\n\r\n $article = createElement('article', {\r\n id: 'outline-reader__article',\r\n className: 'outline-reader__article'\r\n })\r\n this.$article = $article\r\n\r\n $progress = createElement('div', {\r\n className: 'outline-reader__progress'\r\n })\r\n this.$progress = $progress\r\n\r\n const buttons = []\r\n\r\n if (Speech.isSupport && this.attr('allowSpeak')) {\r\n buttons.push({\r\n name: 'speak',\r\n icon: 'sound',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.speak\r\n }\r\n })\r\n }\r\n\r\n buttons.push(\r\n ...[\r\n {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.print\r\n }\r\n },\r\n {\r\n name: 'exit',\r\n icon: 'close',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.exit\r\n }\r\n }\r\n ]\r\n )\r\n\r\n this.toolbar = new Toolbar({\r\n placement: 'rtl',\r\n buttons\r\n })\r\n\r\n $paper = createElement(\r\n 'section',\r\n {\r\n id: 'outline-reader',\r\n className: 'outline-reader outline-reader_hidden'\r\n },\r\n [$progress, $title, $article, this.toolbar.$el]\r\n )\r\n this.$paper = $paper\r\n\r\n document.body.appendChild($paper)\r\n\r\n later(() => {\r\n // 设置邻居节点的打印样式\r\n $sibling = $paper.previousElementSibling\r\n _updateSiblingElements($sibling, true)\r\n\r\n $sibling = $paper.nextElementSibling\r\n _updateSiblingElements($sibling)\r\n })\r\n\r\n return this\r\n }\r\n\r\n enter() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n const enterReadingTip = this.attr('enterReadingTip') || ENTER_READING_TIP\r\n\r\n if (this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n $siblings.forEach(($sibling) => {\r\n addClass($sibling, HIDDEN)\r\n })\r\n addClass($paper, READING)\r\n removeClass($paper, HIDDEN)\r\n this.toolbar.show()\r\n this.reading = true\r\n\r\n Message.info({\r\n round: true,\r\n message: enterReadingTip\r\n })\r\n\r\n this.$emit('enterReading')\r\n\r\n return this\r\n }\r\n\r\n exit() {\r\n const READER = 'outline-reader'\r\n const READING = `${READER}--reading`\r\n const HIDDEN = `${READER}_hidden`\r\n const $paper = this.$paper\r\n const $siblings = document.querySelectorAll('.outline-reader_sibling')\r\n\r\n if (!this.reading || !$paper) {\r\n return this\r\n }\r\n\r\n addClass($paper, HIDDEN)\r\n removeClass($paper, READING)\r\n $siblings.forEach(($sibling) => {\r\n removeClass($sibling, HIDDEN)\r\n })\r\n this.toolbar.hide()\r\n this.reading = false\r\n\r\n this.$emit('exitReading')\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n if (this.reading) {\r\n this.exit()\r\n } else {\r\n this.enter()\r\n }\r\n\r\n return this\r\n }\r\n\r\n speak() {\r\n const text = this.$article.innerText\r\n const speech = this.speech\r\n\r\n if (!Speech.isSupport) {\r\n return this\r\n }\r\n\r\n this.toolbar.highlight('speak')\r\n\r\n if (this.isSpeaking()) {\r\n speech.cancel()\r\n } else {\r\n speech.speak(text)\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n if (!isFunction(print)) {\r\n return this\r\n }\r\n\r\n print()\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n this.removeListeners()._remove()._default()\r\n\r\n return this\r\n }\r\n\r\n onPrint() {\r\n this.print()\r\n return this\r\n }\r\n\r\n onEnterReading() {\r\n this.toggle()\r\n return this\r\n }\r\n\r\n onExitReading(evt) {\r\n const keyCode = evt.keyCode\r\n\r\n if (keyCode === 27 && this.reading) {\r\n this.toggle()\r\n stop(evt)\r\n }\r\n\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n at(document, 'keyup', this.onExitReading, this, true)\r\n\r\n this.$on('toolbar:action:print', this.onPrint)\r\n this.$on('toolbar:action:reading', this.onEnterReading)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const $paper = this.$paper\r\n\r\n if (!$paper) {\r\n return this\r\n }\r\n\r\n off(document, 'keyup', this.onExitReading)\r\n\r\n this.$off('toolbar:action:print')\r\n this.$off('toolbar:action:reading')\r\n\r\n return this\r\n }\r\n}\r\n\r\nReader.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n target: '',\r\n title: '',\r\n enterReadingTip: ENTER_READING_TIP,\r\n allowSpeak: false\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nexport default Reader\r\n","import later from './utils/lang/later'\r\nimport cloneDeep from './utils/lang/cloneDeep'\r\nimport isFunction from './utils/types/isFunction'\r\nimport isString from './utils/types/isString'\r\nimport isElement from './utils/types/isElement'\r\nimport addClass from './utils/dom/addClass'\r\nimport scrollTo from './utils/dom/scrollTo'\r\nimport _getScrollElement from './utils/dom/_getScrollElement'\r\n\r\nimport getChapters from './getChapters'\r\n\r\nimport Base from './base'\r\nimport Anchors from './anchors'\r\nimport Drawer from './drawer'\r\nimport Navigator from './navigator'\r\nimport Reader from './reader'\r\nimport Toolbar from './toolbar'\r\n\r\nclass Outline extends Base {\r\n constructor(options) {\r\n super()\r\n\r\n this._default()\r\n\r\n if (options) {\r\n this.initialize(options)\r\n }\r\n }\r\n\r\n _default() {\r\n const options = Outline.DEFAULTS\r\n\r\n this.attrs = cloneDeep(options)\r\n this.$article = null\r\n this.$scrollElement = null\r\n this.buttons = []\r\n\r\n this.anchors = null\r\n this.drawer = null\r\n this.navigator = null\r\n this.reader = null\r\n this.toolbar = null\r\n\r\n return this\r\n }\r\n\r\n initialize(options) {\r\n let articleElement = ''\r\n let scrollElement = ''\r\n let $article = null\r\n\r\n this.attr(options)\r\n\r\n articleElement = this.attr('articleElement')\r\n scrollElement = this.attr('scrollElement')\r\n\r\n if (isString(articleElement)) {\r\n $article = document.querySelector(articleElement)\r\n } else if (isElement(articleElement)) {\r\n $article = articleElement\r\n }\r\n this.$article = $article\r\n this.$scrollElement = _getScrollElement(scrollElement)\r\n\r\n this.$emit('created', { ...this.attr() })\r\n this.render().addListeners()\r\n\r\n return this\r\n }\r\n\r\n getChapters(isTreeStructured = false) {\r\n const articleElement = this.$article\r\n const selector = this.attr('selector')\r\n const showCode = this.attr('showCode') || true\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n return getChapters({\r\n articleElement,\r\n selector,\r\n showCode,\r\n chapterTextFilter,\r\n isTreeStructured\r\n })\r\n }\r\n\r\n count() {\r\n return this.getChapters().length\r\n }\r\n\r\n render() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n const $scrollElement = this.$scrollElement\r\n\r\n this._renderReader()._renderAnchors()._renderNavigator()._renderToolbar()\r\n\r\n if ($scrollElement && hasToolbar) {\r\n this._updateToolbar({\r\n top: $scrollElement.scrollTop,\r\n min: 0,\r\n max: $scrollElement.scrollHeight\r\n })\r\n }\r\n\r\n this.$emit('mounted')\r\n\r\n return this\r\n }\r\n\r\n refresh() {\r\n const chapters = this.getChapters()\r\n\r\n this.anchors.refresh(chapters)\r\n this.navigator.refresh(chapters)\r\n this.reader.refresh()\r\n\r\n return this\r\n }\r\n\r\n _renderReader() {\r\n const option = this.attr('reader')\r\n\r\n if (!option.target) {\r\n return this\r\n }\r\n\r\n addClass(this.$article, 'outline-article')\r\n\r\n this.reader = new Reader(option)\r\n\r\n return this\r\n }\r\n\r\n _renderAnchors() {\r\n const articleElement = this.attr('articleElement')\r\n const selector = this.attr('selector')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const showCode = this.attr('showCode')\r\n const anchorURL = this.attr('anchorURL')\r\n const afterScroll = this.attr('afterScroll')\r\n const chapterTextFilter = this.attr('chapterTextFilter')\r\n\r\n this.anchors = new Anchors({\r\n articleElement,\r\n stickyHeight,\r\n scrollElement,\r\n selector,\r\n showCode,\r\n anchorURL,\r\n afterScroll,\r\n chapterTextFilter\r\n })\r\n\r\n return this\r\n }\r\n\r\n _renderNavigator() {\r\n const title = this.attr('title')\r\n const stickyHeight = this.attr('stickyHeight')\r\n const scrollElement = this.attr('scrollElement')\r\n const customClass = this.attr('customClass')\r\n const showCode = this.attr('showCode')\r\n const animationCurrent = this.attr('animationCurrent')\r\n const closeOnClickModal = this.attr('closeOnClickModal')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const position = this.attr('position')\r\n const placement = this.attr('placement')\r\n const afterSticky = this.attr('afterSticky')\r\n const afterToggle = this.attr('afterToggle')\r\n const afterScroll = this.attr('afterScroll')\r\n const count = this.count()\r\n let parentElement = this.attr('parentElement')\r\n let OPTIONS\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n OPTIONS = {\r\n scrollElement,\r\n showCode,\r\n animationCurrent,\r\n position,\r\n title,\r\n stickyHeight,\r\n chapters: this.getChapters(),\r\n afterSticky,\r\n afterToggle,\r\n afterScroll\r\n }\r\n\r\n if (position === 'relative') {\r\n this.drawer = new Drawer({\r\n placement,\r\n title,\r\n size: 'tiny',\r\n hasOffset: true,\r\n hasPadding: false,\r\n closeOnClickModal,\r\n customClass,\r\n afterClosed: () => {\r\n const toolbar = this.toolbar\r\n toolbar.toggle()\r\n }\r\n })\r\n parentElement = this.drawer.$main\r\n\r\n if (showNavModalFirst) {\r\n this.drawer.open()\r\n }\r\n } else {\r\n OPTIONS.customClass = customClass\r\n }\r\n\r\n OPTIONS.parentElement = parentElement\r\n this.navigator = new Navigator(OPTIONS)\r\n\r\n return this\r\n }\r\n\r\n _renderToolbar() {\r\n const position = this.attr('position')\r\n const hasToolbar = this.attr('hasToolbar')\r\n const showNavModalFirst = this.attr('showNavModalFirst')\r\n const placement = this.attr('placement')\r\n const homepage = this.attr('homepage')\r\n const git = this.attr('git')\r\n const tags = this.attr('tags')\r\n const issues = this.attr('issues')\r\n const tools = this.attr('tools')\r\n const option = this.attr('reader')\r\n const count = this.count()\r\n const UP = {\r\n name: 'up',\r\n icon: 'up',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toTop\r\n }\r\n }\r\n const HOME = {\r\n name: 'homepage',\r\n icon: 'homepage',\r\n size: 20,\r\n link: homepage\r\n }\r\n const GIT = {\r\n name: 'github',\r\n icon: 'github',\r\n size: 20,\r\n link: git\r\n }\r\n const TAGS = {\r\n name: 'tags',\r\n icon: 'tags',\r\n size: 20,\r\n link: tags\r\n }\r\n const ISSUES = {\r\n name: 'issues',\r\n icon: 'issues',\r\n size: 20,\r\n link: issues\r\n }\r\n const MENU = {\r\n name: 'toggle',\r\n icon: 'menu',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: this.toggle\r\n }\r\n }\r\n const READING = {\r\n name: 'reading',\r\n icon: 'file',\r\n size: 18,\r\n action: {\r\n context: this,\r\n handler: 'toolbar:action:reading'\r\n }\r\n }\r\n const PRINT = {\r\n name: 'print',\r\n icon: 'print',\r\n size: 20,\r\n action: {\r\n handler: 'toolbar:action:print'\r\n }\r\n }\r\n const DOWN = {\r\n name: 'down',\r\n icon: 'down',\r\n size: 20,\r\n action: {\r\n context: this,\r\n handler: this.toBottom\r\n }\r\n }\r\n const buttons = []\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n buttons.push(UP)\r\n if (count > 0) {\r\n buttons.push(MENU)\r\n }\r\n if (homepage) {\r\n buttons.push(HOME)\r\n }\r\n if (git) {\r\n buttons.push(GIT)\r\n }\r\n if (tags) {\r\n buttons.push(TAGS)\r\n }\r\n if (issues) {\r\n buttons.push(ISSUES)\r\n }\r\n if (option.target) {\r\n buttons.push(READING)\r\n if (isFunction(print)) {\r\n buttons.push(PRINT)\r\n }\r\n }\r\n if (tools?.length > 0) {\r\n buttons.push(...tools)\r\n }\r\n buttons.push(DOWN)\r\n this.buttons = [...buttons]\r\n\r\n this.toolbar = new Toolbar({\r\n placement,\r\n buttons\r\n })\r\n\r\n if (position === 'relative' && showNavModalFirst) {\r\n this.toolbar.hide()\r\n }\r\n\r\n return this\r\n }\r\n\r\n addButton(button) {\r\n const toolbar = this.toolbar\r\n const buttons = this.buttons\r\n buttons.splice(-1, 0, button)\r\n toolbar.attr({\r\n buttons\r\n })\r\n toolbar.refresh()\r\n return this\r\n }\r\n\r\n removeButton(name) {\r\n this.toolbar.remove(name)\r\n return this\r\n }\r\n\r\n _updateToolbar({ top, min, max }) {\r\n const toolbar = this.toolbar\r\n const current = Math.ceil(top)\r\n\r\n if (current <= min) {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n } else if (current >= max) {\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n } else if (current > min && current < max) {\r\n toolbar.show('up')\r\n toolbar.show('down')\r\n }\r\n\r\n return this\r\n }\r\n\r\n toTop() {\r\n const afterScroll = this.attr('afterScroll')\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const afterTop = () => {\r\n toolbar.hide('up')\r\n toolbar.show('down')\r\n\r\n if (count > 0) {\r\n navigator.highlight(0)\r\n navigator.playing = false\r\n scrollTo(navigator.$main, 0)\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'up')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n this.scrollTo(0, afterTop)\r\n\r\n return this\r\n }\r\n\r\n toBottom() {\r\n const afterScroll = this.attr('afterScroll')\r\n const $scrollElement = this.$scrollElement\r\n const toolbar = this.toolbar\r\n const navigator = this.navigator\r\n const count = this.count()\r\n const top = Math.floor(\r\n $scrollElement.scrollHeight - $scrollElement.clientHeight\r\n )\r\n const afterDown = () => {\r\n const $main = navigator.$main\r\n toolbar.hide('down')\r\n toolbar.show('up')\r\n\r\n if (count > 0) {\r\n navigator.highlight(count - 1)\r\n scrollTo($main, $main.scrollHeight)\r\n navigator.playing = false\r\n }\r\n\r\n if (isFunction(afterScroll)) {\r\n afterScroll.call(toolbar, 'bottom')\r\n }\r\n }\r\n\r\n if (count > 0) {\r\n navigator.playing = true\r\n }\r\n\r\n this.scrollTo(top, afterDown)\r\n\r\n return this\r\n }\r\n\r\n scrollTo(top, afterScroll) {\r\n scrollTo(this.$scrollElement, top, afterScroll)\r\n return this\r\n }\r\n\r\n enterReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.enter()\r\n\r\n return this\r\n }\r\n\r\n exitReading() {\r\n const reader = this.reader\r\n\r\n if (!reader || !reader.reading) {\r\n return this\r\n }\r\n\r\n this.toolbar.toggle()\r\n reader.exit()\r\n\r\n return this\r\n }\r\n\r\n switchReading() {\r\n const reader = this.reader\r\n\r\n if (!reader) {\r\n return this\r\n }\r\n\r\n reader.toggle()\r\n\r\n return this\r\n }\r\n\r\n toggle() {\r\n const position = this.attr('position')\r\n const toolbar = this.toolbar\r\n const drawer = this.drawer\r\n const navigator = this.navigator\r\n const count = this.count()\r\n\r\n if (count < 1) {\r\n return this\r\n }\r\n\r\n if (position !== 'relative') {\r\n navigator.toggle()\r\n toolbar.highlight('toggle')\r\n } else {\r\n toolbar.toggle()\r\n\r\n later(() => {\r\n drawer.toggle()\r\n })\r\n }\r\n\r\n return this\r\n }\r\n\r\n print() {\r\n this.reader.print()\r\n\r\n return this\r\n }\r\n\r\n _destroy() {\r\n const count = this.count()\r\n let anchors = this.anchors\r\n let navigator = this.navigator\r\n let drawer = this.drawer\r\n let reader = this.reader\r\n let toolbar = this.toolbar\r\n let isOutside = false\r\n\r\n this.removeListeners()\r\n\r\n if (reader) {\r\n reader.destroy()\r\n }\r\n\r\n if (count > 0 && navigator) {\r\n isOutside = navigator.isOutside()\r\n\r\n navigator.destroy()\r\n\r\n if (isOutside && drawer) {\r\n drawer.destroy()\r\n }\r\n }\r\n\r\n if (anchors) {\r\n anchors.destroy()\r\n }\r\n\r\n if (toolbar) {\r\n toolbar.destroy()\r\n }\r\n\r\n return this\r\n }\r\n\r\n destroy() {\r\n this.$emit('beforeDestroy')\r\n\r\n this._destroy()._default()\r\n\r\n this.$emit('destroyed')\r\n\r\n return this\r\n }\r\n\r\n onToolbarUpdate({ top, min, max }) {\r\n this._updateToolbar({ top, min, max })\r\n return this\r\n }\r\n\r\n addListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$on('toolbar:update', this.onToolbarUpdate)\r\n\r\n return this\r\n }\r\n\r\n removeListeners() {\r\n const hasToolbar = this.attr('hasToolbar')\r\n\r\n if (!hasToolbar) {\r\n return this\r\n }\r\n\r\n this.$off('toolbar:update')\r\n\r\n return this\r\n }\r\n}\r\n\r\nOutline.DEFAULTS = (() => {\r\n const OPTIONS = {\r\n articleElement: '#article',\r\n selector: 'h2,h3,h4,h5,h6',\r\n parentElement: '#aside',\r\n scrollElement: 'html,body',\r\n title: '目录',\r\n position: 'relative',\r\n placement: 'rtl',\r\n animationCurrent: true,\r\n showCode: true,\r\n hasToolbar: true,\r\n closeOnClickModal: true,\r\n showNavModalFirst: false,\r\n anchorURL: '',\r\n stickyHeight: 0,\r\n homepage: '',\r\n git: '',\r\n tags: '',\r\n issues: '',\r\n tools: [],\r\n reader: {\r\n target: '',\r\n title: '',\r\n enterReadingTip: '进入阅读模式,按 ESC 键可退出阅读模式',\r\n allowSpeak: false\r\n },\r\n customClass: '',\r\n afterSticky: null,\r\n afterToggle: null,\r\n afterScroll: null,\r\n chapterTextFilter: null\r\n }\r\n\r\n return cloneDeep(OPTIONS)\r\n})()\r\n\r\nif (window?.jQuery) {\r\n const $ = window.jQuery\r\n\r\n // 将 Outline 扩展为一个 jquery 插件\r\n // eslint-disable-next-line no-undef\r\n $.extend($.fn, {\r\n outline: function (options) {\r\n // eslint-disable-next-line no-undef\r\n let $article = $(this)\r\n\r\n return new Outline(\r\n // eslint-disable-next-line no-undef\r\n $.extend({}, options, {\r\n articleElement: $article\r\n })\r\n )\r\n }\r\n })\r\n}\r\n\r\nexport default Outline\r\n"],"names":["toString","val","Object","prototype","apply","isFunction","later","fn","delay","arguments","length","undefined","setTimeout","isObject","o","isArray","Array","cloneDeep","obj","clone","from","assign","keys","forEach","key","isString","str","isElement","nodeName","tagName","nodeType","hasClass","el","className","pattern","RegExp","allClass","classList","contains","exec","addClass","_classList","add","easeInQuad","x","_getScrollElement","$rootElements","$scrollElement","scrollElement","document","querySelector","querySelectorAll","scrollTop","scrollTo","top","afterStop","step","distance","MAX_HEIGHT","scrollHeight","MAX_TOP","stop","play","requestAnimationFrame","trim","replace","getChaptersByHeadings","headings","showCode","chapterTextFilter","previous","level","text","chapters","heading","i","headingLevel","current","parseInt","pid","_getChapterParentIdByDiffer","differ","index","innerHTML","push","id","rel","groups","group","JSON","stringify","cb","code","String","c","subjects","_getChaptersWithCode","getChapters","options","articleElement","selector","isTreeStructured","$article","$headings","filter","toTree","list","nodeKey","parentKey","map","roots","item","children","node","hasOwn","prop","hasOwnProperty","call","extend","origin","source","_subscribers","_hasDirectSubscribersFor","topic","has","found","position","lastIndexOf","substring","_hasSubscribers","emit","data","async","execute","subscriber","message","indexOf","callback","context","deliver","guid","uuid","prefix","_removeSubscriber","off","token","subject","execution","j","splice","_removeSubscriberByToken","Base","constructor","this","attrs","initialize","attr","render","addListeners","value","refresh","destroy","removeListeners","reload","$emit","event","publish","$on","handler","subscribe","$off","unsubscribe","queue","isHandling","done","runIdle","idleDeadline","timeRemaining","shift","requestIdleCallback","window","start","Date","now","didTimeout","Math","max","cancelIdleCallback","clearTimeout","timeSlice","afterComplete","offsetTop","offsetParent","matches","sel","msMatchesSelector","getParentOrHost","host","parentNode","CAPTURE_EVENTS","_off","type","capture","_delegateListener","listeners","_listeners","listener","_delete","removeEventListener","purgeElement","recurse","$element","$children","childNodes","getListeners","$child","on","once","evt","target","getTarget","delegateTarget","closest","ctx","includeCTX","startsWith","overrideContext","addEventListener","stopPropagation","preventDefault","SYMBOLS","getSymbols","name","iconSet","patternName","patternSet","find","symbol","fullName","getSymbol","paint","$body","body","$icons","symbols","join","createElement","insertBefore","firstChild","isDOM","isHTMLCollection","fragment","isTextNode","setAttribute","toLowerCase","style","cssText","innerText","setAttributes","$fragment","createDocumentFragment","$el","isValidChild","child","append","createTextNode","appendChild","every","ICON","size","color","width","height","defaultRules","cssRules","$icon","$svg","binds","svg","test","isSVG","xmlns","class","icon","removeClass","remove","_removeHeading","$heading","hasAnchor","isAtStart","CLS_HEADING","$anchor","removeAttribute","removeChild","Anchors","super","_default","DEFAULTS","$articleElement","created","getHeadings","count","mounted","_paint","erase","_remove","LIMIT","anchorURL","update","chapterCode","_updateHeading","headingId","href","groupIndex","after","beforeDestroy","afterDestroy","onAnchorTrigger","afterScroll","stickyHeight","clientHeight","min","TAGS","isHTML","html","basic","full","slice","tag","stripScripts","setProperty","documentElement","zIndex","idx","Drawer","title","closed","$modal","$header","$title","$close","$main","$footer","$overlay","setTitle","isClosed","placement","hasClose","hasOverlay","hasOffset","hasPadding","autoHeight","customClass","content","$content","strHTML","template","open","opened","close","toggle","afterToggle","onClose","closeOnClickModal","afterClosed","afterOpened","at","getStyle","ruleName","getComputedStyle","inBounding","parent","parentRect","childRect","getBoundingClientRect","right","bottom","left","Navigator","scrollTimer","resizeTimer","observerTimer","Observer","$list","$placeholder","$parentElement","$active","active","offsetWidth","playing","parentElement","$parent","isSticky","isFixed","isInside","isOutside","_paintEdge","animationCurrent","contents","calculateStickyHeight","highlight","sticky","onObserver","clones","parts","byId","chapter","$text","$link","$code","$li","$subject","$chapter","_paintChapters","_getPlaceholderOffset","mainPaddingTop","mainBorderTop","placeholderPaddingTop","placeholderMarginTop","placeholderBorderTop","offsetHeight","positionPlaceholder","ACTIVE","HIGHLIGHT","placeholderOffsetTop","getAttribute","console","log","afterSticky","FIXED","isStickying","innerHeight","show","HIDDEN","hide","props","root","rootMargin","IntersectionObserver","entries","entry","intersectionRatio","$root","section","observe","intersection","onSelect","split","onScroll","onResize","unobserve","isPlainObject","getPrototypeOf","proto","isObjectLike","encodeHTML","CHARTS","instances","instance","Message","visible","offset","timer","destroyed","isDestroyed","_getClassName","effect","round","closable","dangerouslyUseHTMLString","$type","$message","iconSize","_refreshIcon","iconName","$use","_refreshMessage","_refreshClose","_refreshEl","clearTimer","startTimer","duration","destroyAfterClosed","beforeClose","onMouseEnter","onMouseLeave","config","len","dom","clear","Command","action","Commands","commands","get","cmd","command","del","_createButton","button","rounded","link","$button","disabled","DISABLED","Toolbar","buttons","isDisabled","isExist","_getCommand","_self","bind","disable","_add","_disable","_enable","enable","enabled","onExecute","afterDisabled","afterEnabled","Speech","utterance","SpeechSynthesisUtterance","_initialize","lang","setLang","pitch","setPitch","rate","setRate","setText","voice","setVoice","volume","setVolume","_addListeners","isSpeaking","speechSynthesis","speaking","isPending","pending","isPaused","paused","getVoices","speak","pause","resume","cancel","speech","onvoiceschanged","isSupport","_updateSiblingElements","siblingElement","isPrev","$sibling","previousElementSibling","nextElementSibling","ENTER_READING_TIP","Reader","reading","$target","$paper","$progress","toolbar","_this$speech","_renderEdge","cloneNode","print","exit","enter","READER","READING","$siblings","enterReadingTip","info","onPrint","onEnterReading","onExitReading","keyCode","allowSpeak","Outline","anchors","drawer","navigator","reader","hasToolbar","_renderReader","_renderAnchors","_renderNavigator","_renderToolbar","_updateToolbar","option","showNavModalFirst","OPTIONS","homepage","git","tags","issues","tools","UP","toTop","HOME","GIT","ISSUES","MENU","PRINT","DOWN","toBottom","addButton","removeButton","_ref","ceil","afterTop","floor","afterDown","enterReading","exitReading","switchReading","_destroy","onToolbarUpdate","_ref2","_window","jQuery","$","outline"],"mappings":"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AMX,EAGF6I,EAAQG,SAkBCxR,EAjBS,CACd+B,cAAe,YACfmD,eAAgB,WAChBC,SAAU,oBACV2N,aAAc,EACdZ,UAAW,GACXnB,WAAW,EACXC,WAAW,EACX7N,UAAU,EACVuO,QAAS,KACTG,QAAS,KACTgB,YAAa,KACbH,cAAe,KACfC,aAAc,KACdvP,kBAAmB,OEjTvB,MAAM6P,EAAO,CACX,IACA,OACA,UACA,OACA,UACA,QACA,QACA,IACA,OACA,MACA,MACA,aACA,OACA,KACA,SACA,SACA,UACA,OACA,OACA,MACA,WACA,OACA,WACA,KACA,MACA,UACA,MACA,SACA,MACA,KACA,KACA,KACA,QACA,WACA,aACA,SACA,SACA,OACA,KACA,KACA,KACA,KACA,KACA,KACA,OACA,SACA,SACA,KACA,OACA,IACA,SACA,MACA,QACA,MACA,MACA,QACA,SACA,KACA,OACA,OACA,MACA,OACA,OACA,OACA,WACA,OACA,QACA,MACA,WACA,SACA,KACA,WACA,SACA,SACA,IACA,QACA,UACA,MACA,WACA,IACA,KACA,KACA,KACA,MACA,OACA,IACA,OACA,SACA,SACA,UACA,SACA,OACA,QACA,SACA,OACA,SACA,QACA,MACA,UACA,MACA,MACA,QACA,QACA,KACA,WACA,WACA,QACA,KACA,QACA,OACA,QACA,KACA,QACA,IACA,KACA,MACA,QACA,OCzGIC,EAAUzS,IACd,IAAI0S,EACAC,EACAC,EAEJ,QAAK7S,EAASC,KAKd0S,EAAOpQ,EAAKtC,GAAK6S,MAAM,EAAG,KAC1BF,EAAQ,4DACRC,EAAO,IAAInS,OAAO+R,EAAKrN,KAAK2N,GAAS,IAAGA,eAAgBnF,KAAK,KAAM,KAE5DgF,EAAM9C,KAAK6C,IAASE,EAAK/C,KAAK6C,GAAK,ECtBtCK,GAAgB/S,GACbA,EAAIuC,QAAQ,+BAAgC,ICP/CyQ,GAAcA,CAACvN,EAAM4C,KACD9G,SAAS0R,gBACjB5E,MAAM2E,YAAYvN,EAAM4C,EAAM,ECAhD,IAAI7E,GAAQ,IAEZ,MAAM0P,GAAUC,IACVA,EACF3P,GAAQ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"} \ No newline at end of file