Per-message attachment total, deleted-while-offline messages, nested code spans in links and /\host site paths.
7 lines
2.3 KiB
JavaScript
7 lines
2.3 KiB
JavaScript
const m={"&":"&","<":"<",">":">",'"':""","'":"'"};function h(o){return o.replace(/[&<>"']/g,t=>m[t])}function x(o){const t=o.trim().replace(/[\u0000-\u001f\u007f\s]+/g,"");return/^https?:\/\/[^/]/i.test(t)||/^mailto:[^\s]+$/i.test(t)||/^\/(?![/\\])/.test(t)||t.startsWith("#")?t:null}function f(o){const t=[],r=i=>i.replace(/\u0000(\d+)\u0000/g,(s,l)=>t[Number(l)]??""),e=i=>`\0${t.push(r(i))-1}\0`;let c=o.replace(/\u0000/g,"");return c=c.replace(/`([^`\n]+)`/g,(i,s)=>e(`<code>${h(s)}</code>`)),c=c.replace(/\[([^\]\n]+)\]\(([^()\s]*(?:\([^()\s]*\)[^()\s]*)*)\)/g,(i,s,l)=>{if(l.includes("\0"))return i;const u=x(l),a=d(h(s));if(!u)return e(a);const p=/^https?:/i.test(u)?' target="_blank" rel="noopener noreferrer nofollow"':"";return e(`<a href="${h(u)}"${p}>${a}</a>`)}),c=d(h(c)),r(c)}function d(o){return o.replace(/\*\*([^*\n]+)\*\*/g,"<strong>$1</strong>").replace(/(^|[\s(])\*([^*\n]+)\*(?=$|[\s).,;:!?])/g,"$1<em>$2</em>").replace(/(^|[\s(])_([^_\n]+)_(?=$|[\s).,;:!?])/g,"$1<em>$2</em>")}function w(o){if(!o)return"";const t=o.replace(/\r\n?/g,`
|
|
`).split(`
|
|
`),r=[];let e=0;const c=s=>s.trim()==="",i=s=>/^(#{1,6})\s/.test(s)||/^```/.test(s)||/^>\s?/.test(s)||/^\s*([-*+]|\d+[.)])\s+/.test(s)||/^(-{3,}|\*{3,}|_{3,})\s*$/.test(s);for(;e<t.length;){const s=t[e];if(c(s)){e++;continue}if(/^```/.test(s)){const n=[];for(e++;e<t.length&&!/^```/.test(t[e]);)n.push(t[e++]);e++,r.push(`<pre><code>${h(n.join(`
|
|
`))}</code></pre>`);continue}const l=/^(#{1,6})\s+(.*?)\s*#*\s*$/.exec(s);if(l){const n=Math.min(l[1].length+1,6);r.push(`<h${n}>${f(l[2])}</h${n}>`),e++;continue}if(/^(-{3,}|\*{3,}|_{3,})\s*$/.test(s)){r.push("<hr>"),e++;continue}if(/^>\s?/.test(s)){const n=[];for(;e<t.length&&/^>\s?/.test(t[e]);)n.push(t[e++].replace(/^>\s?/,""));r.push(`<blockquote>${w(n.join(`
|
|
`))}</blockquote>`);continue}const u=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(s);if(u){const n=/\d/.test(u[1]),p=[];for(;e<t.length;){const $=/^\s*([-*+]|\d+[.)])\s+(.*)$/.exec(t[e]);if(!$||/\d/.test($[1])!==n)break;let g=$[2];for(e++;e<t.length&&/^\s{2,}\S/.test(t[e])&&!/^\s*([-*+]|\d+[.)])\s+/.test(t[e]);)g+=" "+t[e++].trim();p.push(`<li>${f(g)}</li>`)}r.push(n?`<ol>${p.join("")}</ol>`:`<ul>${p.join("")}</ul>`);continue}const a=[s];for(e++;e<t.length&&!c(t[e])&&!i(t[e]);)a.push(t[e++]);r.push(`<p>${a.map(n=>f(n.trim())).join(" ")}</p>`)}return r.join(`
|
|
`)}export{h as e,d as f,w as r,x as s};
|