🚀 Big News:Socket Has Acquired Secure Annex.Learn More
Socket
Book a DemoSign in
Socket

@mdit/plugin-tab

Package Overview
Dependencies
Maintainers
1
Versions
64
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

@mdit/plugin-tab - npm Package Compare versions

Comparing version
0.22.6-cjs.0
to
0.23.0
+6
-8
lib/browser.js

@@ -1,14 +0,12 @@

"use strict";var C={},T;function q(){if(T)return C;T=1;const r=l=>{const c=l.split(`
`),u=c.reduce((n,e)=>{for(let s=0;s<e.length;s++)if(e[s]!==" "&&e[s]!==" ")return Math.min(s,n);return n},1/0);return u<1/0?c.map(n=>n.slice(u)).join(`
`):l},i=l=>l.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&#39;"),t=l=>l.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&"),a=/\r\n?|\n/g,f=/\\([ \\!"#$%&'()*+,./:;<=>?@[\]^_`{|}~-])/gu;return C.NEWLINE_RE=a,C.UNESCAPE_RE=f,C.dedent=r,C.escapeHtml=i,C.escapeRegExp=t,C}var E=q();function w(r){switch(r){case 9:case 32:return!0}return!1}const B=3,y="@tab",I=y+":active",H=y.length,R=I.length,J=(r,i,t)=>{if(r.src.charCodeAt(i)!==64)return!1;let a=1;for(;a<R&&I.charCodeAt(a)===r.src.charCodeAt(i+a);a++);const f=a===R;if(!f&&a!==H)return!1;const l=i+a,c=r.skipSpaces(l);return c>l&&c<t?{isActive:f,pos:c}:!1},N=(r,i)=>(t,a,f,l)=>{if(i.state!==r)return!1;const c=t.bMarks[a]+t.tShift[a],u=t.eMarks[a],n=t.sCount[a],e=J(t,c,u);if(e===!1)return!1;if(l)return!0;let s=a+1,p=!1;for(;s<f;s++){const x=t.bMarks[s]+t.tShift[s];if(t.sCount[s]===n&&t.src[x]==="@"&&J(t,x,t.eMarks[s])){p=!0;break}}const v=t.parentType,o=t.lineMax,d=t.blkIndent;t.parentType="tab",t.lineMax=s-(p?1:0),t.blkIndent=n;const b=t.push(`${r}_tab_open`,"",1),k=e.pos,A=t.skipSpacesBack(u,k);let h=A,g;for(;h>k;){if(t.src.charCodeAt(h)===35){for(g=h-1;t.src.charCodeAt(g)===92;)g--;if((h-g)%2===1)break}h--}let $,S="";h!==k?(S=t.src.slice(t.skipSpaces(h+1),A),$=t.src.slice(k,t.skipSpacesBack(h,k))):$=t.src.slice(k,A),b.block=!0,b.markup=y,b.info=$,b.meta={active:e.isActive},S&&(b.meta.id=S),b.map=[a,s-(p?1:0)],t.md.block.tokenize(t,a+1,s+(p?0:1));const m=t.push(`${r}_tab_close`,"",-1);return m.block=!0,m.markup="",t.parentType=v,t.lineMax=o,t.blkIndent=d,t.line=s+(p?0:1),!0},z=(r,i)=>(t,a,f,l)=>{const c=t.bMarks[a]+t.tShift[a],u=t.eMarks[a],n=t.sCount[a];if(t.src.charCodeAt(c)!==58)return!1;let e=c+1;for(;e<=u&&t.src.charCodeAt(e)===58;)e++;const s=e-c;if(s<B)return!1;e=t.skipSpaces(e);for(let _=0;_<r.length;_++){if(t.src.charCodeAt(e)!==r.charCodeAt(_))return!1;e++}let p=!1,v;for(;e!==u;){if(v=t.src.charCodeAt(e++),v===35){p=!0;break}if(!w(v))return!1}if(l)return!0;let o=a+1,d=!1,b=e;for(;o<f;o++){const _=t.bMarks[o]+t.tShift[o],M=t.eMarks[o];if(_<M&&t.sCount[o]<n)break;if(t.sCount[o]===n&&t.src.charCodeAt(_)===58){for(e=_+1;e<=M&&t.src.charCodeAt(e)===58;e++);if(e-_>=s&&(e=t.skipSpaces(e),e>=M)){d=!0;break}}}const k=t.parentType,A=t.lineMax,h=t.blkIndent,g=i.state;t.parentType=`${r}_tabs`,t.lineMax=o-(d?1:0),t.blkIndent=n;const $=":".repeat(s);let S="";if(p){b=t.skipSpaces(b);const _=t.skipSpacesBack(u,b);b<_&&(S=t.src.slice(b,_))}const m=t.push(`${r}_tabs_open`,"",1);m.markup=$,m.block=!0,m.info=r,m.meta={id:S},m.map=[a,o-(d?1:0)],i.state=r,t.md.block.tokenize(t,a+1,o-(d?1:0)),i.state=g;const x=t.push(`${r}_tabs_close`,"",-1);return x.markup=$,x.block=!0,t.parentType=k,t.lineMax=A,t.blkIndent=h,t.line=o+(d?1:0),!0},O=r=>(i,t)=>{const a=[];let f=-1,l=!1,c=0;for(let u=t+1;u<i.length;u++){const{block:n,meta:e,type:s,info:p}=i[u];if(n){if(s===`${r}_tabs_open`){c++;continue}if(s===`${r}_tabs_close`){if(c===0)break;c--;continue}if(c>0)continue;if(s===`${r}_tab_open`){l=!0,e.index=a.length,e.active&&(f===-1?f=a.length:e.active=!1),a.push({title:p,index:a.length,id:e.id,isActive:e.active});continue}if(s===`${r}_tab_close`)continue;l||(i[u].type=`${r}_tabs_empty`,i[u].hidden=!0)}}return{active:f,data:a}},D=(r,i)=>{const{info:t,meta:a}=r[i];return{title:t,index:a.index,id:a.id,isActive:a.active}},j={state:null},G=(r,i)=>{const{name:t="tabs",openRender:a=(n,e,s,p,v,o)=>{const{active:d,data:b}=n,k=e[s];k.attrJoin("class",`${t}-tabs-wrapper`),k.meta.id&&k.attrJoin("data-id",k.meta.id);const A=b.map(({title:h,id:g},$)=>`<button type="button" class="${t}-tab-button${d===$?" active":""}" data-tab="${$}"${g?` data-id="${E.escapeHtml(g)}"`:""}${d===$?" data-active":""}>${E.escapeHtml(r.renderInline(h))}</button>`);return`<div${o.renderAttrs(k)}>
const y=a=>a.replace(/&/gu,"&amp;").replace(/</gu,"&lt;").replace(/>/gu,"&gt;").replace(/"/gu,"&quot;").replace(/'/gu,"&#39;");function q(a){switch(a){case 9:case 32:return!0}return!1}const w=3,M="@tab",T=M+":active",B=M.length,I=T.length,R=(a,c,t)=>{if(a.src.charCodeAt(c)!==64)return!1;let r=1;for(;r<I&&T.charCodeAt(r)===a.src.charCodeAt(c+r);r++);const b=r===I;if(!b&&r!==B)return!1;const h=c+r,o=a.skipSpaces(h);return o>h&&o<t?{isActive:b,pos:o}:!1},j=(a,c)=>(t,r,b,h)=>{if(c.state!==a)return!1;const o=t.bMarks[r]+t.tShift[r],d=t.eMarks[r],n=t.sCount[r],e=R(t,o,d);if(e===!1)return!1;if(h)return!0;let s=r+1,l=!1;for(;s<b;s++){const S=t.bMarks[s]+t.tShift[s];if(t.sCount[s]===n&&t.src[S]==="@"&&R(t,S,t.eMarks[s])){l=!0;break}}const v=t.parentType,i=t.lineMax,u=t.blkIndent;t.parentType="tab",t.lineMax=s-(l?1:0),t.blkIndent=n;const p=t.push(`${a}_tab_open`,"",1),f=e.pos,m=t.skipSpacesBack(d,f);let k=m,A;for(;k>f;){if(t.src.charCodeAt(k)===35){for(A=k-1;t.src.charCodeAt(A)===92;)A--;if((k-A)%2===1)break}k--}let $,C="";k!==f?(C=t.src.slice(t.skipSpaces(k+1),m),$=t.src.slice(f,t.skipSpacesBack(k,f))):$=t.src.slice(f,m),p.block=!0,p.markup=M,p.info=$,p.meta={active:e.isActive},C&&(p.meta.id=C),p.map=[r,s-(l?1:0)],t.md.block.tokenize(t,r+1,s+(l?0:1));const g=t.push(`${a}_tab_close`,"",-1);return g.block=!0,g.markup="",t.parentType=v,t.lineMax=i,t.blkIndent=u,t.line=s+(l?0:1),!0},z=(a,c)=>(t,r,b,h)=>{const o=t.bMarks[r]+t.tShift[r],d=t.eMarks[r],n=t.sCount[r];if(t.src.charCodeAt(o)!==58)return!1;let e=o+1;for(;e<=d&&t.src.charCodeAt(e)===58;)e++;const s=e-o;if(s<w)return!1;e=t.skipSpaces(e);for(let _=0;_<a.length;_++){if(t.src.charCodeAt(e)!==a.charCodeAt(_))return!1;e++}let l=!1,v;for(;e!==d;){if(v=t.src.charCodeAt(e++),v===35){l=!0;break}if(!q(v))return!1}if(h)return!0;let i=r+1,u=!1,p=e;for(;i<b;i++){const _=t.bMarks[i]+t.tShift[i],x=t.eMarks[i];if(_<x&&t.sCount[i]<n)break;if(t.sCount[i]===n&&t.src.charCodeAt(_)===58){for(e=_+1;e<=x&&t.src.charCodeAt(e)===58;e++);if(e-_>=s&&(e=t.skipSpaces(e),e>=x)){u=!0;break}}}const f=t.parentType,m=t.lineMax,k=t.blkIndent,A=c.state;t.parentType=`${a}_tabs`,t.lineMax=i-(u?1:0),t.blkIndent=n;const $=":".repeat(s);let C="";if(l){p=t.skipSpaces(p);const _=t.skipSpacesBack(d,p);p<_&&(C=t.src.slice(p,_))}const g=t.push(`${a}_tabs_open`,"",1);g.markup=$,g.block=!0,g.info=a,g.meta={id:C},g.map=[r,i-(u?1:0)],c.state=a,t.md.block.tokenize(t,r+1,i-(u?1:0)),c.state=A;const S=t.push(`${a}_tabs_close`,"",-1);return S.markup=$,S.block=!0,t.parentType=f,t.lineMax=m,t.blkIndent=k,t.line=i+(u?1:0),!0},O=a=>(c,t)=>{const r=[];let b=-1,h=!1,o=0;for(let d=t+1;d<c.length;d++){const{block:n,meta:e,type:s,info:l}=c[d];if(n){if(s===`${a}_tabs_open`){o++;continue}if(s===`${a}_tabs_close`){if(o===0)break;o--;continue}if(o>0)continue;if(s===`${a}_tab_open`){h=!0,e.index=r.length,e.active&&(b===-1?b=r.length:e.active=!1),r.push({title:l,index:r.length,id:e.id,isActive:e.active});continue}if(s===`${a}_tab_close`)continue;h||(c[d].type=`${a}_tabs_empty`,c[d].hidden=!0)}}return{active:b,data:r}},D=(a,c)=>{const{info:t,meta:r}=a[c];return{title:t,index:r.index,id:r.id,isActive:r.active}},J={state:null},E=(a,c)=>{const{name:t="tabs",openRender:r=(n,e,s,l,v,i)=>{const{active:u,data:p}=n,f=e[s];f.attrJoin("class",`${t}-tabs-wrapper`),f.meta.id&&f.attrJoin("data-id",f.meta.id);const m=p.map(({title:k,id:A},$)=>`<button type="button" class="${t}-tab-button${u===$?" active":""}" data-tab="${$}"${A?` data-id="${y(A)}"`:""}${u===$?" data-active":""}>${y(a.renderInline(k))}</button>`);return`<div${i.renderAttrs(f)}>
<div class="${t}-tabs-header">
${A.join(`
${m.join(`
`)}
</div>
<div class="${t}-tabs-container">
`},closeRender:f=()=>` </div>
`},closeRender:b=()=>` </div>
</div>
`,tabOpenRender:l=(n,e,s,p,v,o)=>{const d=e[s];return d.attrJoin("class",`${t}-tab-content${n.isActive?" active":""}`),d.attrSet("data-index",n.index.toString()),n.id&&d.attrSet("data-id",n.id),n.isActive&&d.attrJoin("data-active",""),`<div${o.renderAttrs(e[s])}>
`},tabCloseRender:c=()=>`</div>
`}=i??{},u=O(t);r.block.ruler.before("fence",`${t}_tabs`,z(t,j),{alt:["paragraph","reference","blockquote","list"]}),r.block.ruler.before("paragraph",`${t}_tab`,N(t,j),{alt:["paragraph","reference","blockquote","list"]}),r.renderer.rules[`${t}_tabs_open`]=(n,e,s,p,v)=>{const o=u(n,e);return a(o,n,e,s,p,v)},r.renderer.rules[`${t}_tabs_close`]=f,r.renderer.rules[`${t}_tab_open`]=(n,e,...s)=>{const p=D(n,e);return l(p,n,e,...s)},r.renderer.rules[`${t}_tab_close`]=c};exports.tab=G;
`,tabOpenRender:h=(n,e,s,l,v,i)=>{const u=e[s];return u.attrJoin("class",`${t}-tab-content${n.isActive?" active":""}`),u.attrSet("data-index",n.index.toString()),n.id&&u.attrSet("data-id",n.id),n.isActive&&u.attrJoin("data-active",""),`<div${i.renderAttrs(e[s])}>
`},tabCloseRender:o=()=>`</div>
`}=c??{},d=O(t);a.block.ruler.before("fence",`${t}_tabs`,z(t,J),{alt:["paragraph","reference","blockquote","list"]}),a.block.ruler.before("paragraph",`${t}_tab`,j(t,J),{alt:["paragraph","reference","blockquote","list"]}),a.renderer.rules[`${t}_tabs_open`]=(n,e,s,l,v)=>{const i=d(n,e);return r(i,n,e,s,l,v)},a.renderer.rules[`${t}_tabs_close`]=b,a.renderer.rules[`${t}_tab_open`]=(n,e,...s)=>{const l=D(n,e);return h(l,n,e,...s)},a.renderer.rules[`${t}_tab_close`]=o};export{E as tab};
//# sourceMappingURL=browser.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"browser.js","sources":["../../helper/lib/index.js","../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/utils.mjs","../src/plugin.ts"],"sourcesContent":["\"use strict\";const E=e=>{const p=e.split(`\n`),r=p.reduce((c,n)=>{for(let t=0;t<n.length;t++)if(n[t]!==\" \"&&n[t]!==\"\t\")return Math.min(t,c);return c},1/0);return r<1/0?p.map(c=>c.slice(r)).join(`\n`):e},a=e=>e.replace(/&/gu,\"&amp;\").replace(/</gu,\"&lt;\").replace(/>/gu,\"&gt;\").replace(/\"/gu,\"&quot;\").replace(/'/gu,\"&#39;\"),l=e=>e.replace(/[-/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),s=/\\r\\n?|\\n/g,g=/\\\\([ \\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-])/gu;exports.NEWLINE_RE=s,exports.UNESCAPE_RE=g,exports.dedent=E,exports.escapeHtml=a,exports.escapeRegExp=l;\n//# sourceMappingURL=index.js.map\n","// Utilities\n//\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTML } from 'entities'\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\n\nfunction isString (obj) { return _class(obj) === '[object String]' }\n\nconst _hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction has (object, key) {\n return _hasOwnProperty.call(object, key)\n}\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n const sources = Array.prototype.slice.call(arguments, 1)\n\n sources.forEach(function (source) {\n if (!source) { return }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object')\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key]\n })\n })\n\n return obj\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt (src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\nfunction isValidEntityCode (c) {\n /* eslint no-bitwise:0 */\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false }\n if (c === 0x0B) { return false }\n if (c >= 0x0E && c <= 0x1F) { return false }\n if (c >= 0x7F && c <= 0x9F) { return false }\n // out of range\n if (c > 0x10FFFF) { return false }\n return true\n}\n\nfunction fromCodePoint (c) {\n /* eslint no-bitwise:0 */\n if (c > 0xffff) {\n c -= 0x10000\n const surrogate1 = 0xd800 + (c >> 10)\n const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n return String.fromCharCode(surrogate1, surrogate2)\n }\n return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match, name) {\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n const code = name[1].toLowerCase() === 'x'\n ? parseInt(name.slice(2), 16)\n : parseInt(name.slice(1), 10)\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code)\n }\n\n return match\n }\n\n const decoded = decodeHTML(match)\n if (decoded !== match) {\n return decoded\n }\n\n return match\n}\n\n/* function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n} */\n\nfunction unescapeMd (str) {\n if (str.indexOf('\\\\') < 0) { return str }\n return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\nfunction unescapeAll (str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped }\n return replaceEntityPattern(match, entity)\n })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch) {\n return HTML_REPLACEMENTS[ch]\n}\n\nfunction escapeHtml (str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n }\n return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\nfunction escapeRE (str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\nfunction isSpace (code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true\n }\n return false\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace (code) {\n if (code >= 0x2000 && code <= 0x200A) { return true }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true\n }\n return false\n}\n\n/* eslint-disable max-len */\n\n// Currently without astral characters support.\nfunction isPunctChar (ch) {\n return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct (ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true\n default:\n return false\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference (str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ')\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß')\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase()\n}\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nconst lib = { mdurl, ucmicro }\n\nexport {\n lib,\n assign,\n isString,\n has,\n unescapeMd,\n unescapeAll,\n isValidEntityCode,\n fromCodePoint,\n escapeHtml,\n arrayReplaceAt,\n isSpace,\n isWhiteSpace,\n isMdAsciiPunct,\n isPunctChar,\n escapeRE,\n normalizeReference\n}\n","import { escapeHtml } from \"@mdit/helper\";\nimport type { Options, PluginWithOptions } from \"markdown-it\";\nimport { isSpace } from \"markdown-it/lib/common/utils.mjs\";\nimport type { RuleBlock } from \"markdown-it/lib/parser_block.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type StateBlock from \"markdown-it/lib/rules_block/state_block.mjs\";\nimport type Token from \"markdown-it/lib/token.mjs\";\n\nimport type {\n MarkdownItTabData,\n MarkdownItTabInfo,\n MarkdownItTabOptions,\n} from \"./options.js\";\n\nconst MIN_MARKER_NUM = 3;\nconst TAB_MARKER = \"@tab\";\nconst ACTIVE_TAB_MARKER = TAB_MARKER + \":active\";\nconst TAB_MARKER_LENGTH = TAB_MARKER.length;\nconst ACTIVE_TAB_MARKER_LENGTH = ACTIVE_TAB_MARKER.length;\n\nconst checkTabMarker = (\n state: StateBlock,\n start: number,\n max: number,\n): false | { isActive: boolean; pos: number } => {\n /*\n * Check out the first character quickly,\n * this should filter out most of non-uml blocks\n */\n if (state.src.charCodeAt(start) !== 64 /* @ */) return false;\n\n let pos = 1;\n\n // Check out the rest of the marker string\n for (; pos < ACTIVE_TAB_MARKER_LENGTH; pos++)\n if (ACTIVE_TAB_MARKER.charCodeAt(pos) !== state.src.charCodeAt(start + pos))\n break;\n\n const isActive = pos === ACTIVE_TAB_MARKER_LENGTH;\n\n if (!isActive && pos !== TAB_MARKER_LENGTH) return false;\n\n const markerEnd = start + pos;\n const infoStart = state.skipSpaces(markerEnd);\n\n if (infoStart > markerEnd && infoStart < max)\n return { isActive, pos: infoStart };\n\n return false;\n};\n\nconst getTabRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n if (store.state !== name) return false;\n\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n const tabMatch = checkTabMarker(state, start, max);\n\n if (tabMatch === false) return false;\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n\n if (\n // marker should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src[nextLineStart] === \"@\"\n ) {\n if (checkTabMarker(state, nextLineStart, state.eMarks[nextLine])) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n\n // @ts-expect-error: We are creating a new type called \"tab\"\n state.parentType = `tab`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const openToken = state.push(`${name}_tab_open`, \"\", 1);\n\n const infoStart = tabMatch.pos;\n const infoEnd = state.skipSpacesBack(max, infoStart);\n\n let pos = infoEnd;\n let escapePos: number;\n\n while (pos > infoStart) {\n /*\n * Found potential #, look for escapes, pos will point to\n * first non escape when complete\n */\n if (state.src.charCodeAt(pos) === 35 /* # */) {\n escapePos = pos - 1;\n\n while (state.src.charCodeAt(escapePos) === 92 /* \\ */) escapePos--;\n\n // Even number of escapes, potential closing delimiter found\n if ((pos - escapePos) % 2 === 1) break;\n }\n\n pos--;\n }\n\n let title;\n let id = \"\";\n\n const hasId = pos !== infoStart;\n\n if (hasId) {\n id = state.src.slice(state.skipSpaces(pos + 1), infoEnd);\n title = state.src.slice(infoStart, state.skipSpacesBack(pos, infoStart));\n } else {\n title = state.src.slice(infoStart, infoEnd);\n }\n\n openToken.block = true;\n openToken.markup = TAB_MARKER;\n openToken.info = title;\n openToken.meta = {\n active: tabMatch.isActive,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine + (autoClosed ? 0 : 1),\n );\n\n const closeToken = state.push(`${name}_tab_close`, \"\", -1);\n\n closeToken.block = true;\n closeToken.markup = \"\";\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 0 : 1);\n\n return true;\n };\n\nconst getTabsRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n // Check out the first character quickly,\n // this should filter out most of non-containers\n if (state.src.charCodeAt(start) !== 58 /* : */) return false;\n\n let pos = start + 1;\n\n // Check out the rest of the marker string\n while (pos <= max) {\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n pos++;\n }\n\n const markerCount = pos - start;\n\n if (markerCount < MIN_MARKER_NUM) return false;\n\n pos = state.skipSpaces(pos);\n\n // check name is matched\n for (let i = 0; i < name.length; i++) {\n if (state.src.charCodeAt(pos) !== name.charCodeAt(i)) return false;\n pos++;\n }\n\n let hasId = false;\n let char: number;\n\n while (pos !== max) {\n char = state.src.charCodeAt(pos++);\n if (char === 35 /* # */) {\n hasId = true;\n break;\n }\n if (!isSpace(char)) return false;\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n let idStart = pos;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const nextLineMax = state.eMarks[nextLine];\n\n if (nextLineStart < nextLineMax && state.sCount[nextLine] < indent)\n // non-empty line with negative indent should stop the list:\n // - :::\n // test\n break;\n\n if (\n // closing fence should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src.charCodeAt(nextLineStart) === 58 /* : */\n ) {\n // check rest of marker\n for (pos = nextLineStart + 1; pos <= nextLineMax; pos++)\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n\n // closing code fence must be at least as long as the opening one\n if (pos - nextLineStart >= markerCount) {\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos >= nextLineMax) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n const oldState = store.state;\n\n // @ts-expect-error: We are creating a new type called \"${name}_tabs\"\n state.parentType = `${name}_tabs`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const markup = \":\".repeat(markerCount);\n let id = \"\";\n\n if (hasId) {\n idStart = state.skipSpaces(idStart);\n const idEnd = state.skipSpacesBack(max, idStart);\n\n if (idStart < idEnd) id = state.src.slice(idStart, idEnd);\n }\n\n const openToken = state.push(`${name}_tabs_open`, \"\", 1);\n\n openToken.markup = markup;\n openToken.block = true;\n openToken.info = name;\n openToken.meta = { id };\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n store.state = name;\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine - (autoClosed ? 1 : 0),\n );\n\n store.state = oldState;\n\n const closeToken = state.push(`${name}_tabs_close`, \"\", -1);\n\n closeToken.markup = markup;\n closeToken.block = true;\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 1 : 0);\n\n return true;\n };\n\nconst getTabsDataGetter =\n (name: string): ((tokens: Token[], index: number) => MarkdownItTabInfo) =>\n (tokens, index) => {\n const data: MarkdownItTabData[] = [];\n let activeIndex = -1;\n let isTabStart = false;\n let nestingDepth = 0;\n\n for (\n // skip the current tabs_open token\n let i = index + 1;\n i < tokens.length;\n i++\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { block, meta, type, info } = tokens[i];\n\n if (block) {\n // record the nesting depth of tabs\n if (type === `${name}_tabs_open`) {\n nestingDepth++;\n continue;\n }\n\n if (type === `${name}_tabs_close`) {\n if (nestingDepth === 0) break;\n nestingDepth--;\n continue;\n }\n\n // if we are in a nesting tabs, skip processing\n if (nestingDepth > 0) continue;\n\n if (type === `${name}_tab_open`) {\n isTabStart = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n meta.index = data.length;\n // tab is active\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (meta.active)\n if (activeIndex === -1) activeIndex = data.length;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n else meta.active = false;\n\n data.push({\n title: info,\n index: data.length,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n });\n\n continue;\n }\n\n if (type === `${name}_tab_close`) continue;\n\n // hide contents before first tab\n if (!isTabStart) {\n tokens[i].type = `${name}_tabs_empty`;\n tokens[i].hidden = true;\n }\n }\n }\n\n return {\n active: activeIndex,\n data: data,\n };\n };\n\nconst tabDataGetter = (tokens: Token[], index: number): MarkdownItTabData => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { info, meta } = tokens[index];\n\n return {\n title: info,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n index: meta.index as number,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n openRender = (\n info: MarkdownItTabInfo,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const { active, data } = info;\n const token = tokens[index];\n\n token.attrJoin(\"class\", `${name}-tabs-wrapper`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (token.meta.id) token.attrJoin(\"data-id\", token.meta.id as string);\n\n const tabs = data.map(\n ({ title, id }, index) =>\n `<button type=\"button\" class=\"${name}-tab-button${\n active === index ? \" active\" : \"\"\n }\" data-tab=\"${index}\"${id ? ` data-id=\"${escapeHtml(id)}\"` : \"\"}${\n active === index ? \" data-active\" : \"\"\n }>${escapeHtml(md.renderInline(title))}</button>`,\n );\n\n return `\\\n<div${self.renderAttrs(token)}>\n <div class=\"${name}-tabs-header\">\n ${tabs.join(\"\\n \")}\n </div>\n <div class=\"${name}-tabs-container\">\n`;\n },\n\n closeRender = (): string => `\\\n </div>\n</div>\n`,\n\n tabOpenRender = (\n info: MarkdownItTabData,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const token = tokens[index];\n\n token.attrJoin(\n \"class\",\n `${name}-tab-content${info.isActive ? \" active\" : \"\"}`,\n );\n token.attrSet(\"data-index\", info.index.toString());\n if (info.id) token.attrSet(\"data-id\", info.id);\n\n if (info.isActive) token.attrJoin(\"data-active\", \"\");\n\n return `\\\n<div${self.renderAttrs(tokens[index])}>\n`;\n },\n\n tabCloseRender = (): string => `\\\n</div>\n`,\n } = options ?? {};\n\n const tabsDataGetter = getTabsDataGetter(name);\n\n md.block.ruler.before(\"fence\", `${name}_tabs`, getTabsRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.block.ruler.before(\"paragraph\", `${name}_tab`, getTabRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.renderer.rules[`${name}_tabs_open`] = (\n tokens,\n index,\n options,\n env,\n self,\n ): string => {\n const info = tabsDataGetter(tokens, index);\n\n return openRender(info, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tabs_close`] = closeRender;\n\n md.renderer.rules[`${name}_tab_open`] = (tokens, index, ...args): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, ...args);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"names":["E","e","p","r","c","n","t","a","l","s","g","lib","isSpace","code","MIN_MARKER_NUM","TAB_MARKER","ACTIVE_TAB_MARKER","TAB_MARKER_LENGTH","ACTIVE_TAB_MARKER_LENGTH","checkTabMarker","state","start","max","pos","isActive","markerEnd","infoStart","getTabRule","name","store","startLine","endLine","silent","indent","tabMatch","nextLine","autoClosed","nextLineStart","oldParent","oldLineMax","oldBlkIndent","openToken","infoEnd","escapePos","title","id","closeToken","getTabsRule","markerCount","i","hasId","char","idStart","nextLineMax","oldState","markup","idEnd","getTabsDataGetter","tokens","index","data","activeIndex","isTabStart","nestingDepth","block","meta","type","info","tabDataGetter","tab","md","options","openRender","_options","_env","self","active","token","tabs","escapeHtml","closeRender","tabOpenRender","tabCloseRender","tabsDataGetter","env","args"],"mappings":"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","x_google_ignoreList":[1]}
{"version":3,"file":"browser.js","sources":["../../helper/lib/index.js","../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/utils.mjs","../src/plugin.ts"],"sourcesContent":["const l=e=>{const n=e.split(`\n`),p=n.reduce((r,c)=>{for(let t=0;t<c.length;t++)if(c[t]!==\" \"&&c[t]!==\"\t\")return Math.min(t,r);return r},1/0);return p<1/0?n.map(r=>r.slice(p)).join(`\n`):e},a=e=>e.replace(/&/gu,\"&amp;\").replace(/</gu,\"&lt;\").replace(/>/gu,\"&gt;\").replace(/\"/gu,\"&quot;\").replace(/'/gu,\"&#39;\"),g=e=>e.replace(/[-/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\"),u=/\\r\\n?|\\n/g,s=/\\\\([ \\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-])/gu;export{u as NEWLINE_RE,s as UNESCAPE_RE,l as dedent,a as escapeHtml,g as escapeRegExp};\n//# sourceMappingURL=index.js.map\n","// Utilities\n//\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTML } from 'entities'\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\n\nfunction isString (obj) { return _class(obj) === '[object String]' }\n\nconst _hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction has (object, key) {\n return _hasOwnProperty.call(object, key)\n}\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n const sources = Array.prototype.slice.call(arguments, 1)\n\n sources.forEach(function (source) {\n if (!source) { return }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object')\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key]\n })\n })\n\n return obj\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt (src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\nfunction isValidEntityCode (c) {\n /* eslint no-bitwise:0 */\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false }\n if (c === 0x0B) { return false }\n if (c >= 0x0E && c <= 0x1F) { return false }\n if (c >= 0x7F && c <= 0x9F) { return false }\n // out of range\n if (c > 0x10FFFF) { return false }\n return true\n}\n\nfunction fromCodePoint (c) {\n /* eslint no-bitwise:0 */\n if (c > 0xffff) {\n c -= 0x10000\n const surrogate1 = 0xd800 + (c >> 10)\n const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n return String.fromCharCode(surrogate1, surrogate2)\n }\n return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match, name) {\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n const code = name[1].toLowerCase() === 'x'\n ? parseInt(name.slice(2), 16)\n : parseInt(name.slice(1), 10)\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code)\n }\n\n return match\n }\n\n const decoded = decodeHTML(match)\n if (decoded !== match) {\n return decoded\n }\n\n return match\n}\n\n/* function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n} */\n\nfunction unescapeMd (str) {\n if (str.indexOf('\\\\') < 0) { return str }\n return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\nfunction unescapeAll (str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped }\n return replaceEntityPattern(match, entity)\n })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch) {\n return HTML_REPLACEMENTS[ch]\n}\n\nfunction escapeHtml (str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n }\n return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\nfunction escapeRE (str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\nfunction isSpace (code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true\n }\n return false\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace (code) {\n if (code >= 0x2000 && code <= 0x200A) { return true }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true\n }\n return false\n}\n\n/* eslint-disable max-len */\n\n// Currently without astral characters support.\nfunction isPunctChar (ch) {\n return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct (ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true\n default:\n return false\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference (str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ')\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß')\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase()\n}\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nconst lib = { mdurl, ucmicro }\n\nexport {\n lib,\n assign,\n isString,\n has,\n unescapeMd,\n unescapeAll,\n isValidEntityCode,\n fromCodePoint,\n escapeHtml,\n arrayReplaceAt,\n isSpace,\n isWhiteSpace,\n isMdAsciiPunct,\n isPunctChar,\n escapeRE,\n normalizeReference\n}\n","import { escapeHtml } from \"@mdit/helper\";\nimport type { Options, PluginWithOptions } from \"markdown-it\";\nimport { isSpace } from \"markdown-it/lib/common/utils.mjs\";\nimport type { RuleBlock } from \"markdown-it/lib/parser_block.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type StateBlock from \"markdown-it/lib/rules_block/state_block.mjs\";\nimport type Token from \"markdown-it/lib/token.mjs\";\n\nimport type {\n MarkdownItTabData,\n MarkdownItTabInfo,\n MarkdownItTabOptions,\n} from \"./options.js\";\n\nconst MIN_MARKER_NUM = 3;\nconst TAB_MARKER = \"@tab\";\nconst ACTIVE_TAB_MARKER = TAB_MARKER + \":active\";\nconst TAB_MARKER_LENGTH = TAB_MARKER.length;\nconst ACTIVE_TAB_MARKER_LENGTH = ACTIVE_TAB_MARKER.length;\n\nconst checkTabMarker = (\n state: StateBlock,\n start: number,\n max: number,\n): false | { isActive: boolean; pos: number } => {\n /*\n * Check out the first character quickly,\n * this should filter out most of non-uml blocks\n */\n if (state.src.charCodeAt(start) !== 64 /* @ */) return false;\n\n let pos = 1;\n\n // Check out the rest of the marker string\n for (; pos < ACTIVE_TAB_MARKER_LENGTH; pos++)\n if (ACTIVE_TAB_MARKER.charCodeAt(pos) !== state.src.charCodeAt(start + pos))\n break;\n\n const isActive = pos === ACTIVE_TAB_MARKER_LENGTH;\n\n if (!isActive && pos !== TAB_MARKER_LENGTH) return false;\n\n const markerEnd = start + pos;\n const infoStart = state.skipSpaces(markerEnd);\n\n if (infoStart > markerEnd && infoStart < max)\n return { isActive, pos: infoStart };\n\n return false;\n};\n\nconst getTabRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n if (store.state !== name) return false;\n\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n const tabMatch = checkTabMarker(state, start, max);\n\n if (tabMatch === false) return false;\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n\n if (\n // marker should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src[nextLineStart] === \"@\"\n ) {\n if (checkTabMarker(state, nextLineStart, state.eMarks[nextLine])) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n\n // @ts-expect-error: We are creating a new type called \"tab\"\n state.parentType = `tab`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const openToken = state.push(`${name}_tab_open`, \"\", 1);\n\n const infoStart = tabMatch.pos;\n const infoEnd = state.skipSpacesBack(max, infoStart);\n\n let pos = infoEnd;\n let escapePos: number;\n\n while (pos > infoStart) {\n /*\n * Found potential #, look for escapes, pos will point to\n * first non escape when complete\n */\n if (state.src.charCodeAt(pos) === 35 /* # */) {\n escapePos = pos - 1;\n\n while (state.src.charCodeAt(escapePos) === 92 /* \\ */) escapePos--;\n\n // Even number of escapes, potential closing delimiter found\n if ((pos - escapePos) % 2 === 1) break;\n }\n\n pos--;\n }\n\n let title;\n let id = \"\";\n\n const hasId = pos !== infoStart;\n\n if (hasId) {\n id = state.src.slice(state.skipSpaces(pos + 1), infoEnd);\n title = state.src.slice(infoStart, state.skipSpacesBack(pos, infoStart));\n } else {\n title = state.src.slice(infoStart, infoEnd);\n }\n\n openToken.block = true;\n openToken.markup = TAB_MARKER;\n openToken.info = title;\n openToken.meta = {\n active: tabMatch.isActive,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine + (autoClosed ? 0 : 1),\n );\n\n const closeToken = state.push(`${name}_tab_close`, \"\", -1);\n\n closeToken.block = true;\n closeToken.markup = \"\";\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 0 : 1);\n\n return true;\n };\n\nconst getTabsRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n // Check out the first character quickly,\n // this should filter out most of non-containers\n if (state.src.charCodeAt(start) !== 58 /* : */) return false;\n\n let pos = start + 1;\n\n // Check out the rest of the marker string\n while (pos <= max) {\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n pos++;\n }\n\n const markerCount = pos - start;\n\n if (markerCount < MIN_MARKER_NUM) return false;\n\n pos = state.skipSpaces(pos);\n\n // check name is matched\n for (let i = 0; i < name.length; i++) {\n if (state.src.charCodeAt(pos) !== name.charCodeAt(i)) return false;\n pos++;\n }\n\n let hasId = false;\n let char: number;\n\n while (pos !== max) {\n char = state.src.charCodeAt(pos++);\n if (char === 35 /* # */) {\n hasId = true;\n break;\n }\n if (!isSpace(char)) return false;\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n let idStart = pos;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const nextLineMax = state.eMarks[nextLine];\n\n if (nextLineStart < nextLineMax && state.sCount[nextLine] < indent)\n // non-empty line with negative indent should stop the list:\n // - :::\n // test\n break;\n\n if (\n // closing fence should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src.charCodeAt(nextLineStart) === 58 /* : */\n ) {\n // check rest of marker\n for (pos = nextLineStart + 1; pos <= nextLineMax; pos++)\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n\n // closing code fence must be at least as long as the opening one\n if (pos - nextLineStart >= markerCount) {\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos >= nextLineMax) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n const oldState = store.state;\n\n // @ts-expect-error: We are creating a new type called \"${name}_tabs\"\n state.parentType = `${name}_tabs`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const markup = \":\".repeat(markerCount);\n let id = \"\";\n\n if (hasId) {\n idStart = state.skipSpaces(idStart);\n const idEnd = state.skipSpacesBack(max, idStart);\n\n if (idStart < idEnd) id = state.src.slice(idStart, idEnd);\n }\n\n const openToken = state.push(`${name}_tabs_open`, \"\", 1);\n\n openToken.markup = markup;\n openToken.block = true;\n openToken.info = name;\n openToken.meta = { id };\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n store.state = name;\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine - (autoClosed ? 1 : 0),\n );\n\n store.state = oldState;\n\n const closeToken = state.push(`${name}_tabs_close`, \"\", -1);\n\n closeToken.markup = markup;\n closeToken.block = true;\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 1 : 0);\n\n return true;\n };\n\nconst getTabsDataGetter =\n (name: string): ((tokens: Token[], index: number) => MarkdownItTabInfo) =>\n (tokens, index) => {\n const data: MarkdownItTabData[] = [];\n let activeIndex = -1;\n let isTabStart = false;\n let nestingDepth = 0;\n\n for (\n // skip the current tabs_open token\n let i = index + 1;\n i < tokens.length;\n i++\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { block, meta, type, info } = tokens[i];\n\n if (block) {\n // record the nesting depth of tabs\n if (type === `${name}_tabs_open`) {\n nestingDepth++;\n continue;\n }\n\n if (type === `${name}_tabs_close`) {\n if (nestingDepth === 0) break;\n nestingDepth--;\n continue;\n }\n\n // if we are in a nesting tabs, skip processing\n if (nestingDepth > 0) continue;\n\n if (type === `${name}_tab_open`) {\n isTabStart = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n meta.index = data.length;\n // tab is active\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (meta.active)\n if (activeIndex === -1) activeIndex = data.length;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n else meta.active = false;\n\n data.push({\n title: info,\n index: data.length,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n });\n\n continue;\n }\n\n if (type === `${name}_tab_close`) continue;\n\n // hide contents before first tab\n if (!isTabStart) {\n tokens[i].type = `${name}_tabs_empty`;\n tokens[i].hidden = true;\n }\n }\n }\n\n return {\n active: activeIndex,\n data: data,\n };\n };\n\nconst tabDataGetter = (tokens: Token[], index: number): MarkdownItTabData => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { info, meta } = tokens[index];\n\n return {\n title: info,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n index: meta.index as number,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n openRender = (\n info: MarkdownItTabInfo,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const { active, data } = info;\n const token = tokens[index];\n\n token.attrJoin(\"class\", `${name}-tabs-wrapper`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (token.meta.id) token.attrJoin(\"data-id\", token.meta.id as string);\n\n const tabs = data.map(\n ({ title, id }, index) =>\n `<button type=\"button\" class=\"${name}-tab-button${\n active === index ? \" active\" : \"\"\n }\" data-tab=\"${index}\"${id ? ` data-id=\"${escapeHtml(id)}\"` : \"\"}${\n active === index ? \" data-active\" : \"\"\n }>${escapeHtml(md.renderInline(title))}</button>`,\n );\n\n return `\\\n<div${self.renderAttrs(token)}>\n <div class=\"${name}-tabs-header\">\n ${tabs.join(\"\\n \")}\n </div>\n <div class=\"${name}-tabs-container\">\n`;\n },\n\n closeRender = (): string => `\\\n </div>\n</div>\n`,\n\n tabOpenRender = (\n info: MarkdownItTabData,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const token = tokens[index];\n\n token.attrJoin(\n \"class\",\n `${name}-tab-content${info.isActive ? \" active\" : \"\"}`,\n );\n token.attrSet(\"data-index\", info.index.toString());\n if (info.id) token.attrSet(\"data-id\", info.id);\n\n if (info.isActive) token.attrJoin(\"data-active\", \"\");\n\n return `\\\n<div${self.renderAttrs(tokens[index])}>\n`;\n },\n\n tabCloseRender = (): string => `\\\n</div>\n`,\n } = options ?? {};\n\n const tabsDataGetter = getTabsDataGetter(name);\n\n md.block.ruler.before(\"fence\", `${name}_tabs`, getTabsRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.block.ruler.before(\"paragraph\", `${name}_tab`, getTabRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.renderer.rules[`${name}_tabs_open`] = (\n tokens,\n index,\n options,\n env,\n self,\n ): string => {\n const info = tabsDataGetter(tokens, index);\n\n return openRender(info, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tabs_close`] = closeRender;\n\n md.renderer.rules[`${name}_tab_open`] = (tokens, index, ...args): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, ...args);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"names":["a","e","isSpace","code","MIN_MARKER_NUM","TAB_MARKER","ACTIVE_TAB_MARKER","TAB_MARKER_LENGTH","ACTIVE_TAB_MARKER_LENGTH","checkTabMarker","state","start","max","pos","isActive","markerEnd","infoStart","getTabRule","name","store","startLine","endLine","silent","indent","tabMatch","nextLine","autoClosed","nextLineStart","oldParent","oldLineMax","oldBlkIndent","openToken","infoEnd","escapePos","title","id","closeToken","getTabsRule","markerCount","i","hasId","char","idStart","nextLineMax","oldState","markup","idEnd","getTabsDataGetter","tokens","index","data","activeIndex","isTabStart","nestingDepth","block","meta","type","info","tabDataGetter","tab","md","options","openRender","_options","_env","self","active","token","tabs","escapeHtml","closeRender","tabOpenRender","tabCloseRender","tabsDataGetter","env","args"],"mappings":"AAAA,MAEMA,EAAEC,GAAGA,EAAE,QAAQ,MAAM,OAAO,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,MAAM,EAAE,QAAQ,MAAM,QAAQ,EAAE,QAAQ,MAAM,OAAO,EC+I7H,SAASC,EAASC,EAAM,CACtB,OAAQA,EAAI,CACV,IAAK,GACL,IAAK,IACH,MAAO,EACb,CACE,MAAO,EACT,CC1IA,MAAMC,EAAiB,EACjBC,EAAa,OACbC,EAAoBD,EAAa,UACjCE,EAAoBF,EAAW,OAC/BG,EAA2BF,EAAkB,OAE7CG,EAAiB,CACrBC,EACAC,EACAC,IAC+C,CAK/C,GAAIF,EAAM,IAAI,WAAWC,CAAK,IAAM,GAAY,MAAO,GAEvD,IAAIE,EAAM,EAGV,KAAOA,EAAML,GACPF,EAAkB,WAAWO,CAAG,IAAMH,EAAM,IAAI,WAAWC,EAAQE,CAAG,EADrCA,IACrC,CAGF,MAAMC,EAAWD,IAAQL,EAEzB,GAAI,CAACM,GAAYD,IAAQN,EAAmB,MAAO,GAEnD,MAAMQ,EAAYJ,EAAQE,EACpBG,EAAYN,EAAM,WAAWK,CAAS,EAE5C,OAAIC,EAAYD,GAAaC,EAAYJ,EAChC,CAAE,SAAAE,EAAU,IAAKE,CAAU,EAE7B,EACT,EAEMC,EACJ,CAACC,EAAcC,IACf,CAACT,EAAOU,EAAWC,EAASC,IAAW,CACrC,GAAIH,EAAM,QAAUD,EAAM,MAAO,GAEjC,MAAMP,EAAQD,EAAM,OAAOU,CAAS,EAAIV,EAAM,OAAOU,CAAS,EACxDR,EAAMF,EAAM,OAAOU,CAAS,EAC5BG,EAASb,EAAM,OAAOU,CAAS,EAE/BI,EAAWf,EAAeC,EAAOC,EAAOC,CAAG,EAEjD,GAAIY,IAAa,GAAO,MAAO,GAG/B,GAAIF,EAAQ,MAAO,GAEnB,IAAIG,EAAWL,EAAY,EACvBM,EAAa,GAGjB,KAKED,EAAWJ,EACXI,IACA,CACA,MAAME,EAAgBjB,EAAM,OAAOe,CAAQ,EAAIf,EAAM,OAAOe,CAAQ,EAEpE,GAEEf,EAAM,OAAOe,CAAQ,IAAMF,GAE3Bb,EAAM,IAAIiB,CAAa,IAAM,KAEzBlB,EAAeC,EAAOiB,EAAejB,EAAM,OAAOe,CAAQ,CAAC,EAAG,CAEhEC,EAAa,GACb,KACF,CAEJ,CAEA,MAAME,EAAYlB,EAAM,WAClBmB,EAAanB,EAAM,QACnBoB,EAAepB,EAAM,UAG3BA,EAAM,WAAa,MAGnBA,EAAM,QAAUe,GAAYC,EAAa,EAAI,GAG7ChB,EAAM,UAAYa,EAElB,MAAMQ,EAAYrB,EAAM,KAAK,GAAGQ,CAAI,YAAa,GAAI,CAAC,EAEhDF,EAAYQ,EAAS,IACrBQ,EAAUtB,EAAM,eAAeE,EAAKI,CAAS,EAEnD,IAAIH,EAAMmB,EACNC,EAEJ,KAAOpB,EAAMG,GAAW,CAKtB,GAAIN,EAAM,IAAI,WAAWG,CAAG,IAAM,GAAY,CAG5C,IAFAoB,EAAYpB,EAAM,EAEXH,EAAM,IAAI,WAAWuB,CAAS,IAAM,IAAYA,IAGvD,IAAKpB,EAAMoB,GAAa,IAAM,EAAG,KACnC,CAEApB,GACF,CAEA,IAAIqB,EACAC,EAAK,GAEKtB,IAAQG,GAGpBmB,EAAKzB,EAAM,IAAI,MAAMA,EAAM,WAAWG,EAAM,CAAC,EAAGmB,CAAO,EACvDE,EAAQxB,EAAM,IAAI,MAAMM,EAAWN,EAAM,eAAeG,EAAKG,CAAS,CAAC,GAEvEkB,EAAQxB,EAAM,IAAI,MAAMM,EAAWgB,CAAO,EAG5CD,EAAU,MAAQ,GAClBA,EAAU,OAAS1B,EACnB0B,EAAU,KAAOG,EACjBH,EAAU,KAAO,CACf,OAAQP,EAAS,QACnB,EAEIW,IAAIJ,EAAU,KAAK,GAAKI,GAC5BJ,EAAU,IAAM,CAACX,EAAWK,GAAYC,EAAa,EAAI,EAAE,EAE3DhB,EAAM,GAAG,MAAM,SACbA,EACAU,EAAY,EACZK,GAAYC,EAAa,EAAI,EAC/B,EAEA,MAAMU,EAAa1B,EAAM,KAAK,GAAGQ,CAAI,aAAc,GAAI,EAAE,EAEzD,OAAAkB,EAAW,MAAQ,GACnBA,EAAW,OAAS,GAEpB1B,EAAM,WAAakB,EACnBlB,EAAM,QAAUmB,EAChBnB,EAAM,UAAYoB,EAClBpB,EAAM,KAAOe,GAAYC,EAAa,EAAI,GAEnC,EACT,EAEIW,EACJ,CAACnB,EAAcC,IACf,CAACT,EAAOU,EAAWC,EAASC,IAAW,CACrC,MAAMX,EAAQD,EAAM,OAAOU,CAAS,EAAIV,EAAM,OAAOU,CAAS,EACxDR,EAAMF,EAAM,OAAOU,CAAS,EAC5BG,EAASb,EAAM,OAAOU,CAAS,EAIrC,GAAIV,EAAM,IAAI,WAAWC,CAAK,IAAM,GAAY,MAAO,GAEvD,IAAIE,EAAMF,EAAQ,EAGlB,KAAOE,GAAOD,GACRF,EAAM,IAAI,WAAWG,CAAG,IAAM,IAClCA,IAGF,MAAMyB,EAAczB,EAAMF,EAE1B,GAAI2B,EAAclC,EAAgB,MAAO,GAEzCS,EAAMH,EAAM,WAAWG,CAAG,EAG1B,QAAS0B,EAAI,EAAGA,EAAIrB,EAAK,OAAQqB,IAAK,CACpC,GAAI7B,EAAM,IAAI,WAAWG,CAAG,IAAMK,EAAK,WAAWqB,CAAC,EAAG,MAAO,GAC7D1B,GACF,CAEA,IAAI2B,EAAQ,GACRC,EAEJ,KAAO5B,IAAQD,GAAK,CAElB,GADA6B,EAAO/B,EAAM,IAAI,WAAWG,GAAK,EAC7B4B,IAAS,GAAY,CACvBD,EAAQ,GACR,KACF,CACA,GAAI,CAACtC,EAAQuC,CAAI,EAAG,MAAO,EAC7B,CAGA,GAAInB,EAAQ,MAAO,GAEnB,IAAIG,EAAWL,EAAY,EACvBM,EAAa,GACbgB,EAAU7B,EAGd,KAKEY,EAAWJ,EACXI,IACA,CACA,MAAME,EAAgBjB,EAAM,OAAOe,CAAQ,EAAIf,EAAM,OAAOe,CAAQ,EAC9DkB,EAAcjC,EAAM,OAAOe,CAAQ,EAEzC,GAAIE,EAAgBgB,GAAejC,EAAM,OAAOe,CAAQ,EAAIF,EAI1D,MAEF,GAEEb,EAAM,OAAOe,CAAQ,IAAMF,GAE3Bb,EAAM,IAAI,WAAWiB,CAAa,IAAM,GACxC,CAEA,IAAKd,EAAMc,EAAgB,EAAGd,GAAO8B,GAC/BjC,EAAM,IAAI,WAAWG,CAAG,IAAM,GADcA,IAChD,CAGF,GAAIA,EAAMc,GAAiBW,IAEzBzB,EAAMH,EAAM,WAAWG,CAAG,EAEtBA,GAAO8B,GAAa,CAEtBjB,EAAa,GACb,KACF,CAEJ,CACF,CAEA,MAAME,EAAYlB,EAAM,WAClBmB,EAAanB,EAAM,QACnBoB,EAAepB,EAAM,UACrBkC,EAAWzB,EAAM,MAGvBT,EAAM,WAAa,GAAGQ,CAAI,QAG1BR,EAAM,QAAUe,GAAYC,EAAa,EAAI,GAG7ChB,EAAM,UAAYa,EAElB,MAAMsB,EAAS,IAAI,OAAOP,CAAW,EACrC,IAAIH,EAAK,GAET,GAAIK,EAAO,CACTE,EAAUhC,EAAM,WAAWgC,CAAO,EAClC,MAAMI,EAAQpC,EAAM,eAAeE,EAAK8B,CAAO,EAE3CA,EAAUI,IAAOX,EAAKzB,EAAM,IAAI,MAAMgC,EAASI,CAAK,EAC1D,CAEA,MAAMf,EAAYrB,EAAM,KAAK,GAAGQ,CAAI,aAAc,GAAI,CAAC,EAEvDa,EAAU,OAASc,EACnBd,EAAU,MAAQ,GAClBA,EAAU,KAAOb,EACjBa,EAAU,KAAO,CAAE,GAAAI,CAAG,EACtBJ,EAAU,IAAM,CAACX,EAAWK,GAAYC,EAAa,EAAI,EAAE,EAE3DP,EAAM,MAAQD,EAEdR,EAAM,GAAG,MAAM,SACbA,EACAU,EAAY,EACZK,GAAYC,EAAa,EAAI,EAC/B,EAEAP,EAAM,MAAQyB,EAEd,MAAMR,EAAa1B,EAAM,KAAK,GAAGQ,CAAI,cAAe,GAAI,EAAE,EAE1D,OAAAkB,EAAW,OAASS,EACpBT,EAAW,MAAQ,GAEnB1B,EAAM,WAAakB,EACnBlB,EAAM,QAAUmB,EAChBnB,EAAM,UAAYoB,EAClBpB,EAAM,KAAOe,GAAYC,EAAa,EAAI,GAEnC,EACT,EAEIqB,EACH7B,GACD,CAAC8B,EAAQC,IAAU,CACjB,MAAMC,EAA4B,CAAA,EAClC,IAAIC,EAAc,GACdC,EAAa,GACbC,EAAe,EAEnB,QAEMd,EAAIU,EAAQ,EAChBV,EAAIS,EAAO,OACXT,IACA,CAEA,KAAM,CAAE,MAAAe,EAAO,KAAAC,EAAM,KAAAC,EAAM,KAAAC,CAAK,EAAIT,EAAOT,CAAC,EAE5C,GAAIe,EAAO,CAET,GAAIE,IAAS,GAAGtC,CAAI,aAAc,CAChCmC,IACA,QACF,CAEA,GAAIG,IAAS,GAAGtC,CAAI,cAAe,CACjC,GAAImC,IAAiB,EAAG,MACxBA,IACA,QACF,CAGA,GAAIA,EAAe,EAAG,SAEtB,GAAIG,IAAS,GAAGtC,CAAI,YAAa,CAC/BkC,EAAa,GAGbG,EAAK,MAAQL,EAAK,OAGdK,EAAK,SACHJ,IAAgB,GAAIA,EAAcD,EAAK,OAEtCK,EAAK,OAAS,IAErBL,EAAK,KAAK,CACR,MAAOO,EACP,MAAOP,EAAK,OAEZ,GAAIK,EAAK,GAET,SAAUA,EAAK,MACjB,CAAC,EAED,QACF,CAEA,GAAIC,IAAS,GAAGtC,CAAI,aAAc,SAG7BkC,IACHJ,EAAOT,CAAC,EAAE,KAAO,GAAGrB,CAAI,cACxB8B,EAAOT,CAAC,EAAE,OAAS,GAEvB,CACF,CAEA,MAAO,CACL,OAAQY,EACR,KAAMD,CACR,CACF,EAEIQ,EAAgB,CAACV,EAAiBC,IAAqC,CAE3E,KAAM,CAAE,KAAAQ,EAAM,KAAAF,CAAK,EAAIP,EAAOC,CAAK,EAEnC,MAAO,CACL,MAAOQ,EAEP,MAAOF,EAAK,MAEZ,GAAIA,EAAK,GAET,SAAUA,EAAK,MACjB,CACF,EAEMpC,EAAQ,CAAE,MAAO,IAAK,EAEfwC,EAA+C,CAACC,EAAIC,IAAY,CAC3E,KAAM,CACJ,KAAA3C,EAAO,OAEP,WAAA4C,EAAa,CACXL,EACAT,EACAC,EACAc,EACAC,EACAC,IACW,CACX,KAAM,CAAE,OAAAC,EAAQ,KAAAhB,CAAK,EAAIO,EACnBU,EAAQnB,EAAOC,CAAK,EAE1BkB,EAAM,SAAS,QAAS,GAAGjD,CAAI,eAAe,EAE1CiD,EAAM,KAAK,IAAIA,EAAM,SAAS,UAAWA,EAAM,KAAK,EAAY,EAEpE,MAAMC,EAAOlB,EAAK,IAChB,CAAC,CAAE,MAAAhB,EAAO,GAAAC,CAAG,EAAGc,IACd,gCAAgC/B,CAAI,cAClCgD,IAAWjB,EAAQ,UAAY,EACjC,eAAeA,CAAK,IAAId,EAAK,aAAakC,EAAWlC,CAAE,CAAC,IAAM,EAAE,GAC9D+B,IAAWjB,EAAQ,eAAiB,EACtC,IAAIoB,EAAWT,EAAG,aAAa1B,CAAK,CAAC,CAAC,WAC1C,EAEA,MAAO,OACP+B,EAAK,YAAYE,CAAK,CAAC;AAAA,gBACbjD,CAAI;AAAA,MACdkD,EAAK,KAAK;AAAA,KAAQ,CAAC;AAAA;AAAA,gBAETlD,CAAI;AAAA,CAEhB,EAEA,YAAAoD,EAAc,IAAc;AAAA;AAAA,EAK5B,cAAAC,EAAgB,CACdd,EACAT,EACAC,EACAc,EACAC,EACAC,IACW,CACX,MAAME,EAAQnB,EAAOC,CAAK,EAE1B,OAAAkB,EAAM,SACJ,QACA,GAAGjD,CAAI,eAAeuC,EAAK,SAAW,UAAY,EAAE,EACtD,EACAU,EAAM,QAAQ,aAAcV,EAAK,MAAM,SAAA,CAAU,EAC7CA,EAAK,IAAIU,EAAM,QAAQ,UAAWV,EAAK,EAAE,EAEzCA,EAAK,UAAUU,EAAM,SAAS,cAAe,EAAE,EAE5C,OACPF,EAAK,YAAYjB,EAAOC,CAAK,CAAC,CAAC;AAAA,CAEjC,EAEA,eAAAuB,EAAiB,IAAc;AAAA,CAGjC,EAAIX,GAAW,CAAA,EAETY,EAAiB1B,EAAkB7B,CAAI,EAE7C0C,EAAG,MAAM,MAAM,OAAO,QAAS,GAAG1C,CAAI,QAASmB,EAAYnB,EAAMC,CAAK,EAAG,CACvE,IAAK,CAAC,YAAa,YAAa,aAAc,MAAM,CACtD,CAAC,EAEDyC,EAAG,MAAM,MAAM,OAAO,YAAa,GAAG1C,CAAI,OAAQD,EAAWC,EAAMC,CAAK,EAAG,CACzE,IAAK,CAAC,YAAa,YAAa,aAAc,MAAM,CACtD,CAAC,EAEDyC,EAAG,SAAS,MAAM,GAAG1C,CAAI,YAAY,EAAI,CACvC8B,EACAC,EACAY,EACAa,EACAT,IACW,CACX,MAAMR,EAAOgB,EAAezB,EAAQC,CAAK,EAEzC,OAAOa,EAAWL,EAAMT,EAAQC,EAAOY,EAASa,EAAKT,CAAI,CAC3D,EAEAL,EAAG,SAAS,MAAM,GAAG1C,CAAI,aAAa,EAAIoD,EAE1CV,EAAG,SAAS,MAAM,GAAG1C,CAAI,WAAW,EAAI,CAAC8B,EAAQC,KAAU0B,IAAiB,CAC1E,MAAMzB,EAAOQ,EAAcV,EAAQC,CAAK,EAExC,OAAOsB,EAAcrB,EAAMF,EAAQC,EAAO,GAAG0B,CAAI,CACnD,EAEAf,EAAG,SAAS,MAAM,GAAG1C,CAAI,YAAY,EAAIsD,CAC3C","x_google_ignoreList":[1]}

@@ -1,2 +0,2 @@

"use strict";var y=require("@mdit/helper");function q(r){switch(r){case 9:case 32:return!0}return!1}const w=3,g="@tab",T=g+":active",B=g.length,I=T.length,R=(r,c,t)=>{if(r.src.charCodeAt(c)!==64)return!1;let a=1;for(;a<I&&T.charCodeAt(a)===r.src.charCodeAt(c+a);a++);const b=a===I;if(!b&&a!==B)return!1;const h=c+a,o=r.skipSpaces(h);return o>h&&o<t?{isActive:b,pos:o}:!1},j=(r,c)=>(t,a,b,h)=>{if(c.state!==r)return!1;const o=t.bMarks[a]+t.tShift[a],u=t.eMarks[a],n=t.sCount[a],e=R(t,o,u);if(e===!1)return!1;if(h)return!0;let s=a+1,l=!1;for(;s<b;s++){const x=t.bMarks[s]+t.tShift[s];if(t.sCount[s]===n&&t.src[x]==="@"&&R(t,x,t.eMarks[s])){l=!0;break}}const v=t.parentType,i=t.lineMax,d=t.blkIndent;t.parentType="tab",t.lineMax=s-(l?1:0),t.blkIndent=n;const p=t.push(`${r}_tab_open`,"",1),f=e.pos,C=t.skipSpacesBack(u,f);let k=C,A;for(;k>f;){if(t.src.charCodeAt(k)===35){for(A=k-1;t.src.charCodeAt(A)===92;)A--;if((k-A)%2===1)break}k--}let $,S="";k!==f?(S=t.src.slice(t.skipSpaces(k+1),C),$=t.src.slice(f,t.skipSpacesBack(k,f))):$=t.src.slice(f,C),p.block=!0,p.markup=g,p.info=$,p.meta={active:e.isActive},S&&(p.meta.id=S),p.map=[a,s-(l?1:0)],t.md.block.tokenize(t,a+1,s+(l?0:1));const m=t.push(`${r}_tab_close`,"",-1);return m.block=!0,m.markup="",t.parentType=v,t.lineMax=i,t.blkIndent=d,t.line=s+(l?0:1),!0},z=(r,c)=>(t,a,b,h)=>{const o=t.bMarks[a]+t.tShift[a],u=t.eMarks[a],n=t.sCount[a];if(t.src.charCodeAt(o)!==58)return!1;let e=o+1;for(;e<=u&&t.src.charCodeAt(e)===58;)e++;const s=e-o;if(s<w)return!1;e=t.skipSpaces(e);for(let _=0;_<r.length;_++){if(t.src.charCodeAt(e)!==r.charCodeAt(_))return!1;e++}let l=!1,v;for(;e!==u;){if(v=t.src.charCodeAt(e++),v===35){l=!0;break}if(!q(v))return!1}if(h)return!0;let i=a+1,d=!1,p=e;for(;i<b;i++){const _=t.bMarks[i]+t.tShift[i],M=t.eMarks[i];if(_<M&&t.sCount[i]<n)break;if(t.sCount[i]===n&&t.src.charCodeAt(_)===58){for(e=_+1;e<=M&&t.src.charCodeAt(e)===58;e++);if(e-_>=s&&(e=t.skipSpaces(e),e>=M)){d=!0;break}}}const f=t.parentType,C=t.lineMax,k=t.blkIndent,A=c.state;t.parentType=`${r}_tabs`,t.lineMax=i-(d?1:0),t.blkIndent=n;const $=":".repeat(s);let S="";if(l){p=t.skipSpaces(p);const _=t.skipSpacesBack(u,p);p<_&&(S=t.src.slice(p,_))}const m=t.push(`${r}_tabs_open`,"",1);m.markup=$,m.block=!0,m.info=r,m.meta={id:S},m.map=[a,i-(d?1:0)],c.state=r,t.md.block.tokenize(t,a+1,i-(d?1:0)),c.state=A;const x=t.push(`${r}_tabs_close`,"",-1);return x.markup=$,x.block=!0,t.parentType=f,t.lineMax=C,t.blkIndent=k,t.line=i+(d?1:0),!0},H=r=>(c,t)=>{const a=[];let b=-1,h=!1,o=0;for(let u=t+1;u<c.length;u++){const{block:n,meta:e,type:s,info:l}=c[u];if(n){if(s===`${r}_tabs_open`){o++;continue}if(s===`${r}_tabs_close`){if(o===0)break;o--;continue}if(o>0)continue;if(s===`${r}_tab_open`){h=!0,e.index=a.length,e.active&&(b===-1?b=a.length:e.active=!1),a.push({title:l,index:a.length,id:e.id,isActive:e.active});continue}if(s===`${r}_tab_close`)continue;h||(c[u].type=`${r}_tabs_empty`,c[u].hidden=!0)}}return{active:b,data:a}},O=(r,c)=>{const{info:t,meta:a}=r[c];return{title:t,index:a.index,id:a.id,isActive:a.active}},J={state:null},D=(r,c)=>{const{name:t="tabs",openRender:a=(n,e,s,l,v,i)=>{const{active:d,data:p}=n,f=e[s];f.attrJoin("class",`${t}-tabs-wrapper`),f.meta.id&&f.attrJoin("data-id",f.meta.id);const C=p.map(({title:k,id:A},$)=>`<button type="button" class="${t}-tab-button${d===$?" active":""}" data-tab="${$}"${A?` data-id="${y.escapeHtml(A)}"`:""}${d===$?" data-active":""}>${y.escapeHtml(r.renderInline(k))}</button>`);return`<div${i.renderAttrs(f)}>
import{escapeHtml as y}from"@mdit/helper";import{isSpace as B}from"markdown-it/lib/common/utils.mjs";const j=3,g="@tab",T=g+":active",q=g.length,I=T.length,R=(r,o,t)=>{if(r.src.charCodeAt(o)!==64)return!1;let a=1;for(;a<I&&T.charCodeAt(a)===r.src.charCodeAt(o+a);a++);const b=a===I;if(!b&&a!==q)return!1;const h=o+a,c=r.skipSpaces(h);return c>h&&c<t?{isActive:b,pos:c}:!1},w=(r,o)=>(t,a,b,h)=>{if(o.state!==r)return!1;const c=t.bMarks[a]+t.tShift[a],p=t.eMarks[a],n=t.sCount[a],e=R(t,c,p);if(e===!1)return!1;if(h)return!0;let s=a+1,l=!1;for(;s<b;s++){const M=t.bMarks[s]+t.tShift[s];if(t.sCount[s]===n&&t.src[M]==="@"&&R(t,M,t.eMarks[s])){l=!0;break}}const v=t.parentType,i=t.lineMax,d=t.blkIndent;t.parentType="tab",t.lineMax=s-(l?1:0),t.blkIndent=n;const f=t.push(`${r}_tab_open`,"",1),u=e.pos,C=t.skipSpacesBack(p,u);let k=C,m;for(;k>u;){if(t.src.charCodeAt(k)===35){for(m=k-1;t.src.charCodeAt(m)===92;)m--;if((k-m)%2===1)break}k--}let $,S="";k!==u?(S=t.src.slice(t.skipSpaces(k+1),C),$=t.src.slice(u,t.skipSpacesBack(k,u))):$=t.src.slice(u,C),f.block=!0,f.markup=g,f.info=$,f.meta={active:e.isActive},S&&(f.meta.id=S),f.map=[a,s-(l?1:0)],t.md.block.tokenize(t,a+1,s+(l?0:1));const A=t.push(`${r}_tab_close`,"",-1);return A.block=!0,A.markup="",t.parentType=v,t.lineMax=i,t.blkIndent=d,t.line=s+(l?0:1),!0},z=(r,o)=>(t,a,b,h)=>{const c=t.bMarks[a]+t.tShift[a],p=t.eMarks[a],n=t.sCount[a];if(t.src.charCodeAt(c)!==58)return!1;let e=c+1;for(;e<=p&&t.src.charCodeAt(e)===58;)e++;const s=e-c;if(s<j)return!1;e=t.skipSpaces(e);for(let _=0;_<r.length;_++){if(t.src.charCodeAt(e)!==r.charCodeAt(_))return!1;e++}let l=!1,v;for(;e!==p;){if(v=t.src.charCodeAt(e++),v===35){l=!0;break}if(!B(v))return!1}if(h)return!0;let i=a+1,d=!1,f=e;for(;i<b;i++){const _=t.bMarks[i]+t.tShift[i],x=t.eMarks[i];if(_<x&&t.sCount[i]<n)break;if(t.sCount[i]===n&&t.src.charCodeAt(_)===58){for(e=_+1;e<=x&&t.src.charCodeAt(e)===58;e++);if(e-_>=s&&(e=t.skipSpaces(e),e>=x)){d=!0;break}}}const u=t.parentType,C=t.lineMax,k=t.blkIndent,m=o.state;t.parentType=`${r}_tabs`,t.lineMax=i-(d?1:0),t.blkIndent=n;const $=":".repeat(s);let S="";if(l){f=t.skipSpaces(f);const _=t.skipSpacesBack(p,f);f<_&&(S=t.src.slice(f,_))}const A=t.push(`${r}_tabs_open`,"",1);A.markup=$,A.block=!0,A.info=r,A.meta={id:S},A.map=[a,i-(d?1:0)],o.state=r,t.md.block.tokenize(t,a+1,i-(d?1:0)),o.state=m;const M=t.push(`${r}_tabs_close`,"",-1);return M.markup=$,M.block=!0,t.parentType=u,t.lineMax=C,t.blkIndent=k,t.line=i+(d?1:0),!0},O=r=>(o,t)=>{const a=[];let b=-1,h=!1,c=0;for(let p=t+1;p<o.length;p++){const{block:n,meta:e,type:s,info:l}=o[p];if(n){if(s===`${r}_tabs_open`){c++;continue}if(s===`${r}_tabs_close`){if(c===0)break;c--;continue}if(c>0)continue;if(s===`${r}_tab_open`){h=!0,e.index=a.length,e.active&&(b===-1?b=a.length:e.active=!1),a.push({title:l,index:a.length,id:e.id,isActive:e.active});continue}if(s===`${r}_tab_close`)continue;h||(o[p].type=`${r}_tabs_empty`,o[p].hidden=!0)}}return{active:b,data:a}},D=(r,o)=>{const{info:t,meta:a}=r[o];return{title:t,index:a.index,id:a.id,isActive:a.active}},J={state:null},E=(r,o)=>{const{name:t="tabs",openRender:a=(n,e,s,l,v,i)=>{const{active:d,data:f}=n,u=e[s];u.attrJoin("class",`${t}-tabs-wrapper`),u.meta.id&&u.attrJoin("data-id",u.meta.id);const C=f.map(({title:k,id:m},$)=>`<button type="button" class="${t}-tab-button${d===$?" active":""}" data-tab="${$}"${m?` data-id="${y(m)}"`:""}${d===$?" data-active":""}>${y(r.renderInline(k))}</button>`);return`<div${i.renderAttrs(u)}>
<div class="${t}-tabs-header">

@@ -10,4 +10,4 @@ ${C.join(`

`,tabOpenRender:h=(n,e,s,l,v,i)=>{const d=e[s];return d.attrJoin("class",`${t}-tab-content${n.isActive?" active":""}`),d.attrSet("data-index",n.index.toString()),n.id&&d.attrSet("data-id",n.id),n.isActive&&d.attrJoin("data-active",""),`<div${i.renderAttrs(e[s])}>
`},tabCloseRender:o=()=>`</div>
`}=c??{},u=H(t);r.block.ruler.before("fence",`${t}_tabs`,z(t,J),{alt:["paragraph","reference","blockquote","list"]}),r.block.ruler.before("paragraph",`${t}_tab`,j(t,J),{alt:["paragraph","reference","blockquote","list"]}),r.renderer.rules[`${t}_tabs_open`]=(n,e,s,l,v)=>{const i=u(n,e);return a(i,n,e,s,l,v)},r.renderer.rules[`${t}_tabs_close`]=b,r.renderer.rules[`${t}_tab_open`]=(n,e,...s)=>{const l=O(n,e);return h(l,n,e,...s)},r.renderer.rules[`${t}_tab_close`]=o};exports.tab=D;
`},tabCloseRender:c=()=>`</div>
`}=o??{},p=O(t);r.block.ruler.before("fence",`${t}_tabs`,z(t,J),{alt:["paragraph","reference","blockquote","list"]}),r.block.ruler.before("paragraph",`${t}_tab`,w(t,J),{alt:["paragraph","reference","blockquote","list"]}),r.renderer.rules[`${t}_tabs_open`]=(n,e,s,l,v)=>{const i=p(n,e);return a(i,n,e,s,l,v)},r.renderer.rules[`${t}_tabs_close`]=b,r.renderer.rules[`${t}_tab_open`]=(n,e,...s)=>{const l=D(n,e);return h(l,n,e,...s)},r.renderer.rules[`${t}_tab_close`]=c};export{E as tab};
//# sourceMappingURL=index.js.map

@@ -1,1 +0,1 @@

{"version":3,"file":"index.js","sources":["../../../node_modules/.pnpm/markdown-it@14.1.0/node_modules/markdown-it/lib/common/utils.mjs","../src/plugin.ts"],"sourcesContent":["// Utilities\n//\n\nimport * as mdurl from 'mdurl'\nimport * as ucmicro from 'uc.micro'\nimport { decodeHTML } from 'entities'\n\nfunction _class (obj) { return Object.prototype.toString.call(obj) }\n\nfunction isString (obj) { return _class(obj) === '[object String]' }\n\nconst _hasOwnProperty = Object.prototype.hasOwnProperty\n\nfunction has (object, key) {\n return _hasOwnProperty.call(object, key)\n}\n\n// Merge objects\n//\nfunction assign (obj /* from1, from2, from3, ... */) {\n const sources = Array.prototype.slice.call(arguments, 1)\n\n sources.forEach(function (source) {\n if (!source) { return }\n\n if (typeof source !== 'object') {\n throw new TypeError(source + 'must be object')\n }\n\n Object.keys(source).forEach(function (key) {\n obj[key] = source[key]\n })\n })\n\n return obj\n}\n\n// Remove element from array and put another array at those position.\n// Useful for some operations with tokens\nfunction arrayReplaceAt (src, pos, newElements) {\n return [].concat(src.slice(0, pos), newElements, src.slice(pos + 1))\n}\n\nfunction isValidEntityCode (c) {\n /* eslint no-bitwise:0 */\n // broken sequence\n if (c >= 0xD800 && c <= 0xDFFF) { return false }\n // never used\n if (c >= 0xFDD0 && c <= 0xFDEF) { return false }\n if ((c & 0xFFFF) === 0xFFFF || (c & 0xFFFF) === 0xFFFE) { return false }\n // control codes\n if (c >= 0x00 && c <= 0x08) { return false }\n if (c === 0x0B) { return false }\n if (c >= 0x0E && c <= 0x1F) { return false }\n if (c >= 0x7F && c <= 0x9F) { return false }\n // out of range\n if (c > 0x10FFFF) { return false }\n return true\n}\n\nfunction fromCodePoint (c) {\n /* eslint no-bitwise:0 */\n if (c > 0xffff) {\n c -= 0x10000\n const surrogate1 = 0xd800 + (c >> 10)\n const surrogate2 = 0xdc00 + (c & 0x3ff)\n\n return String.fromCharCode(surrogate1, surrogate2)\n }\n return String.fromCharCode(c)\n}\n\nconst UNESCAPE_MD_RE = /\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g\nconst ENTITY_RE = /&([a-z#][a-z0-9]{1,31});/gi\nconst UNESCAPE_ALL_RE = new RegExp(UNESCAPE_MD_RE.source + '|' + ENTITY_RE.source, 'gi')\n\nconst DIGITAL_ENTITY_TEST_RE = /^#((?:x[a-f0-9]{1,8}|[0-9]{1,8}))$/i\n\nfunction replaceEntityPattern (match, name) {\n if (name.charCodeAt(0) === 0x23/* # */ && DIGITAL_ENTITY_TEST_RE.test(name)) {\n const code = name[1].toLowerCase() === 'x'\n ? parseInt(name.slice(2), 16)\n : parseInt(name.slice(1), 10)\n\n if (isValidEntityCode(code)) {\n return fromCodePoint(code)\n }\n\n return match\n }\n\n const decoded = decodeHTML(match)\n if (decoded !== match) {\n return decoded\n }\n\n return match\n}\n\n/* function replaceEntities(str) {\n if (str.indexOf('&') < 0) { return str; }\n\n return str.replace(ENTITY_RE, replaceEntityPattern);\n} */\n\nfunction unescapeMd (str) {\n if (str.indexOf('\\\\') < 0) { return str }\n return str.replace(UNESCAPE_MD_RE, '$1')\n}\n\nfunction unescapeAll (str) {\n if (str.indexOf('\\\\') < 0 && str.indexOf('&') < 0) { return str }\n\n return str.replace(UNESCAPE_ALL_RE, function (match, escaped, entity) {\n if (escaped) { return escaped }\n return replaceEntityPattern(match, entity)\n })\n}\n\nconst HTML_ESCAPE_TEST_RE = /[&<>\"]/\nconst HTML_ESCAPE_REPLACE_RE = /[&<>\"]/g\nconst HTML_REPLACEMENTS = {\n '&': '&amp;',\n '<': '&lt;',\n '>': '&gt;',\n '\"': '&quot;'\n}\n\nfunction replaceUnsafeChar (ch) {\n return HTML_REPLACEMENTS[ch]\n}\n\nfunction escapeHtml (str) {\n if (HTML_ESCAPE_TEST_RE.test(str)) {\n return str.replace(HTML_ESCAPE_REPLACE_RE, replaceUnsafeChar)\n }\n return str\n}\n\nconst REGEXP_ESCAPE_RE = /[.?*+^$[\\]\\\\(){}|-]/g\n\nfunction escapeRE (str) {\n return str.replace(REGEXP_ESCAPE_RE, '\\\\$&')\n}\n\nfunction isSpace (code) {\n switch (code) {\n case 0x09:\n case 0x20:\n return true\n }\n return false\n}\n\n// Zs (unicode class) || [\\t\\f\\v\\r\\n]\nfunction isWhiteSpace (code) {\n if (code >= 0x2000 && code <= 0x200A) { return true }\n switch (code) {\n case 0x09: // \\t\n case 0x0A: // \\n\n case 0x0B: // \\v\n case 0x0C: // \\f\n case 0x0D: // \\r\n case 0x20:\n case 0xA0:\n case 0x1680:\n case 0x202F:\n case 0x205F:\n case 0x3000:\n return true\n }\n return false\n}\n\n/* eslint-disable max-len */\n\n// Currently without astral characters support.\nfunction isPunctChar (ch) {\n return ucmicro.P.test(ch) || ucmicro.S.test(ch)\n}\n\n// Markdown ASCII punctuation characters.\n//\n// !, \", #, $, %, &, ', (, ), *, +, ,, -, ., /, :, ;, <, =, >, ?, @, [, \\, ], ^, _, `, {, |, }, or ~\n// http://spec.commonmark.org/0.15/#ascii-punctuation-character\n//\n// Don't confuse with unicode punctuation !!! It lacks some chars in ascii range.\n//\nfunction isMdAsciiPunct (ch) {\n switch (ch) {\n case 0x21/* ! */:\n case 0x22/* \" */:\n case 0x23/* # */:\n case 0x24/* $ */:\n case 0x25/* % */:\n case 0x26/* & */:\n case 0x27/* ' */:\n case 0x28/* ( */:\n case 0x29/* ) */:\n case 0x2A/* * */:\n case 0x2B/* + */:\n case 0x2C/* , */:\n case 0x2D/* - */:\n case 0x2E/* . */:\n case 0x2F/* / */:\n case 0x3A/* : */:\n case 0x3B/* ; */:\n case 0x3C/* < */:\n case 0x3D/* = */:\n case 0x3E/* > */:\n case 0x3F/* ? */:\n case 0x40/* @ */:\n case 0x5B/* [ */:\n case 0x5C/* \\ */:\n case 0x5D/* ] */:\n case 0x5E/* ^ */:\n case 0x5F/* _ */:\n case 0x60/* ` */:\n case 0x7B/* { */:\n case 0x7C/* | */:\n case 0x7D/* } */:\n case 0x7E/* ~ */:\n return true\n default:\n return false\n }\n}\n\n// Hepler to unify [reference labels].\n//\nfunction normalizeReference (str) {\n // Trim and collapse whitespace\n //\n str = str.trim().replace(/\\s+/g, ' ')\n\n // In node v10 'ẞ'.toLowerCase() === 'Ṿ', which is presumed to be a bug\n // fixed in v12 (couldn't find any details).\n //\n // So treat this one as a special case\n // (remove this when node v10 is no longer supported).\n //\n if ('ẞ'.toLowerCase() === 'Ṿ') {\n str = str.replace(/ẞ/g, 'ß')\n }\n\n // .toLowerCase().toUpperCase() should get rid of all differences\n // between letter variants.\n //\n // Simple .toLowerCase() doesn't normalize 125 code points correctly,\n // and .toUpperCase doesn't normalize 6 of them (list of exceptions:\n // İ, ϴ, ẞ, Ω, K, Å - those are already uppercased, but have differently\n // uppercased versions).\n //\n // Here's an example showing how it happens. Lets take greek letter omega:\n // uppercase U+0398 (Θ), U+03f4 (ϴ) and lowercase U+03b8 (θ), U+03d1 (ϑ)\n //\n // Unicode entries:\n // 0398;GREEK CAPITAL LETTER THETA;Lu;0;L;;;;;N;;;;03B8;\n // 03B8;GREEK SMALL LETTER THETA;Ll;0;L;;;;;N;;;0398;;0398\n // 03D1;GREEK THETA SYMBOL;Ll;0;L;<compat> 03B8;;;;N;GREEK SMALL LETTER SCRIPT THETA;;0398;;0398\n // 03F4;GREEK CAPITAL THETA SYMBOL;Lu;0;L;<compat> 0398;;;;N;;;;03B8;\n //\n // Case-insensitive comparison should treat all of them as equivalent.\n //\n // But .toLowerCase() doesn't change ϑ (it's already lowercase),\n // and .toUpperCase() doesn't change ϴ (already uppercase).\n //\n // Applying first lower then upper case normalizes any character:\n // '\\u0398\\u03f4\\u03b8\\u03d1'.toLowerCase().toUpperCase() === '\\u0398\\u0398\\u0398\\u0398'\n //\n // Note: this is equivalent to unicode case folding; unicode normalization\n // is a different step that is not required here.\n //\n // Final result should be uppercased, because it's later stored in an object\n // (this avoid a conflict with Object.prototype members,\n // most notably, `__proto__`)\n //\n return str.toLowerCase().toUpperCase()\n}\n\n// Re-export libraries commonly used in both markdown-it and its plugins,\n// so plugins won't have to depend on them explicitly, which reduces their\n// bundled size (e.g. a browser build).\n//\nconst lib = { mdurl, ucmicro }\n\nexport {\n lib,\n assign,\n isString,\n has,\n unescapeMd,\n unescapeAll,\n isValidEntityCode,\n fromCodePoint,\n escapeHtml,\n arrayReplaceAt,\n isSpace,\n isWhiteSpace,\n isMdAsciiPunct,\n isPunctChar,\n escapeRE,\n normalizeReference\n}\n","import { escapeHtml } from \"@mdit/helper\";\nimport type { Options, PluginWithOptions } from \"markdown-it\";\nimport { isSpace } from \"markdown-it/lib/common/utils.mjs\";\nimport type { RuleBlock } from \"markdown-it/lib/parser_block.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type StateBlock from \"markdown-it/lib/rules_block/state_block.mjs\";\nimport type Token from \"markdown-it/lib/token.mjs\";\n\nimport type {\n MarkdownItTabData,\n MarkdownItTabInfo,\n MarkdownItTabOptions,\n} from \"./options.js\";\n\nconst MIN_MARKER_NUM = 3;\nconst TAB_MARKER = \"@tab\";\nconst ACTIVE_TAB_MARKER = TAB_MARKER + \":active\";\nconst TAB_MARKER_LENGTH = TAB_MARKER.length;\nconst ACTIVE_TAB_MARKER_LENGTH = ACTIVE_TAB_MARKER.length;\n\nconst checkTabMarker = (\n state: StateBlock,\n start: number,\n max: number,\n): false | { isActive: boolean; pos: number } => {\n /*\n * Check out the first character quickly,\n * this should filter out most of non-uml blocks\n */\n if (state.src.charCodeAt(start) !== 64 /* @ */) return false;\n\n let pos = 1;\n\n // Check out the rest of the marker string\n for (; pos < ACTIVE_TAB_MARKER_LENGTH; pos++)\n if (ACTIVE_TAB_MARKER.charCodeAt(pos) !== state.src.charCodeAt(start + pos))\n break;\n\n const isActive = pos === ACTIVE_TAB_MARKER_LENGTH;\n\n if (!isActive && pos !== TAB_MARKER_LENGTH) return false;\n\n const markerEnd = start + pos;\n const infoStart = state.skipSpaces(markerEnd);\n\n if (infoStart > markerEnd && infoStart < max)\n return { isActive, pos: infoStart };\n\n return false;\n};\n\nconst getTabRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n if (store.state !== name) return false;\n\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n const tabMatch = checkTabMarker(state, start, max);\n\n if (tabMatch === false) return false;\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n\n if (\n // marker should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src[nextLineStart] === \"@\"\n ) {\n if (checkTabMarker(state, nextLineStart, state.eMarks[nextLine])) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n\n // @ts-expect-error: We are creating a new type called \"tab\"\n state.parentType = `tab`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const openToken = state.push(`${name}_tab_open`, \"\", 1);\n\n const infoStart = tabMatch.pos;\n const infoEnd = state.skipSpacesBack(max, infoStart);\n\n let pos = infoEnd;\n let escapePos: number;\n\n while (pos > infoStart) {\n /*\n * Found potential #, look for escapes, pos will point to\n * first non escape when complete\n */\n if (state.src.charCodeAt(pos) === 35 /* # */) {\n escapePos = pos - 1;\n\n while (state.src.charCodeAt(escapePos) === 92 /* \\ */) escapePos--;\n\n // Even number of escapes, potential closing delimiter found\n if ((pos - escapePos) % 2 === 1) break;\n }\n\n pos--;\n }\n\n let title;\n let id = \"\";\n\n const hasId = pos !== infoStart;\n\n if (hasId) {\n id = state.src.slice(state.skipSpaces(pos + 1), infoEnd);\n title = state.src.slice(infoStart, state.skipSpacesBack(pos, infoStart));\n } else {\n title = state.src.slice(infoStart, infoEnd);\n }\n\n openToken.block = true;\n openToken.markup = TAB_MARKER;\n openToken.info = title;\n openToken.meta = {\n active: tabMatch.isActive,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine + (autoClosed ? 0 : 1),\n );\n\n const closeToken = state.push(`${name}_tab_close`, \"\", -1);\n\n closeToken.block = true;\n closeToken.markup = \"\";\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 0 : 1);\n\n return true;\n };\n\nconst getTabsRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n // Check out the first character quickly,\n // this should filter out most of non-containers\n if (state.src.charCodeAt(start) !== 58 /* : */) return false;\n\n let pos = start + 1;\n\n // Check out the rest of the marker string\n while (pos <= max) {\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n pos++;\n }\n\n const markerCount = pos - start;\n\n if (markerCount < MIN_MARKER_NUM) return false;\n\n pos = state.skipSpaces(pos);\n\n // check name is matched\n for (let i = 0; i < name.length; i++) {\n if (state.src.charCodeAt(pos) !== name.charCodeAt(i)) return false;\n pos++;\n }\n\n let hasId = false;\n let char: number;\n\n while (pos !== max) {\n char = state.src.charCodeAt(pos++);\n if (char === 35 /* # */) {\n hasId = true;\n break;\n }\n if (!isSpace(char)) return false;\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n let idStart = pos;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const nextLineMax = state.eMarks[nextLine];\n\n if (nextLineStart < nextLineMax && state.sCount[nextLine] < indent)\n // non-empty line with negative indent should stop the list:\n // - :::\n // test\n break;\n\n if (\n // closing fence should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src.charCodeAt(nextLineStart) === 58 /* : */\n ) {\n // check rest of marker\n for (pos = nextLineStart + 1; pos <= nextLineMax; pos++)\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n\n // closing code fence must be at least as long as the opening one\n if (pos - nextLineStart >= markerCount) {\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos >= nextLineMax) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n const oldState = store.state;\n\n // @ts-expect-error: We are creating a new type called \"${name}_tabs\"\n state.parentType = `${name}_tabs`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const markup = \":\".repeat(markerCount);\n let id = \"\";\n\n if (hasId) {\n idStart = state.skipSpaces(idStart);\n const idEnd = state.skipSpacesBack(max, idStart);\n\n if (idStart < idEnd) id = state.src.slice(idStart, idEnd);\n }\n\n const openToken = state.push(`${name}_tabs_open`, \"\", 1);\n\n openToken.markup = markup;\n openToken.block = true;\n openToken.info = name;\n openToken.meta = { id };\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n store.state = name;\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine - (autoClosed ? 1 : 0),\n );\n\n store.state = oldState;\n\n const closeToken = state.push(`${name}_tabs_close`, \"\", -1);\n\n closeToken.markup = markup;\n closeToken.block = true;\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 1 : 0);\n\n return true;\n };\n\nconst getTabsDataGetter =\n (name: string): ((tokens: Token[], index: number) => MarkdownItTabInfo) =>\n (tokens, index) => {\n const data: MarkdownItTabData[] = [];\n let activeIndex = -1;\n let isTabStart = false;\n let nestingDepth = 0;\n\n for (\n // skip the current tabs_open token\n let i = index + 1;\n i < tokens.length;\n i++\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { block, meta, type, info } = tokens[i];\n\n if (block) {\n // record the nesting depth of tabs\n if (type === `${name}_tabs_open`) {\n nestingDepth++;\n continue;\n }\n\n if (type === `${name}_tabs_close`) {\n if (nestingDepth === 0) break;\n nestingDepth--;\n continue;\n }\n\n // if we are in a nesting tabs, skip processing\n if (nestingDepth > 0) continue;\n\n if (type === `${name}_tab_open`) {\n isTabStart = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n meta.index = data.length;\n // tab is active\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (meta.active)\n if (activeIndex === -1) activeIndex = data.length;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n else meta.active = false;\n\n data.push({\n title: info,\n index: data.length,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n });\n\n continue;\n }\n\n if (type === `${name}_tab_close`) continue;\n\n // hide contents before first tab\n if (!isTabStart) {\n tokens[i].type = `${name}_tabs_empty`;\n tokens[i].hidden = true;\n }\n }\n }\n\n return {\n active: activeIndex,\n data: data,\n };\n };\n\nconst tabDataGetter = (tokens: Token[], index: number): MarkdownItTabData => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { info, meta } = tokens[index];\n\n return {\n title: info,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n index: meta.index as number,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n openRender = (\n info: MarkdownItTabInfo,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const { active, data } = info;\n const token = tokens[index];\n\n token.attrJoin(\"class\", `${name}-tabs-wrapper`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (token.meta.id) token.attrJoin(\"data-id\", token.meta.id as string);\n\n const tabs = data.map(\n ({ title, id }, index) =>\n `<button type=\"button\" class=\"${name}-tab-button${\n active === index ? \" active\" : \"\"\n }\" data-tab=\"${index}\"${id ? ` data-id=\"${escapeHtml(id)}\"` : \"\"}${\n active === index ? \" data-active\" : \"\"\n }>${escapeHtml(md.renderInline(title))}</button>`,\n );\n\n return `\\\n<div${self.renderAttrs(token)}>\n <div class=\"${name}-tabs-header\">\n ${tabs.join(\"\\n \")}\n </div>\n <div class=\"${name}-tabs-container\">\n`;\n },\n\n closeRender = (): string => `\\\n </div>\n</div>\n`,\n\n tabOpenRender = (\n info: MarkdownItTabData,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const token = tokens[index];\n\n token.attrJoin(\n \"class\",\n `${name}-tab-content${info.isActive ? \" active\" : \"\"}`,\n );\n token.attrSet(\"data-index\", info.index.toString());\n if (info.id) token.attrSet(\"data-id\", info.id);\n\n if (info.isActive) token.attrJoin(\"data-active\", \"\");\n\n return `\\\n<div${self.renderAttrs(tokens[index])}>\n`;\n },\n\n tabCloseRender = (): string => `\\\n</div>\n`,\n } = options ?? {};\n\n const tabsDataGetter = getTabsDataGetter(name);\n\n md.block.ruler.before(\"fence\", `${name}_tabs`, getTabsRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.block.ruler.before(\"paragraph\", `${name}_tab`, getTabRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.renderer.rules[`${name}_tabs_open`] = (\n tokens,\n index,\n options,\n env,\n self,\n ): string => {\n const info = tabsDataGetter(tokens, index);\n\n return openRender(info, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tabs_close`] = closeRender;\n\n md.renderer.rules[`${name}_tab_open`] = (tokens, index, ...args): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, ...args);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"names":["isSpace","code","MIN_MARKER_NUM","TAB_MARKER","ACTIVE_TAB_MARKER","TAB_MARKER_LENGTH","ACTIVE_TAB_MARKER_LENGTH","checkTabMarker","state","start","max","pos","isActive","markerEnd","infoStart","getTabRule","name","store","startLine","endLine","silent","indent","tabMatch","nextLine","autoClosed","nextLineStart","oldParent","oldLineMax","oldBlkIndent","openToken","infoEnd","escapePos","title","id","closeToken","getTabsRule","markerCount","i","hasId","char","idStart","nextLineMax","oldState","markup","idEnd","getTabsDataGetter","tokens","index","data","activeIndex","isTabStart","nestingDepth","block","meta","type","info","tabDataGetter","tab","md","options","openRender","_options","_env","self","active","token","tabs","escapeHtml","closeRender","tabOpenRender","tabCloseRender","tabsDataGetter","env","args"],"mappings":"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","x_google_ignoreList":[0]}
{"version":3,"file":"index.js","sources":["../src/plugin.ts"],"sourcesContent":["import { escapeHtml } from \"@mdit/helper\";\nimport type { Options, PluginWithOptions } from \"markdown-it\";\nimport { isSpace } from \"markdown-it/lib/common/utils.mjs\";\nimport type { RuleBlock } from \"markdown-it/lib/parser_block.mjs\";\nimport type Renderer from \"markdown-it/lib/renderer.mjs\";\nimport type StateBlock from \"markdown-it/lib/rules_block/state_block.mjs\";\nimport type Token from \"markdown-it/lib/token.mjs\";\n\nimport type {\n MarkdownItTabData,\n MarkdownItTabInfo,\n MarkdownItTabOptions,\n} from \"./options.js\";\n\nconst MIN_MARKER_NUM = 3;\nconst TAB_MARKER = \"@tab\";\nconst ACTIVE_TAB_MARKER = TAB_MARKER + \":active\";\nconst TAB_MARKER_LENGTH = TAB_MARKER.length;\nconst ACTIVE_TAB_MARKER_LENGTH = ACTIVE_TAB_MARKER.length;\n\nconst checkTabMarker = (\n state: StateBlock,\n start: number,\n max: number,\n): false | { isActive: boolean; pos: number } => {\n /*\n * Check out the first character quickly,\n * this should filter out most of non-uml blocks\n */\n if (state.src.charCodeAt(start) !== 64 /* @ */) return false;\n\n let pos = 1;\n\n // Check out the rest of the marker string\n for (; pos < ACTIVE_TAB_MARKER_LENGTH; pos++)\n if (ACTIVE_TAB_MARKER.charCodeAt(pos) !== state.src.charCodeAt(start + pos))\n break;\n\n const isActive = pos === ACTIVE_TAB_MARKER_LENGTH;\n\n if (!isActive && pos !== TAB_MARKER_LENGTH) return false;\n\n const markerEnd = start + pos;\n const infoStart = state.skipSpaces(markerEnd);\n\n if (infoStart > markerEnd && infoStart < max)\n return { isActive, pos: infoStart };\n\n return false;\n};\n\nconst getTabRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n if (store.state !== name) return false;\n\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n const tabMatch = checkTabMarker(state, start, max);\n\n if (tabMatch === false) return false;\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n\n if (\n // marker should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src[nextLineStart] === \"@\"\n ) {\n if (checkTabMarker(state, nextLineStart, state.eMarks[nextLine])) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n\n // @ts-expect-error: We are creating a new type called \"tab\"\n state.parentType = `tab`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const openToken = state.push(`${name}_tab_open`, \"\", 1);\n\n const infoStart = tabMatch.pos;\n const infoEnd = state.skipSpacesBack(max, infoStart);\n\n let pos = infoEnd;\n let escapePos: number;\n\n while (pos > infoStart) {\n /*\n * Found potential #, look for escapes, pos will point to\n * first non escape when complete\n */\n if (state.src.charCodeAt(pos) === 35 /* # */) {\n escapePos = pos - 1;\n\n while (state.src.charCodeAt(escapePos) === 92 /* \\ */) escapePos--;\n\n // Even number of escapes, potential closing delimiter found\n if ((pos - escapePos) % 2 === 1) break;\n }\n\n pos--;\n }\n\n let title;\n let id = \"\";\n\n const hasId = pos !== infoStart;\n\n if (hasId) {\n id = state.src.slice(state.skipSpaces(pos + 1), infoEnd);\n title = state.src.slice(infoStart, state.skipSpacesBack(pos, infoStart));\n } else {\n title = state.src.slice(infoStart, infoEnd);\n }\n\n openToken.block = true;\n openToken.markup = TAB_MARKER;\n openToken.info = title;\n openToken.meta = {\n active: tabMatch.isActive,\n };\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine + (autoClosed ? 0 : 1),\n );\n\n const closeToken = state.push(`${name}_tab_close`, \"\", -1);\n\n closeToken.block = true;\n closeToken.markup = \"\";\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 0 : 1);\n\n return true;\n };\n\nconst getTabsRule =\n (name: string, store: { state: string | null }): RuleBlock =>\n (state, startLine, endLine, silent) => {\n const start = state.bMarks[startLine] + state.tShift[startLine];\n const max = state.eMarks[startLine];\n const indent = state.sCount[startLine];\n\n // Check out the first character quickly,\n // this should filter out most of non-containers\n if (state.src.charCodeAt(start) !== 58 /* : */) return false;\n\n let pos = start + 1;\n\n // Check out the rest of the marker string\n while (pos <= max) {\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n pos++;\n }\n\n const markerCount = pos - start;\n\n if (markerCount < MIN_MARKER_NUM) return false;\n\n pos = state.skipSpaces(pos);\n\n // check name is matched\n for (let i = 0; i < name.length; i++) {\n if (state.src.charCodeAt(pos) !== name.charCodeAt(i)) return false;\n pos++;\n }\n\n let hasId = false;\n let char: number;\n\n while (pos !== max) {\n char = state.src.charCodeAt(pos++);\n if (char === 35 /* # */) {\n hasId = true;\n break;\n }\n if (!isSpace(char)) return false;\n }\n\n // Since start is found, we can report success here in validation mode\n if (silent) return true;\n\n let nextLine = startLine + 1;\n let autoClosed = false;\n let idStart = pos;\n\n // Search for the end of the block\n for (\n ;\n // nextLine should be accessible outside the loop,\n // unclosed block should be auto closed by end of document.\n // also block seems to be auto closed by end of parent\n nextLine < endLine;\n nextLine++\n ) {\n const nextLineStart = state.bMarks[nextLine] + state.tShift[nextLine];\n const nextLineMax = state.eMarks[nextLine];\n\n if (nextLineStart < nextLineMax && state.sCount[nextLine] < indent)\n // non-empty line with negative indent should stop the list:\n // - :::\n // test\n break;\n\n if (\n // closing fence should be indented same as opening one\n state.sCount[nextLine] === indent &&\n // match start\n state.src.charCodeAt(nextLineStart) === 58 /* : */\n ) {\n // check rest of marker\n for (pos = nextLineStart + 1; pos <= nextLineMax; pos++)\n if (state.src.charCodeAt(pos) !== 58 /* : */) break;\n\n // closing code fence must be at least as long as the opening one\n if (pos - nextLineStart >= markerCount) {\n // make sure tail has spaces only\n pos = state.skipSpaces(pos);\n\n if (pos >= nextLineMax) {\n // found!\n autoClosed = true;\n break;\n }\n }\n }\n }\n\n const oldParent = state.parentType;\n const oldLineMax = state.lineMax;\n const oldBlkIndent = state.blkIndent;\n const oldState = store.state;\n\n // @ts-expect-error: We are creating a new type called \"${name}_tabs\"\n state.parentType = `${name}_tabs`;\n\n // this will prevent lazy continuations from ever going past our end marker\n state.lineMax = nextLine - (autoClosed ? 1 : 0);\n\n // this will update the block indent\n state.blkIndent = indent;\n\n const markup = \":\".repeat(markerCount);\n let id = \"\";\n\n if (hasId) {\n idStart = state.skipSpaces(idStart);\n const idEnd = state.skipSpacesBack(max, idStart);\n\n if (idStart < idEnd) id = state.src.slice(idStart, idEnd);\n }\n\n const openToken = state.push(`${name}_tabs_open`, \"\", 1);\n\n openToken.markup = markup;\n openToken.block = true;\n openToken.info = name;\n openToken.meta = { id };\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n store.state = name;\n\n state.md.block.tokenize(\n state,\n startLine + 1,\n nextLine - (autoClosed ? 1 : 0),\n );\n\n store.state = oldState;\n\n const closeToken = state.push(`${name}_tabs_close`, \"\", -1);\n\n closeToken.markup = markup;\n closeToken.block = true;\n\n state.parentType = oldParent;\n state.lineMax = oldLineMax;\n state.blkIndent = oldBlkIndent;\n state.line = nextLine + (autoClosed ? 1 : 0);\n\n return true;\n };\n\nconst getTabsDataGetter =\n (name: string): ((tokens: Token[], index: number) => MarkdownItTabInfo) =>\n (tokens, index) => {\n const data: MarkdownItTabData[] = [];\n let activeIndex = -1;\n let isTabStart = false;\n let nestingDepth = 0;\n\n for (\n // skip the current tabs_open token\n let i = index + 1;\n i < tokens.length;\n i++\n ) {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { block, meta, type, info } = tokens[i];\n\n if (block) {\n // record the nesting depth of tabs\n if (type === `${name}_tabs_open`) {\n nestingDepth++;\n continue;\n }\n\n if (type === `${name}_tabs_close`) {\n if (nestingDepth === 0) break;\n nestingDepth--;\n continue;\n }\n\n // if we are in a nesting tabs, skip processing\n if (nestingDepth > 0) continue;\n\n if (type === `${name}_tab_open`) {\n isTabStart = true;\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n meta.index = data.length;\n // tab is active\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (meta.active)\n if (activeIndex === -1) activeIndex = data.length;\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n else meta.active = false;\n\n data.push({\n title: info,\n index: data.length,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n });\n\n continue;\n }\n\n if (type === `${name}_tab_close`) continue;\n\n // hide contents before first tab\n if (!isTabStart) {\n tokens[i].type = `${name}_tabs_empty`;\n tokens[i].hidden = true;\n }\n }\n }\n\n return {\n active: activeIndex,\n data: data,\n };\n };\n\nconst tabDataGetter = (tokens: Token[], index: number): MarkdownItTabData => {\n // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment\n const { info, meta } = tokens[index];\n\n return {\n title: info,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n index: meta.index as number,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n id: meta.id as string | undefined,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n isActive: meta.active as boolean,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n openRender = (\n info: MarkdownItTabInfo,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const { active, data } = info;\n const token = tokens[index];\n\n token.attrJoin(\"class\", `${name}-tabs-wrapper`);\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n if (token.meta.id) token.attrJoin(\"data-id\", token.meta.id as string);\n\n const tabs = data.map(\n ({ title, id }, index) =>\n `<button type=\"button\" class=\"${name}-tab-button${\n active === index ? \" active\" : \"\"\n }\" data-tab=\"${index}\"${id ? ` data-id=\"${escapeHtml(id)}\"` : \"\"}${\n active === index ? \" data-active\" : \"\"\n }>${escapeHtml(md.renderInline(title))}</button>`,\n );\n\n return `\\\n<div${self.renderAttrs(token)}>\n <div class=\"${name}-tabs-header\">\n ${tabs.join(\"\\n \")}\n </div>\n <div class=\"${name}-tabs-container\">\n`;\n },\n\n closeRender = (): string => `\\\n </div>\n</div>\n`,\n\n tabOpenRender = (\n info: MarkdownItTabData,\n tokens: Token[],\n index: number,\n _options: Options,\n _env: unknown,\n self: Renderer,\n ): string => {\n const token = tokens[index];\n\n token.attrJoin(\n \"class\",\n `${name}-tab-content${info.isActive ? \" active\" : \"\"}`,\n );\n token.attrSet(\"data-index\", info.index.toString());\n if (info.id) token.attrSet(\"data-id\", info.id);\n\n if (info.isActive) token.attrJoin(\"data-active\", \"\");\n\n return `\\\n<div${self.renderAttrs(tokens[index])}>\n`;\n },\n\n tabCloseRender = (): string => `\\\n</div>\n`,\n } = options ?? {};\n\n const tabsDataGetter = getTabsDataGetter(name);\n\n md.block.ruler.before(\"fence\", `${name}_tabs`, getTabsRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.block.ruler.before(\"paragraph\", `${name}_tab`, getTabRule(name, store), {\n alt: [\"paragraph\", \"reference\", \"blockquote\", \"list\"],\n });\n\n md.renderer.rules[`${name}_tabs_open`] = (\n tokens,\n index,\n options,\n env,\n self,\n ): string => {\n const info = tabsDataGetter(tokens, index);\n\n return openRender(info, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tabs_close`] = closeRender;\n\n md.renderer.rules[`${name}_tab_open`] = (tokens, index, ...args): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, ...args);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"names":["MIN_MARKER_NUM","TAB_MARKER","ACTIVE_TAB_MARKER","TAB_MARKER_LENGTH","ACTIVE_TAB_MARKER_LENGTH","checkTabMarker","state","start","max","pos","isActive","markerEnd","infoStart","getTabRule","name","store","startLine","endLine","silent","indent","tabMatch","nextLine","autoClosed","nextLineStart","oldParent","oldLineMax","oldBlkIndent","openToken","infoEnd","escapePos","title","id","closeToken","getTabsRule","markerCount","i","hasId","char","isSpace","idStart","nextLineMax","oldState","markup","idEnd","getTabsDataGetter","tokens","index","data","activeIndex","isTabStart","nestingDepth","block","meta","type","info","tabDataGetter","tab","md","options","openRender","_options","_env","self","active","token","tabs","escapeHtml","closeRender","tabOpenRender","tabCloseRender","tabsDataGetter","env","args"],"mappings":"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"}
{
"name": "@mdit/plugin-tab",
"version": "0.22.6-cjs.0",
"version": "0.23.0",
"description": "tab plugin for MarkdownIt",

@@ -25,3 +25,10 @@ "keywords": [

},
"main": "./lib/index.js",
"type": "module",
"exports": {
".": {
"type": "./lib/index.d.ts",
"default": "./lib/index.js"
},
"./package.json": "./package.json"
},
"browser": "./lib/browser.js",

@@ -33,4 +40,4 @@ "types": "./lib/index.d.ts",

"dependencies": {
"@mdit/helper": "0.22.3-cjs.0",
"@types/markdown-it": "^14.1.2"
"@types/markdown-it": "^14.1.2",
"@mdit/helper": "0.22.1"
},

@@ -48,3 +55,6 @@ "peerDependencies": {

},
"gitHead": "a8c9c93edcd21447a510068081710d5cfd88442d"
}
"scripts": {
"build": "rollup -c rollup.config.ts --configPlugin esbuild",
"clean": "rimraf ./lib"
}
}