quikdown 1.2.9 → 1.2.11

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (68) hide show
  1. package/README.md +5 -5
  2. package/dist/quikdown.cjs +104 -5
  3. package/dist/quikdown.d.ts +12 -0
  4. package/dist/quikdown.dark.css +1 -1
  5. package/dist/quikdown.esm.js +104 -5
  6. package/dist/quikdown.esm.min.js +2 -2
  7. package/dist/quikdown.esm.min.js.gz +0 -0
  8. package/dist/quikdown.esm.min.js.map +1 -1
  9. package/dist/quikdown.light.css +1 -1
  10. package/dist/quikdown.umd.js +104 -5
  11. package/dist/quikdown.umd.min.js +2 -2
  12. package/dist/quikdown.umd.min.js.gz +0 -0
  13. package/dist/quikdown.umd.min.js.map +1 -1
  14. package/dist/quikdown_ast.cjs +16 -28
  15. package/dist/quikdown_ast.esm.js +16 -28
  16. package/dist/quikdown_ast.esm.min.js +2 -2
  17. package/dist/quikdown_ast.esm.min.js.gz +0 -0
  18. package/dist/quikdown_ast.esm.min.js.map +1 -1
  19. package/dist/quikdown_ast.umd.js +16 -28
  20. package/dist/quikdown_ast.umd.min.js +2 -2
  21. package/dist/quikdown_ast.umd.min.js.gz +0 -0
  22. package/dist/quikdown_ast.umd.min.js.map +1 -1
  23. package/dist/quikdown_ast_html.cjs +17 -29
  24. package/dist/quikdown_ast_html.esm.js +17 -29
  25. package/dist/quikdown_ast_html.esm.min.js +2 -2
  26. package/dist/quikdown_ast_html.esm.min.js.gz +0 -0
  27. package/dist/quikdown_ast_html.esm.min.js.map +1 -1
  28. package/dist/quikdown_ast_html.umd.js +17 -29
  29. package/dist/quikdown_ast_html.umd.min.js +2 -2
  30. package/dist/quikdown_ast_html.umd.min.js.gz +0 -0
  31. package/dist/quikdown_ast_html.umd.min.js.map +1 -1
  32. package/dist/quikdown_bd.cjs +104 -5
  33. package/dist/quikdown_bd.esm.js +104 -5
  34. package/dist/quikdown_bd.esm.min.js +2 -2
  35. package/dist/quikdown_bd.esm.min.js.gz +0 -0
  36. package/dist/quikdown_bd.esm.min.js.map +1 -1
  37. package/dist/quikdown_bd.umd.js +104 -5
  38. package/dist/quikdown_bd.umd.min.js +2 -2
  39. package/dist/quikdown_bd.umd.min.js.gz +0 -0
  40. package/dist/quikdown_bd.umd.min.js.map +1 -1
  41. package/dist/quikdown_edit.cjs +244 -12
  42. package/dist/quikdown_edit.esm.js +244 -12
  43. package/dist/quikdown_edit.esm.min.js +3 -3
  44. package/dist/quikdown_edit.esm.min.js.gz +0 -0
  45. package/dist/quikdown_edit.esm.min.js.map +1 -1
  46. package/dist/quikdown_edit.umd.js +244 -12
  47. package/dist/quikdown_edit.umd.min.js +3 -3
  48. package/dist/quikdown_edit.umd.min.js.gz +0 -0
  49. package/dist/quikdown_edit.umd.min.js.map +1 -1
  50. package/dist/quikdown_json.cjs +17 -29
  51. package/dist/quikdown_json.esm.js +17 -29
  52. package/dist/quikdown_json.esm.min.js +2 -2
  53. package/dist/quikdown_json.esm.min.js.gz +0 -0
  54. package/dist/quikdown_json.esm.min.js.map +1 -1
  55. package/dist/quikdown_json.umd.js +17 -29
  56. package/dist/quikdown_json.umd.min.js +2 -2
  57. package/dist/quikdown_json.umd.min.js.gz +0 -0
  58. package/dist/quikdown_json.umd.min.js.map +1 -1
  59. package/dist/quikdown_yaml.cjs +17 -29
  60. package/dist/quikdown_yaml.esm.js +17 -29
  61. package/dist/quikdown_yaml.esm.min.js +2 -2
  62. package/dist/quikdown_yaml.esm.min.js.gz +0 -0
  63. package/dist/quikdown_yaml.esm.min.js.map +1 -1
  64. package/dist/quikdown_yaml.umd.js +17 -29
  65. package/dist/quikdown_yaml.umd.min.js +2 -2
  66. package/dist/quikdown_yaml.umd.min.js.gz +0 -0
  67. package/dist/quikdown_yaml.umd.min.js.map +1 -1
  68. package/package.json +10 -10
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * quikdown_bd - Bidirectional Markdown Parser
3
- * @version 1.2.9
3
+ * @version 1.2.11
4
4
  * @license BSD-2-Clause
5
5
  * @copyright DeftIO 2025
6
6
  */
@@ -118,7 +118,7 @@
118
118
  // ────────────────────────────────────────────────────────────────────
119
119
 
120
120
  /** Build-time version stamp (injected by tools/updateVersion) */
121
- const quikdownVersion = '1.2.9';
121
+ const quikdownVersion = '1.2.11';
122
122
 
123
123
  /** CSS class prefix used for all generated elements */
124
124
  const CLASS_PREFIX = 'quikdown-';
@@ -126,6 +126,10 @@
126
126
  /** Placeholder sigils — chosen to be extremely unlikely in real text */
127
127
  const PLACEHOLDER_CB = '§CB'; // fenced code blocks
128
128
  const PLACEHOLDER_IC = '§IC'; // inline code spans
129
+ const PLACEHOLDER_HT = '§HT'; // safe HTML tags (limited mode)
130
+
131
+ /** Attributes whose values need URL sanitization */
132
+ const URL_ATTRIBUTES = { href:1, src:1, action:1, formaction:1 };
129
133
 
130
134
  /** HTML entity escape map */
131
135
  const ESC_MAP = {'&':'&amp;','<':'&lt;','>':'&gt;','"':'&quot;',"'":'&#39;'};
@@ -260,6 +264,46 @@
260
264
  return trimmedUrl;
261
265
  }
262
266
 
