markdown-parser-react
Version:
A lightweight and configurable Markdown renderer for React and Next.js with syntax highlighting, definition lists, images, math and table support.
3 lines (2 loc) • 6.12 kB
JavaScript
import e,{useMemo as t}from"react";function r(){return r=Object.assign?Object.assign.bind():function(e){for(var t=1;t<arguments.length;t++){var r=arguments[t];for(var s in r)({}).hasOwnProperty.call(r,s)&&(e[s]=r[s])}return e},r.apply(null,arguments)}function s({content:s,options:l,className:n,style:a,asArticle:i=!1,id:c,aria:o}){const m=t(()=>{try{return function(t,s={}){const{langPrefix:l="language-",customClasses:n={},customStyles:a={},linkTarget:i="_blank",sanitizeHtml:c=!0,maxNestingLevel:o=6}=s,m=t.trim().split(/\r\n|\n/),u=[];let p=!1,g=null,d=[],h=0,f=0;const $=(e,t={})=>{const s=r({},a[e],t.style),l=n[e]?`${n[e]}${t.className?` ${t.className}`:""}`:t.className;return r({},t,{style:Object.keys(s).length>0?s:void 0,className:l||void 0})},y=e=>{if(!e)return"";const t=[{regex:/\$(.+?)\$/g,replace:(e,t)=>`<span class="math-inline">${t}</span>`},{regex:/~~(.+?)~~/g,replace:"<del>$1</del>"},{regex:/\^(.+?)\^/g,replace:"<sup>$1</sup>"},{regex:/~(.+?)~/g,replace:"<sub>$1</sub>"},{regex:/==(.+?)==/g,replace:"<mark>$1</mark>"},{regex:/\*\*\*(.+?)\*\*\*/g,replace:"<strong><em>$1</em></strong>"},{regex:/___(.+?)___/g,replace:"<strong><em>$1</em></strong>"},{regex:/\*\*(.+?)\*\*/g,replace:"<strong>$1</strong>"},{regex:/__(.+?)__/g,replace:"<strong>$1</strong>"},{regex:/\*(.+?)\*/g,replace:"<em>$1</em>"},{regex:/_(.+?)_/g,replace:"<em>$1</em>"},{regex:/`([^`]+)`/g,replace:"<code>$1</code>"},{regex:/\[([^\]]+)\]\(([^)"'\s]+)(?:\s+"([^"]+)")?\)/g,replace:(e,t,s,l)=>{const n=$("links",r({href:s},l&&{title:l},{target:i,rel:"_blank"===i?"noopener noreferrer":void 0}));return`<a ${Object.entries(n).filter(([e,t])=>void 0!==t).map(([e,t])=>`${e}="${t}"`).join(" ")}>${t}</a>`}}];return t.reduce((e,{regex:t,replace:r})=>e.replace(t,r),e)};return m.forEach((t,s)=>{if(f>0)return void f--;if(h>o)return void u.push(/*#__PURE__*/e.createElement("p",{key:`error-${s}`},"Maximum nesting level reached"));if(s<m.length-1){const l=t.trim(),n=m[s+1].trim();if(""!==l&&!l.startsWith(":")&&n.startsWith(":")){const t=l,n=[];let a=s+1;for(;a<m.length&&m[a].trim().startsWith(":");)n.push(m[a].trim().slice(1).trim()),a++;return f=n.length,void u.push(/*#__PURE__*/e.createElement("dl",r({key:`dl-${s}`},$("lists")),/*#__PURE__*/e.createElement("dt",null,y(t)),n.map((t,r)=>/*#__PURE__*/e.createElement("dd",{key:r},y(t)))))}}if(/^(\s*)-\s\[(x| )\]/.test(t.trim())){const l=(t.match(/^\s*/)||[""])[0].length,n=t.includes("[x]"),a=t.replace(/^(\s*)-\s\[(x| )\]\s*/,"");return h=Math.floor(l/2),void u.push(/*#__PURE__*/e.createElement("div",r({key:`task-${s}`},$("lists"),{style:{marginLeft:20*h+"px"}}),/*#__PURE__*/e.createElement("input",{type:"checkbox",checked:n,readOnly:!0}),/*#__PURE__*/e.createElement("span",null,y(a))))}if(/^#{1,6}\s/.test(t.trim())){var n;const l=(null==(n=t.match(/^#{1,6}/))?void 0:n[0].length)||1,a=t.replace(/^#{1,6}\s/,""),i=a.match(/\{#([^}]+)\}/),c=i?i[1]:void 0,o=a.replace(/\{#([^}]+)\}/,"").trim();return void u.push(/*#__PURE__*/e.createElement(`h${l}`,r({key:`h-${s}`,id:c},$("headings")),y(o)))}if(/^```(\S+)?(\s+\{.*\})?$/.test(t.trim())){if(p=!p,p){const e=t.trim().match(/^```(\S+)?/);g=(null==e?void 0:e[1])||null,d=[]}else{const t=d.join("\n");u.push(/*#__PURE__*/e.createElement("pre",r({key:`code-${s}`},$("codeBlocks")),/*#__PURE__*/e.createElement("code",{className:g?`${l}${g}`:void 0},t))),d=[],g=null}return}if(p)return void d.push(t);if(/^>\s/.test(t.trim())){const l=t.match(/^>\s?(.+?)(?:\s+--\s+(.+))?$/);if(l){const[,t,n]=l;return void u.push(/*#__PURE__*/e.createElement("blockquote",r({key:`quote-${s}`},$("blockquotes")),y(t),n&&/*#__PURE__*/e.createElement("footer",null,"— ",n)))}return void u.push(/*#__PURE__*/e.createElement("blockquote",r({key:`quote-${s}`},$("blockquotes")),y(t.trim().replace(/^>\s/,""))))}if(/^\|(.+\|)+/.test(t.trim())){if(s>0&&/^\|(.+\|)+/.test(m[s-1].trim()))return;if(!/^\|(\s*:?-+:?\s*\|)+/.test(t.trim())){const l=[t.trim()],n=[];if(s+1<m.length&&/^\|(\s*:?-+:?\s*\|)+/.test(m[s+1].trim())){const e=m[s+1].trim();n.push(...e.split("|").slice(1,-1).map(e=>e.trim().startsWith(":")&&e.trim().endsWith(":")?"center":e.trim().endsWith(":")?"right":"left")),s++}for(;s+1<m.length&&/^\|(.+\|)+/.test(m[s+1].trim())&&!/^\|(\s*:?-+:?\s*\|)+/.test(m[s+1].trim());)l.push(m[s+1].trim()),s++;if(l.length>0){const t=l[0].split("|").slice(1,-1).map(e=>e.trim()),a=$("tables");u.push(/*#__PURE__*/e.createElement("table",r({key:`table-${s}`},a),/*#__PURE__*/e.createElement("thead",null,/*#__PURE__*/e.createElement("tr",null,t.map((t,r)=>/*#__PURE__*/e.createElement("th",{key:r,style:{textAlign:n[r]||"left"}},y(t))))),/*#__PURE__*/e.createElement("tbody",null,l.slice(1).map((t,r)=>/*#__PURE__*/e.createElement("tr",{key:r},t.split("|").slice(1,-1).map((t,r)=>/*#__PURE__*/e.createElement("td",{key:r,style:{textAlign:n[r]||"left"}},y(t.trim()))))))))}}return}if(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]+)")?\)/.test(t.trim())){const l=t.trim().match(/!\[([^\]]*)\]\(([^)\s]+)(?:\s+"([^"]+)")?\)/);if(l){const[,t="",n="",a=""]=l;u.push(/*#__PURE__*/e.createElement("img",r({key:`img-${s}`,src:n,alt:t,title:a||void 0},$("images"))))}return}if(/^(\s*)([-*+]|\d+\.)\s/.test(t.trim())){const l=(t.match(/^\s*/)||[""])[0].length,n=/^\s*\d+\./.test(t),a=t.replace(/^(\s*)([-*+]|\d+\.)\s/,"");return h=Math.floor(l/2),void u.push(/*#__PURE__*/e.createElement(n?"ol":"ul",r({key:`list-${s}`},$("lists"),{style:{marginLeft:20*h+"px"}}),/*#__PURE__*/e.createElement("li",null,y(a))))}const a=y(t.trim());a.trim()&&u.push(/*#__PURE__*/e.createElement("p",r({key:`p-${s}`},$("paragraphs")),/*#__PURE__*/e.createElement("span",{dangerouslySetInnerHTML:{__html:a}})))}),u}(s,l)}catch(t){return console.error("Error parsing markdown:",t),[/*#__PURE__*/e.createElement("p",{key:"error"},"Error parsing markdown content")]}},[s,l]),u=r({className:n?`markdown-container ${n}`:"markdown-container",style:a,id:c},(null==o?void 0:o.label)&&{"aria-label":o.label},(null==o?void 0:o.describedBy)&&{"aria-describedby":o.describedBy});/*#__PURE__*/return e.createElement(i?"article":"div",r({},u),m)}export{s as default};
//# sourceMappingURL=lib.modern.mjs.map