markdown-it-plugins
Version:
A collection of plug-ins that extend the Markdown-it parser.
6 lines • 3.56 kB
JavaScript
import MarkdownContainer from"markdown-it-container";let typeClassName={tip:"bg-green-500/50 border-green-500/50",warning:"bg-yellow-500/50 border-yellow-500/50",danger:"bg-red-500/50 border-red-500/50"},titleColorClassName={tip:"text-green-700",warning:"text-yellow-700",danger:"text-red-700"};function container(r){let n=/(tip|warning|danger|details)\s?(.*)/,o;r.use(MarkdownContainer,"container",{validate:e=>e.trim().match(n),render(e,t){return 1===e[t].nesting?([,e,t]=e[t].info.trim().match(n),o=e,t=t,"details"===(e=e)?'<details class="prompt-container block my-2.5 p-1 cursor-pointer bg-gray-200 rounded-lg details">'+(t?`<summary class="prompt-container-title font-medium select-none px-2 py-1.5 rounded-md bg-background"><span class="pl-1">${r.utils.escapeHtml(t)}</span></summary><div class="prompt-container-content px-3 pt-2 pb-1">`:""):`<div class="prompt-container relative my-2.5 border-l-8 py-2 px-3 rounded-md ${e} ${typeClassName[e]}"><p class="prompt-container-title font-bold ${titleColorClassName[e]}">${r.utils.escapeHtml(t)}</p>`):"details"===o?"</div></details>":"</div>"}})}function noticeboard(e){let a="-> ",i="?> ",s={tip:"bg-gray-500/20 border-gray-500/20",warning:"bg-yellow-500/20 border-yellow-500/20",danger:"bg-red-500/20 border-red-500/20"};e.block.ruler.before("paragraph","noticeboard",(n,o,e,t)=>{if(!(4<=n.sCount[o]-n.blkIndent)){var r=n.eMarks[o],l=n.bMarks[o]+n.tShift[o],l=n.src.substring(l,r).trim();if(l.startsWith(a)||l.startsWith("!> ")||l.startsWith(i)){if(!t){let e,t,r;r=l.startsWith(a)?(t="tip",a):l.startsWith(i)?(t="warning",i):(t="danger","!> "),(e=n.push("notice_open","div",1)).attrs=[["class",`noticeboard relative my-2.5 p-4 leading-none rounded-md border ${s[t]} `+t]],e.markup=r,e.map=[o,n.line],(e=n.push("inline","",0)).map=[o,n.line],e.content=l.substring(a.length),e.children=[],(e=n.push("notice_close","div",-1)).markup=r,n.line=o+1}return!0}}return!1})}function codeLineNumbers(e){let n=e.renderer.rules.fence;e.renderer.rules.fence=(e,t,...r)=>`
<ul class="code-line-numbers select-none w-12 m-0 p-0 pr-3 relative text-right list-none font-mono opacity-30">
${([...new Array(e[t].content.split("\n").length).keys()].join('</li><li class="line">')+"</li>").slice(6)}
</ul>
${n(e,t,...r)}
`}function collectBlockCode(e,{lang:a=!0,copy:i=!0,open:s=!0,copyText:c="copy",separator:d=":",blockName:p=!0}={}){let m=e.renderer.rules.fence,u,b;e.renderer.rules.fence=(e,t,...r)=>{var[n,o,l]=e[t].info.split(d).map(e=>e.trim()),l=(b=l?"close"===l?"":"open"===l?"open":l:s?"open":"",u=`<details class="collect-block-code my-4 rounded-md border overflow-hidden" ${b?"open":""}><summary class="collect-block-trigger px-3 text-md font-medium h-10 flex items-center cursor-pointer "><i class="block-code-icon"></i>`+(p&&o?`<p class="block-code-name">${o}</p>`:'<i style="flex:1"></i>'),m(e,t,...r));return(i||p)&&(u+=(a?`<span class="block-code-lang ml-auto">${n}</span>`:"")+(i?`<button class="copy-code-btn" data-text="${c}" data-code='${l}'></button>`:"")),u+=`</summary><div class="collect-block-content py-2 flex border-t">${l}</div></details>`}}function extendImageTitle(e){let l=e.renderer.rules.image;e.renderer.rules.image=(e,t,...r)=>{let n=e[t];var o=n.attrs?.findIndex(([e])=>"title"===e);if(o&&0<=o&&~n.attrs[o][1].indexOf("=")){let t,r;o=n.attrs[o][1].split("&");n.attrSet("title",""),n.attrSet("loading","lazy"),o.forEach(e=>{[t,r]=e.split("="),n.attrSet(t,r)})}return l(e,t,...r)}}export{codeLineNumbers,collectBlockCode,container,extendImageTitle,noticeboard};