marked-footnote
Version:
A marked extension to support GFM footnotes
18 lines (16 loc) • 2.54 kB
JavaScript
;function y(t,f){const n={type:"footnotes",raw:f,rawItems:[],items:[]};return{name:"footnote",level:"block",childTokens:["content"],tokenizer(r){t.hasFootnotes||(this.lexer.tokens.push(n),t.tokens=this.lexer.tokens,t.hasFootnotes=!0,n.rawItems=[],n.items=[]);const s=/^\[\^([^\]\n]+)\]:(?:[ \t]+|[\n]*?|$)([^\n]*?(?:\n|$)(?:\n*?[ ]{4,}[^\n]*)*)/.exec(r);if(s){const[a,d,c=""]=s;let i=c.split(`
`).reduce((l,h)=>l+`
`+h.replace(/^(?:[ ]{4}|[\t])/,""),"");const e=i.trimEnd().split(`
`).pop();i+=e&&/^[ \t]*?[>\-*][ ]|[`]{3,}$|^[ \t]*?[|].+[|]$/.test(e)?`
`:"";const o={type:"footnote",raw:a,label:d,refs:[],content:this.lexer.blockTokens(i)};return n.rawItems.push(o),o}},renderer(){return""}}}function R(t,f=!1){let n=0;return{name:"footnoteRef",level:"inline",tokenizer(r){const s=/^\[\^([^\]\n]+)\]/.exec(r);if(s){const[a,d]=s,c=this.lexer.tokens[0],i=c.rawItems.filter(h=>h.label===d);if(!i.length)return;const e=i[0],o=c.items.filter(h=>h.label===d)[0],l={type:"footnoteRef",raw:a,id:"",label:d};return o?(l.id=o.refs[0].id,o.refs.push(l)):(n++,l.id=String(n),e.refs.push(l),c.items.push(e)),l}},renderer({id:r,label:s}){n=0;const a=encodeURIComponent(s);return`<sup><a id="${t}ref-${a}" href="#${t+a}" data-${t}ref aria-describedby="${t}label">${f?`[${r}]`:r}</a></sup>`}}}function g(t,f,n,r,s,a){return{name:"footnotes",renderer({raw:d,items:c=[]}){if(c.length===0)return"";const i=c.reduce((h,{label:$,content:w,refs:F})=>{const m=encodeURIComponent($),p=this.parser.parse(w).trimEnd(),k=p.endsWith("</p>");let u=`<li id="${t+m}">
`;return u+=k?p.replace(/<\/p>$/,""):p,F.forEach((T,b)=>{const L=a.replace("{0}",$);u+=` <a href="#${t}ref-${m}" data-${t}backref aria-label="${L}">${b>0?`↩<sup>${b+1}</sup>`:"↩"}</a>`}),u+=k?`</p>
`:`
`,u+=`</li>
`,h+u},"");let e="";n&&(e+=`<hr data-${f}footnotes>
`);let o="";r&&(o=` class="${r}"`);let l="";return s&&(l=` class="${s}"`),e+=`<section${o} data-${f}footnotes>
`,e+=`<h2 id="${t}label"${l}>${d.trimEnd()}</h2>
`,e+=`<ol>
${i}</ol>
`,e+=`</section>
`,e}}}function E(t={}){const{prefixId:f="footnote-",prefixData:n="",description:r="Footnotes",refMarkers:s=!1,footnoteDivider:a=!1,sectionClass:d="footnotes",headingClass:c="sr-only",backRefLabel:i="Back to reference {0}"}=t,e={hasFootnotes:!1,tokens:[]};return{extensions:[y(e,r),R(f,s),g(f,n,a,d,c,i)],walkTokens(o){o.type==="footnotes"&&e.tokens.indexOf(o)===0&&o.items.length&&(e.tokens[0]={type:"space",raw:""},e.tokens.push(o)),e.hasFootnotes&&(e.hasFootnotes=!1)}}}module.exports=E;
//# sourceMappingURL=index.cjs.map