very-small-parser
Version:
A very small Markdown, HTML, and CSS parser.
1 lines • 12.1 kB
JavaScript
var e={d:(t,n)=>{for(var r in n)e.o(n,r)&&!e.o(t,r)&&Object.defineProperty(t,r,{enumerable:!0,get:n[r]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{html:()=>z});var n={};e.r(n),e.d(n,{block:()=>Me,inline:()=>ge});var r={};e.r(r),e.d(r,{parseDecls:()=>Te});const s=(e,t,n,r,s=e.length)=>{const l={type:t,len:s};return n&&(l.children=n),r&&Object.assign(l,r),l},l=(e,t,n)=>{const r=[],s=n.length;let l=n,i=0;for(;i<s;){const n=t(e,l);if(!n)break;n.type&&r.push(n),i+=n.len||0,l=l.slice(n.len)}return[r,i]},i=e=>{const t=e.length;return(n,r)=>{for(let s=0;s<t;s++){const t=(0,e[s])(n,r);if(t)return t}}},c=(e,t,n)=>(r,l)=>{const i=l.match(t);return i?s(i[0],e,r.parse(i[n])):void 0},o=(e,t,n)=>n.replace(e,t),a=(e,t,n)=>n.replaceAll(e,t),u="object"==typeof document?document.createElement("textarea"):void 0,h=e=>u?(u.innerHTML=e,u.value):e;class p{parsers;constructor(e){this.parsers=e.parsers}parse(e){return((e,t,n)=>l(e,t,n)[0])(this,i(this.parsers),e)}}const f=(e,t)=>{let n=e.source;for(const e in t)n=o(new RegExp(e,"g"),t[e].source,n);return new RegExp(n,e.flags)},g=/(?:\[[^\[\]]*\]|\\[\[\]]?|`[^`]*`|[^\[\]\\])*?/,m=/"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/,d=/(https?:\/\/)(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,256}(\.[a-z]{2,4})?\b([-a-zA-Z0-9@:%_\+.~#?&\/\/=,\*]*)/,v=/^ {0,3}((?:- *){3,}|(?:_ *){3,}|(?:\* *){3,})(?:\n+|$)/,S=f(/^ {0,3}\[(label)\]: *\n? *<?([^\s>]+)>?(?:(?: +\n? *| *\n *)(title))? *(?:\n+|$)/,{label:g,title:m}),b=/^<!--(?!-?>)[\s\S]*?-->/,_=(e,t)=>{const n=t.match(b);if(n){const e=n[0],t=e.slice(4,-3);return s(e,"comment",void 0,{value:t})}},y=/^[^<]+/,$=e=>(t,n)=>{const r=n.match(y);if(!r)return;let l=r[0];return e&&(l=e(l)),s(l,"text",void 0,{value:l},l.length)},w=e=>e.replace(/</g,"<").replace(/>/g,">").replace(/"/g,'"').replace(/'/g,"'").replace(/&/g,"&").replace(/&#(\d+);/g,(e,t)=>String.fromCharCode(t)),x=f(/^<([a-z][\w-]*)(?:attr)*? *(\/?)>/,{attr:/ +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/}),k=/([\w|data-]+)=["']?((?:.(?!["']?\s+(?:\S+)=|\s*\/?[>"']))*.)["']?/gm,A=/^<\/([a-z][\w-]*)>/,R=(e,t)=>{const n=t.match(x);if(!n)return;const[r,s,l]=n,i=r.length,c=r.slice(s.length+1,-1-l.length),o={};if(c){const e=c.matchAll(k);for(const[,t,n]of e)o[t]=w(n)}const a={type:"element",tagName:s,properties:o,children:[],len:i};if(!l){const n=t.slice(i),r=e.parsef(n),s=r.len;if(l)a.len+=r.len;else{const e=n.slice(s).match(A);if(!e)return a;a.len+=r.len+(e?.[0].length??0)}a.children=r.children}return a},z=new class extends p{first;constructor(e){super(e),this.first=i(this.parsers)}parse(e){const t=[],n=e.length;let r=e,s=0;for(;s<n;){const e=this.first(this,r);if(!e){const e={type:"text",value:r[0],len:1};t.push(e),s+=1,r=r.slice(1);continue}t.push(e),s+=e.len||0,r=r.slice(e.len)}return t}parsef(e){const[t,n]=l(this,this.first,e);return{type:"root",children:t,len:n}}el(e){return R(this,e)}}({parsers:(e=>[$(e),_,R])(h)}),C=/^(`+)\s*([\s\S]*?[^`])\s*\1(?!`)(?:\{(?:\.|:)([^}]{1,32})\})?/,E=(e,t)=>{const n=t.match(C);if(!n)return;const r={value:n[2],wrap:n[1]};return n[3]&&(r.lang=n[3]),s(n[0],"inlineCode",void 0,r)},O=/^__([^\s][\s\S]*?[^\s])__(?!_)|^\*\*([^\s][\s\S]*?[^\s])\*\*(?!\*)|^__([^\s])__(?!_)|^\*\*([^\s])\*\*(?!\*)/,j=(e,t)=>{const n=t.match(O);if(!n)return;const r=n[4]||n[3]||n[2]||n[1];return s(n[0],"strong",e.parse(r))},L=/^_([^\s][\s\S]*?[^\s_])_(?!_)|^_([^\s_][\s\S]*?[^\s])_(?!_)|^\*([^\s][\s\S]*?[^\s*])\*(?!\*)|^\*([^\s*][\s\S]*?[^\s])\*(?!\*)|^_([^\s_])_(?!_)|^\*([^\s*])\*(?!\*)/,B=(e,t)=>{const n=t.match(L);if(!n)return;const r=n[6]||n[5]||n[4]||n[3]||n[2]||n[1];return s(n[0],"emphasis",e.parse(r))},P=/^~~(?=\S)([\s\S]*?\S)~~/,Z=(e,t)=>{const n=t.match(P);if(n)return s(n[0],"delete",e.parse(n[1]))},M=/^(?:(?:\|\|(?=\S)([\s\S]*)\|\|)|(?:\>\!(?=\S)([\s\S]*)\!\<))/,T=(e,t)=>{const n=t.match(M);if(!n)return;const r=n[1]||n[2];return s(n[0],"spoiler",e.parse(r))},q=/^\${1,2}(?=\S)([\s\S]*?\S)\${1,2}/,D=(e,t)=>{const n=t.match(q);if(n)return s(n[0],"inlineMath",void 0,{value:n[1]})},N=/^\[\^([a-zA-Z0-9\-_]{1,64})\]/,H=(e,t)=>{const n=t.match(N);if(!n)return;const r=n[1],l=r.toLowerCase();return s(n[0],"footnoteReference",void 0,{label:r,identifier:l})},I=f(/^!?\[(label)\]\s*(\[([^\]]*)\])?/,{label:g}),F=(e,t)=>{const n=t.match(I);if(!n)return;const r=n[0],l="!"===r[0],i=l?"imageReference":"linkReference";let c,o=n[3],a="full";o||(o=n[1],a=n[2]?"collapsed":"shortcut");const u={identifier:o,referenceType:a};return l?u.alt=n[1]||null:c=e.parse(n[1]),s(r,i,c,u)},G=new RegExp("^"+d.source),J=(e,t)=>{const n=t.match(G);if(!n)return;const r=n[0];return s(r,"inlineLink",void 0,{value:r})},K=c("sup",/^\^(?=\S)([\s\S]*?\S)\^/,1),Q=c("sub",/^~(?=\S)([\s\S]*?\S)~/,1),U=c("mark",/^==(?=\S)([\s\S]*?\S)==/,1),V=/^\{([^}\n]{1,4096})\}/,W=(e,t)=>{const n=t.match(V);if(!n)return;const r=n[1].trim().split(/\s+/).filter(Boolean);return s(n[0],"inlineAttr",void 0,{args:r,value:n[0]})},X=/^([#~@])(?![#~@])(([\w\-_\.\/#]{1,64})|(\{([\w\-_\.\/#=\/ ]{1,64})\}))/,Y=(e,t)=>{const n=t.match(X);if(!n)return;const r=n[5]||n[2];return s(n[0],"handle",void 0,{value:r,prefix:n[1]})},ee=c("underline",/^\+\+(?=\S)([\s\S]*?\S)\+\+/,1),te=/^\s{2,}\r?\n(?!\s*$)/,ne=/^\s*\\n/,re=(e,t)=>{const n=t.match(te)||t.match(ne);if(n)return s(n[0],"break")},se=(e=32)=>{const t=new RegExp(`^::([^'\\s:]{1,${e}}?)::`),n=new RegExp(`^:([^'\\s:]{1,${e}}?):`);return(e,r)=>{const l=r.match(t)||r.match(n);if(l)return s(l[0],"icon",void 0,{emoji:l[1]})}},le=f(/^!?\[(r1)\]\(r2(?:\s+(title))?\s*\)/,{r1:g,r2:/\s*(<(?:\\[<>]?|[^\s<>\\])*>|(?:\\[()]?|\([^\s\x00-\x1f()\\]*\)|[^\s\x00-\x1f()\\])*?)/,title:m}),ie=(e,t)=>{const n=t.match(le);if(!n)return;const r="!"===n[0][0];let l=n[3];return l&&(l=l.slice(1,-1)),r?s(n[0],"image",void 0,{url:n[2],alt:n[1],title:l}):s(n[0],"link",e.parse(n[1]),{url:n[2],title:l})},ce=/\s{0,2}\r?\n/g,oe=e=>" "===e[0]&&" "===e[1]?"\n":" ",ae=new RegExp("^[\\s\\S]+?(?=[\\<>!\\[_*`:~\\|#@\\$\\^=\\+]| {2,}\\n|("+d.source+")|\\\\n|\\\\`|$)"),ue=e=>(t,n)=>{const r=n.match(ae);if(!r)return;const l=r[0];let i=l.replace(ce,oe);return i=a("...","…",a("(P)","§",a("+-","±",a("--","–",a("---","—",a("'","’",a('"',"”",o(/\(c\)/gi,"©",o(/\(r\)/gi,"®",o(/\(tm\)/gi,"™",o(/^'(?=\S)/,"‘",o(/^"(?=\S)/,"“",i)))))))))))),e&&(i=e(i)),s(l,"text",void 0,{value:i},l.length)},he=/^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/,pe=(e,t)=>{const n=t.match(he);if(n)return s(n[0],"text",void 0,{value:n[1]})},fe=(e,t)=>z.el(t),ge=new class extends p{constructor(e){super(e)}parse(e){const t=super.parse(e),n=[];let r;const l=()=>{r&&(n.push(r),r=void 0)},i=(e,t)=>{r?(r.value+=e,r.len+=t):r=s(e,"text",void 0,{value:e},t)},c=t.length;for(let e=0;e<c;e++){const s=t[e];if("text"===s.type){const e=s;r?(r.value+=e.value,r.len+=s.len):r={...e}}else if("inlineAttr"===s.type){const e=s,t=n[n.length-1];!r&&t&&"text"!==t.type?t.args=t.args?[...t.args,...e.args]:[...e.args]:i(e.value,s.len)}else l(),n.push(s)}return l(),n}}({parsers:(e=>[pe,E,j,B,T,Z,D,H,ie,F,J,K,Q,U,W,Y,ee,re,se(),fe,ue(e)])(h)}),me=/^[\n\r]+/,de=/^(\s{4}[^\n]+)+/,ve=/^ *(`{3,}|~{3,})([^\s]*) *([^\n]*)\n([\s\S]*?)\s*\1 *(?:\n+|$)/,Se=/^ *\$\$[ \.]*(\S+)? *\n([\s\S]*?)\s*\$\$ *(?:\n+|$)/,be=/^ *([-=+#@*^]{3,})(?:\s+([^\s]*))?\s*\n([\s\S]*?)\s*\1\s*(?:\n+|$)/,_e=/^ *(#{1,6}) +([^\n]+?) *(?:#+ *)?(?:\n+|$)/,ye=/^([^\n]+)\n *(=|-){2,} *(?:\n+|$)/,$e=/^( *>[^\n]+(\n(?!^ *\[([^\]]+)\]: *<?([^\s>]+)>?(?: +["(]([^\n]+)[")])? *(?:\n+|$))[^\n]+)*)+/,we=/^ *> ?/gm,xe=/^ *!/,ke=/^ *! ?/gm,Ae=/^\s{0,3}([*+-]|\d{1,3}\.)\s{1,42}/,Re=/(?:[*+-]|\d{1,3}\.)/,ze=/\n\s*\n(?!\s*$)/,Ce=f(/^( {0,333})(bull) [^\n]*(?:\n(?!\1bull )[^\n]*)*/gm,{bull:Re}),Ee=f(/^ {0,3}(?:bull) (?:(?!\r?\n\r?\n)[\s\S])+/,{bull:Re,hr:v,def:S}),Oe=(e,t)=>{const n=o(/([^\\])\|/g,"$1 |",e).split(/ +\| */);if(void 0!==t)if(n.length>t)n.splice(t);else for(;n.length<t;)n.push("");for(let e=0;e<n.length;e++)n[e]=o(/\\\|/g,"|",n[e]);return n},je=/^ *\|?(.+)\n *\|?( *[-:]+[-| :]*)(?:\n((?: *[^>\n ].*(?:\n|$))*)\n*|$)/,Le=/^\[\^([a-zA-Z0-9\-_]+)\]: *([^\n]*(\n?(( {2}([^\n]*)\n?)|\n(?!\n))*)?)/,Be=/^ *\{([^}\n]+)\} *(\n+|$)/,Pe=f(/^((?:[^\n]+(\n(?!\s{0,3}bull))?)+)\n*/,{bull:Re}),Ze=[(e,t)=>{const n=t.match(me);if(n)return s(n[0],"")},(e,t)=>{const n=t.match(de);if(!n)return;const r=n[0],l={value:o(/\n+$/,"",o(/^ {4}/gm,"",r)),lang:null};return s(r,"code",void 0,l,r.length)},(e,t)=>{const n=t.match(ve);if(!n)return;const r=n[0],l={value:n[4]||n[3],lang:n[2]||"",meta:n.length>4?n[3]:null};return s(r,"code",void 0,l)},(e,t)=>{const n=t.match(be);if(!n)return;const r=n[0],l=n[1],i=n[2]||void 0,c={value:n[3]};return i&&(c.lang=i),"---"!==l&&(c.fence=l),s(r,"metadata",void 0,c)},(e,t)=>{const n=t.match(Se);if(n)return s(n[0],"math",void 0,{value:n[2]})},(e,t)=>{const n=t.match(v);if(n)return s(n[0],"thematicBreak",void 0,{value:n[1]})},(e,t)=>{let n=t.match(_e);if(n){const t=n[2];return s(n[0],"heading",e.parsei(t),{depth:n[1].length})}if(n=t.match(ye),n){const t=n[1];return s(n[0],"heading",e.parsei(t),{depth:"-"===n[2]?2:1})}},(e,t)=>{const n=t.match($e);if(!n)return;const r=n[0];let l=o(we,"",r),i=!1;l.match(xe)&&(i=l.split("\n").every(e=>e.match(xe)),i&&(l=l.replace(ke,"")));const c=e.parse(l),a=s(r,"blockquote",c);return i&&(a.spoiler=i),a},(e,t)=>{const n=t.match(Ee);if(!n)return;const r=n[0],l=(e=>e.match(Ce))(r);if(!l)return;const i=l.length,c=[];let a=null;for(let t=0;t<i;t++){const n=l[t],r=n.match(Ae);if(!r)return;const[s,i]=r;let u=n.slice(s.length);0===t&&i.length>1&&(a=Number(i));let h=null;"["===u[0]&&"]"===u[2]&&" "===u[3]&&(h=" "!==u[1],u=u.slice(4));const p=u.indexOf("\n");if(p>0){let e=0;for(let t=p+1;t<p+4&&" "===u[t];t++)e++;e&&(u=o(new RegExp("^ {1,"+e+"}","gm"),"",u))}c.push({type:"listItem",spread:ze.test(u),checked:h,children:e.parse(u)})}return s(r,"list",c,{ordered:null!==a,start:a})},(e,t)=>{const n=t.match(je);if(!n)return;const r=n[0],l=n[1],i=o(/^ *|\| *$/g,"",n[2]).split(/ *\| */).map(e=>":"===(e=e.trim())[0]?":"===e[e.length-1]?"center":"left":":"===e[e.length-1]?"right":null),c=n[3]?o(/(?: *\| *)?\n$/,"",n[3]).split("\n"):[],a=[],u=Oe(o(/^ *| *\| *$/g,"",l)).map(t=>({type:"tableCell",children:e.parsei(t)}));if(a.push({type:"tableRow",children:u}),c&&c.length)for(let t=0;t<c.length;t++){const n=c[t],r=Oe(o(/^ *\| *| *\| *$/g,"",n),u.length);a.push({type:"tableRow",children:r.map(t=>({type:"tableCell",children:e.parsei(t)}))})}return s(r,"table",a,{align:i})},(e,t)=>{const n=t.match(Le);if(!n)return;const r=n[0],l=n[1],i=l.toLowerCase(),c=o(/^ {1,4}/gm,"",n[2]),a=e.parse(c);return s(r,"footnoteDefinition",a,{label:l,identifier:i})},(e,t)=>{const n=t.match(S);if(!n)return;const r=n[0],l=n[1],i=n[3];return s(r,"definition",void 0,{label:l,identifier:l.toLowerCase(),title:i?i.slice(1,-1):null,url:n[2]})},(e,t)=>{const n=t.match(Be);if(!n)return;const r=n[1].trim().split(/\s+/).filter(Boolean),l=s(n[0],"blockAttr",void 0,{args:r});return n[2]&&n[2].length>1&&(l._blankLine=!0),l},(e,t)=>z.el(t),(e,t)=>{const n=t.match(Pe);if(n)return s(n[0],"paragraph",e.parsei(n[1].trim()))}],Me=new class extends p{inline;constructor(e){super(e),this.inline=e.inline}parse(e){const t=super.parse(e);return this.applyBlockAttrs(t)}applyBlockAttrs(e){const t=[];let n=[];for(const r of e)if("blockAttr"===r.type){const e=r;e._blankLine?n=[]:n.push(...e.args)}else""===r.type?(n=[],t.push(r)):(n.length>0&&(r.args=n,n=[]),t.push(r));return t}parsef(e){const t=this.parse(e),n={type:"root",children:t,len:e.length},r=t.length;for(let e=0;e<r-1;e++){const n=t[e];if("list"===n?.type){const r=t[e+1];"list"===r?.type&&(n.spread=!0,n.children.push(...r.children),t.splice(e+1,1),e--)}}return n}parsei(e){return this.inline.parse(e)}}({parsers:Ze,inline:ge}),Te=e=>{const t={},n=e.split(";"),r=n.length;for(let e=0;e<r;e++){const r=n[e],s=r.indexOf(":");if(-1===s)continue;const l=r.slice(0,s).trim(),i=r.slice(s+1).trim();l&&i&&(t[l]=i)}return t};export{r as css,t as html,n as markdown};