orz-markdown 1.0.0

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 (94) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +132 -0
  3. package/dist/index.d.ts +18 -0
  4. package/dist/index.d.ts.map +1 -0
  5. package/dist/index.js +159 -0
  6. package/dist/index.js.map +1 -0
  7. package/dist/plugins/attrs.d.ts +3 -0
  8. package/dist/plugins/attrs.d.ts.map +1 -0
  9. package/dist/plugins/attrs.js +60 -0
  10. package/dist/plugins/attrs.js.map +1 -0
  11. package/dist/plugins/emoji.d.ts +2 -0
  12. package/dist/plugins/emoji.d.ts.map +1 -0
  13. package/dist/plugins/emoji.js +51 -0
  14. package/dist/plugins/emoji.js.map +1 -0
  15. package/dist/plugins/markdown-include.d.ts +3 -0
  16. package/dist/plugins/markdown-include.d.ts.map +1 -0
  17. package/dist/plugins/markdown-include.js +44 -0
  18. package/dist/plugins/markdown-include.js.map +1 -0
  19. package/dist/plugins/mermaid.d.ts +2 -0
  20. package/dist/plugins/mermaid.d.ts.map +1 -0
  21. package/dist/plugins/mermaid.js +18 -0
  22. package/dist/plugins/mermaid.js.map +1 -0
  23. package/dist/plugins/nyml.d.ts +2 -0
  24. package/dist/plugins/nyml.d.ts.map +1 -0
  25. package/dist/plugins/nyml.js +21 -0
  26. package/dist/plugins/nyml.js.map +1 -0
  27. package/dist/plugins/nyml_parser.d.ts +32 -0
  28. package/dist/plugins/nyml_parser.d.ts.map +1 -0
  29. package/dist/plugins/nyml_parser.js +236 -0
  30. package/dist/plugins/nyml_parser.js.map +1 -0
  31. package/dist/plugins/qrcode.d.ts +2 -0
  32. package/dist/plugins/qrcode.d.ts.map +1 -0
  33. package/dist/plugins/qrcode.js +21 -0
  34. package/dist/plugins/qrcode.js.map +1 -0
  35. package/dist/plugins/smiles.d.ts +2 -0
  36. package/dist/plugins/smiles.d.ts.map +1 -0
  37. package/dist/plugins/smiles.js +19 -0
  38. package/dist/plugins/smiles.js.map +1 -0
  39. package/dist/plugins/space.d.ts +2 -0
  40. package/dist/plugins/space.d.ts.map +1 -0
  41. package/dist/plugins/space.js +15 -0
  42. package/dist/plugins/space.js.map +1 -0
  43. package/dist/plugins/span.d.ts +3 -0
  44. package/dist/plugins/span.d.ts.map +1 -0
  45. package/dist/plugins/span.js +18 -0
  46. package/dist/plugins/span.js.map +1 -0
  47. package/dist/plugins/test.d.ts +2 -0
  48. package/dist/plugins/test.d.ts.map +1 -0
  49. package/dist/plugins/test.js +14 -0
  50. package/dist/plugins/test.js.map +1 -0
  51. package/dist/plugins/toc.d.ts +3 -0
  52. package/dist/plugins/toc.d.ts.map +1 -0
  53. package/dist/plugins/toc.js +62 -0
  54. package/dist/plugins/toc.js.map +1 -0
  55. package/dist/plugins/yaml.d.ts +2 -0
  56. package/dist/plugins/yaml.d.ts.map +1 -0
  57. package/dist/plugins/yaml.js +12 -0
  58. package/dist/plugins/yaml.js.map +1 -0
  59. package/dist/plugins/youtube.d.ts +2 -0
  60. package/dist/plugins/youtube.d.ts.map +1 -0
  61. package/dist/plugins/youtube.js +19 -0
  62. package/dist/plugins/youtube.js.map +1 -0
  63. package/dist/prepare-sources.d.ts +10 -0
  64. package/dist/prepare-sources.d.ts.map +1 -0
  65. package/dist/prepare-sources.js +31 -0
  66. package/dist/prepare-sources.js.map +1 -0
  67. package/dist/registry.d.ts +10 -0
  68. package/dist/registry.d.ts.map +1 -0
  69. package/dist/registry.js +24 -0
  70. package/dist/registry.js.map +1 -0
  71. package/dist/rules/block-dispatcher.d.ts +9 -0
  72. package/dist/rules/block-dispatcher.d.ts.map +1 -0
  73. package/dist/rules/block-dispatcher.js +108 -0
  74. package/dist/rules/block-dispatcher.js.map +1 -0
  75. package/dist/rules/inline-dispatcher.d.ts +9 -0
  76. package/dist/rules/inline-dispatcher.d.ts.map +1 -0
  77. package/dist/rules/inline-dispatcher.js +62 -0
  78. package/dist/rules/inline-dispatcher.js.map +1 -0
  79. package/dist/runtime.d.ts +3 -0
  80. package/dist/runtime.d.ts.map +1 -0
  81. package/dist/runtime.js +128 -0
  82. package/dist/runtime.js.map +1 -0
  83. package/package.json +70 -0
  84. package/themes/beige-decent-1.css +559 -0
  85. package/themes/beige-decent-2.css +578 -0
  86. package/themes/common.css +178 -0
  87. package/themes/dark-elegant-1.css +729 -0
  88. package/themes/dark-elegant-2.css +1376 -0
  89. package/themes/light-academic-1.css +541 -0
  90. package/themes/light-academic-2.css +462 -0
  91. package/themes/light-neat-1.css +1244 -0
  92. package/themes/light-neat-2.css +1185 -0
  93. package/themes/light-playful-1.css +493 -0
  94. package/themes/light-playful-2.css +494 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":";;AAQA,4BAIC;AAED,4BAGC;AAED,8BAGC;AAED,sCAEC;AApBD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAA4B,CAAC;AAErD,SAAgB,QAAQ,CAAC,GAAqB;IAC5C,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;QAChC,QAAQ,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC;AACnD,CAAC;AAED,SAAgB,SAAS,CAAC,IAAY;IACpC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAC/B,OAAO,GAAG,KAAK,SAAS,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC;AACpD,CAAC;AAED,SAAgB,aAAa,CAAC,IAAY;IACxC,OAAO,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC5B,CAAC"}
