UNPKG

@mdit/plugin-attrs

Version:
4 lines (3 loc) 9.43 kB
import{isSpace as b}from"markdown-it/lib/common/utils.mjs";const k=46,w=35,E=32,v=61,R=34,S=e=>!(e===9||e===10||e===12||e===32||e===47||e===62||e===34||e===39||e===61),O=(e,t,n)=>{let l="",i="",o=!0,s=!1;const r=[];for(let c=t[0];c<t[1];c++){const a=e.charCodeAt(c);if(a===v&&o){o=!1;continue}if(a===k&&l===""){e.charCodeAt(c+1)===k?(l="css-module",c++):l="class",o=!1;continue}if(a===w&&l===""){l="id",o=!1;continue}if(a===R&&i===""&&!s){s=!0;continue}if(a===R&&s){s=!1;continue}if(a===E&&!s){if(l==="")continue;r.push([l,i]),l="",i="",o=!0;continue}if(!(o&&!S(a))){if(o){l+=String.fromCharCode(a);continue}i+=String.fromCharCode(a)}}return l!==""&&r.push([l,i]),n.length?r.filter(([c])=>n.some(a=>a instanceof RegExp?a.test(c):a===c)):r},p=(e,t,n,l)=>{e&&O(t,n,l).forEach(([i,o])=>{switch(i){case"class":e.attrJoin("class",o);break;case"css-module":e.attrJoin("css-module",o);break;default:e.attrPush([i,o])}})},d=({left:e,right:t},n)=>{if(!["start","end","only"].includes(n))throw new Error(`Invalid 'where' parameter: ${n}. Expected 'start', 'end', or 'only'.`);const l=e.length,i=t.length,o=l+1+i;return s=>{if(typeof s!="string"||s.length<o)return!1;let r,c;if(n==="start"){if(!s.startsWith(e)||(r=l,c=s.indexOf(t,l+1),c===-1))return!1;const u=c+i;if(u<s.length&&t.includes(s.charAt(u)))return!1}else if(n==="end"){if(r=s.lastIndexOf(e),r===-1||(c=s.indexOf(t,r+l+1),r+=l,c===-1||c+i!==s.length))return!1}else{if(!s.startsWith(e)||!s.endsWith(t))return!1;r=l,c=s.length-i}const a=s.charCodeAt(r),h=c-r;return(a===k||a===w?h>=2:h>=1)?[r,c]:!1}},g=(e,t)=>{const n=e[t];if(n.type==="softbreak")return null;if(n.nesting===0)return n;const l=n.level,i=n.type.replace("_close","_open");for(;t>=0;){const o=e[t];if(o.type===i&&o.level===l)return o;t--}/* istanbul ignore next -- @preserve */return null},T=(e,t)=>t>=0?e[t]:e[e.length+t],A=(e,t,n)=>{const l={match:!1,position:null,range:null},i=n.shift!==void 0,o=i?t+n.shift:n.position;if(i&&o<0)return l;const s=T(e,o);if(!s)return l;for(const r of Object.keys(n)){if(r==="shift"||r==="position")continue;if(s[r]==null)return l;if(r==="children"&&Array.isArray(n.children)){if(!s.children?.length)return l;const a=n.children,h=s.children;let u,y=null;if(a.every(f=>f.position!=null)){if(u=a.every(f=>{const m=A(h,f.position,f);return m.match?(m.range&&(y=m.range),!0):!1}),u){const{position:f}=a[a.length-1];l.position=f>=0?f:h.length+f,l.range=y}}else for(let f=0;f<h.length;f++)if(u=a.every(m=>{const _=A(h,f,m);return _.match?(_.range&&(y=_.range),!0):!1}),u){l.position=f,y&&(l.range=y);break}if(u===!1)return l;continue}const c=n[r];switch(typeof c){case"boolean":case"number":case"string":{if(s[r]!==c)return l;break}case"function":{const a=c(s[r]);if(!a)return l;Array.isArray(a)&&(l.range=a);break}default:throw new Error(`Unknown type of pattern test (key: ${r}). Test should be of type boolean, number, string or function.`)}}return l.match=!0,l},I=e=>({name:"end of block",tests:[{shift:0,type:"inline",children:[{position:-1,content:d(e,"end"),type:t=>t!=="code_inline"&&t!=="math_inline"}]}],transform:(t,n,l,i)=>{const o=i[0]-e.left.length,s=t[n].children[l],{content:r}=s,c=b(r.charCodeAt(o-1));let a=n+1;for(;t[a+1]?.nesting===-1;)a++;const h=g(t,a);p(h,r,i,e.allowed),s.content=r.slice(0,c?o-1:o)}}),M=e=>({name:"code-block",tests:[{shift:0,block:!0,info:d(e,"end")}],transform:(t,n,l,i)=>{const o=i[0]-e.left.length,s=t[n],{info:r}=s,c=b(r.charCodeAt(o-1));p(s,r,i,e.allowed),s.info=r.slice(0,c?o-1:o)}}),K=e=>({name:"end of block",tests:[{shift:-1,type:"heading_open"},{shift:0,type:"inline",children:[{position:-1,content:d(e,"end"),type:t=>t!=="code_inline"&&t!=="math_inline"}]}],transform:(t,n,l,i)=>{const o=i[0]-e.left.length,s=t[n].children[l],{content:r}=s,c=b(r.charCodeAt(o-1)),a=g(t,n+1);p(a,r,i,e.allowed),s.content=r.slice(0,c?o-1:o)}}),P=e=>[{name:"inline nesting self-close",tests:[{shift:0,type:"inline",children:[{shift:-1,type:t=>t==="image"||t==="code_inline"},{shift:0,type:"text",content:d(e,"start")}]}],transform:(t,n,l,i)=>{const o=t[n].children,s=o[l],r=o[l-1],c=e.right.length+i[1];p(r,s.content,i,e.allowed),s.content.length===c?o.splice(l,1):s.content=s.content.slice(c)}},{name:"inline attributes",tests:[{shift:0,type:"inline",children:[{shift:-1,nesting:-1},{shift:0,type:"text",content:d(e,"start")}]}],transform:(t,n,l,i)=>{const o=t[n].children,s=o[l],{content:r}=s,c=e.right.length+i[1],a=g(o,l-1);p(a,r,i,e.allowed),s.content=r.slice(c)}}],N=e=>[{name:"list softbreak",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:d(e,"only")}]}],transform:(t,n,l,i)=>{const o=t[n].children,s=o[l];let r=n-2;for(;t[r-1]&&t[r-1].type!=="ordered_list_open"&&t[r-1].type!=="bullet_list_open";)r--;p(t[r-1],s.content,i,e.allowed),t[n].children=o.slice(0,-2)}},{name:"list double softbreak",tests:[{shift:0,type:t=>t==="bullet_list_close"||t==="ordered_list_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:d(e,"only"),children:t=>t.length===1},{shift:3,type:"paragraph_close"}],transform:(t,n,l,i)=>{const o=t[n+2],s=g(t,n);p(s,o.content,i,e.allowed),t.splice(n+1,3)}},{name:"list item end",tests:[{shift:-2,type:"list_item_open"},{shift:0,type:"inline",children:[{position:-1,type:"text",content:d(e,"end")}]}],transform:(t,n,l,i)=>{const o=t[n].children[l],{content:s}=o,r=i[0]-e.left.length,c=b(s.charCodeAt(r-1));p(t[n-2],s,i,e.allowed),o.content=s.slice(0,c?r-1:r)}}],W=e=>({name:` {.a} softbreak then curly in start`,tests:[{shift:0,type:"inline",children:[{position:-2,type:"softbreak"},{position:-1,type:"text",content:d(e,"only")}]}],transform:(t,n,l,i)=>{const o=t[n].children,s=o[l];let r=n+1;for(;t[r+1]&&t[r+1].nesting===-1;)r++;p(g(t,r),s.content,i,e.allowed),t[n].children=o.slice(0,-2)}}),B=e=>({name:"horizontal rule",tests:[{shift:0,type:"paragraph_open"},{shift:1,type:"inline",children:t=>t.length===1,content:t=>{let n=0,l;const i=t.charCodeAt(n++);if(i!==45&&i!==42&&i!==95)return!1;let o=1;for(;n<t.length&&(l=t.charCodeAt(n++),l===i);)o++;return o<3?!1:(b(t.charCodeAt(n-1))||n--,d(e,"end")(t))}},{shift:2,type:"paragraph_close"}],transform:(t,n,l,i)=>{const o=t[n],s=t[n+1],{content:r}=s;o.type="hr",o.tag="hr",o.nesting=0,p(o,r,i,e.allowed),o.markup=r,t.splice(n+1,2)}}),C=e=>{e.hidden=!0,e.children?.forEach(t=>{t.content="",C(t)})},D=(e,t,n,l,i,o)=>{let s=l-(i>0?i:1);for(let r=t,c=o;r<n&&c>1;r++)if(e[r].type==="tr_open"){const a=e[r];a.meta??={},a.meta.columnCount&&(s-=1),a.meta.columnCount=s,c--}},G=(e,t,n)=>{const l=e[t].meta?.columnCount;if(l)for(let i=t,o=0;i<n;i++){const s=e[i];if(s.type==="tr_close")break;s.type==="td_open"&&(o+=1),o>l&&!s.hidden&&C(s)}},H=(e,t,n,l,i,o)=>{const s=[],r=e[t];let c=t+3,a=l;for(let f=t;f>o;f--)if(e[f].type==="tr_open"){a=e[f].meta?.columnCount??a;break}else e[f].type==="td_open"&&s.unshift(f);for(let f=t+2;f<n;f++)if(e[f].type==="tr_close"){c=f;break}else e[f].type==="td_open"&&s.push(f);const h=s.indexOf(t),u=Math.min(i,a-h);i>u&&r.attrSet("colspan",u.toString());const y=s.slice(a+1-l-u)[0];for(let f=y;f<c;f++)e[f].hidden||C(e[f])},J=e=>[{name:"table",tests:[{shift:0,type:"table_close"},{shift:1,type:"paragraph_open"},{shift:2,type:"inline",content:d(e,"only")}],transform:(t,n,l,i)=>{const o=t[n+2],s=g(t,n);p(s,o.content,i,e.allowed),t.splice(n+1,3)}},{name:"table cell attributes",tests:[{shift:-1,type:t=>t==="td_open"||t==="th_open"},{shift:0,type:"inline",children:[{shift:0,type:"text",content:d(e,"end")}]}],transform:(t,n,l,i)=>{const o=i[0]-e.left.length,s=t[n].children[l],r=t[n-1],{content:c}=s,a=b(c.charCodeAt(o-1));p(r,c,i,e.allowed),s.content=c.slice(0,a?o-1:o)}},{name:"table thead metadata",tests:[{shift:0,type:"tr_close"},{shift:1,type:"thead_close"},{shift:2,type:"tbody_open"}],transform:(t,n)=>{const l=g(t,n),i=t[n-1];let o=0,s=n-1;for(;s>0;){const c=t[s];if(c===l){const a=t[s-1];a.meta={...a.meta,columnCount:o};break}c.level===i.level&&c.type===i.type&&o++,s--}const r=t[n+2];r.meta={...r.meta,columnCount:o}}},{name:"table tbody calculate",tests:[{shift:0,type:"tbody_close",hidden:!1}],transform:(t,n)=>{let l=n-2;for(;l>0&&(l--,t[l].type!=="tbody_open"););const i=Number(t[l].meta?.columnCount??0);if(i<2)return;const o=t[n].level+2;for(let s=l;s<n;s++){if(t[s].level>o)continue;const r=t[s],c=r.hidden?0:Number(r.attrGet("rowspan")),a=r.hidden?0:Number(r.attrGet("colspan"));c>1&&D(t,s,n,i,a,c),r.type==="tr_open"&&G(t,s,n),a>1&&H(t,s,n,i,a,l)}}}],x=["fence","inline","table","list","heading","hr","softbreak","block"],L=e=>{const t=e.rule===!1?[]:Array.isArray(e.rule)?e.rule.filter(l=>x.includes(l)):x,n=[];return t.includes("fence")&&n.push(M(e)),t.includes("inline")&&n.push(...P(e)),t.includes("table")&&n.push(...J(e)),t.includes("list")&&n.push(...N(e)),t.includes("softbreak")&&n.push(W(e)),t.includes("hr")&&n.push(B(e)),t.includes("block")?n.push(I(e)):t.includes("heading")&&n.push(K(e)),n},U=(e,{left:t="{",right:n="}",allowed:l=[],rule:i="all"}={})=>{const o=L({left:t,right:n,allowed:l,rule:i}),s=({tokens:r})=>{for(let c=0;c<r.length;c++)for(let a=0;a<o.length;a++){const h=o[a];let u=null,y=null;h.tests.every(f=>{const m=A(r,c,f);return m.position!==null&&({position:u}=m),m.range&&(y=m.range),m.match})&&(h.transform(r,c,u,y),(h.name==="inline attributes"||h.name==="inline nesting self-close")&&a--)}};e.core.ruler.before("linkify","attrs",s)};export{U as attrs}; //# sourceMappingURL=index.js.map