UNPKG

very-small-parser

Version:

A very small Markdown, HTML, and CSS parser.

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