/*! * marked-mini - minimal Markdown renderer for Memos Clipper * Supports: headings, bold, italic, strike, code, pre, blockquote, * links, images, ul, ol, hr, tables, line breaks */ (function(global){ "use strict"; function escape(s){return s.replace(/&/g,"&").replace(//g,">").replace(/"/g,""");} function parseInline(s){ // code spans s = s.replace(/`([^`]+)`/g,(_,c)=>`${escape(c)}`); // bold+italic s = s.replace(/\*\*\*(.+?)\*\*\*/g,"$1"); // bold s = s.replace(/\*\*(.+?)\*\*/g,"$1"); s = s.replace(/__(.+?)__/g,"$1"); // italic s = s.replace(/\*(.+?)\*/g,"$1"); s = s.replace(/_([^_]+)_/g,"$1"); // strikethrough s = s.replace(/~~(.+?)~~/g,"$1"); // images s = s.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(_,alt,src)=>`${escape(alt)}`); // links s = s.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(_,txt,href)=>`${txt}`); // auto-link s = s.replace(/(?)]+)/g,url=>`${escape(url)}`); // hard break s = s.replace(/ \n/g,"
"); return s; } function parse(src){ const lines = src.split("\n"); const out = []; let i = 0; while(i < lines.length){ const line = lines[i]; // Fenced code block const fenceM = line.match(/^```(\w*)/); if(fenceM){ const lang = fenceM[1]||""; const code = []; i++; while(i${escape(code.join("\n"))}`); continue; } // Headings const hM = line.match(/^(#{1,6})\s+(.*)/); if(hM){ const lvl = hM[1].length; out.push(`${parseInline(hM[2])}`); i++; continue; } // HR if(/^[-*_]{3,}\s*$/.test(line)){ out.push("
"); i++; continue; } // Blockquote if(line.startsWith("> ")){ const bq = []; while(i ")){ bq.push(lines[i].slice(2)); i++; } out.push(`
${parse(bq.join("\n"))}
`); continue; } // Unordered list if(/^[-*+]\s/.test(line)){ const items = []; while(i${parseInline(lines[i].replace(/^[-*+]\s/,""))}`); i++; } out.push(`
    ${items.join("")}
`); continue; } // Ordered list if(/^\d+\.\s/.test(line)){ const items = []; while(i${parseInline(lines[i].replace(/^\d+\.\s/,""))}`); i++; } out.push(`
    ${items.join("")}
`); continue; } // Table (| col | col |) if(line.startsWith("|") && i+1idx>0&&idx`${parseInline(h.trim())}`); i+=2; // skip header + separator const rows = []; while(iidx>0&&idx`${parseInline(c.trim())}`); rows.push(`${cells.join("")}`); i++; } out.push(`${headers.join("")}${rows.join("")}
`); continue; } // Empty line if(line.trim()===""){ i++; continue; } // Paragraph — collect until blank line const para = []; while(i|[-*+]\s|\d+\.\s|[-*_]{3,}\s*$)/.test(lines[i])) break; para.push(lines[i]); i++; } if(para.length) out.push(`

${parseInline(para.join(" "))}

`); } return out.join("\n"); } global.marked = { parse: function(src, opts) { const breaks = opts && opts.breaks; // With breaks:true, single newlines in paragraphs become
if (breaks) { // Pre-process: single \n inside paragraph text → two spaces + \n (markdown hard break) src = src.replace(/([^\n])\n([^\n])/g, "$1 \n$2"); } return parse(src); } };})(window);