🚀 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.23.0
to
0.23.1
+11
-9
lib/browser.js

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

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">
${m.join(`
String.raw`\$&`;const e=e=>e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`"`,`&quot;`).replaceAll(`'`,`&#39;`);function t(e){switch(e){case 9:case 32:return!0}return!1}const n=`@tab`,r=`${n}:active`,i=r.length,a=(e,t,n)=>{if(e.src.charCodeAt(t)!==64)return!1;let a=1;for(;a<i&&r.charCodeAt(a)===e.src.charCodeAt(t+a);a++);let o=a===i;if(!o&&a!==4)return!1;let s=t+a,c=e.skipSpaces(s);return c>s&&c<n?{isActive:o,pos:c}:!1},o=(e,t)=>(r,i,o,s)=>{if(t.state!==e)return!1;let c=r.bMarks[i]+r.tShift[i],l=r.eMarks[i],u=r.sCount[i],d=a(r,c,l);if(d===!1)return!1;if(s)return!0;let f=i+1,p=!1;for(;f<o;f++){let e=r.bMarks[f]+r.tShift[f];if(r.sCount[f]===u&&r.src[e]===`@`&&a(r,e,r.eMarks[f])){p=!0;break}}let m=r.parentType,h=r.lineMax,g=r.blkIndent;r.parentType=`tab`,r.lineMax=f-(p?1:0),r.blkIndent=u;let _=r.push(`${e}_tab_open`,``,1),v=d.pos,y=r.skipSpacesBack(l,v),b=y,x;for(;b>v;){if(r.src.charCodeAt(b)===35){for(x=b-1;r.src.charCodeAt(x)===92;)x--;if((b-x)%2==1)break}b--}let S,C=``;b===v?S=r.src.slice(v,y):(C=r.src.slice(r.skipSpaces(b+1),y),S=r.src.slice(v,r.skipSpacesBack(b,v))),_.block=!0,_.markup=n,_.info=S,_.meta={active:d.isActive},C&&(_.meta.id=C),_.map=[i,f-(p?1:0)],r.md.block.tokenize(r,i+1,f+(p?0:1));let w=r.push(`${e}_tab_close`,``,-1);return w.block=!0,w.markup=``,r.parentType=m,r.lineMax=h,r.blkIndent=g,r.line=f+(p?0:1),!0},s=(e,n)=>(r,i,a,o)=>{let s=r.bMarks[i]+r.tShift[i],c=r.eMarks[i],l=r.sCount[i];if(r.src.charCodeAt(s)!==58)return!1;let u=s+1;for(;u<=c&&r.src.charCodeAt(u)===58;)u++;let d=u-s;if(d<3)return!1;u=r.skipSpaces(u);for(let t=0;t<e.length;t++){if(r.src.charCodeAt(u)!==e.charCodeAt(t))return!1;u++}let f=!1,p;for(;u!==c;){if(p=r.src.charCodeAt(u++),p===35){f=!0;break}if(!t(p))return!1}if(o)return!0;let m=i+1,h=!1,g=u;for(;m<a;m++){let e=r.bMarks[m]+r.tShift[m],t=r.eMarks[m];if(e<t&&r.sCount[m]<l)break;if(r.sCount[m]===l&&r.src.charCodeAt(e)===58){for(u=e+1;u<=t&&r.src.charCodeAt(u)===58;u++);if(u-e>=d&&(u=r.skipSpaces(u),u>=t)){h=!0;break}}}let _=r.parentType,v=r.lineMax,y=r.blkIndent,b=n.state;r.parentType=`${e}_tabs`,r.lineMax=m-(h?1:0),r.blkIndent=l;let x=`:`.repeat(d),S=``;if(f){g=r.skipSpaces(g);let e=r.skipSpacesBack(c,g);g<e&&(S=r.src.slice(g,e))}let C=r.push(`${e}_tabs_open`,``,1);C.markup=x,C.block=!0,C.info=e,C.meta={id:S},C.map=[i,m-(h?1:0)],n.state=e,r.md.block.tokenize(r,i+1,m-(h?1:0)),n.state=b;let w=r.push(`${e}_tabs_close`,``,-1);return w.markup=x,w.block=!0,r.parentType=_,r.lineMax=v,r.blkIndent=y,r.line=m+(h?1:0),!0},c=e=>(t,n)=>{let r=[],i=-1,a=!1,o=0;for(let s=n+1;s<t.length;s++){let n=t[s],c=n.meta,l=n.type;if(n.block){if(l===`${e}_tabs_open`){o++;continue}if(l===`${e}_tabs_close`){if(o===0)break;o--;continue}if(o>0)continue;if(l===`${e}_tab_open`){a=!0,c.index=r.length,c.active&&(i===-1?i=r.length:c.active=!1),r.push({title:n.info,index:r.length,id:c.id,isActive:c.active});continue}if(l===`${e}_tab_close`)continue;a||(t[s].type=`${e}_tabs_empty`,t[s].hidden=!0)}}return{active:i,data:r}},l=(e,t)=>{let n=e[t],r=n.meta;return{title:n.info,index:r.index,id:r.id,isActive:r.active}},u={state:null},d=(t,n)=>{let{name:r=`tabs`,openRender:i=(n,i,a,o,s,c)=>{let{active:l,data:u}=n,d=i[a];d.attrJoin(`class`,`${r}-tabs-wrapper`),d.meta.id&&d.attrJoin(`data-id`,d.meta.id);let f=u.map(({title:n,id:i},a)=>`<button type="button" class="${r}-tab-button${l===a?` active`:``}" data-tab="${a}"${i?` data-id="${e(i)}"`:``}${l===a?` data-active`:``}>${e(t.renderInline(n))}</button>`);return`\
<div${c.renderAttrs(d)}>
<div class="${r}-tabs-header">
${f.join(`
`)}
</div>
<div class="${t}-tabs-container">
`},closeRender:b=()=>` </div>
<div class="${r}-tabs-container">
`},closeRender:a=()=>` </div>
</div>
`,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
`,tabOpenRender:d=(e,t,n,i,a,o)=>{let s=t[n];return s.attrJoin(`class`,`${r}-tab-content${e.isActive?` active`:``}`),s.attrSet(`data-index`,e.index.toString()),e.id&&s.attrSet(`data-id`,e.id),e.isActive&&s.attrJoin(`data-active`,``),`\
<div${o.renderAttrs(t[n])}>
`},tabCloseRender:f=()=>`</div>
`}=n??{},p=c(r);t.block.ruler.before(`fence`,`${r}_tabs`,s(r,u),{alt:[`paragraph`,`reference`,`blockquote`,`list`]}),t.block.ruler.before(`paragraph`,`${r}_tab`,o(r,u),{alt:[`paragraph`,`reference`,`blockquote`,`list`]}),t.renderer.rules[`${r}_tabs_open`]=(e,t,n,r,a)=>i(p(e,t),e,t,n,r,a),t.renderer.rules[`${r}_tabs_close`]=a,t.renderer.rules[`${r}_tab_open`]=(e,t,n,r,i)=>d(l(e,t),e,t,n,r,i),t.renderer.rules[`${r}_tab_close`]=f};export{d 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":["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":"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","x_google_ignoreList":[1]}
{"version":3,"file":"browser.js","names":["escapeHtml"],"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 e=e=>{let t=e.split(`\n`),n=t.reduce((e,t)=>{for(let n=0;n<t.length;n++)if(t[n]!==` `&&t[n]!==`\t`)return Math.min(n,e);return e},1/0);return n<1/0?t.map(e=>e.slice(n)).join(`\n`):e},t=/[-/\\\\^$*+?.()|[\\]{}]/g,n=String.raw`\\$&`,r=e=>e.replaceAll(`&`,`&amp;`).replaceAll(`<`,`&lt;`).replaceAll(`>`,`&gt;`).replaceAll(`\"`,`&quot;`).replaceAll(`'`,`&#39;`),i=e=>e.replaceAll(t,n),a=/\\r\\n?|\\n/g,o=/\\\\([ \\\\!\"#$%&'()*+,./:;<=>?@[\\]^_`{|}~-])/gu;export{a as NEWLINE_RE,o as UNESCAPE_RE,e as dedent,r as escapeHtml,i as escapeRegExp};\n//# sourceMappingURL=index.js.map","// 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 { MarkdownItTabData, MarkdownItTabInfo, MarkdownItTabOptions } 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\ninterface TabMeta {\n index: number;\n active: boolean;\n id?: string;\n}\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)) 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) 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 // check rest of marker\n checkTabMarker(state, nextLineStart, state.eMarks[nextLine])\n ) {\n // found!\n autoClosed = true;\n break;\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 // oxlint-disable-next-line typescript/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(state, startLine + 1, nextLine + (autoClosed ? 0 : 1));\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\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\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\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(state, startLine + 1, nextLine - (autoClosed ? 1 : 0));\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: Token[], index: number) => {\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 const token = tokens[i];\n const meta = token.meta as TabMeta;\n const type = token.type;\n\n if (token.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\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 meta.index = data.length;\n // tab is active\n if (meta.active) {\n if (activeIndex === -1) activeIndex = data.length;\n else meta.active = false;\n }\n\n data.push({\n title: token.info,\n index: data.length,\n id: meta.id,\n isActive: meta.active,\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 const token = tokens[index];\n const meta = token.meta as TabMeta;\n\n return {\n title: token.info,\n index: meta.index,\n id: meta.id,\n isActive: meta.active,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n // oxlint-disable-next-line max-params\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 // oxlint-disable-next-line typescript/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 // oxlint-disable-next-line max-params\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(\"class\", `${name}-tab-content${info.isActive ? \" active\" : \"\"}`);\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`] = (tokens, index, options, env, self): 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, options, env, self): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"x_google_ignoreList":[1],"mappings":"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"}

@@ -1,77 +0,79 @@

import { Options, PluginWithOptions } from 'markdown-it';
import Renderer, { RenderRule } from 'markdown-it/lib/renderer.mjs';
import Token from 'markdown-it/lib/token.mjs';
import { Options, PluginWithOptions } from "markdown-it";
import Renderer, { RenderRule } from "markdown-it/lib/renderer.mjs";
import Token from "markdown-it/lib/token.mjs";
//#region src/options.d.ts
interface MarkdownItTabData {
/**
* Title of tab
*
* Tab 标题
*/
title: string;
/**
* Tab index
*
* Tab 索引
*/
index: number;
/**
* Identifier of tab
*
* Tab 标识符
*/
id: string | undefined;
/**
* Whether the tab is active
*
* Tab 是否激活
*/
isActive: boolean;
/**
* Title of tab
*
* Tab 标题
*/
title: string;
/**
* Tab index
*
* Tab 索引
*/
index: number;
/**
* Identifier of tab
*
* Tab 标识符
*/
id: string | undefined;
/**
* Whether the tab is active
*
* Tab 是否激活
*/
isActive: boolean;
}
interface MarkdownItTabInfo {
/**
* Which tab is active
*
* @description -1 means no tab is active
*
* 激活的 Tab
*
* @description -1 表示没有 Tab 激活
*/
active: number;
/**
* Data of tabs
*
* Tab 数据
*/
data: MarkdownItTabData[];
/**
* Which tab is active
*
* @description -1 means no tab is active
*
* 激活的 Tab
*
* @description -1 表示没有 Tab 激活
*/
active: number;
/**
* Data of tabs
*
* Tab 数据
*/
data: MarkdownItTabData[];
}
interface MarkdownItTabOptions {
/**
* The name of the tab container.
*
* Tab 容器的名称。
*/
name: string;
/**
* Tabs open render
*/
openRender?: (info: MarkdownItTabInfo, tokens: Token[], index: number, options: Options, env: any, self: Renderer) => string;
/**
* Tabs close render
*/
closeRender?: RenderRule;
/**
* tab open render
*/
tabOpenRender?: (data: MarkdownItTabData, tokens: Token[], index: number, options: Options, env: any, self: Renderer) => string;
/**
* tab close render
*/
tabCloseRender?: RenderRule;
/**
* The name of the tab container.
*
* Tab 容器的名称。
*/
name: string;
/**
* Tabs open render
*/
openRender?: (info: MarkdownItTabInfo, tokens: Token[], index: number, options: Options, env: any, self: Renderer) => string;
/**
* Tabs close render
*/
closeRender?: RenderRule;
/**
* tab open render
*/
tabOpenRender?: (data: MarkdownItTabData, tokens: Token[], index: number, options: Options, env: any, self: Renderer) => string;
/**
* tab close render
*/
tabCloseRender?: RenderRule;
}
//#endregion
//#region src/plugin.d.ts
declare const tab: PluginWithOptions<MarkdownItTabOptions>;
export { tab };
export type { MarkdownItTabData, MarkdownItTabInfo, MarkdownItTabOptions };
//#endregion
export { MarkdownItTabData, MarkdownItTabInfo, MarkdownItTabOptions, tab };
//# sourceMappingURL=index.d.ts.map

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

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">
${C.join(`
import{escapeHtml as e}from"@mdit/helper";import{isSpace as t}from"markdown-it/lib/common/utils.mjs";const n=`@tab`,r=`${n}:active`,i=r.length,a=(e,t,n)=>{if(e.src.charCodeAt(t)!==64)return!1;let a=1;for(;a<i&&r.charCodeAt(a)===e.src.charCodeAt(t+a);a++);let o=a===i;if(!o&&a!==4)return!1;let s=t+a,c=e.skipSpaces(s);return c>s&&c<n?{isActive:o,pos:c}:!1},o=(e,t)=>(r,i,o,s)=>{if(t.state!==e)return!1;let c=r.bMarks[i]+r.tShift[i],l=r.eMarks[i],u=r.sCount[i],d=a(r,c,l);if(d===!1)return!1;if(s)return!0;let f=i+1,p=!1;for(;f<o;f++){let e=r.bMarks[f]+r.tShift[f];if(r.sCount[f]===u&&r.src[e]===`@`&&a(r,e,r.eMarks[f])){p=!0;break}}let m=r.parentType,h=r.lineMax,g=r.blkIndent;r.parentType=`tab`,r.lineMax=f-(p?1:0),r.blkIndent=u;let _=r.push(`${e}_tab_open`,``,1),v=d.pos,y=r.skipSpacesBack(l,v),b=y,x;for(;b>v;){if(r.src.charCodeAt(b)===35){for(x=b-1;r.src.charCodeAt(x)===92;)x--;if((b-x)%2==1)break}b--}let S,C=``;b===v?S=r.src.slice(v,y):(C=r.src.slice(r.skipSpaces(b+1),y),S=r.src.slice(v,r.skipSpacesBack(b,v))),_.block=!0,_.markup=n,_.info=S,_.meta={active:d.isActive},C&&(_.meta.id=C),_.map=[i,f-(p?1:0)],r.md.block.tokenize(r,i+1,f+(p?0:1));let w=r.push(`${e}_tab_close`,``,-1);return w.block=!0,w.markup=``,r.parentType=m,r.lineMax=h,r.blkIndent=g,r.line=f+(p?0:1),!0},s=(e,n)=>(r,i,a,o)=>{let s=r.bMarks[i]+r.tShift[i],c=r.eMarks[i],l=r.sCount[i];if(r.src.charCodeAt(s)!==58)return!1;let u=s+1;for(;u<=c&&r.src.charCodeAt(u)===58;)u++;let d=u-s;if(d<3)return!1;u=r.skipSpaces(u);for(let t=0;t<e.length;t++){if(r.src.charCodeAt(u)!==e.charCodeAt(t))return!1;u++}let f=!1,p;for(;u!==c;){if(p=r.src.charCodeAt(u++),p===35){f=!0;break}if(!t(p))return!1}if(o)return!0;let m=i+1,h=!1,g=u;for(;m<a;m++){let e=r.bMarks[m]+r.tShift[m],t=r.eMarks[m];if(e<t&&r.sCount[m]<l)break;if(r.sCount[m]===l&&r.src.charCodeAt(e)===58){for(u=e+1;u<=t&&r.src.charCodeAt(u)===58;u++);if(u-e>=d&&(u=r.skipSpaces(u),u>=t)){h=!0;break}}}let _=r.parentType,v=r.lineMax,y=r.blkIndent,b=n.state;r.parentType=`${e}_tabs`,r.lineMax=m-(h?1:0),r.blkIndent=l;let x=`:`.repeat(d),S=``;if(f){g=r.skipSpaces(g);let e=r.skipSpacesBack(c,g);g<e&&(S=r.src.slice(g,e))}let C=r.push(`${e}_tabs_open`,``,1);C.markup=x,C.block=!0,C.info=e,C.meta={id:S},C.map=[i,m-(h?1:0)],n.state=e,r.md.block.tokenize(r,i+1,m-(h?1:0)),n.state=b;let w=r.push(`${e}_tabs_close`,``,-1);return w.markup=x,w.block=!0,r.parentType=_,r.lineMax=v,r.blkIndent=y,r.line=m+(h?1:0),!0},c=e=>(t,n)=>{let r=[],i=-1,a=!1,o=0;for(let s=n+1;s<t.length;s++){let n=t[s],c=n.meta,l=n.type;if(n.block){if(l===`${e}_tabs_open`){o++;continue}if(l===`${e}_tabs_close`){if(o===0)break;o--;continue}if(o>0)continue;if(l===`${e}_tab_open`){a=!0,c.index=r.length,c.active&&(i===-1?i=r.length:c.active=!1),r.push({title:n.info,index:r.length,id:c.id,isActive:c.active});continue}if(l===`${e}_tab_close`)continue;a||(t[s].type=`${e}_tabs_empty`,t[s].hidden=!0)}}return{active:i,data:r}},l=(e,t)=>{let n=e[t],r=n.meta;return{title:n.info,index:r.index,id:r.id,isActive:r.active}},u={state:null},d=(t,n)=>{let{name:r=`tabs`,openRender:i=(n,i,a,o,s,c)=>{let{active:l,data:u}=n,d=i[a];d.attrJoin(`class`,`${r}-tabs-wrapper`),d.meta.id&&d.attrJoin(`data-id`,d.meta.id);let f=u.map(({title:n,id:i},a)=>`<button type="button" class="${r}-tab-button${l===a?` active`:``}" data-tab="${a}"${i?` data-id="${e(i)}"`:``}${l===a?` data-active`:``}>${e(t.renderInline(n))}</button>`);return`\
<div${c.renderAttrs(d)}>
<div class="${r}-tabs-header">
${f.join(`
`)}
</div>
<div class="${t}-tabs-container">
`},closeRender:b=()=>` </div>
<div class="${r}-tabs-container">
`},closeRender:a=()=>` </div>
</div>
`,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: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
`,tabOpenRender:d=(e,t,n,i,a,o)=>{let s=t[n];return s.attrJoin(`class`,`${r}-tab-content${e.isActive?` active`:``}`),s.attrSet(`data-index`,e.index.toString()),e.id&&s.attrSet(`data-id`,e.id),e.isActive&&s.attrJoin(`data-active`,``),`\
<div${o.renderAttrs(t[n])}>
`},tabCloseRender:f=()=>`</div>
`}=n??{},p=c(r);t.block.ruler.before(`fence`,`${r}_tabs`,s(r,u),{alt:[`paragraph`,`reference`,`blockquote`,`list`]}),t.block.ruler.before(`paragraph`,`${r}_tab`,o(r,u),{alt:[`paragraph`,`reference`,`blockquote`,`list`]}),t.renderer.rules[`${r}_tabs_open`]=(e,t,n,r,a)=>i(p(e,t),e,t,n,r,a),t.renderer.rules[`${r}_tabs_close`]=a,t.renderer.rules[`${r}_tab_open`]=(e,t,n,r,i)=>d(l(e,t),e,t,n,r,i),t.renderer.rules[`${r}_tab_close`]=f};export{d as tab};
//# sourceMappingURL=index.js.map

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

{"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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"}
{"version":3,"file":"index.js","names":[],"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 { MarkdownItTabData, MarkdownItTabInfo, MarkdownItTabOptions } 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\ninterface TabMeta {\n index: number;\n active: boolean;\n id?: string;\n}\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)) 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) 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 // check rest of marker\n checkTabMarker(state, nextLineStart, state.eMarks[nextLine])\n ) {\n // found!\n autoClosed = true;\n break;\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 // oxlint-disable-next-line typescript/no-unsafe-member-access\n if (id) openToken.meta.id = id;\n\n openToken.map = [startLine, nextLine - (autoClosed ? 1 : 0)];\n\n state.md.block.tokenize(state, startLine + 1, nextLine + (autoClosed ? 0 : 1));\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\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\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\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(state, startLine + 1, nextLine - (autoClosed ? 1 : 0));\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: Token[], index: number) => {\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 const token = tokens[i];\n const meta = token.meta as TabMeta;\n const type = token.type;\n\n if (token.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\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 meta.index = data.length;\n // tab is active\n if (meta.active) {\n if (activeIndex === -1) activeIndex = data.length;\n else meta.active = false;\n }\n\n data.push({\n title: token.info,\n index: data.length,\n id: meta.id,\n isActive: meta.active,\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 const token = tokens[index];\n const meta = token.meta as TabMeta;\n\n return {\n title: token.info,\n index: meta.index,\n id: meta.id,\n isActive: meta.active,\n };\n};\n\nconst store = { state: null };\n\nexport const tab: PluginWithOptions<MarkdownItTabOptions> = (md, options) => {\n const {\n name = \"tabs\",\n\n // oxlint-disable-next-line max-params\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 // oxlint-disable-next-line typescript/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 // oxlint-disable-next-line max-params\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(\"class\", `${name}-tab-content${info.isActive ? \" active\" : \"\"}`);\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`] = (tokens, index, options, env, self): 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, options, env, self): string => {\n const data = tabDataGetter(tokens, index);\n\n return tabOpenRender(data, tokens, index, options, env, self);\n };\n\n md.renderer.rules[`${name}_tab_close`] = tabCloseRender;\n};\n"],"mappings":"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"}
{
"name": "@mdit/plugin-tab",
"version": "0.23.0",
"version": "0.23.1",
"description": "tab plugin for MarkdownIt",

@@ -14,7 +14,2 @@ "keywords": [

},
"repository": {
"type": "git",
"url": "git+https://github.com/mdit-plugins/mdit-plugins.git",
"directory": "packages/tab"
},
"license": "MIT",

@@ -26,3 +21,13 @@ "author": {

},
"repository": {
"type": "git",
"url": "git+https://github.com/mdit-plugins/mdit-plugins.git",
"directory": "packages/tab"
},
"files": [
"lib"
],
"type": "module",
"browser": "./lib/browser.js",
"types": "./lib/index.d.ts",
"exports": {

@@ -35,10 +40,8 @@ ".": {

},
"browser": "./lib/browser.js",
"types": "./lib/index.d.ts",
"files": [
"lib"
],
"publishConfig": {
"access": "public"
},
"dependencies": {
"@types/markdown-it": "^14.1.2",
"@mdit/helper": "0.22.1"
"@mdit/helper": "0.22.2"
},

@@ -53,9 +56,6 @@ "peerDependencies": {

},
"publishConfig": {
"access": "public"
},
"scripts": {
"build": "rollup -c rollup.config.ts --configPlugin esbuild",
"build": "tsdown --config-loader unrun",
"clean": "rimraf ./lib"
}
}