3432 lines
214 KiB
JavaScript
3432 lines
214 KiB
JavaScript
|
(window["webpackJsonpSettings"] = window["webpackJsonpSettings"] || []).push([[3],{
|
||
|
|
||
|
/***/ "./node_modules/@nextcloud/vue/dist/Components/AppNavigationSpacer.js":
|
||
|
/*!****************************************************************************!*\
|
||
|
!*** ./node_modules/@nextcloud/vue/dist/Components/AppNavigationSpacer.js ***!
|
||
|
\****************************************************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
!function(e,t){ true?module.exports=t():undefined}(window,(function(){return function(e){var t={};function n(r){if(t[r])return t[r].exports;var o=t[r]={i:r,l:!1,exports:{}};return e[r].call(o.exports,o,o.exports,n),o.l=!0,o.exports}return n.m=e,n.c=t,n.d=function(e,t,r){n.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:r})},n.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},n.t=function(e,t){if(1&t&&(e=n(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var r=Object.create(null);if(n.r(r),Object.defineProperty(r,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)n.d(r,o,function(t){return e[t]}.bind(null,o));return r},n.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return n.d(t,"a",t),t},n.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},n.p="/dist/",n(n.s=179)}({0:function(e,t,n){"use strict";function r(e,t,n,r,o,i,a,s){var c,u="function"==typeof e?e.options:e;if(t&&(u.render=t,u.staticRenderFns=n,u._compiled=!0),r&&(u.functional=!0),i&&(u._scopeId="data-v-"+i),a?(c=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),o&&o.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(a)},u._ssrRegister=c):o&&(c=s?function(){o.call(this,this.$root.$options.shadowRoot)}:o),c)if(u.functional){u._injectStyles=c;var f=u.render;u.render=function(e,t){return c.call(t),f(e,t)}}else{var p=u.beforeCreate;u.beforeCreate=p?[].concat(p,c):[c]}return{exports:e,options:u}}n.d(t,"a",(function(){return r}))},1:function(e,t,n){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var n=function(e,t){var n=e[1]||"",r=e[3];if(!r)return n;if(t&&"function"==typeof btoa){var o=(a=r,s=btoa(unescape(encodeURIComponent(JSON.stringify(a)))),c="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(s),"/*# ".concat(c," */")),i=r.sources.map((function(e){return"/*# sourceURL=".concat(r.sourceRoot||"").concat(e," */")}));return[n].concat(i).concat([o]).join("\n")}var a,s,c;return[n].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(n,"}"):n})).join("")},t.i=function(e,n,r){"string"==typeof e&&(e=[[null,e,""]]);var o={};if(r)for(var i=0;i<this.length;i++){var a=this[i][0];null!=a&&(o[a]=!0)}for(var s=0;s<e.length;s++){var c=[].concat(e[s]);r&&o[c[0]]||(n&&(c[2]?c[2]="".concat(n," and ").concat(c[2]):c[2]=n),t.push(c))}},t}},104:function(e,t,n){var r=n(227);"string"==typeof r&&(r=[[e.i,r,""]]),r.locals&&(e.exports=r.locals);(0,n(2).default)("1e3ece15",r,!0,{})},179:function(e,t,n){"use strict";n.r(t);var r={name:"AppNavigationSpacer"},o=(n(226),n(0)),i=Object(o.a)(r,(function(){var e=this.$createElement;return(this._self._c||e)("li",{staticClass:"app-navigation-spacer"})}),[],!1,null,"42195cc8",null).exports;t.default=i},2:function(e,t,n){"use strict";function r(e,t){for(var n=[],r={},o=0;o<t.length;o++){var i=t[o],a=i[0],s={id:e+":"+o,css:i[1],media:i[2],sourceMap:i[3]};r[a]?r[a].parts.push(s):n.push(r[a]={id:a,parts:[s]})}return n}n.r(t),n.d(t,"default",(function(){return l}));var o="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!o)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var i={},a=o&&(document.head||document.getElementsByTagName("head")[0]),s=null,c=0,u=!1,f=function(){},p=null,d="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function l(e,t,n,o){u=n,p=o||{};var a=r(e,t);return v(a),function(t){for(var n=[],o=0;o<a.length;o++){var s=a[o];(c=i[s.id]).refs--,n.push(c)}t?v(a=r(e,t)):a=[];for(o=0;o<n.length;o++){var c;if(0===(c=n[o]).refs){for(var u=0;u<c.parts.length;u++)c.parts[u]();delete i[c.id]}}}}function v(e){for(var t=0;t<e
|
||
|
//# sourceMappingURL=AppNavigationSpacer.js.map
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/@nextcloud/vue/dist/Components/AppSidebar.js":
|
||
|
/*!*******************************************************************!*\
|
||
|
!*** ./node_modules/@nextcloud/vue/dist/Components/AppSidebar.js ***!
|
||
|
\*******************************************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
!function(e,t){ true?module.exports=t():undefined}(window,(function(){return function(e){var t={};function s(A){if(t[A])return t[A].exports;var n=t[A]={i:A,l:!1,exports:{}};return e[A].call(n.exports,n,n.exports,s),n.l=!0,n.exports}return s.m=e,s.c=t,s.d=function(e,t,A){s.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:A})},s.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},s.t=function(e,t){if(1&t&&(e=s(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var A=Object.create(null);if(s.r(A),Object.defineProperty(A,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var n in e)s.d(A,n,function(t){return e[t]}.bind(null,n));return A},s.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return s.d(t,"a",t),t},s.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},s.p="/dist/",s(s.s=178)}({0:function(e,t,s){"use strict";function A(e,t,s,A,n,a,o,r){var i,c="function"==typeof e?e.options:e;if(t&&(c.render=t,c.staticRenderFns=s,c._compiled=!0),A&&(c.functional=!0),a&&(c._scopeId="data-v-"+a),o?(i=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),n&&n.call(this,e),e&&e._registeredComponents&&e._registeredComponents.add(o)},c._ssrRegister=i):n&&(i=r?function(){n.call(this,this.$root.$options.shadowRoot)}:n),i)if(c.functional){c._injectStyles=i;var l=c.render;c.render=function(e,t){return i.call(t),l(e,t)}}else{var m=c.beforeCreate;c.beforeCreate=m?[].concat(m,i):[i]}return{exports:e,options:c}}s.d(t,"a",(function(){return A}))},1:function(e,t,s){"use strict";e.exports=function(e){var t=[];return t.toString=function(){return this.map((function(t){var s=function(e,t){var s=e[1]||"",A=e[3];if(!A)return s;if(t&&"function"==typeof btoa){var n=(o=A,r=btoa(unescape(encodeURIComponent(JSON.stringify(o)))),i="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(r),"/*# ".concat(i," */")),a=A.sources.map((function(e){return"/*# sourceURL=".concat(A.sourceRoot||"").concat(e," */")}));return[s].concat(a).concat([n]).join("\n")}var o,r,i;return[s].join("\n")}(t,e);return t[2]?"@media ".concat(t[2]," {").concat(s,"}"):s})).join("")},t.i=function(e,s,A){"string"==typeof e&&(e=[[null,e,""]]);var n={};if(A)for(var a=0;a<this.length;a++){var o=this[a][0];null!=o&&(n[o]=!0)}for(var r=0;r<e.length;r++){var i=[].concat(e[r]);A&&n[i[0]]||(s&&(i[2]?i[2]="".concat(s," and ").concat(i[2]):i[2]=s),t.push(i))}},t}},10:function(e,t,s){"use strict";s.r(t),t.default="data:font/ttf;base64,AAEAAAAKAIAAAwAgT1MvMnTjj5cAAACsAAAAYGNtYXAADeu0AAABDAAAAUJnbHlm9ReudAAAAlAAAASEaGVhZCfF2KoAAAbUAAAANmhoZWEnHBOFAAAHDAAAACRobXR4Z97//wAABzAAAAAsbG9jYQduCEYAAAdcAAAAIG1heHABHABXAAAHfAAAACBuYW1lorGCnAAAB5wAAAKmcG9zdOaJWowAAApEAAAAxAAEEpQBkAAFAAAMZQ2sAAACvAxlDawAAAlgAPUFCgAAAgAFAwAAAAAAAAAAAAAQAAAAAAAAAAAAAABQZkVkAEDqAeoOE4gAAAHCE4gAAAAAAAEAAAAAAAAAAAAAACAAAAAAAAMAAAADAAAAHAABAAAAAAA8AAMAAQAAABwABAAgAAAABAAEAAEAAOoO//8AAOoB//8WAAABAAAAAAAAAQYAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAA6mD0MABQALAAAJAhEJBBEJAQ6m+oIFfvu6BEb6gvqCBX77ugRGD0L6gvqCATgERgRGATj6gvqCATgERgRGAAEAAAAADW4SUAAFAAAJAREJAREGGwdT93QIjAnE+K3+yAiLCIz+xwACAAAAAA/fD0MABQALAAAJAhEJBBEJAQTiBX76ggRG+7oFfgV/+oEERvu6BEYFfgV+/sj7uvu6/sgFfgV+/sj7uvu6AAEAAAAADqYSUAAFAAAJAREJARENbvitCIv3dQnEB1MBOfd093UBOAABAAAAAAY3E4gABQAAEwcJARcBlJQFcvqOlAWjE4hV9pH2kVUJxAAAAQAAAAARhw+DAAUAAAkFD8338/v7/kYFvwnHD4P38wQF/kf6QQnGAAEAAAAAERcRFwALAAAJCxEX/e36wPrA/e0FQPrAAhMFQAVAAhP6wASE/e0FQPrAAhMFQAVAAhP6wAVA/e36wAAB//8AABOTEuwAMwAAASIHDgEXFhcBISYHBgcGBwYUFxYXFhcWNyEBBgcGFxYXHgEXFhcWNzY3AT
|
||
|
/**
|
||
|
* @copyright Copyright (c) 2019 Georg Ehrke
|
||
|
*
|
||
|
* @author Georg Ehrke <oc.list@georgehrke.com>
|
||
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
*/
|
||
|
var A={inserted:function(e){e.focus()}};t.default=A},106:function(e,t,s){var A=s(230);"string"==typeof A&&(A=[[e.i,A,""]]),A.locals&&(e.exports=A.locals);(0,s(2).default)("45aebdd4",A,!0,{})},107:function(e,t,s){var A=s(232);"string"==typeof A&&(A=[[e.i,A,""]]),A.locals&&(e.exports=A.locals);(0,s(2).default)("4dd3631b",A,!0,{})},11:function(e,t,s){"use strict";s.r(t),t.default="data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PjwhRE9DVFlQRSBzdmcgUFVCTElDICItLy9XM0MvL0RURCBTVkcgMS4xLy9FTiIgImh0dHA6Ly93d3cudzMub3JnL0dyYXBoaWNzL1NWRy8xLjEvRFREL3N2ZzExLmR0ZCIgPjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48bWV0YWRhdGE+PC9tZXRhZGF0YT48ZGVmcz48Zm9udCBpZD0iaWNvbmZvbnQtdnVlLWUxZjU1Y2UiIGhvcml6LWFkdi14PSI1MDAwIj48Zm9udC1mYWNlIGZvbnQtZmFtaWx5PSJpY29uZm9udC12dWUtZTFmNTVjZSIgZm9udC13ZWlnaHQ9IjQwMCIgZm9udC1zdHJldGNoPSJub3JtYWwiIHVuaXRzLXBlci1lbT0iNTAwMCIgcGFub3NlLTE9IjIgMCA1IDMgMCAwIDAgMCAwIDAiIGFzY2VudD0iNTAwMCIgZGVzY2VudD0iMCIgeC1oZWlnaHQ9IjAiIGJib3g9Ii0xIDAgNTAxMSA1MDAwIiB1bmRlcmxpbmUtdGhpY2tuZXNzPSIwIiB1bmRlcmxpbmUtcG9zaXRpb249IjUwIiB1bmljb2RlLXJhbmdlPSJVK2VhMDEtZWEwZSIgLz48bWlzc2luZy1nbHlwaCBob3Jpei1hZHYteD0iMCIgIC8+PGdseXBoIGdseXBoLW5hbWU9ImFycm93LWxlZnQtZG91YmxlIiB1bmljb2RlPSImI3hlYTAxOyIgZD0iTTM3NTAgMzkwNiBsLTE0MDYgLTE0MDYgbDE0MDYgLTE0MDYgbDAgMzEyIGwtMTA5NCAxMDk0IGwxMDk0IDEwOTQgbDAgMzEyIFpNMjM0NCAzOTA2IGwtMTQwNiAtMTQwNiBsMTQwNiAtMTQwNiBsMCAzMTIgbC0xMDk0IDEwOTQgbDEwOTQgMTA5NCBsMCAzMTIgWiIgLz48Z2x5cGggZ2x5cGgtbmFtZT0iYXJyb3ctbGVmdCIgdW5pY29kZT0iJiN4ZWEwMjsiIGQ9Ik0xNTYzIDI1MDAgbDE4NzUgLTE4NzUgbDAgLTMxMiBsLTIxODggMjE4NyBsMjE4OCAyMTg4IGwwIC0zMTMgbC0xODc1IC0xODc1IFoiIC8+PGdseXBoIGdseXBoLW5hbWU9ImFycm93LXJpZ2h0LWRvdWJsZSIgdW5pY29kZT0iJiN4ZWEwMzsiIGQ9Ik0xMjUwIDEwOTQgbDE0MDYgMTQwNiBsLTE0MDYgMTQwNiBsMCAtMzEyIGwxMDk0IC0xMDk0IGwtMTA5NCAtMTA5NCBsMCAtMzEyIFpNMjY1NiAxMDk0IGwxNDA3IDE0MDYgbC0xNDA3IDE0MDYgbDAgLTMxMiBsMTA5NCAtMTA5NCBsLTEwOTQgLTEwOTQgbDAgLTMxMiBaIiAvPjxnbHlwaCBnbHlwaC1uYW1lPSJhcnJvdy1yaWdodCIgdW5pY29kZT0iJiN4ZWEwNDsiIGQ9Ik0zNDM4IDI1MDAgbC0xODc1IDE4NzUgbDAgMzEzIGwyMTg3IC0yMTg4IGwtMjE4NyAtMjE4NyBsMCAzMTIgbDE4NzUgMTg3NSBaIiAvPjxnbHlwaCBnbHlwaC1uYW1lPSJicmVhZGNydW1iIiB1bmljb2RlPSImI3hlYTA1OyIgZD0iTTE0OCA1MDAwIGwtMTQ4IC04NSBsMTM5NCAtMjQxNSBsLTEzOTQgLTI0MTUgbDE0OCAtODUgbDE0NDMgMjUwMCBsLTE0NDMgMjUwMCBaIiAvPjxnbHlwaCBnbHlwaC1uYW1lPSJjaGVja21hcmsiIHVuaWNvZGU9IiYjeGVhMDY7IiBkPSJNNDA0NSAzOTcxIGwtMjA2MSAtMjA2MSBsLTEwMjkgMTAyOSBsLTQ0MiAtNDQxIGwxNDcxIC0xNDcxIGwyNTAzIDI1MDIgbC00NDIgNDQyIFoiIC8+PGdseXBoIGdseXBoLW5hbWU9ImNsb3NlIiB1bmljb2RlPSImI3hlYTA3OyIgZD0iTTQzNzUgMTE1NiBsLTUzMSAtNTMxIGwtMTM0NCAxMzQ0IGwtMTM0NCAtMTM0NCBsLTUzMSA1MzEgbDEzNDQgMTM0NCBsLTEzNDQgMTM0NCBsNTMxIDUzMSBsMTM0NCAtMTM0NCBsMTM0NCAxMzQ0IGw1MzEgLTUzMSBsLTEzNDQgLTEzNDQgbDEzNDQgLTEzNDQgWiIgLz48Z2x5cGggZ2x5cGgtbmFtZT0iY29uZmlybSIgdW5pY29kZT0iJiN4ZWEwODsiIGQ9Ik0yNjU2IDQ4NDQgcS0xMDEgMCAtMTgwIC01NyBxLTc0IC01MiAtMTA5IC0xMzggcS0zNSAtODYgLTE5IC0xNzUgcTE4IC05NiA5MCAtMTY3IGwxNDk1IC0xNDk0IGwtMzYxNiAwIHEtNzcgMSAtMTM5IC0yNiBxLTU4IC0yNCAtOTkgLTcwIHEtMzkgLTQ0IC01OSAtMTAxIHEtMjAgLTU2IC0yMCAtMTE2IHEwIC02MCAyMCAtMTE2IHEyMCAtNTcgNTkgLTEwMSBxNDEgLTQ2IDk5IC03MCBxNjIgLTI3IDEzOSAtMjUgbDM2MTYgMCBsLTE0OTUgLTE0OTUgcS01NSAtNTMgLTgxIC0xMTYgcS0yNCAtNTkgLTIxIC0xMjEgcTMgLTU4IDMwIC0xMTMgcTI1IC01NCA2OCAtOTcgcTQzIC00MyA5NiAtNjggcTU1IC0yNiAxMTQgLTI5IHE2MiAtMyAxMjAgMjEgcTYzIDI1IDExNiA4MSBsMjAyOSAyMDI4IHE1OSA2MCA4MCAxNDEgcTIxIDgwIDEgMTU5IHEtMjEgODIgLTgxIDE0MiBsLTIwMjkgMjAyOCBxLTQ0IDQ1IC0xMDIgNzAgcS01OCAyNSAtMTIyIDI1IFoiIC8+PGdseXBoIGdseXBoLW5hbWU9ImluZm8iIHVuaWNvZGU9IiYjeGVhMDk7IiBkPSJNMjQyMiA0Njg4IHEtMTExIDAgLTIxMyAtNDMgcS05OCAtNDIgLTE3NCAtMTE3LjUgcS03NiAtNzUuNSAtMTE3IC0xNzQuNSBxLTQzIC0xMDEgLTQzIC0yMTIuNSBxMCAtMTExLjUgNDMgLTIxMi41IHE0MSAtOTggMTE3IC0xNzQgcTc2IC03NiAxNzQgLTExNyBxMTAyIC00MyAyMTMgLTQzIHExMTEgMCAyMTMgNDMgcTk4IDQxIDE3My41IDExNyBxNzUuNSA3NiAxMTcuNSAxNzQgcTQzIDEwMSA0MyAyMTIuNSBxMCAxMTEuNSAtNDMgMjEyLjUgcS00MiA5OSAtMTE3LjUgMTc0LjUgcS03NS41IDc1LjUgLTE3My41IDExNy41IHEtMTAyIDQzIC0yMTMgNDMgWk0xNTYzIDMxMjUgcS04NiAwIC0xNTggLTQzIHEtNzEgLTQxIC0xMTIgLTExMiBxLTQzIC03MiAtNDMgLTE1Ny41IHEwIC04NS41IDQzIC0xNTcuNSBxNDEgLTcxIDExMiAtMTEyIHE3MiAtNDMgMTU4IC00MyBsNjI1IDAgbDAgLTE1NjIgbC02MjUgMCBx
|
||
|
/**
|
||
|
* @copyright Copyright (c) 2019 Julius Härtl <jus@bitgrid.net>
|
||
|
*
|
||
|
* @author Julius Härtl <jus@bitgrid.net>
|
||
|
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
*/
|
||
|
A.VTooltip.options.defaultTemplate='<div class="vue-tooltip" role="tooltip" data-v-'.concat("e1f55ce",'><div class="tooltip-arrow"></div><div class="tooltip-inner"></div></div>'),A.VTooltip.options.defaultHtml=!1,t.default=A.VTooltip},138:function(e,t){},14:function(e,t){e.exports=__webpack_require__(/*! v-click-outside */ "./node_modules/v-click-outside/dist/v-click-outside.umd.js")},15:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.array.index-of */ "./node_modules/core-js/modules/es.array.index-of.js")},17:function(e,t,s){"use strict";s(4),s(21),s(23),s(30);t.a=function(e){return Math.random().toString(36).replace(/[^a-z]+/g,"").substr(0,e||5)}},178:function(e,t,s){"use strict";s.r(t);s(46),s(228),s(15),s(12),s(28);var A=s(5),n=s.n(A),a=s(38),o=s(105),r=s(32),i=function(e){return e&&"string"==typeof e&&""!==e.trim()&&-1===e.indexOf(" ")},c={name:"AppSidebar",components:{Actions:a.default},directives:{focus:o.default},mixins:[r.a],props:{active:{type:String,default:""},title:{type:String,default:"",required:!0},titleEditable:{type:Boolean,default:!1},titlePlaceholder:{type:String,default:""},subtitle:{type:String,default:""},background:{type:String,default:""},starred:{type:Boolean,default:null},starLoading:{type:Boolean,default:!1},compact:{type:Boolean,default:!1},forceMenu:{type:Boolean,default:!1}},data:function(){return{tabs:[],activeTab:"",isStarred:this.starred,children:[]}},computed:{canStar:function(){return null!==this.isStarred},hasFigure:function(){return this.$slots.header||this.background},hasMultipleTabs:function(){return this.tabs.length>1},hasFigureClickListener:function(){return this.$listeners["figure-click"]},currentTabIndex:function(){var e=this;return this.tabs.findIndex((function(t){return t.id===e.activeTab}))}},watch:{active:function(e){e!==this.activeTab&&this.updateActive()},starred:function(){this.isStarred=this.starred},children:function(){this.updateTabs()}},mounted:function(){this.updateTabs(),this.children=this.$children},methods:{closeSidebar:function(e){this.$emit("close",e)},onFigureClick:function(e){this.$emit("figure-click",e)},setActive:function(e){var t=e.target.closest("a").dataset.id;this.activeTab=t,this.$emit("update:active",t)},focusPreviousTab:function(){this.currentTabIndex>0&&(this.activeTab=this.tabs[this.currentTabIndex-1].id,this.$emit("update:active",this.activeTab)),this.focusActiveTab()},focusNextTab:function(){this.currentTabIndex<this.tabs.length-1&&(this.activeTab=this.tabs[this.currentTabIndex+1].id,this.$emit("update:active",this.activeTab)),this.focusActiveTab()},focusFirstTab:function(){this.activeTab=this.tabs[0].id,this.$emit("update:active",this.activeTab),this.focusActiveTab()},focusLastTab:function(){this.activeTab=this.tabs[this.tabs.length-1].id,this.$emit("update:active",this.activeTab),this.focusActiveTab()},focusActiveTab:function(){this.$el.querySelector("#"+this.activeTab).focus()},focusActiveTabContent:function(){this.$el.querySelector("#tab-"+this.activeTab).focus()},updateActive:function(){var e=this;this.activeTab=this.active&&-1!==this.tabs.findIndex((function(t){return t.id===e.active}))?this.active:this.tabs.length>0?this.tabs[0].id:""},toggleStarred:function(){this.isStarred=!this.isStarred,this.$emit("update:starred",this.isStarred)},updateTabs:function(){var e=this.$children.filter((function(e){return e.name&&"string"==typeof e.name&&i(e.id)&&i(e.icon)}));0!==e.length&&e.length!==this.$children.length&&n.a.util.warn("Mixing tabs and non-tab-content is not possible."),this.tabs=e.sort((function(e,t){var s=e.order||0,A=t.order||0;return s===A?OC.Util.naturalSortCompare(e.name,t.name):s-A})),this.tabs.length>0&&this.updateActive()},onTitleInput:function(e){this.$emit("input-title",e),this.$emit("update:title",e.target.value)},onSubmitTitle:function(e){this.$emit("submit-title",e)},onDismissEditing:function(){this.$emit("dismiss-editing")}}},l=(s(229),s(231),s(0)),m=s(138),g=s.n(m),u=Object(l.a)(c,(function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("transition",{attrs:{name:"slide-right"}},[s("aside",{attrs
|
||
|
/*
|
||
|
* @copyright 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||
|
*
|
||
|
* @author 2019 Christoph Wurst <christoph@winzerhof-wurst.at>
|
||
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*/t.default=d},2:function(e,t,s){"use strict";function A(e,t){for(var s=[],A={},n=0;n<t.length;n++){var a=t[n],o=a[0],r={id:e+":"+n,css:a[1],media:a[2],sourceMap:a[3]};A[o]?A[o].parts.push(r):s.push(A[o]={id:o,parts:[r]})}return s}s.r(t),s.d(t,"default",(function(){return u}));var n="undefined"!=typeof document;if("undefined"!=typeof DEBUG&&DEBUG&&!n)throw new Error("vue-style-loader cannot be used in a non-browser environment. Use { target: 'node' } in your Webpack config to indicate a server-rendering environment.");var a={},o=n&&(document.head||document.getElementsByTagName("head")[0]),r=null,i=0,c=!1,l=function(){},m=null,g="undefined"!=typeof navigator&&/msie [6-9]\b/.test(navigator.userAgent.toLowerCase());function u(e,t,s,n){c=s,m=n||{};var o=A(e,t);return d(o),function(t){for(var s=[],n=0;n<o.length;n++){var r=o[n];(i=a[r.id]).refs--,s.push(i)}t?d(o=A(e,t)):o=[];for(n=0;n<s.length;n++){var i;if(0===(i=s[n]).refs){for(var c=0;c<i.parts.length;c++)i.parts[c]();delete a[i.id]}}}}function d(e){for(var t=0;t<e.length;t++){var s=e[t],A=a[s.id];if(A){A.refs++;for(var n=0;n<A.parts.length;n++)A.parts[n](s.parts[n]);for(;n<s.parts.length;n++)A.parts.push(f(s.parts[n]));A.parts.length>s.parts.length&&(A.parts.length=s.parts.length)}else{var o=[];for(n=0;n<s.parts.length;n++)o.push(f(s.parts[n]));a[s.id]={id:s.id,refs:1,parts:o}}}}function p(){var e=document.createElement("style");return e.type="text/css",o.appendChild(e),e}function f(e){var t,s,A=document.querySelector('style[data-vue-ssr-id~="'+e.id+'"]');if(A){if(c)return l;A.parentNode.removeChild(A)}if(g){var n=i++;A=r||(r=p()),t=M.bind(null,A,n,!1),s=M.bind(null,A,n,!0)}else A=p(),t=b.bind(null,A),s=function(){A.parentNode.removeChild(A)};return t(e),function(A){if(A){if(A.css===e.css&&A.media===e.media&&A.sourceMap===e.sourceMap)return;t(e=A)}else s()}}var h,v=(h=[],function(e,t){return h[e]=t,h.filter(Boolean).join("\n")});function M(e,t,s,A){var n=s?"":A.css;if(e.styleSheet)e.styleSheet.cssText=v(t,n);else{var a=document.createTextNode(n),o=e.childNodes;o[t]&&e.removeChild(o[t]),o.length?e.insertBefore(a,o[t]):e.appendChild(a)}}function b(e,t){var s=t.css,A=t.media,n=t.sourceMap;if(A&&e.setAttribute("media",A),m.ssrId&&e.setAttribute("data-vue-ssr-id",t.id),n&&(s+="\n/*# sourceURL="+n.sources[0]+" */",s+="\n/*# sourceMappingURL=data:application/json;base64,"+btoa(unescape(encodeURIComponent(JSON.stringify(n))))+" */"),e.styleSheet)e.styleSheet.cssText=s;else{for(;e.firstChild;)e.removeChild(e.firstChild);e.appendChild(document.createTextNode(s))}}},21:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.regexp.exec */ "./node_modules/core-js/modules/es.regexp.exec.js")},22:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.array.map */ "./node_modules/core-js/modules/es.array.map.js")},228:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.array.find-index */ "./node_modules/core-js/modules/es.array.find-index.js")},229:function(e,t,s){"use strict";var A=s(106);s.n(A).a},23:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.regexp.to-string */ "./node_modules/core-js/modules/es.regexp.to-string.js")},230:function(e,t,s){(t=s(1)(!1)).push([e.i,"#app-sidebar[data-v-1059746a]{z-index:1500;height:calc(100vh - 50px);width:27vw;min-width:300px;max-width:500px;top:50px;right:0;display:flex;flex-shrink:0;flex-direction:column;position:-webkit-sticky;position:sticky;overflow-y:auto;overflow-x:hidden;background:var(--color-main-background);border-left:1px solid var(--color-border)}#app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-1059746a]{position:absolute;width:44px;height:44px;top:6px;right:6px;z-index:100;opacity:.7;border-radius:22px}#app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-1059746a]:hover,#app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-1059746a]:active,#app-sidebar .app-sidebar-header>.app-sidebar__close[data-v-1059746a]:focus{opacity:1;background-color:rgba(127,127,127,0.25)}#app-sidebar .app-sidebar-header__figure[data-v-1059746a]{max-height:250px;height:250px;wid
|
||
|
/**
|
||
|
* @copyright Copyright (c) 2018 John Molakvoæ <skjnldsv@protonmail.com>
|
||
|
*
|
||
|
* @author John Molakvoæ <skjnldsv@protonmail.com>
|
||
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
*/t.default=A.a},4:function(e,t){e.exports=__webpack_require__(/*! core-js/modules/es.object.to-string */ "./node_modules/core-js/modules/es.object.to-string.js")},40:function(e,t,s){var A=s(41);"string"==typeof A&&(A=[[e.i,A,""]]),A.locals&&(e.exports=A.locals);(0,s(2).default)("941c791e",A,!0,{})},41:function(e,t,s){(t=s(1)(!1)).push([e.i,".vue-tooltip[data-v-e1f55ce]{position:absolute;z-index:100000;right:auto;left:auto;display:block;margin:0;margin-top:-3px;padding:10px 0;text-align:left;text-align:start;white-space:normal;text-decoration:none;letter-spacing:normal;word-spacing:normal;text-transform:none;word-wrap:normal;word-break:normal;opacity:0;text-shadow:none;font-family:'Nunito', 'Open Sans', Frutiger, Calibri, 'Myriad Pro', Myriad, sans-serif;font-size:12px;font-weight:normal;font-style:normal;line-height:1.6;line-break:auto;filter:drop-shadow(0 1px 10px var(--color-box-shadow))}.vue-tooltip[data-v-e1f55ce][x-placement^='top'] .tooltip-arrow{bottom:0;margin-top:0;margin-bottom:0;border-width:10px 10px 0 10px;border-right-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.vue-tooltip[data-v-e1f55ce][x-placement^='bottom'] .tooltip-arrow{top:0;margin-top:0;margin-bottom:0;border-width:0 10px 10px 10px;border-top-color:transparent;border-right-color:transparent;border-left-color:transparent}.vue-tooltip[data-v-e1f55ce][x-placement^='right'] .tooltip-arrow{right:100%;margin-right:0;margin-left:0;border-width:10px 10px 10px 0;border-top-color:transparent;border-bottom-color:transparent;border-left-color:transparent}.vue-tooltip[data-v-e1f55ce][x-placement^='left'] .tooltip-arrow{left:100%;margin-right:0;margin-left:0;border-width:10px 0 10px 10px;border-top-color:transparent;border-right-color:transparent;border-bottom-color:transparent}.vue-tooltip[data-v-e1f55ce][aria-hidden='true']{visibility:hidden;transition:opacity .15s, visibility .15s;opacity:0}.vue-tooltip[data-v-e1f55ce][aria-hidden='false']{visibility:visible;transition:opacity .15s;opacity:1}.vue-tooltip[data-v-e1f55ce] .tooltip-inner{max-width:350px;padding:5px 8px;text-align:center;color:var(--color-main-text);border-radius:var(--border-radius);background-color:var(--color-main-background)}.vue-tooltip[data-v-e1f55ce] .tooltip-arrow{position:absolute;z-index:1;width:0;height:0;margin:0;border-style:solid;border-color:var(--color-main-background)}\n",""]),e.exports=t},43:function(e,t,s){"use strict";s(25),s(46),s(15);var A=s(14),n=s(13),a=s(17),o=(s(64),function(e){var t=e.getBoundingClientRect(),s=document.documentElement.clientHeight,A=document.documentElement.clientWidth,n=Object.assign({});return n.top=t.top<0,n.left=t.left<0,n.bottom=t.bottom>s,n.right=t.right>A,n.any=n.top||n.left||n.bottom||n.right,n.all=n.top&&n.left&&n.bottom&&n.right,n.offsetY=n.top?t.top:n.bottom?t.bottom-s:0,n.offsetX=n.left?t.left:n.right?t.right-A:0,n}),r=s(31),i=s(6),c=["ActionButton","ActionCheckbox","ActionInput","ActionLink","ActionRadio","ActionRouter","ActionSeparator","ActionText","ActionTextEditable"],l={name:"Actions",directives:{ClickOutside:A.directive,tooltip:n.default},props:{open:{type:Boolean,default:!1},forceMenu:{type:Boolean,default:!1},menuAlign:{type:String,default:"center",validator:function(e){return["left","center","right"].indexOf(e)>-1}},defaultIcon:{type:String,default:"action-item__menutoggle--default-icon"},ariaLabel:{type:String,default:Object(i.b)("Actions")}},data:function(){return{actions:[],opened:this.open,focusIndex:0,randomId:"menu-"+Object(a.a)(),offsetX:0,offsetY:0,offsetYArrow:0,rotateArrow:!1,children:this.$children}},computed:{hasMultipleActions:function(){return this.actions.length>1},isValidSingleAction:function(){return 1===this.actions.length&&null!==this.firstActionElement},firstActionVNode:function(){return this.actions[0]},firstAction:function(){return this.children[0]?this.children[0]:{}},firstActionBinding:function(){if(this.firstActionVNode&&this.firstActionVNode.componentOptions){var e=this.firstActionVNode.componentOptions.tag;if("ActionLink"===e)return{is:"a",href:this.firstAction.href,
|
||
|
//# sourceMappingURL=AppSidebar.js.map
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/dompurify/dist/purify.js":
|
||
|
/*!***********************************************!*\
|
||
|
!*** ./node_modules/dompurify/dist/purify.js ***!
|
||
|
\***********************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
(function (global, factory) {
|
||
|
true ? module.exports = factory() :
|
||
|
undefined;
|
||
|
}(this, (function () { 'use strict';
|
||
|
|
||
|
function _toConsumableArray$1(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
||
|
|
||
|
var hasOwnProperty = Object.hasOwnProperty;
|
||
|
var setPrototypeOf = Object.setPrototypeOf;
|
||
|
var isFrozen = Object.isFrozen;
|
||
|
var objectKeys = Object.keys;
|
||
|
var freeze = Object.freeze;
|
||
|
var seal = Object.seal; // eslint-disable-line import/no-mutable-exports
|
||
|
|
||
|
var _ref = typeof Reflect !== 'undefined' && Reflect;
|
||
|
var apply = _ref.apply;
|
||
|
var construct = _ref.construct;
|
||
|
|
||
|
if (!apply) {
|
||
|
apply = function apply(fun, thisValue, args) {
|
||
|
return fun.apply(thisValue, args);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (!freeze) {
|
||
|
freeze = function freeze(x) {
|
||
|
return x;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (!seal) {
|
||
|
seal = function seal(x) {
|
||
|
return x;
|
||
|
};
|
||
|
}
|
||
|
|
||
|
if (!construct) {
|
||
|
construct = function construct(Func, args) {
|
||
|
return new (Function.prototype.bind.apply(Func, [null].concat(_toConsumableArray$1(args))))();
|
||
|
};
|
||
|
}
|
||
|
|
||
|
var arrayForEach = unapply(Array.prototype.forEach);
|
||
|
var arrayIndexOf = unapply(Array.prototype.indexOf);
|
||
|
var arrayJoin = unapply(Array.prototype.join);
|
||
|
var arrayPop = unapply(Array.prototype.pop);
|
||
|
var arrayPush = unapply(Array.prototype.push);
|
||
|
var arraySlice = unapply(Array.prototype.slice);
|
||
|
|
||
|
var stringToLowerCase = unapply(String.prototype.toLowerCase);
|
||
|
var stringMatch = unapply(String.prototype.match);
|
||
|
var stringReplace = unapply(String.prototype.replace);
|
||
|
var stringIndexOf = unapply(String.prototype.indexOf);
|
||
|
var stringTrim = unapply(String.prototype.trim);
|
||
|
|
||
|
var regExpTest = unapply(RegExp.prototype.test);
|
||
|
var regExpCreate = unconstruct(RegExp);
|
||
|
|
||
|
var typeErrorCreate = unconstruct(TypeError);
|
||
|
|
||
|
function unapply(func) {
|
||
|
return function (thisArg) {
|
||
|
for (var _len = arguments.length, args = Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
|
args[_key - 1] = arguments[_key];
|
||
|
}
|
||
|
|
||
|
return apply(func, thisArg, args);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function unconstruct(func) {
|
||
|
return function () {
|
||
|
for (var _len2 = arguments.length, args = Array(_len2), _key2 = 0; _key2 < _len2; _key2++) {
|
||
|
args[_key2] = arguments[_key2];
|
||
|
}
|
||
|
|
||
|
return construct(func, args);
|
||
|
};
|
||
|
}
|
||
|
|
||
|
/* Add properties to a lookup table */
|
||
|
function addToSet(set, array) {
|
||
|
if (setPrototypeOf) {
|
||
|
// Make 'in' and truthy checks like Boolean(set.constructor)
|
||
|
// independent of any properties defined on Object.prototype.
|
||
|
// Prevent prototype setters from intercepting set as a this value.
|
||
|
setPrototypeOf(set, null);
|
||
|
}
|
||
|
|
||
|
var l = array.length;
|
||
|
while (l--) {
|
||
|
var element = array[l];
|
||
|
if (typeof element === 'string') {
|
||
|
var lcElement = stringToLowerCase(element);
|
||
|
if (lcElement !== element) {
|
||
|
// Config presets (e.g. tags.js, attrs.js) are immutable.
|
||
|
if (!isFrozen(array)) {
|
||
|
array[l] = lcElement;
|
||
|
}
|
||
|
|
||
|
element = lcElement;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
set[element] = true;
|
||
|
}
|
||
|
|
||
|
return set;
|
||
|
}
|
||
|
|
||
|
/* Shallow clone an object */
|
||
|
function clone(object) {
|
||
|
var newObject = {};
|
||
|
|
||
|
var property = void 0;
|
||
|
for (property in object) {
|
||
|
if (apply(hasOwnProperty, object, [property])) {
|
||
|
newObject[property] = object[property];
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return newObject;
|
||
|
}
|
||
|
|
||
|
var html = freeze(['a', 'abbr', 'acronym', 'address', 'area', 'article', 'aside', 'audio', 'b', 'bdi', 'bdo', 'big', 'blink', 'blockquote', 'body', 'br', 'button', 'canvas', 'caption', 'center', 'cite', 'code', 'col', 'colgroup', 'content', 'data', 'datalist', 'dd', 'decorator', 'del', 'details', 'dfn', 'dir', 'div', 'dl', 'dt', 'element', 'em', 'fieldset', 'figcaption', 'figure', 'font', 'footer', 'form', 'h1', 'h2', 'h3', 'h4', 'h5', 'h6', 'head', 'header', 'hgroup', 'hr', 'html', 'i', 'img', 'input', 'ins', 'kbd', 'label', 'legend', 'li', 'main', 'map', 'mark', 'marquee', 'menu', 'menuitem', 'meter', 'nav', 'nobr', 'ol', 'optgroup', 'option', 'output', 'p', 'picture', 'pre', 'progress', 'q', 'rp', 'rt', 'ruby', 's', 'samp', 'section', 'select', 'shadow', 'small', 'source', 'spacer', 'span', 'strike', 'strong', 'style', 'sub', 'summary', 'sup', 'table', 'tbody', 'td', 'template', 'textarea', 'tfoot', 'th', 'thead', 'time', 'tr', 'track', 'tt', 'u', 'ul', 'var', 'video', 'wbr']);
|
||
|
|
||
|
// SVG
|
||
|
var svg = freeze(['svg', 'a', 'altglyph', 'altglyphdef', 'altglyphitem', 'animatecolor', 'animatemotion', 'animatetransform', 'audio', 'canvas', 'circle', 'clippath', 'defs', 'desc', 'ellipse', 'filter', 'font', 'g', 'glyph', 'glyphref', 'hkern', 'image', 'line', 'lineargradient', 'marker', 'mask', 'metadata', 'mpath', 'path', 'pattern', 'polygon', 'polyline', 'radialgradient', 'rect', 'stop', 'style', 'switch', 'symbol', 'text', 'textpath', 'title', 'tref', 'tspan', 'video', 'view', 'vkern']);
|
||
|
|
||
|
var svgFilters = freeze(['feBlend', 'feColorMatrix', 'feComponentTransfer', 'feComposite', 'feConvolveMatrix', 'feDiffuseLighting', 'feDisplacementMap', 'feDistantLight', 'feFlood', 'feFuncA', 'feFuncB', 'feFuncG', 'feFuncR', 'feGaussianBlur', 'feMerge', 'feMergeNode', 'feMorphology', 'feOffset', 'fePointLight', 'feSpecularLighting', 'feSpotLight', 'feTile', 'feTurbulence']);
|
||
|
|
||
|
var mathMl = freeze(['math', 'menclose', 'merror', 'mfenced', 'mfrac', 'mglyph', 'mi', 'mlabeledtr', 'mmultiscripts', 'mn', 'mo', 'mover', 'mpadded', 'mphantom', 'mroot', 'mrow', 'ms', 'mspace', 'msqrt', 'mstyle', 'msub', 'msup', 'msubsup', 'mtable', 'mtd', 'mtext', 'mtr', 'munder', 'munderover']);
|
||
|
|
||
|
var text = freeze(['#text']);
|
||
|
|
||
|
var html$1 = freeze(['accept', 'action', 'align', 'alt', 'autocomplete', 'background', 'bgcolor', 'border', 'cellpadding', 'cellspacing', 'checked', 'cite', 'class', 'clear', 'color', 'cols', 'colspan', 'controls', 'coords', 'crossorigin', 'datetime', 'default', 'dir', 'disabled', 'download', 'enctype', 'face', 'for', 'headers', 'height', 'hidden', 'high', 'href', 'hreflang', 'id', 'integrity', 'ismap', 'label', 'lang', 'list', 'loop', 'low', 'max', 'maxlength', 'media', 'method', 'min', 'minlength', 'multiple', 'name', 'noshade', 'novalidate', 'nowrap', 'open', 'optimum', 'pattern', 'placeholder', 'poster', 'preload', 'pubdate', 'radiogroup', 'readonly', 'rel', 'required', 'rev', 'reversed', 'role', 'rows', 'rowspan', 'spellcheck', 'scope', 'selected', 'shape', 'size', 'sizes', 'span', 'srclang', 'start', 'src', 'srcset', 'step', 'style', 'summary', 'tabindex', 'title', 'type', 'usemap', 'valign', 'value', 'width', 'xmlns']);
|
||
|
|
||
|
var svg$1 = freeze(['accent-height', 'accumulate', 'additive', 'alignment-baseline', 'ascent', 'attributename', 'attributetype', 'azimuth', 'basefrequency', 'baseline-shift', 'begin', 'bias', 'by', 'class', 'clip', 'clip-path', 'clip-rule', 'color', 'color-interpolation', 'color-interpolation-filters', 'color-profile', 'color-rendering', 'cx', 'cy', 'd', 'dx', 'dy', 'diffuseconstant', 'direction', 'display', 'divisor', 'dur', 'edgemode', 'elevation', 'end', 'fill', 'fill-opacity', 'fill-rule', 'filter', 'filterunits', 'flood-color', 'flood-opacity', 'font-family', 'font-size', 'font-size-adjust', 'font-stretch', 'font-style', 'font-variant', 'font-weight', 'fx', 'fy', 'g1', 'g2', 'glyph-name', 'glyphref', 'gradientunits', 'gradienttransform', 'height', 'href', 'id', 'image-rendering', 'in', 'in2', 'k', 'k1', 'k2', 'k3', 'k4', 'kerning', 'keypoints', 'keysplines', 'keytimes', 'lang', 'lengthadjust', 'letter-spacing', 'kernelmatrix', 'kernelunitlength', 'lighting-color', 'local', 'marker-end', 'marker-mid', 'marker-start', 'markerheight', 'markerunits', 'markerwidth', 'maskcontentunits', 'maskunits', 'max', 'mask', 'media', 'method', 'mode', 'min', 'name', 'numoctaves', 'offset', 'operator', 'opacity', 'order', 'orient', 'orientation', 'origin', 'overflow', 'paint-order', 'path', 'pathlength', 'patterncontentunits', 'patterntransform', 'patternunits', 'points', 'preservealpha', 'preserveaspectratio', 'primitiveunits', 'r', 'rx', 'ry', 'radius', 'refx', 'refy', 'repeatcount', 'repeatdur', 'restart', 'result', 'rotate', 'scale', 'seed', 'shape-rendering', 'specularconstant', 'specularexponent', 'spreadmethod', 'stddeviation', 'stitchtiles', 'stop-color', 'stop-opacity', 'stroke-dasharray', 'stroke-dashoffset', 'stroke-linecap', 'stroke-linejoin', 'stroke-miterlimit', 'stroke-opacity', 'stroke', 'stroke-width', 'style', 'surfacescale', 'tabindex', 'targetx', 'targety', 'transform', 'text-anchor', 'text-decoration', 'text-rendering', 'textlength', 'type', 'u1', 'u2', 'unicode', 'values', 'viewbox', 'visibility', 'version', 'vert-adv-y', 'vert-origin-x', 'vert-origin-y', 'width', 'word-spacing', 'wrap', 'writing-mode', 'xchannelselector', 'ychannelselector', 'x', 'x1', 'x2', 'xmlns', 'y', 'y1', 'y2', 'z', 'zoomandpan']);
|
||
|
|
||
|
var mathMl$1 = freeze(['accent', 'accentunder', 'align', 'bevelled', 'close', 'columnsalign', 'columnlines', 'columnspan', 'denomalign', 'depth', 'dir', 'display', 'displaystyle', 'encoding', 'fence', 'frame', 'height', 'href', 'id', 'largeop', 'length', 'linethickness', 'lspace', 'lquote', 'mathbackground', 'mathcolor', 'mathsize', 'mathvariant', 'maxsize', 'minsize', 'movablelimits', 'notation', 'numalign', 'open', 'rowalign', 'rowlines', 'rowspacing', 'rowspan', 'rspace', 'rquote', 'scriptlevel', 'scriptminsize', 'scriptsizemultiplier', 'selection', 'separator', 'separators', 'stretchy', 'subscriptshift', 'supscriptshift', 'symmetric', 'voffset', 'width', 'xmlns']);
|
||
|
|
||
|
var xml = freeze(['xlink:href', 'xml:id', 'xlink:title', 'xml:space', 'xmlns:xlink']);
|
||
|
|
||
|
var MUSTACHE_EXPR = seal(/\{\{[\s\S]*|[\s\S]*\}\}/gm); // Specify template detection regex for SAFE_FOR_TEMPLATES mode
|
||
|
var ERB_EXPR = seal(/<%[\s\S]*|[\s\S]*%>/gm);
|
||
|
var DATA_ATTR = seal(/^data-[\-\w.\u00B7-\uFFFF]/); // eslint-disable-line no-useless-escape
|
||
|
var ARIA_ATTR = seal(/^aria-[\-\w]+$/); // eslint-disable-line no-useless-escape
|
||
|
var IS_ALLOWED_URI = seal(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape
|
||
|
);
|
||
|
var IS_SCRIPT_OR_DATA = seal(/^(?:\w+script|data):/i);
|
||
|
var ATTR_WHITESPACE = seal(/[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205f\u3000]/g // eslint-disable-line no-control-regex
|
||
|
);
|
||
|
|
||
|
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
||
|
|
||
|
function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } }
|
||
|
|
||
|
var getGlobal = function getGlobal() {
|
||
|
return typeof window === 'undefined' ? null : window;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Creates a no-op policy for internal use only.
|
||
|
* Don't export this function outside this module!
|
||
|
* @param {?TrustedTypePolicyFactory} trustedTypes The policy factory.
|
||
|
* @param {Document} document The document object (to determine policy name suffix)
|
||
|
* @return {?TrustedTypePolicy} The policy created (or null, if Trusted Types
|
||
|
* are not supported).
|
||
|
*/
|
||
|
var _createTrustedTypesPolicy = function _createTrustedTypesPolicy(trustedTypes, document) {
|
||
|
if ((typeof trustedTypes === 'undefined' ? 'undefined' : _typeof(trustedTypes)) !== 'object' || typeof trustedTypes.createPolicy !== 'function') {
|
||
|
return null;
|
||
|
}
|
||
|
|
||
|
// Allow the callers to control the unique policy name
|
||
|
// by adding a data-tt-policy-suffix to the script element with the DOMPurify.
|
||
|
// Policy creation with duplicate names throws in Trusted Types.
|
||
|
var suffix = null;
|
||
|
var ATTR_NAME = 'data-tt-policy-suffix';
|
||
|
if (document.currentScript && document.currentScript.hasAttribute(ATTR_NAME)) {
|
||
|
suffix = document.currentScript.getAttribute(ATTR_NAME);
|
||
|
}
|
||
|
|
||
|
var policyName = 'dompurify' + (suffix ? '#' + suffix : '');
|
||
|
|
||
|
try {
|
||
|
return trustedTypes.createPolicy(policyName, {
|
||
|
createHTML: function createHTML(html$$1) {
|
||
|
return html$$1;
|
||
|
}
|
||
|
});
|
||
|
} catch (error) {
|
||
|
// Policy creation failed (most likely another DOMPurify script has
|
||
|
// already run). Skip creating the policy, as this will only cause errors
|
||
|
// if TT are enforced.
|
||
|
console.warn('TrustedTypes policy ' + policyName + ' could not be created.');
|
||
|
return null;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
function createDOMPurify() {
|
||
|
var window = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : getGlobal();
|
||
|
|
||
|
var DOMPurify = function DOMPurify(root) {
|
||
|
return createDOMPurify(root);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Version label, exposed for easier checks
|
||
|
* if DOMPurify is up to date or not
|
||
|
*/
|
||
|
DOMPurify.version = '2.0.8';
|
||
|
|
||
|
/**
|
||
|
* Array of elements that DOMPurify removed during sanitation.
|
||
|
* Empty if nothing was removed.
|
||
|
*/
|
||
|
DOMPurify.removed = [];
|
||
|
|
||
|
if (!window || !window.document || window.document.nodeType !== 9) {
|
||
|
// Not running in a browser, provide a factory function
|
||
|
// so that you can pass your own Window
|
||
|
DOMPurify.isSupported = false;
|
||
|
|
||
|
return DOMPurify;
|
||
|
}
|
||
|
|
||
|
var originalDocument = window.document;
|
||
|
var useDOMParser = false;
|
||
|
var removeTitle = false;
|
||
|
|
||
|
var document = window.document;
|
||
|
var DocumentFragment = window.DocumentFragment,
|
||
|
HTMLTemplateElement = window.HTMLTemplateElement,
|
||
|
Node = window.Node,
|
||
|
NodeFilter = window.NodeFilter,
|
||
|
_window$NamedNodeMap = window.NamedNodeMap,
|
||
|
NamedNodeMap = _window$NamedNodeMap === undefined ? window.NamedNodeMap || window.MozNamedAttrMap : _window$NamedNodeMap,
|
||
|
Text = window.Text,
|
||
|
Comment = window.Comment,
|
||
|
DOMParser = window.DOMParser,
|
||
|
trustedTypes = window.trustedTypes;
|
||
|
|
||
|
// As per issue #47, the web-components registry is inherited by a
|
||
|
// new document created via createHTMLDocument. As per the spec
|
||
|
// (http://w3c.github.io/webcomponents/spec/custom/#creating-and-passing-registries)
|
||
|
// a new empty registry is used when creating a template contents owner
|
||
|
// document, so we use that as our parent document to ensure nothing
|
||
|
// is inherited.
|
||
|
|
||
|
if (typeof HTMLTemplateElement === 'function') {
|
||
|
var template = document.createElement('template');
|
||
|
if (template.content && template.content.ownerDocument) {
|
||
|
document = template.content.ownerDocument;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
var trustedTypesPolicy = _createTrustedTypesPolicy(trustedTypes, originalDocument);
|
||
|
var emptyHTML = trustedTypesPolicy ? trustedTypesPolicy.createHTML('') : '';
|
||
|
|
||
|
var _document = document,
|
||
|
implementation = _document.implementation,
|
||
|
createNodeIterator = _document.createNodeIterator,
|
||
|
getElementsByTagName = _document.getElementsByTagName,
|
||
|
createDocumentFragment = _document.createDocumentFragment;
|
||
|
var importNode = originalDocument.importNode;
|
||
|
|
||
|
|
||
|
var hooks = {};
|
||
|
|
||
|
/**
|
||
|
* Expose whether this browser supports running the full DOMPurify.
|
||
|
*/
|
||
|
DOMPurify.isSupported = implementation && typeof implementation.createHTMLDocument !== 'undefined' && document.documentMode !== 9;
|
||
|
|
||
|
var MUSTACHE_EXPR$$1 = MUSTACHE_EXPR,
|
||
|
ERB_EXPR$$1 = ERB_EXPR,
|
||
|
DATA_ATTR$$1 = DATA_ATTR,
|
||
|
ARIA_ATTR$$1 = ARIA_ATTR,
|
||
|
IS_SCRIPT_OR_DATA$$1 = IS_SCRIPT_OR_DATA,
|
||
|
ATTR_WHITESPACE$$1 = ATTR_WHITESPACE;
|
||
|
var IS_ALLOWED_URI$$1 = IS_ALLOWED_URI;
|
||
|
|
||
|
/**
|
||
|
* We consider the elements and attributes below to be safe. Ideally
|
||
|
* don't add any new ones but feel free to remove unwanted ones.
|
||
|
*/
|
||
|
|
||
|
/* allowed element names */
|
||
|
|
||
|
var ALLOWED_TAGS = null;
|
||
|
var DEFAULT_ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(html), _toConsumableArray(svg), _toConsumableArray(svgFilters), _toConsumableArray(mathMl), _toConsumableArray(text)));
|
||
|
|
||
|
/* Allowed attribute names */
|
||
|
var ALLOWED_ATTR = null;
|
||
|
var DEFAULT_ALLOWED_ATTR = addToSet({}, [].concat(_toConsumableArray(html$1), _toConsumableArray(svg$1), _toConsumableArray(mathMl$1), _toConsumableArray(xml)));
|
||
|
|
||
|
/* Explicitly forbidden tags (overrides ALLOWED_TAGS/ADD_TAGS) */
|
||
|
var FORBID_TAGS = null;
|
||
|
|
||
|
/* Explicitly forbidden attributes (overrides ALLOWED_ATTR/ADD_ATTR) */
|
||
|
var FORBID_ATTR = null;
|
||
|
|
||
|
/* Decide if ARIA attributes are okay */
|
||
|
var ALLOW_ARIA_ATTR = true;
|
||
|
|
||
|
/* Decide if custom data attributes are okay */
|
||
|
var ALLOW_DATA_ATTR = true;
|
||
|
|
||
|
/* Decide if unknown protocols are okay */
|
||
|
var ALLOW_UNKNOWN_PROTOCOLS = false;
|
||
|
|
||
|
/* Output should be safe for jQuery's $() factory? */
|
||
|
var SAFE_FOR_JQUERY = false;
|
||
|
|
||
|
/* Output should be safe for common template engines.
|
||
|
* This means, DOMPurify removes data attributes, mustaches and ERB
|
||
|
*/
|
||
|
var SAFE_FOR_TEMPLATES = false;
|
||
|
|
||
|
/* Decide if document with <html>... should be returned */
|
||
|
var WHOLE_DOCUMENT = false;
|
||
|
|
||
|
/* Track whether config is already set on this instance of DOMPurify. */
|
||
|
var SET_CONFIG = false;
|
||
|
|
||
|
/* Decide if all elements (e.g. style, script) must be children of
|
||
|
* document.body. By default, browsers might move them to document.head */
|
||
|
var FORCE_BODY = false;
|
||
|
|
||
|
/* Decide if a DOM `HTMLBodyElement` should be returned, instead of a html
|
||
|
* string (or a TrustedHTML object if Trusted Types are supported).
|
||
|
* If `WHOLE_DOCUMENT` is enabled a `HTMLHtmlElement` will be returned instead
|
||
|
*/
|
||
|
var RETURN_DOM = false;
|
||
|
|
||
|
/* Decide if a DOM `DocumentFragment` should be returned, instead of a html
|
||
|
* string (or a TrustedHTML object if Trusted Types are supported) */
|
||
|
var RETURN_DOM_FRAGMENT = false;
|
||
|
|
||
|
/* If `RETURN_DOM` or `RETURN_DOM_FRAGMENT` is enabled, decide if the returned DOM
|
||
|
* `Node` is imported into the current `Document`. If this flag is not enabled the
|
||
|
* `Node` will belong (its ownerDocument) to a fresh `HTMLDocument`, created by
|
||
|
* DOMPurify. */
|
||
|
var RETURN_DOM_IMPORT = false;
|
||
|
|
||
|
/* Try to return a Trusted Type object instead of a string, retrun a string in
|
||
|
* case Trusted Types are not supported */
|
||
|
var RETURN_TRUSTED_TYPE = false;
|
||
|
|
||
|
/* Output should be free from DOM clobbering attacks? */
|
||
|
var SANITIZE_DOM = true;
|
||
|
|
||
|
/* Keep element content when removing element? */
|
||
|
var KEEP_CONTENT = true;
|
||
|
|
||
|
/* If a `Node` is passed to sanitize(), then performs sanitization in-place instead
|
||
|
* of importing it into a new Document and returning a sanitized copy */
|
||
|
var IN_PLACE = false;
|
||
|
|
||
|
/* Allow usage of profiles like html, svg and mathMl */
|
||
|
var USE_PROFILES = {};
|
||
|
|
||
|
/* Tags to ignore content of when KEEP_CONTENT is true */
|
||
|
var FORBID_CONTENTS = addToSet({}, ['annotation-xml', 'audio', 'colgroup', 'desc', 'foreignobject', 'head', 'iframe', 'math', 'mi', 'mn', 'mo', 'ms', 'mtext', 'noembed', 'noframes', 'plaintext', 'script', 'style', 'svg', 'template', 'thead', 'title', 'video', 'xmp']);
|
||
|
|
||
|
/* Tags that are safe for data: URIs */
|
||
|
var DATA_URI_TAGS = addToSet({}, ['audio', 'video', 'img', 'source', 'image']);
|
||
|
|
||
|
/* Attributes safe for values like "javascript:" */
|
||
|
var URI_SAFE_ATTRIBUTES = null;
|
||
|
var DEFAULT_URI_SAFE_ATTRIBUTES = addToSet({}, ['alt', 'class', 'for', 'id', 'label', 'name', 'pattern', 'placeholder', 'summary', 'title', 'value', 'style', 'xmlns']);
|
||
|
|
||
|
/* Keep a reference to config to pass to hooks */
|
||
|
var CONFIG = null;
|
||
|
|
||
|
/* Ideally, do not touch anything below this line */
|
||
|
/* ______________________________________________ */
|
||
|
|
||
|
var formElement = document.createElement('form');
|
||
|
|
||
|
/**
|
||
|
* _parseConfig
|
||
|
*
|
||
|
* @param {Object} cfg optional config literal
|
||
|
*/
|
||
|
// eslint-disable-next-line complexity
|
||
|
var _parseConfig = function _parseConfig(cfg) {
|
||
|
if (CONFIG && CONFIG === cfg) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
/* Shield configuration object from tampering */
|
||
|
if (!cfg || (typeof cfg === 'undefined' ? 'undefined' : _typeof(cfg)) !== 'object') {
|
||
|
cfg = {};
|
||
|
}
|
||
|
|
||
|
/* Set configuration parameters */
|
||
|
ALLOWED_TAGS = 'ALLOWED_TAGS' in cfg ? addToSet({}, cfg.ALLOWED_TAGS) : DEFAULT_ALLOWED_TAGS;
|
||
|
ALLOWED_ATTR = 'ALLOWED_ATTR' in cfg ? addToSet({}, cfg.ALLOWED_ATTR) : DEFAULT_ALLOWED_ATTR;
|
||
|
URI_SAFE_ATTRIBUTES = 'ADD_URI_SAFE_ATTR' in cfg ? addToSet(clone(DEFAULT_URI_SAFE_ATTRIBUTES), cfg.ADD_URI_SAFE_ATTR) : DEFAULT_URI_SAFE_ATTRIBUTES;
|
||
|
FORBID_TAGS = 'FORBID_TAGS' in cfg ? addToSet({}, cfg.FORBID_TAGS) : {};
|
||
|
FORBID_ATTR = 'FORBID_ATTR' in cfg ? addToSet({}, cfg.FORBID_ATTR) : {};
|
||
|
USE_PROFILES = 'USE_PROFILES' in cfg ? cfg.USE_PROFILES : false;
|
||
|
ALLOW_ARIA_ATTR = cfg.ALLOW_ARIA_ATTR !== false; // Default true
|
||
|
ALLOW_DATA_ATTR = cfg.ALLOW_DATA_ATTR !== false; // Default true
|
||
|
ALLOW_UNKNOWN_PROTOCOLS = cfg.ALLOW_UNKNOWN_PROTOCOLS || false; // Default false
|
||
|
SAFE_FOR_JQUERY = cfg.SAFE_FOR_JQUERY || false; // Default false
|
||
|
SAFE_FOR_TEMPLATES = cfg.SAFE_FOR_TEMPLATES || false; // Default false
|
||
|
WHOLE_DOCUMENT = cfg.WHOLE_DOCUMENT || false; // Default false
|
||
|
RETURN_DOM = cfg.RETURN_DOM || false; // Default false
|
||
|
RETURN_DOM_FRAGMENT = cfg.RETURN_DOM_FRAGMENT || false; // Default false
|
||
|
RETURN_DOM_IMPORT = cfg.RETURN_DOM_IMPORT || false; // Default false
|
||
|
RETURN_TRUSTED_TYPE = cfg.RETURN_TRUSTED_TYPE || false; // Default false
|
||
|
FORCE_BODY = cfg.FORCE_BODY || false; // Default false
|
||
|
SANITIZE_DOM = cfg.SANITIZE_DOM !== false; // Default true
|
||
|
KEEP_CONTENT = cfg.KEEP_CONTENT !== false; // Default true
|
||
|
IN_PLACE = cfg.IN_PLACE || false; // Default false
|
||
|
IS_ALLOWED_URI$$1 = cfg.ALLOWED_URI_REGEXP || IS_ALLOWED_URI$$1;
|
||
|
if (SAFE_FOR_TEMPLATES) {
|
||
|
ALLOW_DATA_ATTR = false;
|
||
|
}
|
||
|
|
||
|
if (RETURN_DOM_FRAGMENT) {
|
||
|
RETURN_DOM = true;
|
||
|
}
|
||
|
|
||
|
/* Parse profile info */
|
||
|
if (USE_PROFILES) {
|
||
|
ALLOWED_TAGS = addToSet({}, [].concat(_toConsumableArray(text)));
|
||
|
ALLOWED_ATTR = [];
|
||
|
if (USE_PROFILES.html === true) {
|
||
|
addToSet(ALLOWED_TAGS, html);
|
||
|
addToSet(ALLOWED_ATTR, html$1);
|
||
|
}
|
||
|
|
||
|
if (USE_PROFILES.svg === true) {
|
||
|
addToSet(ALLOWED_TAGS, svg);
|
||
|
addToSet(ALLOWED_ATTR, svg$1);
|
||
|
addToSet(ALLOWED_ATTR, xml);
|
||
|
}
|
||
|
|
||
|
if (USE_PROFILES.svgFilters === true) {
|
||
|
addToSet(ALLOWED_TAGS, svgFilters);
|
||
|
addToSet(ALLOWED_ATTR, svg$1);
|
||
|
addToSet(ALLOWED_ATTR, xml);
|
||
|
}
|
||
|
|
||
|
if (USE_PROFILES.mathMl === true) {
|
||
|
addToSet(ALLOWED_TAGS, mathMl);
|
||
|
addToSet(ALLOWED_ATTR, mathMl$1);
|
||
|
addToSet(ALLOWED_ATTR, xml);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Merge configuration parameters */
|
||
|
if (cfg.ADD_TAGS) {
|
||
|
if (ALLOWED_TAGS === DEFAULT_ALLOWED_TAGS) {
|
||
|
ALLOWED_TAGS = clone(ALLOWED_TAGS);
|
||
|
}
|
||
|
|
||
|
addToSet(ALLOWED_TAGS, cfg.ADD_TAGS);
|
||
|
}
|
||
|
|
||
|
if (cfg.ADD_ATTR) {
|
||
|
if (ALLOWED_ATTR === DEFAULT_ALLOWED_ATTR) {
|
||
|
ALLOWED_ATTR = clone(ALLOWED_ATTR);
|
||
|
}
|
||
|
|
||
|
addToSet(ALLOWED_ATTR, cfg.ADD_ATTR);
|
||
|
}
|
||
|
|
||
|
if (cfg.ADD_URI_SAFE_ATTR) {
|
||
|
addToSet(URI_SAFE_ATTRIBUTES, cfg.ADD_URI_SAFE_ATTR);
|
||
|
}
|
||
|
|
||
|
/* Add #text in case KEEP_CONTENT is set to true */
|
||
|
if (KEEP_CONTENT) {
|
||
|
ALLOWED_TAGS['#text'] = true;
|
||
|
}
|
||
|
|
||
|
/* Add html, head and body to ALLOWED_TAGS in case WHOLE_DOCUMENT is true */
|
||
|
if (WHOLE_DOCUMENT) {
|
||
|
addToSet(ALLOWED_TAGS, ['html', 'head', 'body']);
|
||
|
}
|
||
|
|
||
|
/* Add tbody to ALLOWED_TAGS in case tables are permitted, see #286, #365 */
|
||
|
if (ALLOWED_TAGS.table) {
|
||
|
addToSet(ALLOWED_TAGS, ['tbody']);
|
||
|
delete FORBID_TAGS.tbody;
|
||
|
}
|
||
|
|
||
|
// Prevent further manipulation of configuration.
|
||
|
// Not available in IE8, Safari 5, etc.
|
||
|
if (freeze) {
|
||
|
freeze(cfg);
|
||
|
}
|
||
|
|
||
|
CONFIG = cfg;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _forceRemove
|
||
|
*
|
||
|
* @param {Node} node a DOM node
|
||
|
*/
|
||
|
var _forceRemove = function _forceRemove(node) {
|
||
|
arrayPush(DOMPurify.removed, { element: node });
|
||
|
try {
|
||
|
node.parentNode.removeChild(node);
|
||
|
} catch (error) {
|
||
|
node.outerHTML = emptyHTML;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _removeAttribute
|
||
|
*
|
||
|
* @param {String} name an Attribute name
|
||
|
* @param {Node} node a DOM node
|
||
|
*/
|
||
|
var _removeAttribute = function _removeAttribute(name, node) {
|
||
|
try {
|
||
|
arrayPush(DOMPurify.removed, {
|
||
|
attribute: node.getAttributeNode(name),
|
||
|
from: node
|
||
|
});
|
||
|
} catch (error) {
|
||
|
arrayPush(DOMPurify.removed, {
|
||
|
attribute: null,
|
||
|
from: node
|
||
|
});
|
||
|
}
|
||
|
|
||
|
node.removeAttribute(name);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _initDocument
|
||
|
*
|
||
|
* @param {String} dirty a string of dirty markup
|
||
|
* @return {Document} a DOM, filled with the dirty markup
|
||
|
*/
|
||
|
var _initDocument = function _initDocument(dirty) {
|
||
|
/* Create a HTML document */
|
||
|
var doc = void 0;
|
||
|
var leadingWhitespace = void 0;
|
||
|
|
||
|
if (FORCE_BODY) {
|
||
|
dirty = '<remove></remove>' + dirty;
|
||
|
} else {
|
||
|
/* If FORCE_BODY isn't used, leading whitespace needs to be preserved manually */
|
||
|
var matches = stringMatch(dirty, /^[\s]+/);
|
||
|
leadingWhitespace = matches && matches[0];
|
||
|
}
|
||
|
|
||
|
var dirtyPayload = trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
|
||
|
/* Use DOMParser to workaround Firefox bug (see comment below) */
|
||
|
if (useDOMParser) {
|
||
|
try {
|
||
|
doc = new DOMParser().parseFromString(dirtyPayload, 'text/html');
|
||
|
} catch (error) {}
|
||
|
}
|
||
|
|
||
|
/* Remove title to fix a mXSS bug in older MS Edge */
|
||
|
if (removeTitle) {
|
||
|
addToSet(FORBID_TAGS, ['title']);
|
||
|
}
|
||
|
|
||
|
/* Otherwise use createHTMLDocument, because DOMParser is unsafe in
|
||
|
Safari (see comment below) */
|
||
|
if (!doc || !doc.documentElement) {
|
||
|
doc = implementation.createHTMLDocument('');
|
||
|
var _doc = doc,
|
||
|
body = _doc.body;
|
||
|
|
||
|
body.parentNode.removeChild(body.parentNode.firstElementChild);
|
||
|
body.outerHTML = dirtyPayload;
|
||
|
}
|
||
|
|
||
|
if (dirty && leadingWhitespace) {
|
||
|
doc.body.insertBefore(document.createTextNode(leadingWhitespace), doc.body.childNodes[0] || null);
|
||
|
}
|
||
|
|
||
|
/* Work on whole document or just its body */
|
||
|
return getElementsByTagName.call(doc, WHOLE_DOCUMENT ? 'html' : 'body')[0];
|
||
|
};
|
||
|
|
||
|
// Firefox uses a different parser for innerHTML rather than
|
||
|
// DOMParser (see https://bugzilla.mozilla.org/show_bug.cgi?id=1205631)
|
||
|
// which means that you *must* use DOMParser, otherwise the output may
|
||
|
// not be safe if used in a document.write context later.
|
||
|
//
|
||
|
// So we feature detect the Firefox bug and use the DOMParser if necessary.
|
||
|
//
|
||
|
// Chrome 77 and other versions ship an mXSS bug that caused a bypass to
|
||
|
// happen. We now check for the mXSS trigger and react accordingly.
|
||
|
if (DOMPurify.isSupported) {
|
||
|
(function () {
|
||
|
try {
|
||
|
var doc = _initDocument('<svg><p><textarea><img src="</textarea><img src=x abc=1//">');
|
||
|
if (doc.querySelector('svg img')) {
|
||
|
useDOMParser = true;
|
||
|
}
|
||
|
} catch (error) {}
|
||
|
})();
|
||
|
|
||
|
(function () {
|
||
|
try {
|
||
|
var doc = _initDocument('<x/><title></title><img>');
|
||
|
if (regExpTest(/<\/title/, doc.querySelector('title').innerHTML)) {
|
||
|
removeTitle = true;
|
||
|
}
|
||
|
} catch (error) {}
|
||
|
})();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* _createIterator
|
||
|
*
|
||
|
* @param {Document} root document/fragment to create iterator for
|
||
|
* @return {Iterator} iterator instance
|
||
|
*/
|
||
|
var _createIterator = function _createIterator(root) {
|
||
|
return createNodeIterator.call(root.ownerDocument || root, root, NodeFilter.SHOW_ELEMENT | NodeFilter.SHOW_COMMENT | NodeFilter.SHOW_TEXT, function () {
|
||
|
return NodeFilter.FILTER_ACCEPT;
|
||
|
}, false);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _isClobbered
|
||
|
*
|
||
|
* @param {Node} elm element to check for clobbering attacks
|
||
|
* @return {Boolean} true if clobbered, false if safe
|
||
|
*/
|
||
|
var _isClobbered = function _isClobbered(elm) {
|
||
|
if (elm instanceof Text || elm instanceof Comment) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
if (typeof elm.nodeName !== 'string' || typeof elm.textContent !== 'string' || typeof elm.removeChild !== 'function' || !(elm.attributes instanceof NamedNodeMap) || typeof elm.removeAttribute !== 'function' || typeof elm.setAttribute !== 'function' || typeof elm.namespaceURI !== 'string') {
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _isNode
|
||
|
*
|
||
|
* @param {Node} obj object to check whether it's a DOM node
|
||
|
* @return {Boolean} true is object is a DOM node
|
||
|
*/
|
||
|
var _isNode = function _isNode(obj) {
|
||
|
return (typeof Node === 'undefined' ? 'undefined' : _typeof(Node)) === 'object' ? obj instanceof Node : obj && (typeof obj === 'undefined' ? 'undefined' : _typeof(obj)) === 'object' && typeof obj.nodeType === 'number' && typeof obj.nodeName === 'string';
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _executeHook
|
||
|
* Execute user configurable hooks
|
||
|
*
|
||
|
* @param {String} entryPoint Name of the hook's entry point
|
||
|
* @param {Node} currentNode node to work on with the hook
|
||
|
* @param {Object} data additional hook parameters
|
||
|
*/
|
||
|
var _executeHook = function _executeHook(entryPoint, currentNode, data) {
|
||
|
if (!hooks[entryPoint]) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
arrayForEach(hooks[entryPoint], function (hook) {
|
||
|
hook.call(DOMPurify, currentNode, data, CONFIG);
|
||
|
});
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _sanitizeElements
|
||
|
*
|
||
|
* @protect nodeName
|
||
|
* @protect textContent
|
||
|
* @protect removeChild
|
||
|
*
|
||
|
* @param {Node} currentNode to check for permission to exist
|
||
|
* @return {Boolean} true if node was killed, false if left alive
|
||
|
*/
|
||
|
// eslint-disable-next-line complexity
|
||
|
var _sanitizeElements = function _sanitizeElements(currentNode) {
|
||
|
var content = void 0;
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('beforeSanitizeElements', currentNode, null);
|
||
|
|
||
|
/* Check if element is clobbered or can clobber */
|
||
|
if (_isClobbered(currentNode)) {
|
||
|
_forceRemove(currentNode);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/* Now let's check the element's type and name */
|
||
|
var tagName = stringToLowerCase(currentNode.nodeName);
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('uponSanitizeElement', currentNode, {
|
||
|
tagName: tagName,
|
||
|
allowedTags: ALLOWED_TAGS
|
||
|
});
|
||
|
|
||
|
/* Take care of an mXSS pattern using p, br inside svg, math */
|
||
|
if ((tagName === 'svg' || tagName === 'math') && currentNode.querySelectorAll('p, br').length !== 0) {
|
||
|
_forceRemove(currentNode);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/* Remove element if anything forbids its presence */
|
||
|
if (!ALLOWED_TAGS[tagName] || FORBID_TAGS[tagName]) {
|
||
|
/* Keep content except for black-listed elements */
|
||
|
if (KEEP_CONTENT && !FORBID_CONTENTS[tagName] && typeof currentNode.insertAdjacentHTML === 'function') {
|
||
|
try {
|
||
|
var htmlToInsert = currentNode.innerHTML;
|
||
|
currentNode.insertAdjacentHTML('AfterEnd', trustedTypesPolicy ? trustedTypesPolicy.createHTML(htmlToInsert) : htmlToInsert);
|
||
|
} catch (error) {}
|
||
|
}
|
||
|
|
||
|
_forceRemove(currentNode);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/* Remove in case a noscript/noembed XSS is suspected */
|
||
|
if (tagName === 'noscript' && regExpTest(/<\/noscript/i, currentNode.innerHTML)) {
|
||
|
_forceRemove(currentNode);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
if (tagName === 'noembed' && regExpTest(/<\/noembed/i, currentNode.innerHTML)) {
|
||
|
_forceRemove(currentNode);
|
||
|
return true;
|
||
|
}
|
||
|
|
||
|
/* Convert markup to cover jQuery behavior */
|
||
|
if (SAFE_FOR_JQUERY && !currentNode.firstElementChild && (!currentNode.content || !currentNode.content.firstElementChild) && regExpTest(/</g, currentNode.textContent)) {
|
||
|
arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
|
||
|
if (currentNode.innerHTML) {
|
||
|
currentNode.innerHTML = stringReplace(currentNode.innerHTML, /</g, '<');
|
||
|
} else {
|
||
|
currentNode.innerHTML = stringReplace(currentNode.textContent, /</g, '<');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Sanitize element content to be template-safe */
|
||
|
if (SAFE_FOR_TEMPLATES && currentNode.nodeType === 3) {
|
||
|
/* Get the element's text content */
|
||
|
content = currentNode.textContent;
|
||
|
content = stringReplace(content, MUSTACHE_EXPR$$1, ' ');
|
||
|
content = stringReplace(content, ERB_EXPR$$1, ' ');
|
||
|
if (currentNode.textContent !== content) {
|
||
|
arrayPush(DOMPurify.removed, { element: currentNode.cloneNode() });
|
||
|
currentNode.textContent = content;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('afterSanitizeElements', currentNode, null);
|
||
|
|
||
|
return false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _isValidAttribute
|
||
|
*
|
||
|
* @param {string} lcTag Lowercase tag name of containing element.
|
||
|
* @param {string} lcName Lowercase attribute name.
|
||
|
* @param {string} value Attribute value.
|
||
|
* @return {Boolean} Returns true if `value` is valid, otherwise false.
|
||
|
*/
|
||
|
// eslint-disable-next-line complexity
|
||
|
var _isValidAttribute = function _isValidAttribute(lcTag, lcName, value) {
|
||
|
/* Make sure attribute cannot clobber */
|
||
|
if (SANITIZE_DOM && (lcName === 'id' || lcName === 'name') && (value in document || value in formElement)) {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
/* Allow valid data-* attributes: At least one character after "-"
|
||
|
(https://html.spec.whatwg.org/multipage/dom.html#embedding-custom-non-visible-data-with-the-data-*-attributes)
|
||
|
XML-compatible (https://html.spec.whatwg.org/multipage/infrastructure.html#xml-compatible and http://www.w3.org/TR/xml/#d0e804)
|
||
|
We don't need to check the value; it's always URI safe. */
|
||
|
if (ALLOW_DATA_ATTR && regExpTest(DATA_ATTR$$1, lcName)) {
|
||
|
// This attribute is safe
|
||
|
} else if (ALLOW_ARIA_ATTR && regExpTest(ARIA_ATTR$$1, lcName)) {
|
||
|
// This attribute is safe
|
||
|
/* Otherwise, check the name is permitted */
|
||
|
} else if (!ALLOWED_ATTR[lcName] || FORBID_ATTR[lcName]) {
|
||
|
return false;
|
||
|
|
||
|
/* Check value is safe. First, is attr inert? If so, is safe */
|
||
|
} else if (URI_SAFE_ATTRIBUTES[lcName]) {
|
||
|
// This attribute is safe
|
||
|
/* Check no script, data or unknown possibly unsafe URI
|
||
|
unless we know URI values are safe for that attribute */
|
||
|
} else if (regExpTest(IS_ALLOWED_URI$$1, stringReplace(value, ATTR_WHITESPACE$$1, ''))) {
|
||
|
// This attribute is safe
|
||
|
/* Keep image data URIs alive if src/xlink:href is allowed */
|
||
|
/* Further prevent gadget XSS for dynamically built script tags */
|
||
|
} else if ((lcName === 'src' || lcName === 'xlink:href' || lcName === 'href') && lcTag !== 'script' && stringIndexOf(value, 'data:') === 0 && DATA_URI_TAGS[lcTag]) {
|
||
|
// This attribute is safe
|
||
|
/* Allow unknown protocols: This provides support for links that
|
||
|
are handled by protocol handlers which may be unknown ahead of
|
||
|
time, e.g. fb:, spotify: */
|
||
|
} else if (ALLOW_UNKNOWN_PROTOCOLS && !regExpTest(IS_SCRIPT_OR_DATA$$1, stringReplace(value, ATTR_WHITESPACE$$1, ''))) {
|
||
|
// This attribute is safe
|
||
|
/* Check for binary attributes */
|
||
|
// eslint-disable-next-line no-negated-condition
|
||
|
} else if (!value) {
|
||
|
// Binary attributes are safe at this point
|
||
|
/* Anything else, presume unsafe, do not add it back */
|
||
|
} else {
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
return true;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _sanitizeAttributes
|
||
|
*
|
||
|
* @protect attributes
|
||
|
* @protect nodeName
|
||
|
* @protect removeAttribute
|
||
|
* @protect setAttribute
|
||
|
*
|
||
|
* @param {Node} currentNode to sanitize
|
||
|
*/
|
||
|
// eslint-disable-next-line complexity
|
||
|
var _sanitizeAttributes = function _sanitizeAttributes(currentNode) {
|
||
|
var attr = void 0;
|
||
|
var value = void 0;
|
||
|
var lcName = void 0;
|
||
|
var idAttr = void 0;
|
||
|
var l = void 0;
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('beforeSanitizeAttributes', currentNode, null);
|
||
|
|
||
|
var attributes = currentNode.attributes;
|
||
|
|
||
|
/* Check if we have attributes; if not we might have a text node */
|
||
|
|
||
|
if (!attributes) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
var hookEvent = {
|
||
|
attrName: '',
|
||
|
attrValue: '',
|
||
|
keepAttr: true,
|
||
|
allowedAttributes: ALLOWED_ATTR
|
||
|
};
|
||
|
l = attributes.length;
|
||
|
|
||
|
/* Go backwards over all attributes; safely remove bad ones */
|
||
|
while (l--) {
|
||
|
attr = attributes[l];
|
||
|
var _attr = attr,
|
||
|
name = _attr.name,
|
||
|
namespaceURI = _attr.namespaceURI;
|
||
|
|
||
|
value = stringTrim(attr.value);
|
||
|
lcName = stringToLowerCase(name);
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
hookEvent.attrName = lcName;
|
||
|
hookEvent.attrValue = value;
|
||
|
hookEvent.keepAttr = true;
|
||
|
hookEvent.forceKeepAttr = undefined; // Allows developers to see this is a property they can set
|
||
|
_executeHook('uponSanitizeAttribute', currentNode, hookEvent);
|
||
|
value = hookEvent.attrValue;
|
||
|
/* Did the hooks approve of the attribute? */
|
||
|
if (hookEvent.forceKeepAttr) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Remove attribute */
|
||
|
// Safari (iOS + Mac), last tested v8.0.5, crashes if you try to
|
||
|
// remove a "name" attribute from an <img> tag that has an "id"
|
||
|
// attribute at the time.
|
||
|
if (lcName === 'name' && currentNode.nodeName === 'IMG' && attributes.id) {
|
||
|
idAttr = attributes.id;
|
||
|
attributes = arraySlice(attributes, []);
|
||
|
_removeAttribute('id', currentNode);
|
||
|
_removeAttribute(name, currentNode);
|
||
|
if (arrayIndexOf(attributes, idAttr) > l) {
|
||
|
currentNode.setAttribute('id', idAttr.value);
|
||
|
}
|
||
|
} else if (
|
||
|
// This works around a bug in Safari, where input[type=file]
|
||
|
// cannot be dynamically set after type has been removed
|
||
|
currentNode.nodeName === 'INPUT' && lcName === 'type' && value === 'file' && hookEvent.keepAttr && (ALLOWED_ATTR[lcName] || !FORBID_ATTR[lcName])) {
|
||
|
continue;
|
||
|
} else {
|
||
|
// This avoids a crash in Safari v9.0 with double-ids.
|
||
|
// The trick is to first set the id to be empty and then to
|
||
|
// remove the attribute
|
||
|
if (name === 'id') {
|
||
|
currentNode.setAttribute(name, '');
|
||
|
}
|
||
|
|
||
|
_removeAttribute(name, currentNode);
|
||
|
}
|
||
|
|
||
|
/* Did the hooks approve of the attribute? */
|
||
|
if (!hookEvent.keepAttr) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Work around a security issue in jQuery 3.0 */
|
||
|
if (SAFE_FOR_JQUERY && regExpTest(/\/>/i, value)) {
|
||
|
_removeAttribute(name, currentNode);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Take care of an mXSS pattern using namespace switches */
|
||
|
if (regExpTest(/svg|math/i, currentNode.namespaceURI) && regExpTest(regExpCreate('</(' + arrayJoin(objectKeys(FORBID_CONTENTS), '|') + ')', 'i'), value)) {
|
||
|
_removeAttribute(name, currentNode);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Sanitize attribute content to be template-safe */
|
||
|
if (SAFE_FOR_TEMPLATES) {
|
||
|
value = stringReplace(value, MUSTACHE_EXPR$$1, ' ');
|
||
|
value = stringReplace(value, ERB_EXPR$$1, ' ');
|
||
|
}
|
||
|
|
||
|
/* Is `value` valid for this attribute? */
|
||
|
var lcTag = currentNode.nodeName.toLowerCase();
|
||
|
if (!_isValidAttribute(lcTag, lcName, value)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Handle invalid data-* attribute set by try-catching it */
|
||
|
try {
|
||
|
if (namespaceURI) {
|
||
|
currentNode.setAttributeNS(namespaceURI, name, value);
|
||
|
} else {
|
||
|
/* Fallback to setAttribute() for browser-unrecognized namespaces e.g. "x-schema". */
|
||
|
currentNode.setAttribute(name, value);
|
||
|
}
|
||
|
|
||
|
arrayPop(DOMPurify.removed);
|
||
|
} catch (error) {}
|
||
|
}
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('afterSanitizeAttributes', currentNode, null);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* _sanitizeShadowDOM
|
||
|
*
|
||
|
* @param {DocumentFragment} fragment to iterate over recursively
|
||
|
*/
|
||
|
var _sanitizeShadowDOM = function _sanitizeShadowDOM(fragment) {
|
||
|
var shadowNode = void 0;
|
||
|
var shadowIterator = _createIterator(fragment);
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('beforeSanitizeShadowDOM', fragment, null);
|
||
|
|
||
|
while (shadowNode = shadowIterator.nextNode()) {
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('uponSanitizeShadowNode', shadowNode, null);
|
||
|
|
||
|
/* Sanitize tags and elements */
|
||
|
if (_sanitizeElements(shadowNode)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Deep shadow DOM detected */
|
||
|
if (shadowNode.content instanceof DocumentFragment) {
|
||
|
_sanitizeShadowDOM(shadowNode.content);
|
||
|
}
|
||
|
|
||
|
/* Check attributes, sanitize if necessary */
|
||
|
_sanitizeAttributes(shadowNode);
|
||
|
}
|
||
|
|
||
|
/* Execute a hook if present */
|
||
|
_executeHook('afterSanitizeShadowDOM', fragment, null);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Sanitize
|
||
|
* Public method providing core sanitation functionality
|
||
|
*
|
||
|
* @param {String|Node} dirty string or DOM node
|
||
|
* @param {Object} configuration object
|
||
|
*/
|
||
|
// eslint-disable-next-line complexity
|
||
|
DOMPurify.sanitize = function (dirty, cfg) {
|
||
|
var body = void 0;
|
||
|
var importedNode = void 0;
|
||
|
var currentNode = void 0;
|
||
|
var oldNode = void 0;
|
||
|
var returnNode = void 0;
|
||
|
/* Make sure we have a string to sanitize.
|
||
|
DO NOT return early, as this will return the wrong type if
|
||
|
the user has requested a DOM object rather than a string */
|
||
|
if (!dirty) {
|
||
|
dirty = '<!-->';
|
||
|
}
|
||
|
|
||
|
/* Stringify, in case dirty is an object */
|
||
|
if (typeof dirty !== 'string' && !_isNode(dirty)) {
|
||
|
// eslint-disable-next-line no-negated-condition
|
||
|
if (typeof dirty.toString !== 'function') {
|
||
|
throw typeErrorCreate('toString is not a function');
|
||
|
} else {
|
||
|
dirty = dirty.toString();
|
||
|
if (typeof dirty !== 'string') {
|
||
|
throw typeErrorCreate('dirty is not a string, aborting');
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Check we can run. Otherwise fall back or ignore */
|
||
|
if (!DOMPurify.isSupported) {
|
||
|
if (_typeof(window.toStaticHTML) === 'object' || typeof window.toStaticHTML === 'function') {
|
||
|
if (typeof dirty === 'string') {
|
||
|
return window.toStaticHTML(dirty);
|
||
|
}
|
||
|
|
||
|
if (_isNode(dirty)) {
|
||
|
return window.toStaticHTML(dirty.outerHTML);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dirty;
|
||
|
}
|
||
|
|
||
|
/* Assign config vars */
|
||
|
if (!SET_CONFIG) {
|
||
|
_parseConfig(cfg);
|
||
|
}
|
||
|
|
||
|
/* Clean up removed elements */
|
||
|
DOMPurify.removed = [];
|
||
|
|
||
|
/* Check if dirty is correctly typed for IN_PLACE */
|
||
|
if (typeof dirty === 'string') {
|
||
|
IN_PLACE = false;
|
||
|
}
|
||
|
|
||
|
if (IN_PLACE) {
|
||
|
/* No special handling necessary for in-place sanitization */
|
||
|
} else if (dirty instanceof Node) {
|
||
|
/* If dirty is a DOM element, append to an empty document to avoid
|
||
|
elements being stripped by the parser */
|
||
|
body = _initDocument('<!-->');
|
||
|
importedNode = body.ownerDocument.importNode(dirty, true);
|
||
|
if (importedNode.nodeType === 1 && importedNode.nodeName === 'BODY') {
|
||
|
/* Node is already a body, use as is */
|
||
|
body = importedNode;
|
||
|
} else if (importedNode.nodeName === 'HTML') {
|
||
|
body = importedNode;
|
||
|
} else {
|
||
|
// eslint-disable-next-line unicorn/prefer-node-append
|
||
|
body.appendChild(importedNode);
|
||
|
}
|
||
|
} else {
|
||
|
/* Exit directly if we have nothing to do */
|
||
|
if (!RETURN_DOM && !SAFE_FOR_TEMPLATES && !WHOLE_DOCUMENT && RETURN_TRUSTED_TYPE && dirty.indexOf('<') === -1) {
|
||
|
return trustedTypesPolicy ? trustedTypesPolicy.createHTML(dirty) : dirty;
|
||
|
}
|
||
|
|
||
|
/* Initialize the document to work on */
|
||
|
body = _initDocument(dirty);
|
||
|
|
||
|
/* Check we have a DOM node from the data */
|
||
|
if (!body) {
|
||
|
return RETURN_DOM ? null : emptyHTML;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/* Remove first element node (ours) if FORCE_BODY is set */
|
||
|
if (body && FORCE_BODY) {
|
||
|
_forceRemove(body.firstChild);
|
||
|
}
|
||
|
|
||
|
/* Get node iterator */
|
||
|
var nodeIterator = _createIterator(IN_PLACE ? dirty : body);
|
||
|
|
||
|
/* Now start iterating over the created document */
|
||
|
while (currentNode = nodeIterator.nextNode()) {
|
||
|
/* Fix IE's strange behavior with manipulated textNodes #89 */
|
||
|
if (currentNode.nodeType === 3 && currentNode === oldNode) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Sanitize tags and elements */
|
||
|
if (_sanitizeElements(currentNode)) {
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
/* Shadow DOM detected, sanitize it */
|
||
|
if (currentNode.content instanceof DocumentFragment) {
|
||
|
_sanitizeShadowDOM(currentNode.content);
|
||
|
}
|
||
|
|
||
|
/* Check attributes, sanitize if necessary */
|
||
|
_sanitizeAttributes(currentNode);
|
||
|
|
||
|
oldNode = currentNode;
|
||
|
}
|
||
|
|
||
|
oldNode = null;
|
||
|
|
||
|
/* If we sanitized `dirty` in-place, return it. */
|
||
|
if (IN_PLACE) {
|
||
|
return dirty;
|
||
|
}
|
||
|
|
||
|
/* Return sanitized string or DOM */
|
||
|
if (RETURN_DOM) {
|
||
|
if (RETURN_DOM_FRAGMENT) {
|
||
|
returnNode = createDocumentFragment.call(body.ownerDocument);
|
||
|
|
||
|
while (body.firstChild) {
|
||
|
// eslint-disable-next-line unicorn/prefer-node-append
|
||
|
returnNode.appendChild(body.firstChild);
|
||
|
}
|
||
|
} else {
|
||
|
returnNode = body;
|
||
|
}
|
||
|
|
||
|
if (RETURN_DOM_IMPORT) {
|
||
|
/* AdoptNode() is not used because internal state is not reset
|
||
|
(e.g. the past names map of a HTMLFormElement), this is safe
|
||
|
in theory but we would rather not risk another attack vector.
|
||
|
The state that is cloned by importNode() is explicitly defined
|
||
|
by the specs. */
|
||
|
returnNode = importNode.call(originalDocument, returnNode, true);
|
||
|
}
|
||
|
|
||
|
return returnNode;
|
||
|
}
|
||
|
|
||
|
var serializedHTML = WHOLE_DOCUMENT ? body.outerHTML : body.innerHTML;
|
||
|
|
||
|
/* Sanitize final string template-safe */
|
||
|
if (SAFE_FOR_TEMPLATES) {
|
||
|
serializedHTML = stringReplace(serializedHTML, MUSTACHE_EXPR$$1, ' ');
|
||
|
serializedHTML = stringReplace(serializedHTML, ERB_EXPR$$1, ' ');
|
||
|
}
|
||
|
|
||
|
return trustedTypesPolicy && RETURN_TRUSTED_TYPE ? trustedTypesPolicy.createHTML(serializedHTML) : serializedHTML;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Public method to set the configuration once
|
||
|
* setConfig
|
||
|
*
|
||
|
* @param {Object} cfg configuration object
|
||
|
*/
|
||
|
DOMPurify.setConfig = function (cfg) {
|
||
|
_parseConfig(cfg);
|
||
|
SET_CONFIG = true;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Public method to remove the configuration
|
||
|
* clearConfig
|
||
|
*
|
||
|
*/
|
||
|
DOMPurify.clearConfig = function () {
|
||
|
CONFIG = null;
|
||
|
SET_CONFIG = false;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Public method to check if an attribute value is valid.
|
||
|
* Uses last set config, if any. Otherwise, uses config defaults.
|
||
|
* isValidAttribute
|
||
|
*
|
||
|
* @param {string} tag Tag name of containing element.
|
||
|
* @param {string} attr Attribute name.
|
||
|
* @param {string} value Attribute value.
|
||
|
* @return {Boolean} Returns true if `value` is valid. Otherwise, returns false.
|
||
|
*/
|
||
|
DOMPurify.isValidAttribute = function (tag, attr, value) {
|
||
|
/* Initialize shared config vars if necessary. */
|
||
|
if (!CONFIG) {
|
||
|
_parseConfig({});
|
||
|
}
|
||
|
|
||
|
var lcTag = stringToLowerCase(tag);
|
||
|
var lcName = stringToLowerCase(attr);
|
||
|
return _isValidAttribute(lcTag, lcName, value);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* AddHook
|
||
|
* Public method to add DOMPurify hooks
|
||
|
*
|
||
|
* @param {String} entryPoint entry point for the hook to add
|
||
|
* @param {Function} hookFunction function to execute
|
||
|
*/
|
||
|
DOMPurify.addHook = function (entryPoint, hookFunction) {
|
||
|
if (typeof hookFunction !== 'function') {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
hooks[entryPoint] = hooks[entryPoint] || [];
|
||
|
arrayPush(hooks[entryPoint], hookFunction);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* RemoveHook
|
||
|
* Public method to remove a DOMPurify hook at a given entryPoint
|
||
|
* (pops it from the stack of hooks if more are present)
|
||
|
*
|
||
|
* @param {String} entryPoint entry point for the hook to remove
|
||
|
*/
|
||
|
DOMPurify.removeHook = function (entryPoint) {
|
||
|
if (hooks[entryPoint]) {
|
||
|
arrayPop(hooks[entryPoint]);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* RemoveHooks
|
||
|
* Public method to remove all DOMPurify hooks at a given entryPoint
|
||
|
*
|
||
|
* @param {String} entryPoint entry point for the hooks to remove
|
||
|
*/
|
||
|
DOMPurify.removeHooks = function (entryPoint) {
|
||
|
if (hooks[entryPoint]) {
|
||
|
hooks[entryPoint] = [];
|
||
|
}
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* RemoveAllHooks
|
||
|
* Public method to remove all DOMPurify hooks
|
||
|
*
|
||
|
*/
|
||
|
DOMPurify.removeAllHooks = function () {
|
||
|
hooks = {};
|
||
|
};
|
||
|
|
||
|
return DOMPurify;
|
||
|
}
|
||
|
|
||
|
var purify = createDOMPurify();
|
||
|
|
||
|
return purify;
|
||
|
|
||
|
})));
|
||
|
//# sourceMappingURL=purify.js.map
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/InlineLexer.js":
|
||
|
/*!************************************************!*\
|
||
|
!*** ./node_modules/marked/src/InlineLexer.js ***!
|
||
|
\************************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const Renderer = __webpack_require__(/*! ./Renderer.js */ "./node_modules/marked/src/Renderer.js");
|
||
|
const { defaults } = __webpack_require__(/*! ./defaults.js */ "./node_modules/marked/src/defaults.js");
|
||
|
const { inline } = __webpack_require__(/*! ./rules.js */ "./node_modules/marked/src/rules.js");
|
||
|
const {
|
||
|
findClosingBracket,
|
||
|
escape
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
|
||
|
/**
|
||
|
* Inline Lexer & Compiler
|
||
|
*/
|
||
|
module.exports = class InlineLexer {
|
||
|
constructor(links, options) {
|
||
|
this.options = options || defaults;
|
||
|
this.links = links;
|
||
|
this.rules = inline.normal;
|
||
|
this.options.renderer = this.options.renderer || new Renderer();
|
||
|
this.renderer = this.options.renderer;
|
||
|
this.renderer.options = this.options;
|
||
|
|
||
|
if (!this.links) {
|
||
|
throw new Error('Tokens array requires a `links` property.');
|
||
|
}
|
||
|
|
||
|
if (this.options.pedantic) {
|
||
|
this.rules = inline.pedantic;
|
||
|
} else if (this.options.gfm) {
|
||
|
if (this.options.breaks) {
|
||
|
this.rules = inline.breaks;
|
||
|
} else {
|
||
|
this.rules = inline.gfm;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Expose Inline Rules
|
||
|
*/
|
||
|
static get rules() {
|
||
|
return inline;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Static Lexing/Compiling Method
|
||
|
*/
|
||
|
static output(src, links, options) {
|
||
|
const inline = new InlineLexer(links, options);
|
||
|
return inline.output(src);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Lexing/Compiling
|
||
|
*/
|
||
|
output(src) {
|
||
|
let out = '',
|
||
|
link,
|
||
|
text,
|
||
|
href,
|
||
|
title,
|
||
|
cap,
|
||
|
prevCapZero;
|
||
|
|
||
|
while (src) {
|
||
|
// escape
|
||
|
if (cap = this.rules.escape.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += escape(cap[1]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// tag
|
||
|
if (cap = this.rules.tag.exec(src)) {
|
||
|
if (!this.inLink && /^<a /i.test(cap[0])) {
|
||
|
this.inLink = true;
|
||
|
} else if (this.inLink && /^<\/a>/i.test(cap[0])) {
|
||
|
this.inLink = false;
|
||
|
}
|
||
|
if (!this.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
|
||
|
this.inRawBlock = true;
|
||
|
} else if (this.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(cap[0])) {
|
||
|
this.inRawBlock = false;
|
||
|
}
|
||
|
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.html(this.options.sanitize
|
||
|
? (this.options.sanitizer
|
||
|
? this.options.sanitizer(cap[0])
|
||
|
: escape(cap[0]))
|
||
|
: cap[0]);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// link
|
||
|
if (cap = this.rules.link.exec(src)) {
|
||
|
const lastParenIndex = findClosingBracket(cap[2], '()');
|
||
|
if (lastParenIndex > -1) {
|
||
|
const start = cap[0].indexOf('!') === 0 ? 5 : 4;
|
||
|
const linkLen = start + cap[1].length + lastParenIndex;
|
||
|
cap[2] = cap[2].substring(0, lastParenIndex);
|
||
|
cap[0] = cap[0].substring(0, linkLen).trim();
|
||
|
cap[3] = '';
|
||
|
}
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.inLink = true;
|
||
|
href = cap[2];
|
||
|
if (this.options.pedantic) {
|
||
|
link = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(href);
|
||
|
|
||
|
if (link) {
|
||
|
href = link[1];
|
||
|
title = link[3];
|
||
|
} else {
|
||
|
title = '';
|
||
|
}
|
||
|
} else {
|
||
|
title = cap[3] ? cap[3].slice(1, -1) : '';
|
||
|
}
|
||
|
href = href.trim().replace(/^<([\s\S]*)>$/, '$1');
|
||
|
out += this.outputLink(cap, {
|
||
|
href: InlineLexer.escapes(href),
|
||
|
title: InlineLexer.escapes(title)
|
||
|
});
|
||
|
this.inLink = false;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// reflink, nolink
|
||
|
if ((cap = this.rules.reflink.exec(src))
|
||
|
|| (cap = this.rules.nolink.exec(src))) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
link = (cap[2] || cap[1]).replace(/\s+/g, ' ');
|
||
|
link = this.links[link.toLowerCase()];
|
||
|
if (!link || !link.href) {
|
||
|
out += cap[0].charAt(0);
|
||
|
src = cap[0].substring(1) + src;
|
||
|
continue;
|
||
|
}
|
||
|
this.inLink = true;
|
||
|
out += this.outputLink(cap, link);
|
||
|
this.inLink = false;
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// strong
|
||
|
if (cap = this.rules.strong.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.strong(this.output(cap[4] || cap[3] || cap[2] || cap[1]));
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// em
|
||
|
if (cap = this.rules.em.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.em(this.output(cap[6] || cap[5] || cap[4] || cap[3] || cap[2] || cap[1]));
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// code
|
||
|
if (cap = this.rules.code.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.codespan(escape(cap[2].trim(), true));
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// br
|
||
|
if (cap = this.rules.br.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.br();
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// del (gfm)
|
||
|
if (cap = this.rules.del.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.del(this.output(cap[1]));
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// autolink
|
||
|
if (cap = this.rules.autolink.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
if (cap[2] === '@') {
|
||
|
text = escape(this.mangle(cap[1]));
|
||
|
href = 'mailto:' + text;
|
||
|
} else {
|
||
|
text = escape(cap[1]);
|
||
|
href = text;
|
||
|
}
|
||
|
out += this.renderer.link(href, null, text);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// url (gfm)
|
||
|
if (!this.inLink && (cap = this.rules.url.exec(src))) {
|
||
|
if (cap[2] === '@') {
|
||
|
text = escape(cap[0]);
|
||
|
href = 'mailto:' + text;
|
||
|
} else {
|
||
|
// do extended autolink path validation
|
||
|
do {
|
||
|
prevCapZero = cap[0];
|
||
|
cap[0] = this.rules._backpedal.exec(cap[0])[0];
|
||
|
} while (prevCapZero !== cap[0]);
|
||
|
text = escape(cap[0]);
|
||
|
if (cap[1] === 'www.') {
|
||
|
href = 'http://' + text;
|
||
|
} else {
|
||
|
href = text;
|
||
|
}
|
||
|
}
|
||
|
src = src.substring(cap[0].length);
|
||
|
out += this.renderer.link(href, null, text);
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// text
|
||
|
if (cap = this.rules.text.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
if (this.inRawBlock) {
|
||
|
out += this.renderer.text(this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]);
|
||
|
} else {
|
||
|
out += this.renderer.text(escape(this.smartypants(cap[0])));
|
||
|
}
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (src) {
|
||
|
throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return out;
|
||
|
}
|
||
|
|
||
|
static escapes(text) {
|
||
|
return text ? text.replace(InlineLexer.rules._escapes, '$1') : text;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Compile Link
|
||
|
*/
|
||
|
outputLink(cap, link) {
|
||
|
const href = link.href,
|
||
|
title = link.title ? escape(link.title) : null;
|
||
|
|
||
|
return cap[0].charAt(0) !== '!'
|
||
|
? this.renderer.link(href, title, this.output(cap[1]))
|
||
|
: this.renderer.image(href, title, escape(cap[1]));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Smartypants Transformations
|
||
|
*/
|
||
|
smartypants(text) {
|
||
|
if (!this.options.smartypants) return text;
|
||
|
return text
|
||
|
// em-dashes
|
||
|
.replace(/---/g, '\u2014')
|
||
|
// en-dashes
|
||
|
.replace(/--/g, '\u2013')
|
||
|
// opening singles
|
||
|
.replace(/(^|[-\u2014/(\[{"\s])'/g, '$1\u2018')
|
||
|
// closing singles & apostrophes
|
||
|
.replace(/'/g, '\u2019')
|
||
|
// opening doubles
|
||
|
.replace(/(^|[-\u2014/(\[{\u2018\s])"/g, '$1\u201c')
|
||
|
// closing doubles
|
||
|
.replace(/"/g, '\u201d')
|
||
|
// ellipses
|
||
|
.replace(/\.{3}/g, '\u2026');
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Mangle Links
|
||
|
*/
|
||
|
mangle(text) {
|
||
|
if (!this.options.mangle) return text;
|
||
|
const l = text.length;
|
||
|
let out = '',
|
||
|
i = 0,
|
||
|
ch;
|
||
|
|
||
|
for (; i < l; i++) {
|
||
|
ch = text.charCodeAt(i);
|
||
|
if (Math.random() > 0.5) {
|
||
|
ch = 'x' + ch.toString(16);
|
||
|
}
|
||
|
out += '&#' + ch + ';';
|
||
|
}
|
||
|
|
||
|
return out;
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/Lexer.js":
|
||
|
/*!******************************************!*\
|
||
|
!*** ./node_modules/marked/src/Lexer.js ***!
|
||
|
\******************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const { defaults } = __webpack_require__(/*! ./defaults.js */ "./node_modules/marked/src/defaults.js");
|
||
|
const { block } = __webpack_require__(/*! ./rules.js */ "./node_modules/marked/src/rules.js");
|
||
|
const {
|
||
|
rtrim,
|
||
|
splitCells,
|
||
|
escape
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
|
||
|
/**
|
||
|
* Block Lexer
|
||
|
*/
|
||
|
module.exports = class Lexer {
|
||
|
constructor(options) {
|
||
|
this.tokens = [];
|
||
|
this.tokens.links = Object.create(null);
|
||
|
this.options = options || defaults;
|
||
|
this.rules = block.normal;
|
||
|
|
||
|
if (this.options.pedantic) {
|
||
|
this.rules = block.pedantic;
|
||
|
} else if (this.options.gfm) {
|
||
|
this.rules = block.gfm;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Expose Block Rules
|
||
|
*/
|
||
|
static get rules() {
|
||
|
return block;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Static Lex Method
|
||
|
*/
|
||
|
static lex(src, options) {
|
||
|
const lexer = new Lexer(options);
|
||
|
return lexer.lex(src);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Preprocessing
|
||
|
*/
|
||
|
lex(src) {
|
||
|
src = src
|
||
|
.replace(/\r\n|\r/g, '\n')
|
||
|
.replace(/\t/g, ' ');
|
||
|
|
||
|
return this.token(src, true);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Lexing
|
||
|
*/
|
||
|
token(src, top) {
|
||
|
src = src.replace(/^ +$/gm, '');
|
||
|
let next,
|
||
|
loose,
|
||
|
cap,
|
||
|
bull,
|
||
|
b,
|
||
|
item,
|
||
|
listStart,
|
||
|
listItems,
|
||
|
t,
|
||
|
space,
|
||
|
i,
|
||
|
tag,
|
||
|
l,
|
||
|
isordered,
|
||
|
istask,
|
||
|
ischecked;
|
||
|
|
||
|
while (src) {
|
||
|
// newline
|
||
|
if (cap = this.rules.newline.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
if (cap[0].length > 1) {
|
||
|
this.tokens.push({
|
||
|
type: 'space'
|
||
|
});
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// code
|
||
|
if (cap = this.rules.code.exec(src)) {
|
||
|
const lastToken = this.tokens[this.tokens.length - 1];
|
||
|
src = src.substring(cap[0].length);
|
||
|
// An indented code block cannot interrupt a paragraph.
|
||
|
if (lastToken && lastToken.type === 'paragraph') {
|
||
|
lastToken.text += '\n' + cap[0].trimRight();
|
||
|
} else {
|
||
|
cap = cap[0].replace(/^ {4}/gm, '');
|
||
|
this.tokens.push({
|
||
|
type: 'code',
|
||
|
codeBlockStyle: 'indented',
|
||
|
text: !this.options.pedantic
|
||
|
? rtrim(cap, '\n')
|
||
|
: cap
|
||
|
});
|
||
|
}
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// fences
|
||
|
if (cap = this.rules.fences.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'code',
|
||
|
lang: cap[2] ? cap[2].trim() : cap[2],
|
||
|
text: cap[3] || ''
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// heading
|
||
|
if (cap = this.rules.heading.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'heading',
|
||
|
depth: cap[1].length,
|
||
|
text: cap[2]
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// table no leading pipe (gfm)
|
||
|
if (cap = this.rules.nptable.exec(src)) {
|
||
|
item = {
|
||
|
type: 'table',
|
||
|
header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
|
||
|
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
||
|
cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
|
||
|
};
|
||
|
|
||
|
if (item.header.length === item.align.length) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
|
||
|
for (i = 0; i < item.align.length; i++) {
|
||
|
if (/^ *-+: *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'right';
|
||
|
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'center';
|
||
|
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'left';
|
||
|
} else {
|
||
|
item.align[i] = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < item.cells.length; i++) {
|
||
|
item.cells[i] = splitCells(item.cells[i], item.header.length);
|
||
|
}
|
||
|
|
||
|
this.tokens.push(item);
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// hr
|
||
|
if (cap = this.rules.hr.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'hr'
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// blockquote
|
||
|
if (cap = this.rules.blockquote.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
|
||
|
this.tokens.push({
|
||
|
type: 'blockquote_start'
|
||
|
});
|
||
|
|
||
|
cap = cap[0].replace(/^ *> ?/gm, '');
|
||
|
|
||
|
// Pass `top` to keep the current
|
||
|
// "toplevel" state. This is exactly
|
||
|
// how markdown.pl works.
|
||
|
this.token(cap, top);
|
||
|
|
||
|
this.tokens.push({
|
||
|
type: 'blockquote_end'
|
||
|
});
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// list
|
||
|
if (cap = this.rules.list.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
bull = cap[2];
|
||
|
isordered = bull.length > 1;
|
||
|
|
||
|
listStart = {
|
||
|
type: 'list_start',
|
||
|
ordered: isordered,
|
||
|
start: isordered ? +bull : '',
|
||
|
loose: false
|
||
|
};
|
||
|
|
||
|
this.tokens.push(listStart);
|
||
|
|
||
|
// Get each top-level item.
|
||
|
cap = cap[0].match(this.rules.item);
|
||
|
|
||
|
listItems = [];
|
||
|
next = false;
|
||
|
l = cap.length;
|
||
|
i = 0;
|
||
|
|
||
|
for (; i < l; i++) {
|
||
|
item = cap[i];
|
||
|
|
||
|
// Remove the list item's bullet
|
||
|
// so it is seen as the next token.
|
||
|
space = item.length;
|
||
|
item = item.replace(/^ *([*+-]|\d+\.) */, '');
|
||
|
|
||
|
// Outdent whatever the
|
||
|
// list item contains. Hacky.
|
||
|
if (~item.indexOf('\n ')) {
|
||
|
space -= item.length;
|
||
|
item = !this.options.pedantic
|
||
|
? item.replace(new RegExp('^ {1,' + space + '}', 'gm'), '')
|
||
|
: item.replace(/^ {1,4}/gm, '');
|
||
|
}
|
||
|
|
||
|
// Determine whether the next list item belongs here.
|
||
|
// Backpedal if it does not belong in this list.
|
||
|
if (i !== l - 1) {
|
||
|
b = block.bullet.exec(cap[i + 1])[0];
|
||
|
if (bull.length > 1 ? b.length === 1
|
||
|
: (b.length > 1 || (this.options.smartLists && b !== bull))) {
|
||
|
src = cap.slice(i + 1).join('\n') + src;
|
||
|
i = l - 1;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// Determine whether item is loose or not.
|
||
|
// Use: /(^|\n)(?! )[^\n]+\n\n(?!\s*$)/
|
||
|
// for discount behavior.
|
||
|
loose = next || /\n\n(?!\s*$)/.test(item);
|
||
|
if (i !== l - 1) {
|
||
|
next = item.charAt(item.length - 1) === '\n';
|
||
|
if (!loose) loose = next;
|
||
|
}
|
||
|
|
||
|
if (loose) {
|
||
|
listStart.loose = true;
|
||
|
}
|
||
|
|
||
|
// Check for task list items
|
||
|
istask = /^\[[ xX]\] /.test(item);
|
||
|
ischecked = undefined;
|
||
|
if (istask) {
|
||
|
ischecked = item[1] !== ' ';
|
||
|
item = item.replace(/^\[[ xX]\] +/, '');
|
||
|
}
|
||
|
|
||
|
t = {
|
||
|
type: 'list_item_start',
|
||
|
task: istask,
|
||
|
checked: ischecked,
|
||
|
loose: loose
|
||
|
};
|
||
|
|
||
|
listItems.push(t);
|
||
|
this.tokens.push(t);
|
||
|
|
||
|
// Recurse.
|
||
|
this.token(item, false);
|
||
|
|
||
|
this.tokens.push({
|
||
|
type: 'list_item_end'
|
||
|
});
|
||
|
}
|
||
|
|
||
|
if (listStart.loose) {
|
||
|
l = listItems.length;
|
||
|
i = 0;
|
||
|
for (; i < l; i++) {
|
||
|
listItems[i].loose = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
this.tokens.push({
|
||
|
type: 'list_end'
|
||
|
});
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// html
|
||
|
if (cap = this.rules.html.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: this.options.sanitize
|
||
|
? 'paragraph'
|
||
|
: 'html',
|
||
|
pre: !this.options.sanitizer
|
||
|
&& (cap[1] === 'pre' || cap[1] === 'script' || cap[1] === 'style'),
|
||
|
text: this.options.sanitize ? (this.options.sanitizer ? this.options.sanitizer(cap[0]) : escape(cap[0])) : cap[0]
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// def
|
||
|
if (top && (cap = this.rules.def.exec(src))) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
if (cap[3]) cap[3] = cap[3].substring(1, cap[3].length - 1);
|
||
|
tag = cap[1].toLowerCase().replace(/\s+/g, ' ');
|
||
|
if (!this.tokens.links[tag]) {
|
||
|
this.tokens.links[tag] = {
|
||
|
href: cap[2],
|
||
|
title: cap[3]
|
||
|
};
|
||
|
}
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// table (gfm)
|
||
|
if (cap = this.rules.table.exec(src)) {
|
||
|
item = {
|
||
|
type: 'table',
|
||
|
header: splitCells(cap[1].replace(/^ *| *\| *$/g, '')),
|
||
|
align: cap[2].replace(/^ *|\| *$/g, '').split(/ *\| */),
|
||
|
cells: cap[3] ? cap[3].replace(/\n$/, '').split('\n') : []
|
||
|
};
|
||
|
|
||
|
if (item.header.length === item.align.length) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
|
||
|
for (i = 0; i < item.align.length; i++) {
|
||
|
if (/^ *-+: *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'right';
|
||
|
} else if (/^ *:-+: *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'center';
|
||
|
} else if (/^ *:-+ *$/.test(item.align[i])) {
|
||
|
item.align[i] = 'left';
|
||
|
} else {
|
||
|
item.align[i] = null;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
for (i = 0; i < item.cells.length; i++) {
|
||
|
item.cells[i] = splitCells(
|
||
|
item.cells[i].replace(/^ *\| *| *\| *$/g, ''),
|
||
|
item.header.length);
|
||
|
}
|
||
|
|
||
|
this.tokens.push(item);
|
||
|
|
||
|
continue;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// lheading
|
||
|
if (cap = this.rules.lheading.exec(src)) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'heading',
|
||
|
depth: cap[2].charAt(0) === '=' ? 1 : 2,
|
||
|
text: cap[1]
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// top-level paragraph
|
||
|
if (top && (cap = this.rules.paragraph.exec(src))) {
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'paragraph',
|
||
|
text: cap[1].charAt(cap[1].length - 1) === '\n'
|
||
|
? cap[1].slice(0, -1)
|
||
|
: cap[1]
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
// text
|
||
|
if (cap = this.rules.text.exec(src)) {
|
||
|
// Top-level should never reach here.
|
||
|
src = src.substring(cap[0].length);
|
||
|
this.tokens.push({
|
||
|
type: 'text',
|
||
|
text: cap[0]
|
||
|
});
|
||
|
continue;
|
||
|
}
|
||
|
|
||
|
if (src) {
|
||
|
throw new Error('Infinite loop on byte: ' + src.charCodeAt(0));
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return this.tokens;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/Parser.js":
|
||
|
/*!*******************************************!*\
|
||
|
!*** ./node_modules/marked/src/Parser.js ***!
|
||
|
\*******************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const Renderer = __webpack_require__(/*! ./Renderer.js */ "./node_modules/marked/src/Renderer.js");
|
||
|
const Slugger = __webpack_require__(/*! ./Slugger.js */ "./node_modules/marked/src/Slugger.js");
|
||
|
const InlineLexer = __webpack_require__(/*! ./InlineLexer.js */ "./node_modules/marked/src/InlineLexer.js");
|
||
|
const TextRenderer = __webpack_require__(/*! ./TextRenderer.js */ "./node_modules/marked/src/TextRenderer.js");
|
||
|
const { defaults } = __webpack_require__(/*! ./defaults.js */ "./node_modules/marked/src/defaults.js");
|
||
|
const {
|
||
|
merge,
|
||
|
unescape
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
|
||
|
/**
|
||
|
* Parsing & Compiling
|
||
|
*/
|
||
|
module.exports = class Parser {
|
||
|
constructor(options) {
|
||
|
this.tokens = [];
|
||
|
this.token = null;
|
||
|
this.options = options || defaults;
|
||
|
this.options.renderer = this.options.renderer || new Renderer();
|
||
|
this.renderer = this.options.renderer;
|
||
|
this.renderer.options = this.options;
|
||
|
this.slugger = new Slugger();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Static Parse Method
|
||
|
*/
|
||
|
static parse(tokens, options) {
|
||
|
const parser = new Parser(options);
|
||
|
return parser.parse(tokens);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Parse Loop
|
||
|
*/
|
||
|
parse(tokens) {
|
||
|
this.inline = new InlineLexer(tokens.links, this.options);
|
||
|
// use an InlineLexer with a TextRenderer to extract pure text
|
||
|
this.inlineText = new InlineLexer(
|
||
|
tokens.links,
|
||
|
merge({}, this.options, { renderer: new TextRenderer() })
|
||
|
);
|
||
|
this.tokens = tokens.reverse();
|
||
|
|
||
|
let out = '';
|
||
|
while (this.next()) {
|
||
|
out += this.tok();
|
||
|
}
|
||
|
|
||
|
return out;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Next Token
|
||
|
*/
|
||
|
next() {
|
||
|
this.token = this.tokens.pop();
|
||
|
return this.token;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Preview Next Token
|
||
|
*/
|
||
|
peek() {
|
||
|
return this.tokens[this.tokens.length - 1] || 0;
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Parse Text Tokens
|
||
|
*/
|
||
|
parseText() {
|
||
|
let body = this.token.text;
|
||
|
|
||
|
while (this.peek().type === 'text') {
|
||
|
body += '\n' + this.next().text;
|
||
|
}
|
||
|
|
||
|
return this.inline.output(body);
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Parse Current Token
|
||
|
*/
|
||
|
tok() {
|
||
|
let body = '';
|
||
|
switch (this.token.type) {
|
||
|
case 'space': {
|
||
|
return '';
|
||
|
}
|
||
|
case 'hr': {
|
||
|
return this.renderer.hr();
|
||
|
}
|
||
|
case 'heading': {
|
||
|
return this.renderer.heading(
|
||
|
this.inline.output(this.token.text),
|
||
|
this.token.depth,
|
||
|
unescape(this.inlineText.output(this.token.text)),
|
||
|
this.slugger);
|
||
|
}
|
||
|
case 'code': {
|
||
|
return this.renderer.code(this.token.text,
|
||
|
this.token.lang,
|
||
|
this.token.escaped);
|
||
|
}
|
||
|
case 'table': {
|
||
|
let header = '',
|
||
|
i,
|
||
|
row,
|
||
|
cell,
|
||
|
j;
|
||
|
|
||
|
// header
|
||
|
cell = '';
|
||
|
for (i = 0; i < this.token.header.length; i++) {
|
||
|
cell += this.renderer.tablecell(
|
||
|
this.inline.output(this.token.header[i]),
|
||
|
{ header: true, align: this.token.align[i] }
|
||
|
);
|
||
|
}
|
||
|
header += this.renderer.tablerow(cell);
|
||
|
|
||
|
for (i = 0; i < this.token.cells.length; i++) {
|
||
|
row = this.token.cells[i];
|
||
|
|
||
|
cell = '';
|
||
|
for (j = 0; j < row.length; j++) {
|
||
|
cell += this.renderer.tablecell(
|
||
|
this.inline.output(row[j]),
|
||
|
{ header: false, align: this.token.align[j] }
|
||
|
);
|
||
|
}
|
||
|
|
||
|
body += this.renderer.tablerow(cell);
|
||
|
}
|
||
|
return this.renderer.table(header, body);
|
||
|
}
|
||
|
case 'blockquote_start': {
|
||
|
body = '';
|
||
|
|
||
|
while (this.next().type !== 'blockquote_end') {
|
||
|
body += this.tok();
|
||
|
}
|
||
|
|
||
|
return this.renderer.blockquote(body);
|
||
|
}
|
||
|
case 'list_start': {
|
||
|
body = '';
|
||
|
const ordered = this.token.ordered,
|
||
|
start = this.token.start;
|
||
|
|
||
|
while (this.next().type !== 'list_end') {
|
||
|
body += this.tok();
|
||
|
}
|
||
|
|
||
|
return this.renderer.list(body, ordered, start);
|
||
|
}
|
||
|
case 'list_item_start': {
|
||
|
body = '';
|
||
|
const loose = this.token.loose;
|
||
|
const checked = this.token.checked;
|
||
|
const task = this.token.task;
|
||
|
|
||
|
if (this.token.task) {
|
||
|
if (loose) {
|
||
|
if (this.peek().type === 'text') {
|
||
|
const nextToken = this.peek();
|
||
|
nextToken.text = this.renderer.checkbox(checked) + ' ' + nextToken.text;
|
||
|
} else {
|
||
|
this.tokens.push({
|
||
|
type: 'text',
|
||
|
text: this.renderer.checkbox(checked)
|
||
|
});
|
||
|
}
|
||
|
} else {
|
||
|
body += this.renderer.checkbox(checked);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
while (this.next().type !== 'list_item_end') {
|
||
|
body += !loose && this.token.type === 'text'
|
||
|
? this.parseText()
|
||
|
: this.tok();
|
||
|
}
|
||
|
return this.renderer.listitem(body, task, checked);
|
||
|
}
|
||
|
case 'html': {
|
||
|
// TODO parse inline content if parameter markdown=1
|
||
|
return this.renderer.html(this.token.text);
|
||
|
}
|
||
|
case 'paragraph': {
|
||
|
return this.renderer.paragraph(this.inline.output(this.token.text));
|
||
|
}
|
||
|
case 'text': {
|
||
|
return this.renderer.paragraph(this.parseText());
|
||
|
}
|
||
|
default: {
|
||
|
const errMsg = 'Token with "' + this.token.type + '" type was not found.';
|
||
|
if (this.options.silent) {
|
||
|
console.log(errMsg);
|
||
|
} else {
|
||
|
throw new Error(errMsg);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/Renderer.js":
|
||
|
/*!*********************************************!*\
|
||
|
!*** ./node_modules/marked/src/Renderer.js ***!
|
||
|
\*********************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const { defaults } = __webpack_require__(/*! ./defaults.js */ "./node_modules/marked/src/defaults.js");
|
||
|
const {
|
||
|
cleanUrl,
|
||
|
escape
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
|
||
|
/**
|
||
|
* Renderer
|
||
|
*/
|
||
|
module.exports = class Renderer {
|
||
|
constructor(options) {
|
||
|
this.options = options || defaults;
|
||
|
}
|
||
|
|
||
|
code(code, infostring, escaped) {
|
||
|
const lang = (infostring || '').match(/\S*/)[0];
|
||
|
if (this.options.highlight) {
|
||
|
const out = this.options.highlight(code, lang);
|
||
|
if (out != null && out !== code) {
|
||
|
escaped = true;
|
||
|
code = out;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if (!lang) {
|
||
|
return '<pre><code>'
|
||
|
+ (escaped ? code : escape(code, true))
|
||
|
+ '</code></pre>';
|
||
|
}
|
||
|
|
||
|
return '<pre><code class="'
|
||
|
+ this.options.langPrefix
|
||
|
+ escape(lang, true)
|
||
|
+ '">'
|
||
|
+ (escaped ? code : escape(code, true))
|
||
|
+ '</code></pre>\n';
|
||
|
};
|
||
|
|
||
|
blockquote(quote) {
|
||
|
return '<blockquote>\n' + quote + '</blockquote>\n';
|
||
|
};
|
||
|
|
||
|
html(html) {
|
||
|
return html;
|
||
|
};
|
||
|
|
||
|
heading(text, level, raw, slugger) {
|
||
|
if (this.options.headerIds) {
|
||
|
return '<h'
|
||
|
+ level
|
||
|
+ ' id="'
|
||
|
+ this.options.headerPrefix
|
||
|
+ slugger.slug(raw)
|
||
|
+ '">'
|
||
|
+ text
|
||
|
+ '</h'
|
||
|
+ level
|
||
|
+ '>\n';
|
||
|
}
|
||
|
// ignore IDs
|
||
|
return '<h' + level + '>' + text + '</h' + level + '>\n';
|
||
|
};
|
||
|
|
||
|
hr() {
|
||
|
return this.options.xhtml ? '<hr/>\n' : '<hr>\n';
|
||
|
};
|
||
|
|
||
|
list(body, ordered, start) {
|
||
|
const type = ordered ? 'ol' : 'ul',
|
||
|
startatt = (ordered && start !== 1) ? (' start="' + start + '"') : '';
|
||
|
return '<' + type + startatt + '>\n' + body + '</' + type + '>\n';
|
||
|
};
|
||
|
|
||
|
listitem(text) {
|
||
|
return '<li>' + text + '</li>\n';
|
||
|
};
|
||
|
|
||
|
checkbox(checked) {
|
||
|
return '<input '
|
||
|
+ (checked ? 'checked="" ' : '')
|
||
|
+ 'disabled="" type="checkbox"'
|
||
|
+ (this.options.xhtml ? ' /' : '')
|
||
|
+ '> ';
|
||
|
};
|
||
|
|
||
|
paragraph(text) {
|
||
|
return '<p>' + text + '</p>\n';
|
||
|
};
|
||
|
|
||
|
table(header, body) {
|
||
|
if (body) body = '<tbody>' + body + '</tbody>';
|
||
|
|
||
|
return '<table>\n'
|
||
|
+ '<thead>\n'
|
||
|
+ header
|
||
|
+ '</thead>\n'
|
||
|
+ body
|
||
|
+ '</table>\n';
|
||
|
};
|
||
|
|
||
|
tablerow(content) {
|
||
|
return '<tr>\n' + content + '</tr>\n';
|
||
|
};
|
||
|
|
||
|
tablecell(content, flags) {
|
||
|
const type = flags.header ? 'th' : 'td';
|
||
|
const tag = flags.align
|
||
|
? '<' + type + ' align="' + flags.align + '">'
|
||
|
: '<' + type + '>';
|
||
|
return tag + content + '</' + type + '>\n';
|
||
|
};
|
||
|
|
||
|
// span level renderer
|
||
|
strong(text) {
|
||
|
return '<strong>' + text + '</strong>';
|
||
|
};
|
||
|
|
||
|
em(text) {
|
||
|
return '<em>' + text + '</em>';
|
||
|
};
|
||
|
|
||
|
codespan(text) {
|
||
|
return '<code>' + text + '</code>';
|
||
|
};
|
||
|
|
||
|
br() {
|
||
|
return this.options.xhtml ? '<br/>' : '<br>';
|
||
|
};
|
||
|
|
||
|
del(text) {
|
||
|
return '<del>' + text + '</del>';
|
||
|
};
|
||
|
|
||
|
link(href, title, text) {
|
||
|
href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
|
||
|
if (href === null) {
|
||
|
return text;
|
||
|
}
|
||
|
let out = '<a href="' + escape(href) + '"';
|
||
|
if (title) {
|
||
|
out += ' title="' + title + '"';
|
||
|
}
|
||
|
out += '>' + text + '</a>';
|
||
|
return out;
|
||
|
};
|
||
|
|
||
|
image(href, title, text) {
|
||
|
href = cleanUrl(this.options.sanitize, this.options.baseUrl, href);
|
||
|
if (href === null) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
let out = '<img src="' + href + '" alt="' + text + '"';
|
||
|
if (title) {
|
||
|
out += ' title="' + title + '"';
|
||
|
}
|
||
|
out += this.options.xhtml ? '/>' : '>';
|
||
|
return out;
|
||
|
};
|
||
|
|
||
|
text(text) {
|
||
|
return text;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/Slugger.js":
|
||
|
/*!********************************************!*\
|
||
|
!*** ./node_modules/marked/src/Slugger.js ***!
|
||
|
\********************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports) {
|
||
|
|
||
|
/**
|
||
|
* Slugger generates header id
|
||
|
*/
|
||
|
module.exports = class Slugger {
|
||
|
constructor() {
|
||
|
this.seen = {};
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Convert string to unique id
|
||
|
*/
|
||
|
slug(value) {
|
||
|
let slug = value
|
||
|
.toLowerCase()
|
||
|
.trim()
|
||
|
// remove html tags
|
||
|
.replace(/<[!\/a-z].*?>/ig, '')
|
||
|
// remove unwanted chars
|
||
|
.replace(/[\u2000-\u206F\u2E00-\u2E7F\\'!"#$%&()*+,./:;<=>?@[\]^`{|}~]/g, '')
|
||
|
.replace(/\s/g, '-');
|
||
|
|
||
|
if (this.seen.hasOwnProperty(slug)) {
|
||
|
const originalSlug = slug;
|
||
|
do {
|
||
|
this.seen[originalSlug]++;
|
||
|
slug = originalSlug + '-' + this.seen[originalSlug];
|
||
|
} while (this.seen.hasOwnProperty(slug));
|
||
|
}
|
||
|
this.seen[slug] = 0;
|
||
|
|
||
|
return slug;
|
||
|
};
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/TextRenderer.js":
|
||
|
/*!*************************************************!*\
|
||
|
!*** ./node_modules/marked/src/TextRenderer.js ***!
|
||
|
\*************************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports) {
|
||
|
|
||
|
/**
|
||
|
* TextRenderer
|
||
|
* returns only the textual part of the token
|
||
|
*/
|
||
|
module.exports = class TextRenderer {
|
||
|
// no need for block level renderers
|
||
|
strong(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
em(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
codespan(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
del(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
html(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
text(text) {
|
||
|
return text;
|
||
|
}
|
||
|
|
||
|
link(href, title, text) {
|
||
|
return '' + text;
|
||
|
}
|
||
|
|
||
|
image(href, title, text) {
|
||
|
return '' + text;
|
||
|
}
|
||
|
|
||
|
br() {
|
||
|
return '';
|
||
|
}
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/defaults.js":
|
||
|
/*!*********************************************!*\
|
||
|
!*** ./node_modules/marked/src/defaults.js ***!
|
||
|
\*********************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports) {
|
||
|
|
||
|
function getDefaults() {
|
||
|
return {
|
||
|
baseUrl: null,
|
||
|
breaks: false,
|
||
|
gfm: true,
|
||
|
headerIds: true,
|
||
|
headerPrefix: '',
|
||
|
highlight: null,
|
||
|
langPrefix: 'language-',
|
||
|
mangle: true,
|
||
|
pedantic: false,
|
||
|
renderer: null,
|
||
|
sanitize: false,
|
||
|
sanitizer: null,
|
||
|
silent: false,
|
||
|
smartLists: false,
|
||
|
smartypants: false,
|
||
|
xhtml: false
|
||
|
};
|
||
|
}
|
||
|
|
||
|
function changeDefaults(newDefaults) {
|
||
|
module.exports.defaults = newDefaults;
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
defaults: getDefaults(),
|
||
|
getDefaults,
|
||
|
changeDefaults
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/helpers.js":
|
||
|
/*!********************************************!*\
|
||
|
!*** ./node_modules/marked/src/helpers.js ***!
|
||
|
\********************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports) {
|
||
|
|
||
|
/**
|
||
|
* Helpers
|
||
|
*/
|
||
|
const escapeTest = /[&<>"']/;
|
||
|
const escapeReplace = /[&<>"']/g;
|
||
|
const escapeTestNoEncode = /[<>"']|&(?!#?\w+;)/;
|
||
|
const escapeReplaceNoEncode = /[<>"']|&(?!#?\w+;)/g;
|
||
|
const escapeReplacements = {
|
||
|
'&': '&',
|
||
|
'<': '<',
|
||
|
'>': '>',
|
||
|
'"': '"',
|
||
|
"'": '''
|
||
|
};
|
||
|
const getEscapeReplacement = (ch) => escapeReplacements[ch];
|
||
|
function escape(html, encode) {
|
||
|
if (encode) {
|
||
|
if (escapeTest.test(html)) {
|
||
|
return html.replace(escapeReplace, getEscapeReplacement);
|
||
|
}
|
||
|
} else {
|
||
|
if (escapeTestNoEncode.test(html)) {
|
||
|
return html.replace(escapeReplaceNoEncode, getEscapeReplacement);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return html;
|
||
|
}
|
||
|
|
||
|
const unescapeTest = /&(#(?:\d+)|(?:#x[0-9A-Fa-f]+)|(?:\w+));?/ig;
|
||
|
|
||
|
function unescape(html) {
|
||
|
// explicitly match decimal, hex, and named HTML entities
|
||
|
return html.replace(unescapeTest, (_, n) => {
|
||
|
n = n.toLowerCase();
|
||
|
if (n === 'colon') return ':';
|
||
|
if (n.charAt(0) === '#') {
|
||
|
return n.charAt(1) === 'x'
|
||
|
? String.fromCharCode(parseInt(n.substring(2), 16))
|
||
|
: String.fromCharCode(+n.substring(1));
|
||
|
}
|
||
|
return '';
|
||
|
});
|
||
|
}
|
||
|
|
||
|
const caret = /(^|[^\[])\^/g;
|
||
|
function edit(regex, opt) {
|
||
|
regex = regex.source || regex;
|
||
|
opt = opt || '';
|
||
|
const obj = {
|
||
|
replace: (name, val) => {
|
||
|
val = val.source || val;
|
||
|
val = val.replace(caret, '$1');
|
||
|
regex = regex.replace(name, val);
|
||
|
return obj;
|
||
|
},
|
||
|
getRegex: () => {
|
||
|
return new RegExp(regex, opt);
|
||
|
}
|
||
|
};
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
const nonWordAndColonTest = /[^\w:]/g;
|
||
|
const originIndependentUrl = /^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;
|
||
|
function cleanUrl(sanitize, base, href) {
|
||
|
if (sanitize) {
|
||
|
let prot;
|
||
|
try {
|
||
|
prot = decodeURIComponent(unescape(href))
|
||
|
.replace(nonWordAndColonTest, '')
|
||
|
.toLowerCase();
|
||
|
} catch (e) {
|
||
|
return null;
|
||
|
}
|
||
|
if (prot.indexOf('javascript:') === 0 || prot.indexOf('vbscript:') === 0 || prot.indexOf('data:') === 0) {
|
||
|
return null;
|
||
|
}
|
||
|
}
|
||
|
if (base && !originIndependentUrl.test(href)) {
|
||
|
href = resolveUrl(base, href);
|
||
|
}
|
||
|
try {
|
||
|
href = encodeURI(href).replace(/%25/g, '%');
|
||
|
} catch (e) {
|
||
|
return null;
|
||
|
}
|
||
|
return href;
|
||
|
}
|
||
|
|
||
|
const baseUrls = {};
|
||
|
const justDomain = /^[^:]+:\/*[^/]*$/;
|
||
|
const protocol = /^([^:]+:)[\s\S]*$/;
|
||
|
const domain = /^([^:]+:\/*[^/]*)[\s\S]*$/;
|
||
|
|
||
|
function resolveUrl(base, href) {
|
||
|
if (!baseUrls[' ' + base]) {
|
||
|
// we can ignore everything in base after the last slash of its path component,
|
||
|
// but we might need to add _that_
|
||
|
// https://tools.ietf.org/html/rfc3986#section-3
|
||
|
if (justDomain.test(base)) {
|
||
|
baseUrls[' ' + base] = base + '/';
|
||
|
} else {
|
||
|
baseUrls[' ' + base] = rtrim(base, '/', true);
|
||
|
}
|
||
|
}
|
||
|
base = baseUrls[' ' + base];
|
||
|
const relativeBase = base.indexOf(':') === -1;
|
||
|
|
||
|
if (href.substring(0, 2) === '//') {
|
||
|
if (relativeBase) {
|
||
|
return href;
|
||
|
}
|
||
|
return base.replace(protocol, '$1') + href;
|
||
|
} else if (href.charAt(0) === '/') {
|
||
|
if (relativeBase) {
|
||
|
return href;
|
||
|
}
|
||
|
return base.replace(domain, '$1') + href;
|
||
|
} else {
|
||
|
return base + href;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
const noopTest = { exec: function noopTest() {} };
|
||
|
|
||
|
function merge(obj) {
|
||
|
let i = 1,
|
||
|
target,
|
||
|
key;
|
||
|
|
||
|
for (; i < arguments.length; i++) {
|
||
|
target = arguments[i];
|
||
|
for (key in target) {
|
||
|
if (Object.prototype.hasOwnProperty.call(target, key)) {
|
||
|
obj[key] = target[key];
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return obj;
|
||
|
}
|
||
|
|
||
|
function splitCells(tableRow, count) {
|
||
|
// ensure that every cell-delimiting pipe has a space
|
||
|
// before it to distinguish it from an escaped pipe
|
||
|
const row = tableRow.replace(/\|/g, (match, offset, str) => {
|
||
|
let escaped = false,
|
||
|
curr = offset;
|
||
|
while (--curr >= 0 && str[curr] === '\\') escaped = !escaped;
|
||
|
if (escaped) {
|
||
|
// odd number of slashes means | is escaped
|
||
|
// so we leave it alone
|
||
|
return '|';
|
||
|
} else {
|
||
|
// add space before unescaped |
|
||
|
return ' |';
|
||
|
}
|
||
|
}),
|
||
|
cells = row.split(/ \|/);
|
||
|
let i = 0;
|
||
|
|
||
|
if (cells.length > count) {
|
||
|
cells.splice(count);
|
||
|
} else {
|
||
|
while (cells.length < count) cells.push('');
|
||
|
}
|
||
|
|
||
|
for (; i < cells.length; i++) {
|
||
|
// leading or trailing whitespace is ignored per the gfm spec
|
||
|
cells[i] = cells[i].trim().replace(/\\\|/g, '|');
|
||
|
}
|
||
|
return cells;
|
||
|
}
|
||
|
|
||
|
// Remove trailing 'c's. Equivalent to str.replace(/c*$/, '').
|
||
|
// /c*$/ is vulnerable to REDOS.
|
||
|
// invert: Remove suffix of non-c chars instead. Default falsey.
|
||
|
function rtrim(str, c, invert) {
|
||
|
const l = str.length;
|
||
|
if (l === 0) {
|
||
|
return '';
|
||
|
}
|
||
|
|
||
|
// Length of suffix matching the invert condition.
|
||
|
let suffLen = 0;
|
||
|
|
||
|
// Step left until we fail to match the invert condition.
|
||
|
while (suffLen < l) {
|
||
|
const currChar = str.charAt(l - suffLen - 1);
|
||
|
if (currChar === c && !invert) {
|
||
|
suffLen++;
|
||
|
} else if (currChar !== c && invert) {
|
||
|
suffLen++;
|
||
|
} else {
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return str.substr(0, l - suffLen);
|
||
|
}
|
||
|
|
||
|
function findClosingBracket(str, b) {
|
||
|
if (str.indexOf(b[1]) === -1) {
|
||
|
return -1;
|
||
|
}
|
||
|
const l = str.length;
|
||
|
let level = 0,
|
||
|
i = 0;
|
||
|
for (; i < l; i++) {
|
||
|
if (str[i] === '\\') {
|
||
|
i++;
|
||
|
} else if (str[i] === b[0]) {
|
||
|
level++;
|
||
|
} else if (str[i] === b[1]) {
|
||
|
level--;
|
||
|
if (level < 0) {
|
||
|
return i;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return -1;
|
||
|
}
|
||
|
|
||
|
function checkSanitizeDeprecation(opt) {
|
||
|
if (opt && opt.sanitize && !opt.silent) {
|
||
|
console.warn('marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options');
|
||
|
}
|
||
|
}
|
||
|
|
||
|
module.exports = {
|
||
|
escape,
|
||
|
unescape,
|
||
|
edit,
|
||
|
cleanUrl,
|
||
|
resolveUrl,
|
||
|
noopTest,
|
||
|
merge,
|
||
|
splitCells,
|
||
|
rtrim,
|
||
|
findClosingBracket,
|
||
|
checkSanitizeDeprecation
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/marked.js":
|
||
|
/*!*******************************************!*\
|
||
|
!*** ./node_modules/marked/src/marked.js ***!
|
||
|
\*******************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const Lexer = __webpack_require__(/*! ./Lexer.js */ "./node_modules/marked/src/Lexer.js");
|
||
|
const Parser = __webpack_require__(/*! ./Parser.js */ "./node_modules/marked/src/Parser.js");
|
||
|
const Renderer = __webpack_require__(/*! ./Renderer.js */ "./node_modules/marked/src/Renderer.js");
|
||
|
const TextRenderer = __webpack_require__(/*! ./TextRenderer.js */ "./node_modules/marked/src/TextRenderer.js");
|
||
|
const InlineLexer = __webpack_require__(/*! ./InlineLexer.js */ "./node_modules/marked/src/InlineLexer.js");
|
||
|
const Slugger = __webpack_require__(/*! ./Slugger.js */ "./node_modules/marked/src/Slugger.js");
|
||
|
const {
|
||
|
merge,
|
||
|
checkSanitizeDeprecation,
|
||
|
escape
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
const {
|
||
|
getDefaults,
|
||
|
changeDefaults,
|
||
|
defaults
|
||
|
} = __webpack_require__(/*! ./defaults.js */ "./node_modules/marked/src/defaults.js");
|
||
|
|
||
|
/**
|
||
|
* Marked
|
||
|
*/
|
||
|
function marked(src, opt, callback) {
|
||
|
// throw error in case of non string input
|
||
|
if (typeof src === 'undefined' || src === null) {
|
||
|
throw new Error('marked(): input parameter is undefined or null');
|
||
|
}
|
||
|
if (typeof src !== 'string') {
|
||
|
throw new Error('marked(): input parameter is of type '
|
||
|
+ Object.prototype.toString.call(src) + ', string expected');
|
||
|
}
|
||
|
|
||
|
if (callback || typeof opt === 'function') {
|
||
|
if (!callback) {
|
||
|
callback = opt;
|
||
|
opt = null;
|
||
|
}
|
||
|
|
||
|
opt = merge({}, marked.defaults, opt || {});
|
||
|
checkSanitizeDeprecation(opt);
|
||
|
const highlight = opt.highlight;
|
||
|
let tokens,
|
||
|
pending,
|
||
|
i = 0;
|
||
|
|
||
|
try {
|
||
|
tokens = Lexer.lex(src, opt);
|
||
|
} catch (e) {
|
||
|
return callback(e);
|
||
|
}
|
||
|
|
||
|
pending = tokens.length;
|
||
|
|
||
|
const done = function(err) {
|
||
|
if (err) {
|
||
|
opt.highlight = highlight;
|
||
|
return callback(err);
|
||
|
}
|
||
|
|
||
|
let out;
|
||
|
|
||
|
try {
|
||
|
out = Parser.parse(tokens, opt);
|
||
|
} catch (e) {
|
||
|
err = e;
|
||
|
}
|
||
|
|
||
|
opt.highlight = highlight;
|
||
|
|
||
|
return err
|
||
|
? callback(err)
|
||
|
: callback(null, out);
|
||
|
};
|
||
|
|
||
|
if (!highlight || highlight.length < 3) {
|
||
|
return done();
|
||
|
}
|
||
|
|
||
|
delete opt.highlight;
|
||
|
|
||
|
if (!pending) return done();
|
||
|
|
||
|
for (; i < tokens.length; i++) {
|
||
|
(function(token) {
|
||
|
if (token.type !== 'code') {
|
||
|
return --pending || done();
|
||
|
}
|
||
|
return highlight(token.text, token.lang, function(err, code) {
|
||
|
if (err) return done(err);
|
||
|
if (code == null || code === token.text) {
|
||
|
return --pending || done();
|
||
|
}
|
||
|
token.text = code;
|
||
|
token.escaped = true;
|
||
|
--pending || done();
|
||
|
});
|
||
|
})(tokens[i]);
|
||
|
}
|
||
|
|
||
|
return;
|
||
|
}
|
||
|
try {
|
||
|
opt = merge({}, marked.defaults, opt || {});
|
||
|
checkSanitizeDeprecation(opt);
|
||
|
return Parser.parse(Lexer.lex(src, opt), opt);
|
||
|
} catch (e) {
|
||
|
e.message += '\nPlease report this to https://github.com/markedjs/marked.';
|
||
|
if ((opt || marked.defaults).silent) {
|
||
|
return '<p>An error occurred:</p><pre>'
|
||
|
+ escape(e.message + '', true)
|
||
|
+ '</pre>';
|
||
|
}
|
||
|
throw e;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Options
|
||
|
*/
|
||
|
|
||
|
marked.options =
|
||
|
marked.setOptions = function(opt) {
|
||
|
merge(marked.defaults, opt);
|
||
|
changeDefaults(marked.defaults);
|
||
|
return marked;
|
||
|
};
|
||
|
|
||
|
marked.getDefaults = getDefaults;
|
||
|
|
||
|
marked.defaults = defaults;
|
||
|
|
||
|
/**
|
||
|
* Expose
|
||
|
*/
|
||
|
|
||
|
marked.Parser = Parser;
|
||
|
marked.parser = Parser.parse;
|
||
|
|
||
|
marked.Renderer = Renderer;
|
||
|
marked.TextRenderer = TextRenderer;
|
||
|
|
||
|
marked.Lexer = Lexer;
|
||
|
marked.lexer = Lexer.lex;
|
||
|
|
||
|
marked.InlineLexer = InlineLexer;
|
||
|
marked.inlineLexer = InlineLexer.output;
|
||
|
|
||
|
marked.Slugger = Slugger;
|
||
|
|
||
|
marked.parse = marked;
|
||
|
|
||
|
module.exports = marked;
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/marked/src/rules.js":
|
||
|
/*!******************************************!*\
|
||
|
!*** ./node_modules/marked/src/rules.js ***!
|
||
|
\******************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
const {
|
||
|
noopTest,
|
||
|
edit,
|
||
|
merge
|
||
|
} = __webpack_require__(/*! ./helpers.js */ "./node_modules/marked/src/helpers.js");
|
||
|
|
||
|
/**
|
||
|
* Block-Level Grammar
|
||
|
*/
|
||
|
const block = {
|
||
|
newline: /^\n+/,
|
||
|
code: /^( {4}[^\n]+\n*)+/,
|
||
|
fences: /^ {0,3}(`{3,}(?=[^`\n]*\n)|~{3,})([^\n]*)\n(?:|([\s\S]*?)\n)(?: {0,3}\1[~`]* *(?:\n+|$)|$)/,
|
||
|
hr: /^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,
|
||
|
heading: /^ {0,3}(#{1,6}) +([^\n]*?)(?: +#+)? *(?:\n+|$)/,
|
||
|
blockquote: /^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/,
|
||
|
list: /^( {0,3})(bull) [\s\S]+?(?:hr|def|\n{2,}(?! )(?!\1bull )\n*|\s*$)/,
|
||
|
html: '^ {0,3}(?:' // optional indentation
|
||
|
+ '<(script|pre|style)[\\s>][\\s\\S]*?(?:</\\1>[^\\n]*\\n+|$)' // (1)
|
||
|
+ '|comment[^\\n]*(\\n+|$)' // (2)
|
||
|
+ '|<\\?[\\s\\S]*?\\?>\\n*' // (3)
|
||
|
+ '|<![A-Z][\\s\\S]*?>\\n*' // (4)
|
||
|
+ '|<!\\[CDATA\\[[\\s\\S]*?\\]\\]>\\n*' // (5)
|
||
|
+ '|</?(tag)(?: +|\\n|/?>)[\\s\\S]*?(?:\\n{2,}|$)' // (6)
|
||
|
+ '|<(?!script|pre|style)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) open tag
|
||
|
+ '|</(?!script|pre|style)[a-z][\\w-]*\\s*>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:\\n{2,}|$)' // (7) closing tag
|
||
|
+ ')',
|
||
|
def: /^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,
|
||
|
nptable: noopTest,
|
||
|
table: noopTest,
|
||
|
lheading: /^([^\n]+)\n {0,3}(=+|-+) *(?:\n+|$)/,
|
||
|
// regex template, placeholders will be replaced according to different paragraph
|
||
|
// interruption rules of commonmark and the original markdown spec:
|
||
|
_paragraph: /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html)[^\n]+)*)/,
|
||
|
text: /^[^\n]+/
|
||
|
};
|
||
|
|
||
|
block._label = /(?!\s*\])(?:\\[\[\]]|[^\[\]])+/;
|
||
|
block._title = /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/;
|
||
|
block.def = edit(block.def)
|
||
|
.replace('label', block._label)
|
||
|
.replace('title', block._title)
|
||
|
.getRegex();
|
||
|
|
||
|
block.bullet = /(?:[*+-]|\d{1,9}\.)/;
|
||
|
block.item = /^( *)(bull) ?[^\n]*(?:\n(?!\1bull ?)[^\n]*)*/;
|
||
|
block.item = edit(block.item, 'gm')
|
||
|
.replace(/bull/g, block.bullet)
|
||
|
.getRegex();
|
||
|
|
||
|
block.list = edit(block.list)
|
||
|
.replace(/bull/g, block.bullet)
|
||
|
.replace('hr', '\\n+(?=\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$))')
|
||
|
.replace('def', '\\n+(?=' + block.def.source + ')')
|
||
|
.getRegex();
|
||
|
|
||
|
block._tag = 'address|article|aside|base|basefont|blockquote|body|caption'
|
||
|
+ '|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption'
|
||
|
+ '|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe'
|
||
|
+ '|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option'
|
||
|
+ '|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr'
|
||
|
+ '|track|ul';
|
||
|
block._comment = /<!--(?!-?>)[\s\S]*?-->/;
|
||
|
block.html = edit(block.html, 'i')
|
||
|
.replace('comment', block._comment)
|
||
|
.replace('tag', block._tag)
|
||
|
.replace('attribute', / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/)
|
||
|
.getRegex();
|
||
|
|
||
|
block.paragraph = edit(block._paragraph)
|
||
|
.replace('hr', block.hr)
|
||
|
.replace('heading', ' {0,3}#{1,6} ')
|
||
|
.replace('|lheading', '') // setex headings don't interrupt commonmark paragraphs
|
||
|
.replace('blockquote', ' {0,3}>')
|
||
|
.replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
|
||
|
.replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
|
||
|
.replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
|
||
|
.replace('tag', block._tag) // pars can be interrupted by type (6) html blocks
|
||
|
.getRegex();
|
||
|
|
||
|
block.blockquote = edit(block.blockquote)
|
||
|
.replace('paragraph', block.paragraph)
|
||
|
.getRegex();
|
||
|
|
||
|
/**
|
||
|
* Normal Block Grammar
|
||
|
*/
|
||
|
|
||
|
block.normal = merge({}, block);
|
||
|
|
||
|
/**
|
||
|
* GFM Block Grammar
|
||
|
*/
|
||
|
|
||
|
block.gfm = merge({}, block.normal, {
|
||
|
nptable: '^ *([^|\\n ].*\\|.*)\\n' // Header
|
||
|
+ ' *([-:]+ *\\|[-| :]*)' // Align
|
||
|
+ '(?:\\n((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)', // Cells
|
||
|
table: '^ *\\|(.+)\\n' // Header
|
||
|
+ ' *\\|?( *[-:]+[-| :]*)' // Align
|
||
|
+ '(?:\\n *((?:(?!\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)' // Cells
|
||
|
});
|
||
|
|
||
|
block.gfm.nptable = edit(block.gfm.nptable)
|
||
|
.replace('hr', block.hr)
|
||
|
.replace('heading', ' {0,3}#{1,6} ')
|
||
|
.replace('blockquote', ' {0,3}>')
|
||
|
.replace('code', ' {4}[^\\n]')
|
||
|
.replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
|
||
|
.replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
|
||
|
.replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
|
||
|
.replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
|
||
|
.getRegex();
|
||
|
|
||
|
block.gfm.table = edit(block.gfm.table)
|
||
|
.replace('hr', block.hr)
|
||
|
.replace('heading', ' {0,3}#{1,6} ')
|
||
|
.replace('blockquote', ' {0,3}>')
|
||
|
.replace('code', ' {4}[^\\n]')
|
||
|
.replace('fences', ' {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n')
|
||
|
.replace('list', ' {0,3}(?:[*+-]|1[.)]) ') // only lists starting from 1 can interrupt
|
||
|
.replace('html', '</?(?:tag)(?: +|\\n|/?>)|<(?:script|pre|style|!--)')
|
||
|
.replace('tag', block._tag) // tables can be interrupted by type (6) html blocks
|
||
|
.getRegex();
|
||
|
|
||
|
/**
|
||
|
* Pedantic grammar (original John Gruber's loose markdown specification)
|
||
|
*/
|
||
|
|
||
|
block.pedantic = merge({}, block.normal, {
|
||
|
html: edit(
|
||
|
'^ *(?:comment *(?:\\n|\\s*$)'
|
||
|
+ '|<(tag)[\\s\\S]+?</\\1> *(?:\\n{2,}|\\s*$)' // closed tag
|
||
|
+ '|<tag(?:"[^"]*"|\'[^\']*\'|\\s[^\'"/>\\s]*)*?/?> *(?:\\n{2,}|\\s*$))')
|
||
|
.replace('comment', block._comment)
|
||
|
.replace(/tag/g, '(?!(?:'
|
||
|
+ 'a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub'
|
||
|
+ '|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)'
|
||
|
+ '\\b)\\w+(?!:|[^\\w\\s@]*@)\\b')
|
||
|
.getRegex(),
|
||
|
def: /^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/,
|
||
|
heading: /^ *(#{1,6}) *([^\n]+?) *(?:#+ *)?(?:\n+|$)/,
|
||
|
fences: noopTest, // fences not supported
|
||
|
paragraph: edit(block.normal._paragraph)
|
||
|
.replace('hr', block.hr)
|
||
|
.replace('heading', ' *#{1,6} *[^\n]')
|
||
|
.replace('lheading', block.lheading)
|
||
|
.replace('blockquote', ' {0,3}>')
|
||
|
.replace('|fences', '')
|
||
|
.replace('|list', '')
|
||
|
.replace('|html', '')
|
||
|
.getRegex()
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* Inline-Level Grammar
|
||
|
*/
|
||
|
const inline = {
|
||
|
escape: /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,
|
||
|
autolink: /^<(scheme:[^\s\x00-\x1f<>]*|email)>/,
|
||
|
url: noopTest,
|
||
|
tag: '^comment'
|
||
|
+ '|^</[a-zA-Z][\\w:-]*\\s*>' // self-closing tag
|
||
|
+ '|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>' // open tag
|
||
|
+ '|^<\\?[\\s\\S]*?\\?>' // processing instruction, e.g. <?php ?>
|
||
|
+ '|^<![a-zA-Z]+\\s[\\s\\S]*?>' // declaration, e.g. <!DOCTYPE html>
|
||
|
+ '|^<!\\[CDATA\\[[\\s\\S]*?\\]\\]>', // CDATA section
|
||
|
link: /^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/,
|
||
|
reflink: /^!?\[(label)\]\[(?!\s*\])((?:\\[\[\]]?|[^\[\]\\])+)\]/,
|
||
|
nolink: /^!?\[(?!\s*\])((?:\[[^\[\]]*\]|\\[\[\]]|[^\[\]])*)\](?:\[\])?/,
|
||
|
strong: /^__([^\s_])__(?!_)|^\*\*([^\s*])\*\*(?!\*)|^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)/,
|
||
|
em: /^_([^\s_])_(?!_)|^\*([^\s*<\[])\*(?!\*)|^_([^\s<][\s\S]*?[^\s_])_(?!_|[^\spunctuation])|^_([^\s_<][\s\S]*?[^\s])_(?!_|[^\spunctuation])|^\*([^\s<"][\s\S]*?[^\s\*])\*(?!\*|[^\spunctuation])|^\*([^\s*"<\[][\s\S]*?[^\s])\*(?!\*)/,
|
||
|
code: /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/,
|
||
|
br: /^( {2,}|\\)\n(?!\s*$)/,
|
||
|
del: noopTest,
|
||
|
text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*]|\b_|$)|[^ ](?= {2,}\n))|(?= {2,}\n))/
|
||
|
};
|
||
|
|
||
|
// list of punctuation marks from common mark spec
|
||
|
// without ` and ] to workaround Rule 17 (inline code blocks/links)
|
||
|
inline._punctuation = '!"#$%&\'()*+,\\-./:;<=>?@\\[^_{|}~';
|
||
|
inline.em = edit(inline.em).replace(/punctuation/g, inline._punctuation).getRegex();
|
||
|
|
||
|
inline._escapes = /\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/g;
|
||
|
|
||
|
inline._scheme = /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/;
|
||
|
inline._email = /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/;
|
||
|
inline.autolink = edit(inline.autolink)
|
||
|
.replace('scheme', inline._scheme)
|
||
|
.replace('email', inline._email)
|
||
|
.getRegex();
|
||
|
|
||
|
inline._attribute = /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/;
|
||
|
|
||
|
inline.tag = edit(inline.tag)
|
||
|
.replace('comment', block._comment)
|
||
|
.replace('attribute', inline._attribute)
|
||
|
.getRegex();
|
||
|
|
||
|
inline._label = /(?:\[[^\[\]]*\]|\\.|`[^`]*`|[^\[\]\\`])*?/;
|
||
|
inline._href = /<(?:\\[<>]?|[^\s<>\\])*>|[^\s\x00-\x1f]*/;
|
||
|
inline._title = /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/;
|
||
|
|
||
|
inline.link = edit(inline.link)
|
||
|
.replace('label', inline._label)
|
||
|
.replace('href', inline._href)
|
||
|
.replace('title', inline._title)
|
||
|
.getRegex();
|
||
|
|
||
|
inline.reflink = edit(inline.reflink)
|
||
|
.replace('label', inline._label)
|
||
|
.getRegex();
|
||
|
|
||
|
/**
|
||
|
* Normal Inline Grammar
|
||
|
*/
|
||
|
|
||
|
inline.normal = merge({}, inline);
|
||
|
|
||
|
/**
|
||
|
* Pedantic Inline Grammar
|
||
|
*/
|
||
|
|
||
|
inline.pedantic = merge({}, inline.normal, {
|
||
|
strong: /^__(?=\S)([\s\S]*?\S)__(?!_)|^\*\*(?=\S)([\s\S]*?\S)\*\*(?!\*)/,
|
||
|
em: /^_(?=\S)([\s\S]*?\S)_(?!_)|^\*(?=\S)([\s\S]*?\S)\*(?!\*)/,
|
||
|
link: edit(/^!?\[(label)\]\((.*?)\)/)
|
||
|
.replace('label', inline._label)
|
||
|
.getRegex(),
|
||
|
reflink: edit(/^!?\[(label)\]\s*\[([^\]]*)\]/)
|
||
|
.replace('label', inline._label)
|
||
|
.getRegex()
|
||
|
});
|
||
|
|
||
|
/**
|
||
|
* GFM Inline Grammar
|
||
|
*/
|
||
|
|
||
|
inline.gfm = merge({}, inline.normal, {
|
||
|
escape: edit(inline.escape).replace('])', '~|])').getRegex(),
|
||
|
_extended_email: /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,
|
||
|
url: /^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/,
|
||
|
_backpedal: /(?:[^?!.,:;*_~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,
|
||
|
del: /^~+(?=\S)([\s\S]*?\S)~+/,
|
||
|
text: /^(`+|[^`])(?:[\s\S]*?(?:(?=[\\<!\[`*~]|\b_|https?:\/\/|ftp:\/\/|www\.|$)|[^ ](?= {2,}\n)|[^a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-](?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))|(?= {2,}\n|[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@))/
|
||
|
});
|
||
|
|
||
|
inline.gfm.url = edit(inline.gfm.url, 'i')
|
||
|
.replace('email', inline.gfm._extended_email)
|
||
|
.getRegex();
|
||
|
/**
|
||
|
* GFM + Line Breaks Inline Grammar
|
||
|
*/
|
||
|
|
||
|
inline.breaks = merge({}, inline.gfm, {
|
||
|
br: edit(inline.br).replace('{2,}', '*').getRegex(),
|
||
|
text: edit(inline.gfm.text)
|
||
|
.replace('\\b_', '\\b_| {2,}\\n')
|
||
|
.replace(/\{2,\}/g, '*')
|
||
|
.getRegex()
|
||
|
});
|
||
|
|
||
|
module.exports = {
|
||
|
block,
|
||
|
inline
|
||
|
};
|
||
|
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/p-limit/index.js":
|
||
|
/*!***************************************!*\
|
||
|
!*** ./node_modules/p-limit/index.js ***!
|
||
|
\***************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
|
||
|
var pTry = __webpack_require__(/*! p-try */ "./node_modules/p-try/index.js");
|
||
|
|
||
|
var pLimit = function pLimit(concurrency) {
|
||
|
if (!((Number.isInteger(concurrency) || concurrency === Infinity) && concurrency > 0)) {
|
||
|
return Promise.reject(new TypeError('Expected `concurrency` to be a number from 1 and up'));
|
||
|
}
|
||
|
|
||
|
var queue = [];
|
||
|
var activeCount = 0;
|
||
|
|
||
|
var next = function next() {
|
||
|
activeCount--;
|
||
|
|
||
|
if (queue.length > 0) {
|
||
|
queue.shift()();
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var run = function run(fn, resolve) {
|
||
|
activeCount++;
|
||
|
|
||
|
for (var _len = arguments.length, args = new Array(_len > 2 ? _len - 2 : 0), _key = 2; _key < _len; _key++) {
|
||
|
args[_key - 2] = arguments[_key];
|
||
|
}
|
||
|
|
||
|
var result = pTry.apply(void 0, [fn].concat(args));
|
||
|
resolve(result);
|
||
|
result.then(next, next);
|
||
|
};
|
||
|
|
||
|
var enqueue = function enqueue(fn, resolve) {
|
||
|
for (var _len2 = arguments.length, args = new Array(_len2 > 2 ? _len2 - 2 : 0), _key2 = 2; _key2 < _len2; _key2++) {
|
||
|
args[_key2 - 2] = arguments[_key2];
|
||
|
}
|
||
|
|
||
|
if (activeCount < concurrency) {
|
||
|
run.apply(void 0, [fn, resolve].concat(args));
|
||
|
} else {
|
||
|
queue.push(run.bind.apply(run, [null, fn, resolve].concat(args)));
|
||
|
}
|
||
|
};
|
||
|
|
||
|
var generator = function generator(fn) {
|
||
|
for (var _len3 = arguments.length, args = new Array(_len3 > 1 ? _len3 - 1 : 0), _key3 = 1; _key3 < _len3; _key3++) {
|
||
|
args[_key3 - 1] = arguments[_key3];
|
||
|
}
|
||
|
|
||
|
return new Promise(function (resolve) {
|
||
|
return enqueue.apply(void 0, [fn, resolve].concat(args));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
Object.defineProperties(generator, {
|
||
|
activeCount: {
|
||
|
get: function get() {
|
||
|
return activeCount;
|
||
|
}
|
||
|
},
|
||
|
pendingCount: {
|
||
|
get: function get() {
|
||
|
return queue.length;
|
||
|
}
|
||
|
},
|
||
|
clearQueue: {
|
||
|
value: function value() {
|
||
|
queue.length = 0;
|
||
|
}
|
||
|
}
|
||
|
});
|
||
|
return generator;
|
||
|
};
|
||
|
|
||
|
module.exports = pLimit;
|
||
|
module.exports.default = pLimit;
|
||
|
|
||
|
/***/ }),
|
||
|
|
||
|
/***/ "./node_modules/p-try/index.js":
|
||
|
/*!*************************************!*\
|
||
|
!*** ./node_modules/p-try/index.js ***!
|
||
|
\*************************************/
|
||
|
/*! no static exports found */
|
||
|
/***/ (function(module, exports, __webpack_require__) {
|
||
|
|
||
|
"use strict";
|
||
|
|
||
|
|
||
|
var pTry = function pTry(fn) {
|
||
|
for (var _len = arguments.length, arguments_ = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
|
||
|
arguments_[_key - 1] = arguments[_key];
|
||
|
}
|
||
|
|
||
|
return new Promise(function (resolve) {
|
||
|
resolve(fn.apply(void 0, arguments_));
|
||
|
});
|
||
|
};
|
||
|
|
||
|
module.exports = pTry; // TODO: remove this in the next major version
|
||
|
|
||
|
module.exports.default = pTry;
|
||
|
|
||
|
/***/ })
|
||
|
|
||
|
}]);
|
||
|
//# sourceMappingURL=vue-3.js.map?v=49bee3c8683e8ce01ca3
|