@@ -0,0 +1,9 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ type StateBlock = MarkdownIt.StateBlock;
3
+ /**
4
+ * Block dispatcher rule for {{name[args] body}} constructs.
5
+ * Registered after 'blockquote' so it runs before 'paragraph' but after 'fence'/'code_block'.
6
+ */
7
+ export declare function blockDispatcher(state: StateBlock, startLine: number, endLine: number, silent: boolean): boolean;
8
+ export {};
9
+ //# sourceMappingURL=block-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-dispatcher.d.ts","sourceRoot":"","sources":["../../src/rules/block-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAG1C,KAAK,UAAU,GAAG,UAAU,CAAC,UAAU,CAAC;AAExC;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,KAAK,EAAE,UAAU,EACjB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,OAAO,GACd,OAAO,CAyHT"}
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.blockDispatcher = blockDispatcher;
4
+ const registry_js_1 = require("../registry.js");
5
+ /**
6
+ * Block dispatcher rule for {{name[args] body}} constructs.
7
+ * Registered after 'blockquote' so it runs before 'paragraph' but after 'fence'/'code_block'.
8
+ */
9
+ function blockDispatcher(state, startLine, endLine, silent) {
10
+ // Skip if this line is at indented-code-block level
11
+ if (state.sCount[startLine] - state.blkIndent >= 4) {
12
+ return false;
13
+ }
14
+ const src = state.src;
15
+ const pos = state.bMarks[startLine] + state.tShift[startLine];
16
+ const lineMax = state.eMarks[startLine];
17
+ // Must start with {{
18
+ if (pos + 1 >= lineMax || src[pos] !== '{' || src[pos + 1] !== '{') {
19
+ return false;
20
+ }
21
+ // Extract plugin name: alphanumeric + hyphens
22
+ let nameEnd = pos + 2;
23
+ while (nameEnd < lineMax) {
24
+ const ch = src[nameEnd];
25
+ if (!/[a-zA-Z0-9-]/.test(ch))
26
+ break;
27
+ nameEnd++;
28
+ }
29
+ const name = src.slice(pos + 2, nameEnd);
30
+ if (!name || !(0, registry_js_1.hasBlock)(name)) {
31
+ return false;
32
+ }
33
+ // Extract optional [args] — only if '[' immediately follows name (no space)
34
+ let args = null;
35
+ let cursor = nameEnd;
36
+ if (src[cursor] === '[') {
37
+ const argsStart = cursor + 1;
38
+ const bracketEnd = src.indexOf(']', argsStart);
39
+ if (bracketEnd === -1 || bracketEnd > lineMax) {
40
+ return false; // unclosed [
41
+ }
42
+ args = src.slice(argsStart, bracketEnd);
43
+ cursor = bracketEnd + 1;
44
+ }
45
+ // Skip horizontal whitespace before body
46
+ while (cursor < lineMax && (src[cursor] === ' ' || src[cursor] === '\t')) {
47
+ cursor++;
48
+ }
49
+ // Check for closing '}}' on the same line (compact / single-line form)
50
+ const firstLineRest = src.slice(cursor, lineMax);
51
+ const closingOnFirstLine = firstLineRest.indexOf('}}');
52
+ let bodyContent;
53
+ let nextLine;
54
+ if (closingOnFirstLine !== -1) {
55
+ // Single-line form: {{name[args] body}}
56
+ bodyContent = firstLineRest.slice(0, closingOnFirstLine).trim();
57
+ nextLine = startLine + 1;
58
+ }
59
+ else {
60
+ // Multiline form: scan forward across lines for closing '}}'
61
+ let found = false;
62
+ let lastLine = startLine;
63
+ let lastPos = -1;
64
+ for (let line = startLine + 1; line < endLine; line++) {
65
+ const lineStart = state.bMarks[line];
66
+ const lineEnd = state.eMarks[line];
67
+ // A non-empty line with negative indent breaks the block
68
+ if (lineStart < lineEnd &&
69
+ state.tShift[line] < state.blkIndent) {
70
+ break;
71
+ }
72
+ const lineContent = src.slice(lineStart, lineEnd);
73
+ const closingIdx = lineContent.indexOf('}}');
74
+ if (closingIdx !== -1) {
75
+ lastLine = line;
76
+ lastPos = lineStart + closingIdx;
77
+ found = true;
78
+ break;
79
+ }
80
+ }
81
+ if (!found) {
82
+ return false; // unclosed — leave as literal text
83
+ }
84
+ nextLine = lastLine + 1;
85
+ // Body is: everything from cursor (on first line) through closing line, trimmed
86
+ // First-line body part
87
+ const firstLinePart = src.slice(cursor, lineMax);
88
+ // Middle lines
89
+ const middlePart = lastLine > startLine + 1
90
+ ? state.getLines(startLine + 1, lastLine, state.tShift[startLine], true)
91
+ : '';
92
+ // Last-line body part (before the closing }})
93
+ const lastLinePart = src.slice(state.bMarks[lastLine] + state.tShift[lastLine], lastPos);
94
+ bodyContent = (firstLinePart + '\n' + middlePart + lastLinePart).trim();
95
+ }
96
+ if (silent) {
97
+ return true;
98
+ }
99
+ const token = state.push('plugin_block', '', 0);
100
+ token.info = name;
101
+ token.meta = { args };
102
+ token.content = bodyContent;
103
+ token.map = [startLine, nextLine];
104
+ token.block = true;
105
+ state.line = nextLine;
106
+ return true;
107
+ }
108
+ //# sourceMappingURL=block-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"block-dispatcher.js","sourceRoot":"","sources":["../../src/rules/block-dispatcher.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type MarkdownIt from 'markdown-it';
2
+ type StateInline = MarkdownIt.StateInline;
3
+ /**
4
+ * Inline dispatcher rule for {{name[args] body}} constructs.
5
+ * Registered after 'escape' so \{{ is handled by the built-in escape rule.
6
+ */
7
+ export declare function inlineDispatcher(state: StateInline, silent: boolean): boolean;
8
+ export {};
9
+ //# sourceMappingURL=inline-dispatcher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-dispatcher.d.ts","sourceRoot":"","sources":["../../src/rules/inline-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAG1C,KAAK,WAAW,GAAG,UAAU,CAAC,WAAW,CAAC;AAE1C;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,OAAO,GAAG,OAAO,CA+D7E"}
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.inlineDispatcher = inlineDispatcher;
4
+ const registry_js_1 = require("../registry.js");
5
+ /**
6
+ * Inline dispatcher rule for {{name[args] body}} constructs.
7
+ * Registered after 'escape' so \{{ is handled by the built-in escape rule.
8
+ */
9
+ function inlineDispatcher(state, silent) {
10
+ const src = state.src;
11
+ const pos = state.pos;
12
+ const max = state.posMax;
13
+ // Must start with {{
14
+ if (pos + 1 > max || src[pos] !== '{' || src[pos + 1] !== '{') {
15
+ return false;
16
+ }
17
+ // Extract plugin name: alphanumeric + hyphens
18
+ let nameEnd = pos + 2;
19
+ while (nameEnd <= max) {
20
+ const ch = src[nameEnd];
21
+ if (!/[a-zA-Z0-9-]/.test(ch))
22
+ break;
23
+ nameEnd++;
24
+ }
25
+ const name = src.slice(pos + 2, nameEnd);
26
+ if (!name || !(0, registry_js_1.hasInline)(name)) {
27
+ return false;
28
+ }
29
+ // Extract optional [args] — only if '[' immediately follows name (no space)
30
+ let args = null;
31
+ let cursor = nameEnd;
32
+ if (src[cursor] === '[') {
33
+ const argsStart = cursor + 1;
34
+ const bracketEnd = src.indexOf(']', argsStart);
35
+ if (bracketEnd === -1) {
36
+ return false; // unclosed [
37
+ }
38
+ args = src.slice(argsStart, bracketEnd);
39
+ cursor = bracketEnd + 1;
40
+ }
41
+ // Skip horizontal whitespace before body
42
+ while (cursor <= max && (src[cursor] === ' ' || src[cursor] === '\t')) {
43
+ cursor++;
44
+ }
45
+ // Find closing '}}' within the current inline buffer (no line crossing)
46
+ const closingIdx = src.indexOf('}}', cursor);
47
+ if (closingIdx === -1) {
48
+ return false; // no closing — leave as literal text
49
+ }
50
+ const bodyContent = src.slice(cursor, closingIdx).trim();
51
+ // Always advance state.pos (required even in silent mode for skipToken)
52
+ state.pos = closingIdx + 2;
53
+ if (silent) {
54
+ return true;
55
+ }
56
+ const token = state.push('plugin_inline', '', 0);
57
+ token.info = name;
58
+ token.meta = { args };
59
+ token.content = bodyContent;
60
+ return true;
61
+ }
62
+ //# sourceMappingURL=inline-dispatcher.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inline-dispatcher.js","sourceRoot":"","sources":["../../src/rules/inline-dispatcher.ts"],"names":[],"mappings":";;AASA,4CA+DC;AAvED,gDAA2C;AAI3C;;;GAGG;AACH,SAAgB,gBAAgB,CAAC,KAAkB,EAAE,MAAe;IAClE,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,MAAM,GAAG,GAAG,KAAK,CAAC,MAAM,CAAC;IAEzB,qBAAqB;IACrB,IAAI,GAAG,GAAG,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,GAAG,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;QAC9D,OAAO,KAAK,CAAC;IACf,CAAC;IAED,8CAA8C;IAC9C,IAAI,OAAO,GAAG,GAAG,GAAG,CAAC,CAAC;IACtB,OAAO,OAAO,IAAI,GAAG,EAAE,CAAC;QACtB,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC;QACxB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,CAAC;YAAE,MAAM;QACpC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC,EAAE,OAAO,CAAC,CAAC;IAEzC,IAAI,CAAC,IAAI,IAAI,CAAC,IAAA,uBAAS,EAAC,IAAI,CAAC,EAAE,CAAC;QAC9B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,4EAA4E;IAC5E,IAAI,IAAI,GAAkB,IAAI,CAAC;IAC/B,IAAI,MAAM,GAAG,OAAO,CAAC;IAErB,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC;QACxB,MAAM,SAAS,GAAG,MAAM,GAAG,CAAC,CAAC;QAC7B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;QAC/C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;YACtB,OAAO,KAAK,CAAC,CAAC,aAAa;QAC7B,CAAC;QACD,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACxC,MAAM,GAAG,UAAU,GAAG,CAAC,CAAC;IAC1B,CAAC;IAED,yCAAyC;IACzC,OAAO,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC;QACtE,MAAM,EAAE,CAAC;IACX,CAAC;IAED,wEAAwE;IACxE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,UAAU,KAAK,CAAC,CAAC,EAAE,CAAC;QACtB,OAAO,KAAK,CAAC,CAAC,qCAAqC;IACrD,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,IAAI,EAAE,CAAC;IAEzD,wEAAwE;IACxE,KAAK,CAAC,GAAG,GAAG,UAAU,GAAG,CAAC,CAAC;IAE3B,IAAI,MAAM,EAAE,CAAC;QACX,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC;IAClB,KAAK,CAAC,IAAI,GAAG,EAAE,IAAI,EAAE,CAAC;IACtB,KAAK,CAAC,OAAO,GAAG,WAAW,CAAC;IAE5B,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare const browserRuntimeScript: string;
2
+ export declare function getBrowserRuntimeScript(): string;
3
+ //# sourceMappingURL=runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,oBAAoB,QAuHhC,CAAC;AAEF,wBAAgB,uBAAuB,IAAI,MAAM,CAEhD"}
@@ -0,0 +1,128 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.browserRuntimeScript = void 0;
4
+ exports.getBrowserRuntimeScript = getBrowserRuntimeScript;
5
+ exports.browserRuntimeScript = String.raw `
6
+ (function (global) {
7
+ var expandedQr = null;
8
+ var expandedSourceQr = null;
9
+
10
+ function collapseQr() {
11
+ if (!expandedQr) return;
12
+
13
+ if (expandedSourceQr) {
14
+ expandedSourceQr.classList.remove('is-expanded');
15
+ expandedSourceQr.setAttribute('aria-expanded', 'false');
16
+ }
17
+
18
+ if (expandedQr.parentNode) {
19
+ expandedQr.parentNode.removeChild(expandedQr);
20
+ }
21
+
22
+ if (global.document && global.document.body) {
23
+ global.document.body.style.overflow = '';
24
+ }
25
+ expandedQr = null;
26
+ expandedSourceQr = null;
27
+ }
28
+
29
+ function toggleQr(node) {
30
+ if (expandedSourceQr === node) {
31
+ collapseQr();
32
+ return;
33
+ }
34
+
35
+ collapseQr();
36
+ if (!global.document || !global.document.body) {
37
+ return;
38
+ }
39
+
40
+ expandedSourceQr = node;
41
+ expandedSourceQr.classList.add('is-expanded');
42
+ expandedSourceQr.setAttribute('aria-expanded', 'true');
43
+
44
+ expandedQr = node.cloneNode(true);
45
+ expandedQr.classList.add('qrcode-overlay', 'is-expanded');
46
+ expandedQr.setAttribute('aria-hidden', 'true');
47
+ expandedQr.removeAttribute('aria-expanded');
48
+ expandedQr.removeAttribute('tabindex');
49
+ expandedQr.removeAttribute('role');
50
+ expandedQr.addEventListener('click', function (event) {
51
+ event.stopPropagation();
52
+ collapseQr();
53
+ });
54
+
55
+ global.document.body.appendChild(expandedQr);
56
+
57
+ if (global.document && global.document.body) {
58
+ global.document.body.style.overflow = 'hidden';
59
+ }
60
+ }
61
+
62
+ function initQrCodes(root) {
63
+ if (!root || typeof root.querySelectorAll !== 'function') return;
64
+
65
+ Array.prototype.slice.call(root.querySelectorAll('.qrcode')).forEach(function (node) {
66
+ if (node.getAttribute('data-qr-ready') === '1') return;
67
+
68
+ node.setAttribute('data-qr-ready', '1');
69
+ node.addEventListener('click', function (event) {
70
+ event.stopPropagation();
71
+ toggleQr(node);
72
+ });
73
+ node.addEventListener('keydown', function (event) {
74
+ if (event.key === 'Enter' || event.key === ' ') {
75
+ event.preventDefault();
76
+ toggleQr(node);
77
+ }
78
+ if (event.key === 'Escape') {
79
+ collapseQr();
80
+ }
81
+ });
82
+ });
83
+ }
84
+
85
+ function init(root) {
86
+ initQrCodes(root || global.document);
87
+ }
88
+
89
+ function bindGlobalHandlers() {
90
+ if (!global.document || global.__orzMarkdownRuntimeBound) return;
91
+ global.__orzMarkdownRuntimeBound = true;
92
+
93
+ global.document.addEventListener('click', function (event) {
94
+ if (expandedQr && !expandedQr.contains(event.target)) {
95
+ collapseQr();
96
+ }
97
+ });
98
+
99
+ global.document.addEventListener('keydown', function (event) {
100
+ if (event.key === 'Escape') {
101
+ collapseQr();
102
+ }
103
+ });
104
+ }
105
+
106
+ global.OrzMarkdownRuntime = Object.assign({}, global.OrzMarkdownRuntime, {
107
+ init: init,
108
+ initQrCodes: initQrCodes,
109
+ collapseQr: collapseQr,
110
+ });
111
+
112
+ bindGlobalHandlers();
113
+
114
+ if (global.document) {
115
+ if (global.document.readyState === 'loading') {
116
+ global.document.addEventListener('DOMContentLoaded', function () {
117
+ init(global.document);
118
+ }, { once: true });
119
+ } else {
120
+ init(global.document);
121
+ }
122
+ }
123
+ })(typeof globalThis !== 'undefined' ? globalThis : window);
124
+ `;
125
+ function getBrowserRuntimeScript() {
126
+ return exports.browserRuntimeScript;
127
+ }
128
+ //# sourceMappingURL=runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime.js","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":";;;AAyHA,0DAEC;AA3HY,QAAA,oBAAoB,GAAG,MAAM,CAAC,GAAG,CAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuH7C,CAAC;AAEF,SAAgB,uBAAuB;IACrC,OAAO,4BAAoB,CAAC;AAC9B,CAAC"}
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "orz-markdown",
3
+ "version": "1.0.0",
4
+ "description": "Customized markdown-it parser with official and custom plugins",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "exports": {
8
+ ".": "./dist/index.js",
9
+ "./runtime": "./dist/runtime.js",
10
+ "./themes/*": "./themes/*"
11
+ },
12
+ "files": [
13
+ "dist",
14
+ "themes"
15
+ ],
16
+ "scripts": {
17
+ "build": "tsc",
18
+ "test": "vitest run",
19
+ "test:watch": "vitest",
20
+ "render": "tsx scripts/render.ts",
21
+ "prepublishOnly": "npm run build && npm run test"
22
+ },
23
+ "keywords": [
24
+ "markdown",
25
+ "markdown-it",
26
+ "parser",
27
+ "plugin",
28
+ "katex",
29
+ "mermaid",
30
+ "smiles",
31
+ "qrcode",
32
+ "toc",
33
+ "footnote"
34
+ ],
35
+ "author": "Yu Wang <yuwang@orz.how>",
36
+ "license": "MIT",
37
+ "repository": {
38
+ "type": "git",
39
+ "url": "https://github.com/wangyu16/orz-markdown"
40
+ },
41
+ "homepage": "https://github.com/wangyu16/orz-markdown#readme",
42
+ "bugs": "https://github.com/wangyu16/orz-markdown/issues",
43
+ "dependencies": {
44
+ "@traptitech/markdown-it-katex": "^3.6.0",
45
+ "katex": "^0.16.35",
46
+ "markdown-it": "^14.1.1",
47
+ "markdown-it-anchor": "^9.2.0",
48
+ "markdown-it-container": "^4.0.0",
49
+ "markdown-it-footnote": "^4.0.0",
50
+ "markdown-it-imsize": "^2.0.1",
51
+ "markdown-it-ins": "^4.0.0",
52
+ "markdown-it-mark": "^4.0.0",
53
+ "markdown-it-sub": "^2.0.0",
54
+ "markdown-it-sup": "^2.0.0",
55
+ "markdown-it-task-lists": "^2.1.1",
56
+ "node-emoji": "^2.2.0",
57
+ "qrcode-svg": "^1.1.0"
58
+ },
59
+ "devDependencies": {
60
+ "@types/markdown-it": "^14.1.2",
61
+ "@types/markdown-it-anchor": "^7.0.0",
62
+ "@types/markdown-it-container": "^4.0.0",
63
+ "@types/markdown-it-footnote": "^3.0.4",
64
+ "@types/node": "^25.3.5",
65
+ "@types/qrcode-svg": "^1.1.5",
66
+ "tsx": "^4.21.0",
67
+ "typescript": "^5.9.3",
68
+ "vitest": "^4.0.18"
69
+ }
70
+ }