267
+ /**
268
+ * Sanitize attributes on an HTML tag string for limited mode.
269
+ * Strips on* event handlers (case-insensitive) and runs sanitizeUrl()
270
+ * on href/src/action/formaction values.
271
+ */
272
+ function sanitizeHtmlTagAttrs(tagStr) {
273
+ // Self-closing or void tag without attributes — pass through
274
+ if (!/\s/.test(tagStr.replace(/<\/?[a-zA-Z][a-zA-Z0-9]*/, '').replace(/\/?>$/, ''))) {
275
+ return tagStr;
276
+ }
277
+ // Parse: <tagname ...attrs... > or <tagname ...attrs... />
278
+ const m = tagStr.match(/^(<\/?[a-zA-Z][a-zA-Z0-9]*)([\s\S]*?)(\/?>)$/);
279
+ /* istanbul ignore next - defensive: Phase 1.5 regex guarantees valid tag shape */
280
+ if (!m) return tagStr;
281
+
282
+ const [, open, attrStr, close] = m;
283
+ // Match individual attributes: name="value", name='value', name=value, or bare name
284
+ // eslint-disable-next-line security/detect-unsafe-regex -- linear: no nested quantifiers
285
+ const attrRe = /([a-zA-Z_][\w\-.:]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+)))?/g;
286
+ const attrs = [];
287
+ let am;
288
+ while ((am = attrRe.exec(attrStr)) !== null) {
289
+ const name = am[1];
290
+ const value = am[2] !== undefined ? am[2] : am[3] !== undefined ? am[3] : am[4];
291
+ // Strip event handlers (on*)
292
+ if (/^on/i.test(name)) continue;
293
+ if (value === undefined) {
294
+ // Boolean attribute (e.g. disabled, checked)
295
+ attrs.push(name);
296
+ } else {
297
+ let sanitized = value;
298
+ if (name.toLowerCase() in URL_ATTRIBUTES) {
299
+ sanitized = sanitizeUrl(value);
300
+ }
301
+ attrs.push(`${name}="${sanitized}"`);
302
+ }
303
+ }
304
+ return open + (attrs.length ? ' ' + attrs.join(' ') : '') + close;
305
+ }
306
+
263
307
  // ────────────────────────────────────────────────────────────────
264
308
  // Phase 1 — Code Extraction
265
309
  // ────────────────────────────────────────────────────────────────
@@ -311,17 +355,57 @@
311
355
  return placeholder;
312
356
  });
313
357
 
358
+ // ────────────────────────────────────────────────────────────────
359
+ // Phase 1.5 — Safe HTML Extraction (whitelist mode)
360
+ // ────────────────────────────────────────────────────────────────
361
+ // When allow_unsafe_html is an object or array, extract whitelisted
362
+ // HTML tags, sanitize their attributes, and replace with placeholders.
363
+ // Non-whitelisted tags stay in text so Phase 2 will escape them.
364
+
365
+ const safeTags = [];
366
+ // Normalize: array → object for O(1) lookup; object used as-is
367
+ const htmlAllow = Array.isArray(allow_unsafe_html)
368
+ ? Object.fromEntries(allow_unsafe_html.map(t => [t, 1]))
369
+ : (allow_unsafe_html && typeof allow_unsafe_html === 'object') ? allow_unsafe_html : null;
370
+
371
+ if (htmlAllow) {
372
+ // Pass through HTML comments — browsers render them as nothing
373
+ html = html.replace(/<!--[\s\S]*?-->/g, (match) => {
374
+ const idx = safeTags.length;
375
+ safeTags.push(match);
376
+ return `${PLACEHOLDER_HT}${idx}§`;
377
+ });
378
+ html = html.replace(/<\/?([a-zA-Z][a-zA-Z0-9]*)\b[^>]*\/?>/g, (match, tagName) => {
379
+ if (tagName.toLowerCase() in htmlAllow) {
380
+ const sanitized = sanitizeHtmlTagAttrs(match);
381
+ const idx = safeTags.length;
382
+ safeTags.push(sanitized);
383
+ return `${PLACEHOLDER_HT}${idx}§`;
384
+ }
385
+ // Not whitelisted — leave in text for Phase 2 to escape
386
+ return match;
387
+ });
388
+ }
389
+
314
390
  // ────────────────────────────────────────────────────────────────
315
391
  // Phase 2 — HTML Escaping
316
392
  // ────────────────────────────────────────────────────────────────
317
393
  // All remaining text (everything except code placeholders) is escaped
318
394
  // to prevent XSS. The `allow_unsafe_html` option skips this for
319
395
  // trusted pipelines that intentionally embed raw HTML.
396
+ // For whitelist mode, escaping still runs (only `true` bypasses it).
320
397
 
321
- if (!allow_unsafe_html) {
398
+ if (allow_unsafe_html !== true) {
322
399
  html = escapeHtml(html);
323
400
  }
324
401
 
402
+ // Restore safe HTML tag placeholders after escaping
403
+ if (htmlAllow) {
404
+ safeTags.forEach((tag, i) => {
405
+ html = html.replace(`${PLACEHOLDER_HT}${i}§`, tag);
406
+ });
407
+ }
408
+
325
409
  // ────────────────────────────────────────────────────────────────
326
410
  // Phase 3 — Block Scanning + Inline Formatting + Paragraphs
327
411
  // ────────────────────────────────────────────────────────────────
@@ -363,7 +447,6 @@
363
447
  // Images (must come before links — ![alt](src) vs [text](url))
364
448
  html = html.replace(/!\[([^\]]*)\]\(([^)]+)\)/g, (match, alt, src) => {
365
449
  const sanitizedSrc = sanitizeUrl(src, options.allow_unsafe_urls);
366
- // Bidirectional attributes are only exercised via quikdown_bd bundle.
367
450
  /* istanbul ignore next - bd-only branch */
368
451
  const altAttr = bidirectional && alt ? ` data-qd-alt="${escapeHtml(alt)}"` : '';
369
452
  /* istanbul ignore next - bd-only branch */
@@ -387,8 +470,12 @@
387
470
  return `${prefix}<a${getAttr('a')} href="${sanitizedUrl}" rel="noopener noreferrer">${url}</a>`;
388
471
  });
389
472
 
473
+ // Protect rendered tags so emphasis regexes don't see attribute
474
+ // values — fixes #3 (underscores in URLs interpreted as emphasis).
475
+ const savedTags = [];
476
+ html = html.replace(/<[^>]+>/g, m => { savedTags.push(m); return `%%T${savedTags.length - 1}%%`; });
477
+
390
478
  // Bold, italic, strikethrough
391
- // Order matters: ** before * (so ** isn't consumed as two *s)
392
479
  const inlinePatterns = [
393
480
  [/\*\*(.+?)\*\*/g, 'strong', '**'],
394
481
  [/__(.+?)__/g, 'strong', '__'],
@@ -400,6 +487,9 @@
400
487
  html = html.replace(pattern, `<${tag}${getAttr(tag)}${dataQd(marker)}>$1</${tag}>`);
401
488
  });
402
489
 
490
+ // Restore protected tags
491
+ html = html.replace(/%%T(\d+)%%/g, (_, i) => savedTags[i]);
492
+
403
493
  // ── Step 5: Line breaks + paragraph wrapping ──
404
494
  if (lazy_linefeeds) {
405
495
  // Lazy linefeeds mode: every single \n becomes <br> EXCEPT:
@@ -557,6 +647,14 @@
557
647
  while (i < lines.length) {
558
648
  const line = lines[i];
559
649
 
650
+ // ── Markdown comment (reference-link hack) ──
651
+ // [//]: # (comment) or [//]: # "comment" or [//]: #
652
+ // These produce no output — standard markdown comment convention.
653
+ if (/^\[\/\/\]: #/.test(line)) {
654
+ i++;
655
+ continue;
656
+ }
657
+
560
658
  // ── Heading ──
561
659
  // Count leading '#' characters. Valid heading: 1-6 hashes then a space.
562
660
  // Example: "## Hello World ##" → <h2>Hello World</h2>
@@ -921,6 +1019,7 @@
921
1019
  /** Semantic version (injected at build time) */
922
1020
  quikdown.version = quikdownVersion;
923
1021
 
1022
+
924
1023
  // ════════════════════════════════════════════════════════════════════
925
1024
  // Exports
926
1025
  // ════════════════════════════════════════════════════════════════════
@@ -1,8 +1,8 @@
1
1
  /**
2
2
  * quikdown_bd - Bidirectional Markdown Parser
3
- * @version 1.2.9
3
+ * @version 1.2.11
4
4
  * @license BSD-2-Clause
5
5
  * @copyright DeftIO 2025
6
6
  */
7
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).quikdown_bd=t()}(this,function(){"use strict";function e(e){if(e.length<3)return!1;for(let t=0;t<e.length;t++){const n=e[t];if("-"!==n){if(" "===n||"\t"===n){for(let n=t+1;n<e.length;n++)if(" "!==e[n]&&"\t"!==e[n])return!1;return t>=3}return!1}}return!0}const t="quikdown-",n="§CB",r={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},o={h1:"font-size:2em;font-weight:600;margin:.67em 0;text-align:left",h2:"font-size:1.5em;font-weight:600;margin:.83em 0",h3:"font-size:1.25em;font-weight:600;margin:1em 0",h4:"font-size:1em;font-weight:600;margin:1.33em 0",h5:"font-size:.875em;font-weight:600;margin:1.67em 0",h6:"font-size:.85em;font-weight:600;margin:2em 0",pre:"background:#f4f4f4;padding:10px;border-radius:4px;overflow-x:auto;margin:1em 0",code:"background:#f0f0f0;padding:2px 4px;border-radius:3px;font-family:monospace",blockquote:"border-left:4px solid #ddd;margin-left:0;padding-left:1em",table:"border-collapse:collapse;width:100%;margin:1em 0",th:"border:1px solid #ddd;padding:8px;background-color:#f2f2f2;font-weight:bold;text-align:left",td:"border:1px solid #ddd;padding:8px;text-align:left",hr:"border:none;border-top:1px solid #ddd;margin:1em 0",img:"max-width:100%;height:auto",a:"color:#06c;text-decoration:underline",strong:"font-weight:bold",em:"font-style:italic",del:"text-decoration:line-through",ul:"margin:.5em 0;padding-left:2em",ol:"margin:.5em 0;padding-left:2em",li:"margin:.25em 0","task-item":"list-style:none","task-checkbox":"margin-right:.5em"};function c(c,a={}){if(!c||"string"!=typeof c)return"";const{fence_plugin:i,inline_styles:s=!1,bidirectional:u=!1,lazy_linefeeds:d=!1,allow_unsafe_html:f=!1}=a,$=function(e,n){return function(r,o=""){if(e){let e=n[r];return e||o?(o&&o.includes("text-align")&&e&&e.includes("text-align")&&(e=e.replace(/text-align:[^;]+;?/,"").trim(),e&&!e.endsWith(";")&&(e+=";")),` style="${o?e?`${e}${o}`:o:e}"`):""}{const e=` class="${t}${r}"`;return o?`${e} style="${o}"`:e}}}(s,o);function g(e){return e.replace(/[&<>"']/g,e=>r[e])}const p=u?e=>` data-qd="${g(e)}"`:()=>"";function h(e,t=!1){if(!e)return"";if(t)return e;const n=e.trim(),r=n.toLowerCase(),o=["javascript:","vbscript:","data:"];for(const e of o)if(r.startsWith(e))return"data:"===e&&r.startsWith("data:image/")?n:"#";return n}let m=c;const b=[],q=[];m=m.replace(/^(```|~~~)([^\n]*)\n([\s\S]*?)^\1$/gm,(e,t,r,o)=>{const c=`${n}${b.length}§`,a=r?r.trim():"";return i&&i.render&&"function"==typeof i.render?b.push({lang:a,code:o.trimEnd(),custom:!0,fence:t,hasReverse:!!i.reverse}):b.push({lang:a,code:g(o.trimEnd()),custom:!1,fence:t}),c}),m=m.replace(/`([^`]+)`/g,(e,t)=>{const n=`§IC${q.length}§`;return q.push(g(t)),n}),f||(m=g(m)),m=function(e,t){const n=e.split("\n"),r=[];let o=!1,c=[];for(let e=0;e<n.length;e++){const a=n[e].trim();if(a.includes("|")&&(a.startsWith("|")||/[^\\|]/.test(a)))o||(o=!0,c=[]),c.push(a);else{if(o){const e=l(c,t);e?r.push(e):r.push(...c),o=!1,c=[]}r.push(n[e])}}if(o&&c.length>0){const e=l(c,t);e?r.push(e):r.push(...c)}return r.join("\n")}(m,$),m=function(t,n,r){const o=t.split("\n"),c=[];let a=0;for(;a<o.length;){const t=o[a];let l=0;for(;l<t.length&&l<7&&"#"===t[l];)l++;if(l>=1&&l<=6&&" "===t[l]){const e=t.slice(l+1).replace(/\s*#+\s*$/,""),o="h"+l;c.push(`<${o}${n(o)}${r("#".repeat(l))}>${e}</${o}>`),a++;continue}e(t)?(c.push(`<hr${n("hr")}>`),a++):/^&gt;\s+/.test(t)?(c.push(`<blockquote${n("blockquote")}>${t.replace(/^&gt;\s+/,"")}</blockquote>`),a++):(c.push(t),a++)}let l=c.join("\n");return l=l.replace(/<\/blockquote>\n<blockquote>/g,"\n"),l}(m,$,p),m=function(e,n,r,o){const c=e.split("\n"),a=[],l=[],i=e=>e.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[e])),s=o?e=>` data-qd="${i(e)}"`:()=>"";for(let e=0;e<c.length;e++){const o=c[e],i=o.match(/^(\s*)([*\-+]|\d+\.)\s+(.+)$/);if(i){const[,e,o,c]=i,u=Math.floor(e.length/2),d=/^\d+\./.test(o),f=d?"ol":"ul";let $=c,g="";const p=c.match(/^\[([x ])\]\s+(.*)$/i);if(p&&!d){const[,e,n]=p,o="x"===e.toLowerCase();$=`<input type="checkbox"${r?' style="margin-right:.5em"':` class="${t}task-checkbox"`}${o?" checked":""} disabled> ${n}`,g=r?' style="list-style:none"':` class="${t}task-item"`}for(;l.length>u+1;){const e=l.pop();a.push(`</${e.type}>`)}if(l.length===u)l.push({type:f,level:u}),a.push(`<${f}${n(f)}>`);else if(l.length===u+1){const e=l[l.length-1];e.type!==f&&(a.push(`</${e.type}>`),l.pop(),l.push({type:f,level:u}),a.push(`<${f}${n(f)}>`))}const h=g||n("li");a.push(`<li${h}${s(o)}>${$}</li>`)}else{for(;l.length>0;){const e=l.pop();a.push(`</${e.type}>`)}a.push(o)}}for(;l.length>0;){const e=l.pop();a.push(`</${e.type}>`)}return a.join("\n")}(m,$,s,u),m=m.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(e,t,n)=>{const r=h(n,a.allow_unsafe_urls),o=u&&t?` data-qd-alt="${g(t)}"`:"",c=u?` data-qd-src="${g(n)}"`:"";return`<img${$("img")} src="${r}" alt="${t}"${o}${c}${p("!")}>`}),m=m.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(e,t,n)=>{const r=h(n,a.allow_unsafe_urls),o=/^https?:\/\//i.test(r)?' rel="noopener noreferrer"':"",c=u?` data-qd-text="${g(t)}"`:"";return`<a${$("a")} href="${r}"${o}${c}${p("[")}>${t}</a>`}),m=m.replace(/(^|\s)(https?:\/\/[^\s<]+)/g,(e,t,n)=>{const r=h(n,a.allow_unsafe_urls);return`${t}<a${$("a")} href="${r}" rel="noopener noreferrer">${n}</a>`});if([[/\*\*(.+?)\*\*/g,"strong","**"],[/__(.+?)__/g,"strong","__"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em","*"],[/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g,"em","_"],[/~~(.+?)~~/g,"del","~~"]].forEach(([e,t,n])=>{m=m.replace(e,`<${t}${$(t)}${p(n)}>$1</${t}>`)}),d){const e=[];let t=0;m=m.replace(/<(table|[uo]l)[^>]*>[\s\S]*?<\/\1>/g,n=>(e[t]=n,`§B${t++}§`)),m=m.replace(/\n\n+/g,"§P§").replace(/(<\/(?:h[1-6]|blockquote|pre)>)\n/g,"$1§N§").replace(/(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)\n/g,"$1§N§").replace(/\n(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)/g,"§N§$1").replace(/\n(§B\d+§)/g,"§N§$1").replace(/(§B\d+§)\n/g,"$1§N§").replace(/\n/g,`<br${$("br")}>`).replace(/§N§/g,"\n").replace(/§P§/g,"</p><p>"),e.forEach((e,t)=>m=m.replace(`§B${t}§`,e)),m="<p>"+m+"</p>"}else m=m.replace(/ {2}$/gm,`<br${$("br")}>`),m=m.replace(/\n\n+/g,(e,t)=>m.substring(0,t).match(/<\/(h[1-6]|blockquote|ul|ol|table|pre|hr)>$/)?"<p>":"</p><p>"),m="<p>"+m+"</p>";return[[/<p><\/p>/g,""],[/<p>(<h[1-6][^>]*>)/g,"$1"],[/(<\/h[1-6]>)<\/p>/g,"$1"],[/<p>(<blockquote[^>]*>)/g,"$1"],[/(<\/blockquote>)<\/p>/g,"$1"],[/<p>(<ul[^>]*>|<ol[^>]*>)/g,"$1"],[/(<\/ul>|<\/ol>)<\/p>/g,"$1"],[/<p>(<hr[^>]*>)<\/p>/g,"$1"],[/<p>(<table[^>]*>)/g,"$1"],[/(<\/table>)<\/p>/g,"$1"],[/<p>(<pre[^>]*>)/g,"$1"],[/(<\/pre>)<\/p>/g,"$1"],[new RegExp(`<p>(${n}\\d+§)</p>`,"g"),"$1"]].forEach(([e,t])=>{m=m.replace(e,t)}),m=m.replace(/(<\/(?:h[1-6]|blockquote|ul|ol|table|pre|hr)>)\n([^<])/g,"$1\n<p>$2"),b.forEach((e,t)=>{let r;if(e.custom&&i&&i.render)if(r=i.render(e.code,e.lang),void 0===r){const t=!s&&e.lang?` class="language-${e.lang}"`:"",n=s?$("code"):t,o=u&&e.lang?` data-qd-lang="${g(e.lang)}"`:"",c=u?` data-qd-fence="${g(e.fence)}"`:"";r=`<pre${$("pre")}${c}${o}><code${n}>${g(e.code)}</code></pre>`}else u&&(r=r.replace(/^<(\w+)/,`<$1 data-qd-fence="${g(e.fence)}" data-qd-lang="${g(e.lang)}" data-qd-source="${g(e.code)}"`));else{const t=!s&&e.lang?` class="language-${e.lang}"`:"",n=s?$("code"):t,o=u&&e.lang?` data-qd-lang="${g(e.lang)}"`:"",c=u?` data-qd-fence="${g(e.fence)}"`:"";r=`<pre${$("pre")}${c}${o}><code${n}>${e.code}</code></pre>`}const o=`${n}${t}§`;m=m.replace(o,r)}),q.forEach((e,t)=>{const n=`§IC${t}§`;m=m.replace(n,`<code${$("code")}${p("`")}>${e}</code>`)}),m.trim()}function a(e,t){return[[/\*\*(.+?)\*\*/g,"strong"],[/__(.+?)__/g,"strong"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em"],[/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g,"em"],[/~~(.+?)~~/g,"del"],[/`([^`]+)`/g,"code"]].forEach(([n,r])=>{e=e.replace(n,`<${r}${t(r)}>$1</${r}>`)}),e}function l(e,t){if(e.length<2)return null;let n=-1;for(let t=1;t<e.length;t++)if(/^\|?[\s\-:|]+\|?$/.test(e[t])&&e[t].includes("-")){n=t;break}if(-1===n)return null;const r=e.slice(0,n),o=e.slice(n+1),c=e[n].trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(e=>{const t=e.trim();return t.startsWith(":")&&t.endsWith(":")?"center":t.endsWith(":")?"right":"left"});let l=`<table${t("table")}>\n`;return l+=`<thead${t("thead")}>\n`,r.forEach(e=>{l+=`<tr${t("tr")}>\n`;e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").forEach((e,n)=>{const r=c[n]&&"left"!==c[n]?`text-align:${c[n]}`:"",o=a(e.trim(),t);l+=`<th${t("th",r)}>${o}</th>\n`}),l+="</tr>\n"}),l+="</thead>\n",o.length>0&&(l+=`<tbody${t("tbody")}>\n`,o.forEach(e=>{l+=`<tr${t("tr")}>\n`;e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").forEach((e,n)=>{const r=c[n]&&"left"!==c[n]?`text-align:${c[n]}`:"",o=a(e.trim(),t);l+=`<td${t("td",r)}>${o}</td>\n`}),l+="</tr>\n"}),l+="</tbody>\n"),l+="</table>",l}function i(e,t={}){return c(e,{...t,bidirectional:!0})}return c.emitStyles=function(e="quikdown-",t="light"){const n=o,r={"#f4f4f4":"#2a2a2a","#f0f0f0":"#2a2a2a","#f2f2f2":"#2a2a2a","#ddd":"#3a3a3a","#06c":"#6db3f2",_textColor:"#e0e0e0"},c={_textColor:"#333"};let a="";for(const[o,l]of Object.entries(n)){let n=l;if("dark"===t&&r){for(const[e,t]of Object.entries(r))e.startsWith("_")||(n=n.replaceAll(e,t));["h1","h2","h3","h4","h5","h6","td","li","blockquote"].includes(o)&&(n+=`;color:${r._textColor}`)}else if("light"===t&&c){["h1","h2","h3","h4","h5","h6","td","li","blockquote"].includes(o)&&(n+=`;color:${c._textColor}`)}a+=`.${e}${o} { ${n} }\n`}return a},c.configure=function(e){return function(t){return c(t,e)}},c.version="1.2.9","undefined"!=typeof module&&module.exports&&(module.exports=c),"undefined"!=typeof window&&(window.quikdown=c),Object.keys(c).forEach(e=>{"configure"!==e&&(i[e]=c[e])}),i.toMarkdown=function(e,t={}){let n;if("string"==typeof e)n=document.createElement("div"),n.innerHTML=e;else{if(!(e instanceof Element))return"";n=e}function r(e,n={}){if(e.nodeType===Node.TEXT_NODE)return e.textContent;if(e.nodeType!==Node.ELEMENT_NODE)return"";const c=e.tagName.toLowerCase(),a=e.getAttribute("data-qd");let l="";for(const t of e.childNodes)l+=r(t,{parentTag:c,...n});switch(c){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":const n=parseInt(c[1]);return`${a||"#".repeat(n)} ${l.trim()}\n\n`;case"strong":case"b":if(!l)return"";const r=a||"**";return`${r}${l}${r}`;case"em":case"i":if(!l)return"";const i=a||"*";return`${i}${l}${i}`;case"del":case"s":case"strike":if(!l)return"";const s=a||"~~";return`${s}${l}${s}`;case"code":if(!l)return"";const u=a||"`";return`${u}${l}${u}`;case"pre":const d=e.getAttribute("data-qd-fence")||a||"```",f=e.getAttribute("data-qd-lang")||"";if(t.fence_plugin&&t.fence_plugin.reverse&&f)try{const n=t.fence_plugin.reverse(e);if(n&&n.content){const e=n.fence||d;return`${e}${n.lang||f}\n${n.content}\n${e}\n\n`}}catch(e){console.warn("Fence reverse handler error:",e)}const $=e.getAttribute("data-qd-source");if($)return`${d}${f}\n${$}\n${d}\n\n`;const g=e.querySelector("code");return`${d}${f}\n${(g?g.textContent:l).trimEnd()}\n${d}\n\n`;case"blockquote":const p=a||">";return l.trim().split("\n").map(e=>`${p} ${e}`).join("\n")+"\n\n";case"hr":return`${a||"---"}\n\n`;case"br":return`${a||" "}\n`;case"a":const h=e.getAttribute("data-qd-text")||l.trim(),m=e.getAttribute("href")||"";return h!==m||a?`[${h}](${m})`:`<${m}>`;case"img":return`${a||"!"}[${e.getAttribute("data-qd-alt")||e.getAttribute("alt")||""}](${e.getAttribute("data-qd-src")||e.getAttribute("src")||""})`;case"ul":case"ol":return o(e,"ol"===c)+"\n";case"li":case"span":default:return l;case"table":return function(e){let t="";const n=e.getAttribute("data-qd-align"),r=n?n.split(","):[],o=e.querySelector("thead");if(o){const e=o.querySelector("tr");if(e){const n=[];for(const t of e.querySelectorAll("th"))n.push(t.textContent.trim());t+="| "+n.join(" | ")+" |\n";t+="| "+n.map((e,t)=>{const n=r[t]||"left";return"center"===n?":---:":"right"===n?"---:":"---"}).join(" | ")+" |\n"}}const c=e.querySelector("tbody");if(c)for(const e of c.querySelectorAll("tr")){const n=[];for(const t of e.querySelectorAll("td"))n.push(t.textContent.trim());n.length>0&&(t+="| "+n.join(" | ")+" |\n")}return t.trim()}(e)+"\n\n";case"p":if(l.trim()){const e=l.split("\n");let t=l.trim();if(e.length>1){let n=0;for(let t=e.length-1;t>=0&&""===e[t].trim();t--)n++;if(n>0)return t+="\n ",t+"\n"}return t+"\n\n"}return"";case"div":const b=e.getAttribute("data-qd-lang"),q=e.getAttribute("data-qd-fence");if(b&&t.fence_plugin&&t.fence_plugin.reverse)try{const n=t.fence_plugin.reverse(e);if(n&&n.content){const e=n.fence||q||"```";return`${e}${n.lang||b}\n${n.content}\n${e}\n\n`}}catch(e){console.warn("Fence reverse handler error:",e)}const x=e.getAttribute("data-qd-source");if(x&&q)return`${q}${b||""}\n${x}\n${q}\n\n`;if(e.classList&&e.classList.contains("mermaid-container")){const t=e.getAttribute("data-qd-fence")||"```",n=e.getAttribute("data-qd-lang")||"mermaid",r=e.getAttribute("data-qd-source");if(r){const e=document.createElement("textarea");e.innerHTML=r;return`${t}${n}\n${e.value}\n${t}\n\n`}const o=e.querySelector("pre.mermaid");if(o){const e=o.getAttribute("data-qd-source");if(e){const r=document.createElement("textarea");r.innerHTML=e;return`${t}${n}\n${r.value}\n${t}\n\n`}}const c=e.querySelector(".mermaid-source");if(c){const e=document.createElement("div");e.innerHTML=c.innerHTML;return`${t}${n}\n${e.textContent}\n${t}\n\n`}const a=e.querySelector(".mermaid");if(a&&a.textContent.includes("graph"))return`${t}${n}\n${a.textContent.trim()}\n${t}\n\n`}if(e.classList&&e.classList.contains("mermaid")){const t=e.getAttribute("data-qd-fence")||"```";return`${t}${e.getAttribute("data-qd-lang")||"mermaid"}\n${e.textContent.trim()}\n${t}\n\n`}return l}}function o(e,t,n=0){let c="",a=1;const l=" ".repeat(n);for(const i of e.children){if("LI"!==i.tagName)continue;let e=i.getAttribute("data-qd")||(t?`${a}.`:"-");const s=i.querySelector('input[type="checkbox"]');if(s){const t=s.checked?"x":" ";e="-";let n="";for(const e of i.childNodes)e.nodeType===Node.TEXT_NODE?n+=e.textContent:e.tagName&&"INPUT"!==e.tagName&&(n+=r(e));c+=`${l}${e} [${t}] ${n.trim()}\n`}else{let t="";for(const e of i.childNodes)"UL"===e.tagName||"OL"===e.tagName?t+=o(e,"OL"===e.tagName,n+1):t+=r(e);c+=`${l}${e} ${t.trim()}\n`}a++}return c}let c=r(n);return c=c.replace(/\n{3,}/g,"\n\n"),c=c.trim(),c},i.configure=function(e){const t=c.configure({...e,bidirectional:!0});return function(e){return t(e)}},"undefined"!=typeof module&&module.exports&&(module.exports=i),"undefined"!=typeof window&&(window.quikdown_bd=i),i});
7
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).quikdown_bd=t()}(this,function(){"use strict";function e(e){if(e.length<3)return!1;for(let t=0;t<e.length;t++){const n=e[t];if("-"!==n){if(" "===n||"\t"===n){for(let n=t+1;n<e.length;n++)if(" "!==e[n]&&"\t"!==e[n])return!1;return t>=3}return!1}}return!0}const t="quikdown-",n="§CB",r="§HT",o={href:1,src:1,action:1,formaction:1},c={"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"},a={h1:"font-size:2em;font-weight:600;margin:.67em 0;text-align:left",h2:"font-size:1.5em;font-weight:600;margin:.83em 0",h3:"font-size:1.25em;font-weight:600;margin:1em 0",h4:"font-size:1em;font-weight:600;margin:1.33em 0",h5:"font-size:.875em;font-weight:600;margin:1.67em 0",h6:"font-size:.85em;font-weight:600;margin:2em 0",pre:"background:#f4f4f4;padding:10px;border-radius:4px;overflow-x:auto;margin:1em 0",code:"background:#f0f0f0;padding:2px 4px;border-radius:3px;font-family:monospace",blockquote:"border-left:4px solid #ddd;margin-left:0;padding-left:1em",table:"border-collapse:collapse;width:100%;margin:1em 0",th:"border:1px solid #ddd;padding:8px;background-color:#f2f2f2;font-weight:bold;text-align:left",td:"border:1px solid #ddd;padding:8px;text-align:left",hr:"border:none;border-top:1px solid #ddd;margin:1em 0",img:"max-width:100%;height:auto",a:"color:#06c;text-decoration:underline",strong:"font-weight:bold",em:"font-style:italic",del:"text-decoration:line-through",ul:"margin:.5em 0;padding-left:2em",ol:"margin:.5em 0;padding-left:2em",li:"margin:.25em 0","task-item":"list-style:none","task-checkbox":"margin-right:.5em"};function l(l,i={}){if(!l||"string"!=typeof l)return"";const{fence_plugin:u,inline_styles:d=!1,bidirectional:f=!1,lazy_linefeeds:$=!1,allow_unsafe_html:p=!1}=i,g=function(e,n){return function(r,o=""){if(e){let e=n[r];return e||o?(o&&o.includes("text-align")&&e&&e.includes("text-align")&&(e=e.replace(/text-align:[^;]+;?/,"").trim(),e&&!e.endsWith(";")&&(e+=";")),` style="${o?e?`${e}${o}`:o:e}"`):""}{const e=` class="${t}${r}"`;return o?`${e} style="${o}"`:e}}}(d,a);function h(e){return e.replace(/[&<>"']/g,e=>c[e])}const m=f?e=>` data-qd="${h(e)}"`:()=>"";function b(e,t=!1){if(!e)return"";if(t)return e;const n=e.trim(),r=n.toLowerCase(),o=["javascript:","vbscript:","data:"];for(const e of o)if(r.startsWith(e))return"data:"===e&&r.startsWith("data:image/")?n:"#";return n}let q=l;const x=[],y=[];q=q.replace(/^(```|~~~)([^\n]*)\n([\s\S]*?)^\1$/gm,(e,t,r,o)=>{const c=`${n}${x.length}§`,a=r?r.trim():"";return u&&u.render&&"function"==typeof u.render?x.push({lang:a,code:o.trimEnd(),custom:!0,fence:t,hasReverse:!!u.reverse}):x.push({lang:a,code:h(o.trimEnd()),custom:!1,fence:t}),c}),q=q.replace(/`([^`]+)`/g,(e,t)=>{const n=`§IC${y.length}§`;return y.push(h(t)),n});const _=[],w=Array.isArray(p)?Object.fromEntries(p.map(e=>[e,1])):p&&"object"==typeof p?p:null;w&&(q=q.replace(/<!--[\s\S]*?-->/g,e=>{const t=_.length;return _.push(e),`${r}${t}§`}),q=q.replace(/<\/?([a-zA-Z][a-zA-Z0-9]*)\b[^>]*\/?>/g,(e,t)=>{if(t.toLowerCase()in w){const t=function(e){if(!/\s/.test(e.replace(/<\/?[a-zA-Z][a-zA-Z0-9]*/,"").replace(/\/?>$/,"")))return e;const t=e.match(/^(<\/?[a-zA-Z][a-zA-Z0-9]*)([\s\S]*?)(\/?>)$/);if(!t)return e;const[,n,r,c]=t,a=/([a-zA-Z_][\w\-.:]*)(?:\s*=\s*(?:"([^"]*)"|'([^']*)'|(\S+)))?/g,l=[];let i;for(;null!==(i=a.exec(r));){const e=i[1],t=void 0!==i[2]?i[2]:void 0!==i[3]?i[3]:i[4];if(!/^on/i.test(e))if(void 0===t)l.push(e);else{let n=t;e.toLowerCase()in o&&(n=b(t)),l.push(`${e}="${n}"`)}}return n+(l.length?" "+l.join(" "):"")+c}(e),n=_.length;return _.push(t),`${r}${n}§`}return e})),!0!==p&&(q=h(q)),w&&_.forEach((e,t)=>{q=q.replace(`${r}${t}§`,e)}),q=function(e,t){const n=e.split("\n"),r=[];let o=!1,c=[];for(let e=0;e<n.length;e++){const a=n[e].trim();if(a.includes("|")&&(a.startsWith("|")||/[^\\|]/.test(a)))o||(o=!0,c=[]),c.push(a);else{if(o){const e=s(c,t);e?r.push(e):r.push(...c),o=!1,c=[]}r.push(n[e])}}if(o&&c.length>0){const e=s(c,t);e?r.push(e):r.push(...c)}return r.join("\n")}(q,g),q=function(t,n,r){const o=t.split("\n"),c=[];let a=0;for(;a<o.length;){const t=o[a];if(/^\[\/\/\]: #/.test(t)){a++;continue}let l=0;for(;l<t.length&&l<7&&"#"===t[l];)l++;if(l>=1&&l<=6&&" "===t[l]){const e=t.slice(l+1).replace(/\s*#+\s*$/,""),o="h"+l;c.push(`<${o}${n(o)}${r("#".repeat(l))}>${e}</${o}>`),a++;continue}e(t)?(c.push(`<hr${n("hr")}>`),a++):/^&gt;\s+/.test(t)?(c.push(`<blockquote${n("blockquote")}>${t.replace(/^&gt;\s+/,"")}</blockquote>`),a++):(c.push(t),a++)}let l=c.join("\n");return l=l.replace(/<\/blockquote>\n<blockquote>/g,"\n"),l}(q,g,m),q=function(e,n,r,o){const c=e.split("\n"),a=[],l=[],i=e=>e.replace(/[&<>"']/g,e=>({"&":"&amp;","<":"&lt;",">":"&gt;",'"':"&quot;","'":"&#39;"}[e])),s=o?e=>` data-qd="${i(e)}"`:()=>"";for(let e=0;e<c.length;e++){const o=c[e],i=o.match(/^(\s*)([*\-+]|\d+\.)\s+(.+)$/);if(i){const[,e,o,c]=i,u=Math.floor(e.length/2),d=/^\d+\./.test(o),f=d?"ol":"ul";let $=c,p="";const g=c.match(/^\[([x ])\]\s+(.*)$/i);if(g&&!d){const[,e,n]=g,o="x"===e.toLowerCase();$=`<input type="checkbox"${r?' style="margin-right:.5em"':` class="${t}task-checkbox"`}${o?" checked":""} disabled> ${n}`,p=r?' style="list-style:none"':` class="${t}task-item"`}for(;l.length>u+1;){const e=l.pop();a.push(`</${e.type}>`)}if(l.length===u)l.push({type:f,level:u}),a.push(`<${f}${n(f)}>`);else if(l.length===u+1){const e=l[l.length-1];e.type!==f&&(a.push(`</${e.type}>`),l.pop(),l.push({type:f,level:u}),a.push(`<${f}${n(f)}>`))}const h=p||n("li");a.push(`<li${h}${s(o)}>${$}</li>`)}else{for(;l.length>0;){const e=l.pop();a.push(`</${e.type}>`)}a.push(o)}}for(;l.length>0;){const e=l.pop();a.push(`</${e.type}>`)}return a.join("\n")}(q,g,d,f),q=q.replace(/!\[([^\]]*)\]\(([^)]+)\)/g,(e,t,n)=>{const r=b(n,i.allow_unsafe_urls),o=f&&t?` data-qd-alt="${h(t)}"`:"",c=f?` data-qd-src="${h(n)}"`:"";return`<img${g("img")} src="${r}" alt="${t}"${o}${c}${m("!")}>`}),q=q.replace(/\[([^\]]+)\]\(([^)]+)\)/g,(e,t,n)=>{const r=b(n,i.allow_unsafe_urls),o=/^https?:\/\//i.test(r)?' rel="noopener noreferrer"':"",c=f?` data-qd-text="${h(t)}"`:"";return`<a${g("a")} href="${r}"${o}${c}${m("[")}>${t}</a>`}),q=q.replace(/(^|\s)(https?:\/\/[^\s<]+)/g,(e,t,n)=>{const r=b(n,i.allow_unsafe_urls);return`${t}<a${g("a")} href="${r}" rel="noopener noreferrer">${n}</a>`});const k=[];q=q.replace(/<[^>]+>/g,e=>(k.push(e),`%%T${k.length-1}%%`));if([[/\*\*(.+?)\*\*/g,"strong","**"],[/__(.+?)__/g,"strong","__"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em","*"],[/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g,"em","_"],[/~~(.+?)~~/g,"del","~~"]].forEach(([e,t,n])=>{q=q.replace(e,`<${t}${g(t)}${m(n)}>$1</${t}>`)}),q=q.replace(/%%T(\d+)%%/g,(e,t)=>k[t]),$){const e=[];let t=0;q=q.replace(/<(table|[uo]l)[^>]*>[\s\S]*?<\/\1>/g,n=>(e[t]=n,`§B${t++}§`)),q=q.replace(/\n\n+/g,"§P§").replace(/(<\/(?:h[1-6]|blockquote|pre)>)\n/g,"$1§N§").replace(/(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)\n/g,"$1§N§").replace(/\n(<(?:h[1-6]|blockquote|pre|hr)[^>]*>)/g,"§N§$1").replace(/\n(§B\d+§)/g,"§N§$1").replace(/(§B\d+§)\n/g,"$1§N§").replace(/\n/g,`<br${g("br")}>`).replace(/§N§/g,"\n").replace(/§P§/g,"</p><p>"),e.forEach((e,t)=>q=q.replace(`§B${t}§`,e)),q="<p>"+q+"</p>"}else q=q.replace(/ {2}$/gm,`<br${g("br")}>`),q=q.replace(/\n\n+/g,(e,t)=>q.substring(0,t).match(/<\/(h[1-6]|blockquote|ul|ol|table|pre|hr)>$/)?"<p>":"</p><p>"),q="<p>"+q+"</p>";return[[/<p><\/p>/g,""],[/<p>(<h[1-6][^>]*>)/g,"$1"],[/(<\/h[1-6]>)<\/p>/g,"$1"],[/<p>(<blockquote[^>]*>)/g,"$1"],[/(<\/blockquote>)<\/p>/g,"$1"],[/<p>(<ul[^>]*>|<ol[^>]*>)/g,"$1"],[/(<\/ul>|<\/ol>)<\/p>/g,"$1"],[/<p>(<hr[^>]*>)<\/p>/g,"$1"],[/<p>(<table[^>]*>)/g,"$1"],[/(<\/table>)<\/p>/g,"$1"],[/<p>(<pre[^>]*>)/g,"$1"],[/(<\/pre>)<\/p>/g,"$1"],[new RegExp(`<p>(${n}\\d+§)</p>`,"g"),"$1"]].forEach(([e,t])=>{q=q.replace(e,t)}),q=q.replace(/(<\/(?:h[1-6]|blockquote|ul|ol|table|pre|hr)>)\n([^<])/g,"$1\n<p>$2"),x.forEach((e,t)=>{let r;if(e.custom&&u&&u.render)if(r=u.render(e.code,e.lang),void 0===r){const t=!d&&e.lang?` class="language-${e.lang}"`:"",n=d?g("code"):t,o=f&&e.lang?` data-qd-lang="${h(e.lang)}"`:"",c=f?` data-qd-fence="${h(e.fence)}"`:"";r=`<pre${g("pre")}${c}${o}><code${n}>${h(e.code)}</code></pre>`}else f&&(r=r.replace(/^<(\w+)/,`<$1 data-qd-fence="${h(e.fence)}" data-qd-lang="${h(e.lang)}" data-qd-source="${h(e.code)}"`));else{const t=!d&&e.lang?` class="language-${e.lang}"`:"",n=d?g("code"):t,o=f&&e.lang?` data-qd-lang="${h(e.lang)}"`:"",c=f?` data-qd-fence="${h(e.fence)}"`:"";r=`<pre${g("pre")}${c}${o}><code${n}>${e.code}</code></pre>`}const o=`${n}${t}§`;q=q.replace(o,r)}),y.forEach((e,t)=>{const n=`§IC${t}§`;q=q.replace(n,`<code${g("code")}${m("`")}>${e}</code>`)}),q.trim()}function i(e,t){return[[/\*\*(.+?)\*\*/g,"strong"],[/__(.+?)__/g,"strong"],[/(?<!\*)\*(?!\*)(.+?)(?<!\*)\*(?!\*)/g,"em"],[/(?<!_)_(?!_)(.+?)(?<!_)_(?!_)/g,"em"],[/~~(.+?)~~/g,"del"],[/`([^`]+)`/g,"code"]].forEach(([n,r])=>{e=e.replace(n,`<${r}${t(r)}>$1</${r}>`)}),e}function s(e,t){if(e.length<2)return null;let n=-1;for(let t=1;t<e.length;t++)if(/^\|?[\s\-:|]+\|?$/.test(e[t])&&e[t].includes("-")){n=t;break}if(-1===n)return null;const r=e.slice(0,n),o=e.slice(n+1),c=e[n].trim().replace(/^\|/,"").replace(/\|$/,"").split("|").map(e=>{const t=e.trim();return t.startsWith(":")&&t.endsWith(":")?"center":t.endsWith(":")?"right":"left"});let a=`<table${t("table")}>\n`;return a+=`<thead${t("thead")}>\n`,r.forEach(e=>{a+=`<tr${t("tr")}>\n`;e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").forEach((e,n)=>{const r=c[n]&&"left"!==c[n]?`text-align:${c[n]}`:"",o=i(e.trim(),t);a+=`<th${t("th",r)}>${o}</th>\n`}),a+="</tr>\n"}),a+="</thead>\n",o.length>0&&(a+=`<tbody${t("tbody")}>\n`,o.forEach(e=>{a+=`<tr${t("tr")}>\n`;e.trim().replace(/^\|/,"").replace(/\|$/,"").split("|").forEach((e,n)=>{const r=c[n]&&"left"!==c[n]?`text-align:${c[n]}`:"",o=i(e.trim(),t);a+=`<td${t("td",r)}>${o}</td>\n`}),a+="</tr>\n"}),a+="</tbody>\n"),a+="</table>",a}function u(e,t={}){return l(e,{...t,bidirectional:!0})}return l.emitStyles=function(e="quikdown-",t="light"){const n=a,r={"#f4f4f4":"#2a2a2a","#f0f0f0":"#2a2a2a","#f2f2f2":"#2a2a2a","#ddd":"#3a3a3a","#06c":"#6db3f2",_textColor:"#e0e0e0"},o={_textColor:"#333"};let c="";for(const[a,l]of Object.entries(n)){let n=l;if("dark"===t&&r){for(const[e,t]of Object.entries(r))e.startsWith("_")||(n=n.replaceAll(e,t));["h1","h2","h3","h4","h5","h6","td","li","blockquote"].includes(a)&&(n+=`;color:${r._textColor}`)}else if("light"===t&&o){["h1","h2","h3","h4","h5","h6","td","li","blockquote"].includes(a)&&(n+=`;color:${o._textColor}`)}c+=`.${e}${a} { ${n} }\n`}return c},l.configure=function(e){return function(t){return l(t,e)}},l.version="1.2.11","undefined"!=typeof module&&module.exports&&(module.exports=l),"undefined"!=typeof window&&(window.quikdown=l),Object.keys(l).forEach(e=>{"configure"!==e&&(u[e]=l[e])}),u.toMarkdown=function(e,t={}){let n;if("string"==typeof e)n=document.createElement("div"),n.innerHTML=e;else{if(!(e instanceof Element))return"";n=e}function r(e,n={}){if(e.nodeType===Node.TEXT_NODE)return e.textContent;if(e.nodeType!==Node.ELEMENT_NODE)return"";const c=e.tagName.toLowerCase(),a=e.getAttribute("data-qd");let l="";for(const t of e.childNodes)l+=r(t,{parentTag:c,...n});switch(c){case"h1":case"h2":case"h3":case"h4":case"h5":case"h6":const n=parseInt(c[1]);return`${a||"#".repeat(n)} ${l.trim()}\n\n`;case"strong":case"b":if(!l)return"";const r=a||"**";return`${r}${l}${r}`;case"em":case"i":if(!l)return"";const i=a||"*";return`${i}${l}${i}`;case"del":case"s":case"strike":if(!l)return"";const s=a||"~~";return`${s}${l}${s}`;case"code":if(!l)return"";const u=a||"`";return`${u}${l}${u}`;case"pre":const d=e.getAttribute("data-qd-fence")||a||"```",f=e.getAttribute("data-qd-lang")||"";if(t.fence_plugin&&t.fence_plugin.reverse&&f)try{const n=t.fence_plugin.reverse(e);if(n&&n.content){const e=n.fence||d;return`${e}${n.lang||f}\n${n.content}\n${e}\n\n`}}catch(e){console.warn("Fence reverse handler error:",e)}const $=e.getAttribute("data-qd-source");if($)return`${d}${f}\n${$}\n${d}\n\n`;const p=e.querySelector("code");return`${d}${f}\n${(p?p.textContent:l).trimEnd()}\n${d}\n\n`;case"blockquote":const g=a||">";return l.trim().split("\n").map(e=>`${g} ${e}`).join("\n")+"\n\n";case"hr":return`${a||"---"}\n\n`;case"br":return`${a||" "}\n`;case"a":const h=e.getAttribute("data-qd-text")||l.trim(),m=e.getAttribute("href")||"";return h!==m||a?`[${h}](${m})`:`<${m}>`;case"img":return`${a||"!"}[${e.getAttribute("data-qd-alt")||e.getAttribute("alt")||""}](${e.getAttribute("data-qd-src")||e.getAttribute("src")||""})`;case"ul":case"ol":return o(e,"ol"===c)+"\n";case"li":case"span":default:return l;case"table":return function(e){let t="";const n=e.getAttribute("data-qd-align"),r=n?n.split(","):[],o=e.querySelector("thead");if(o){const e=o.querySelector("tr");if(e){const n=[];for(const t of e.querySelectorAll("th"))n.push(t.textContent.trim());t+="| "+n.join(" | ")+" |\n";t+="| "+n.map((e,t)=>{const n=r[t]||"left";return"center"===n?":---:":"right"===n?"---:":"---"}).join(" | ")+" |\n"}}const c=e.querySelector("tbody");if(c)for(const e of c.querySelectorAll("tr")){const n=[];for(const t of e.querySelectorAll("td"))n.push(t.textContent.trim());n.length>0&&(t+="| "+n.join(" | ")+" |\n")}return t.trim()}(e)+"\n\n";case"p":if(l.trim()){const e=l.split("\n");let t=l.trim();if(e.length>1){let n=0;for(let t=e.length-1;t>=0&&""===e[t].trim();t--)n++;if(n>0)return t+="\n ",t+"\n"}return t+"\n\n"}return"";case"div":const b=e.getAttribute("data-qd-lang"),q=e.getAttribute("data-qd-fence");if(b&&t.fence_plugin&&t.fence_plugin.reverse)try{const n=t.fence_plugin.reverse(e);if(n&&n.content){const e=n.fence||q||"```";return`${e}${n.lang||b}\n${n.content}\n${e}\n\n`}}catch(e){console.warn("Fence reverse handler error:",e)}const x=e.getAttribute("data-qd-source");if(x&&q)return`${q}${b||""}\n${x}\n${q}\n\n`;if(e.classList&&e.classList.contains("mermaid-container")){const t=e.getAttribute("data-qd-fence")||"```",n=e.getAttribute("data-qd-lang")||"mermaid",r=e.getAttribute("data-qd-source");if(r){const e=document.createElement("textarea");e.innerHTML=r;return`${t}${n}\n${e.value}\n${t}\n\n`}const o=e.querySelector("pre.mermaid");if(o){const e=o.getAttribute("data-qd-source");if(e){const r=document.createElement("textarea");r.innerHTML=e;return`${t}${n}\n${r.value}\n${t}\n\n`}}const c=e.querySelector(".mermaid-source");if(c){const e=document.createElement("div");e.innerHTML=c.innerHTML;return`${t}${n}\n${e.textContent}\n${t}\n\n`}const a=e.querySelector(".mermaid");if(a&&a.textContent.includes("graph"))return`${t}${n}\n${a.textContent.trim()}\n${t}\n\n`}if(e.classList&&e.classList.contains("mermaid")){const t=e.getAttribute("data-qd-fence")||"```";return`${t}${e.getAttribute("data-qd-lang")||"mermaid"}\n${e.textContent.trim()}\n${t}\n\n`}return l}}function o(e,t,n=0){let c="",a=1;const l=" ".repeat(n);for(const i of e.children){if("LI"!==i.tagName)continue;let e=i.getAttribute("data-qd")||(t?`${a}.`:"-");const s=i.querySelector('input[type="checkbox"]');if(s){const t=s.checked?"x":" ";e="-";let n="";for(const e of i.childNodes)e.nodeType===Node.TEXT_NODE?n+=e.textContent:e.tagName&&"INPUT"!==e.tagName&&(n+=r(e));c+=`${l}${e} [${t}] ${n.trim()}\n`}else{let t="";for(const e of i.childNodes)"UL"===e.tagName||"OL"===e.tagName?t+=o(e,"OL"===e.tagName,n+1):t+=r(e);c+=`${l}${e} ${t.trim()}\n`}a++}return c}let c=r(n);return c=c.replace(/\n{3,}/g,"\n\n"),c=c.trim(),c},u.configure=function(e){const t=l.configure({...e,bidirectional:!0});return function(e){return t(e)}},"undefined"!=typeof module&&module.exports&&(module.exports=u),"undefined"!=typeof window&&(window.quikdown_bd=u),u});
8
8
  //# sourceMappingURL=quikdown_bd.umd.min.js.map
Binary file