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.
- package/LICENSE +21 -0
- package/README.md +132 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +159 -0
- package/dist/index.js.map +1 -0
- package/dist/plugins/attrs.d.ts +3 -0
- package/dist/plugins/attrs.d.ts.map +1 -0
- package/dist/plugins/attrs.js +60 -0
- package/dist/plugins/attrs.js.map +1 -0
- package/dist/plugins/emoji.d.ts +2 -0
- package/dist/plugins/emoji.d.ts.map +1 -0
- package/dist/plugins/emoji.js +51 -0
- package/dist/plugins/emoji.js.map +1 -0
- package/dist/plugins/markdown-include.d.ts +3 -0
- package/dist/plugins/markdown-include.d.ts.map +1 -0
- package/dist/plugins/markdown-include.js +44 -0
- package/dist/plugins/markdown-include.js.map +1 -0
- package/dist/plugins/mermaid.d.ts +2 -0
- package/dist/plugins/mermaid.d.ts.map +1 -0
- package/dist/plugins/mermaid.js +18 -0
- package/dist/plugins/mermaid.js.map +1 -0
- package/dist/plugins/nyml.d.ts +2 -0
- package/dist/plugins/nyml.d.ts.map +1 -0
- package/dist/plugins/nyml.js +21 -0
- package/dist/plugins/nyml.js.map +1 -0
- package/dist/plugins/nyml_parser.d.ts +32 -0
- package/dist/plugins/nyml_parser.d.ts.map +1 -0
- package/dist/plugins/nyml_parser.js +236 -0
- package/dist/plugins/nyml_parser.js.map +1 -0
- package/dist/plugins/qrcode.d.ts +2 -0
- package/dist/plugins/qrcode.d.ts.map +1 -0
- package/dist/plugins/qrcode.js +21 -0
- package/dist/plugins/qrcode.js.map +1 -0
- package/dist/plugins/smiles.d.ts +2 -0
- package/dist/plugins/smiles.d.ts.map +1 -0
- package/dist/plugins/smiles.js +19 -0
- package/dist/plugins/smiles.js.map +1 -0
- package/dist/plugins/space.d.ts +2 -0
- package/dist/plugins/space.d.ts.map +1 -0
- package/dist/plugins/space.js +15 -0
- package/dist/plugins/space.js.map +1 -0
- package/dist/plugins/span.d.ts +3 -0
- package/dist/plugins/span.d.ts.map +1 -0
- package/dist/plugins/span.js +18 -0
- package/dist/plugins/span.js.map +1 -0
- package/dist/plugins/test.d.ts +2 -0
- package/dist/plugins/test.d.ts.map +1 -0
- package/dist/plugins/test.js +14 -0
- package/dist/plugins/test.js.map +1 -0
- package/dist/plugins/toc.d.ts +3 -0
- package/dist/plugins/toc.d.ts.map +1 -0
- package/dist/plugins/toc.js +62 -0
- package/dist/plugins/toc.js.map +1 -0
- package/dist/plugins/yaml.d.ts +2 -0
- package/dist/plugins/yaml.d.ts.map +1 -0
- package/dist/plugins/yaml.js +12 -0
- package/dist/plugins/yaml.js.map +1 -0
- package/dist/plugins/youtube.d.ts +2 -0
- package/dist/plugins/youtube.d.ts.map +1 -0
- package/dist/plugins/youtube.js +19 -0
- package/dist/plugins/youtube.js.map +1 -0
- package/dist/prepare-sources.d.ts +10 -0
- package/dist/prepare-sources.d.ts.map +1 -0
- package/dist/prepare-sources.js +31 -0
- package/dist/prepare-sources.js.map +1 -0
- package/dist/registry.d.ts +10 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +24 -0
- package/dist/registry.js.map +1 -0
- package/dist/rules/block-dispatcher.d.ts +9 -0
- package/dist/rules/block-dispatcher.d.ts.map +1 -0
- package/dist/rules/block-dispatcher.js +108 -0
- package/dist/rules/block-dispatcher.js.map +1 -0
- package/dist/rules/inline-dispatcher.d.ts +9 -0
- package/dist/rules/inline-dispatcher.d.ts.map +1 -0
- package/dist/rules/inline-dispatcher.js +62 -0
- package/dist/rules/inline-dispatcher.js.map +1 -0
- package/dist/runtime.d.ts +3 -0
- package/dist/runtime.d.ts.map +1 -0
- package/dist/runtime.js +128 -0
- package/dist/runtime.js.map +1 -0
- package/package.json +70 -0
- package/themes/beige-decent-1.css +559 -0
- package/themes/beige-decent-2.css +578 -0
- package/themes/common.css +178 -0
- package/themes/dark-elegant-1.css +729 -0
- package/themes/dark-elegant-2.css +1376 -0
- package/themes/light-academic-1.css +541 -0
- package/themes/light-academic-2.css +462 -0
- package/themes/light-neat-1.css +1244 -0
- package/themes/light-neat-2.css +1185 -0
- package/themes/light-playful-1.css +493 -0
- package/themes/light-playful-2.css +494 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nyml_parser.d.ts","sourceRoot":"","sources":["../../src/plugins/nyml_parser.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,cAAM,UAAW,SAAQ,KAAK;IAC5B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;gBACV,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAE,MAAM,GAAG,IAAW;CAOtF;AA+HD;;;;;GAKG;AACH,iBAAS,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,GAAG,EAAE,CAgExC;AAED;;;;;;GAMG;AACH,iBAAS,eAAe,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE,MAAM,GAAE,MAAU,GAAG,MAAM,CAiChE;AAED,OAAO,EAAE,WAAW,EAAE,eAAe,EAAE,UAAU,EAAE,CAAC"}
|
|
@@ -0,0 +1,236 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* NYML V2 Parser implementation.
|
|
4
|
+
*
|
|
5
|
+
* V2 introduces list-based output where:
|
|
6
|
+
* - Root is always a list of entries
|
|
7
|
+
* - Multi-value fields create nested lists
|
|
8
|
+
* - Mixed content (strings + key/value pairs) is supported
|
|
9
|
+
* - No comments (# is allowed in values)
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ParseError = void 0;
|
|
13
|
+
exports.parseNymlV2 = parseNymlV2;
|
|
14
|
+
exports.serializeNymlV2 = serializeNymlV2;
|
|
15
|
+
class ParseError extends Error {
|
|
16
|
+
constructor(code, message, line, column = null) {
|
|
17
|
+
super(`Line ${line}: ${message}`);
|
|
18
|
+
this.code = code;
|
|
19
|
+
this.line = line;
|
|
20
|
+
this.column = column;
|
|
21
|
+
this.name = "ParseError";
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.ParseError = ParseError;
|
|
25
|
+
/**
|
|
26
|
+
* Count leading spaces in a string.
|
|
27
|
+
* @param {string} s
|
|
28
|
+
* @returns {number}
|
|
29
|
+
*/
|
|
30
|
+
function leadingSpaces(s) {
|
|
31
|
+
let count = 0;
|
|
32
|
+
for (const ch of s) {
|
|
33
|
+
if (ch === " ") {
|
|
34
|
+
count++;
|
|
35
|
+
}
|
|
36
|
+
else {
|
|
37
|
+
break;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return count;
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Parse a stripped line into [key, value] tuple.
|
|
44
|
+
*
|
|
45
|
+
* @param {string} stripped - Line with leading/trailing whitespace removed
|
|
46
|
+
* @returns {[string|null, string|null]} - [key, value] or [null, null] if no colon
|
|
47
|
+
*/
|
|
48
|
+
function parseKeyValue(stripped) {
|
|
49
|
+
if (!stripped) {
|
|
50
|
+
return [null, null];
|
|
51
|
+
}
|
|
52
|
+
// Handle quoted keys
|
|
53
|
+
if (stripped.startsWith('"')) {
|
|
54
|
+
const end = stripped.indexOf('"', 1);
|
|
55
|
+
if (end === -1) {
|
|
56
|
+
// Unmatched quote - treat as plain string
|
|
57
|
+
return [null, null];
|
|
58
|
+
}
|
|
59
|
+
const key = stripped.slice(1, end);
|
|
60
|
+
const rest = stripped.slice(end + 1).trimStart();
|
|
61
|
+
if (!rest.startsWith(":")) {
|
|
62
|
+
// No colon after quoted key - treat as plain string
|
|
63
|
+
return [null, null];
|
|
64
|
+
}
|
|
65
|
+
const value = rest.slice(1).trim();
|
|
66
|
+
return [key, value];
|
|
67
|
+
}
|
|
68
|
+
// Regular key:value
|
|
69
|
+
const idx = stripped.indexOf(":");
|
|
70
|
+
if (idx === -1) {
|
|
71
|
+
return [null, null];
|
|
72
|
+
}
|
|
73
|
+
const key = stripped.slice(0, idx).trim();
|
|
74
|
+
const value = stripped.slice(idx + 1).trim();
|
|
75
|
+
return [key, value];
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Collect multiline string content starting from startIdx + 1.
|
|
79
|
+
*
|
|
80
|
+
* @param {string[]} lines - All lines
|
|
81
|
+
* @param {number} startIdx - Index of the "key: |" line
|
|
82
|
+
* @param {number} baseIndent - Indent of the key line
|
|
83
|
+
* @returns {[string, number]} - [content, nextIndex]
|
|
84
|
+
*/
|
|
85
|
+
function collectMultiline(lines, startIdx, baseIndent) {
|
|
86
|
+
const rawLines = [];
|
|
87
|
+
let i = startIdx + 1;
|
|
88
|
+
while (i < lines.length) {
|
|
89
|
+
const line = lines[i];
|
|
90
|
+
const indent = leadingSpaces(line);
|
|
91
|
+
// Empty lines are included in multiline content
|
|
92
|
+
if (line.trim() === "") {
|
|
93
|
+
rawLines.push("");
|
|
94
|
+
i++;
|
|
95
|
+
continue;
|
|
96
|
+
}
|
|
97
|
+
// Line with less or equal indent ends the block
|
|
98
|
+
if (indent <= baseIndent) {
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
rawLines.push(line);
|
|
102
|
+
i++;
|
|
103
|
+
}
|
|
104
|
+
// Dedent: find minimum indent among non-blank lines
|
|
105
|
+
const nonblank = rawLines.filter((r) => r.trim() !== "");
|
|
106
|
+
let minIndent = 0;
|
|
107
|
+
if (nonblank.length > 0) {
|
|
108
|
+
minIndent = Math.min(...nonblank.map((r) => leadingSpaces(r)));
|
|
109
|
+
}
|
|
110
|
+
// Apply dedent
|
|
111
|
+
const pieces = [];
|
|
112
|
+
for (const r of rawLines) {
|
|
113
|
+
if (r.trim() === "") {
|
|
114
|
+
pieces.push("");
|
|
115
|
+
}
|
|
116
|
+
else {
|
|
117
|
+
pieces.push(r.slice(minIndent));
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
// Collapse multiple trailing blank lines
|
|
121
|
+
while (pieces.length >= 2 &&
|
|
122
|
+
pieces[pieces.length - 1] === "" &&
|
|
123
|
+
pieces[pieces.length - 2] === "") {
|
|
124
|
+
pieces.pop();
|
|
125
|
+
}
|
|
126
|
+
// Build content with trailing newline
|
|
127
|
+
let content;
|
|
128
|
+
if (pieces.length > 0 && pieces[pieces.length - 1] === "") {
|
|
129
|
+
content = pieces.join("\n");
|
|
130
|
+
}
|
|
131
|
+
else {
|
|
132
|
+
content = pieces.length > 0 ? pieces.join("\n") + "\n" : "";
|
|
133
|
+
}
|
|
134
|
+
return [content, i];
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* Parse NYML V2 text into a list structure.
|
|
138
|
+
*
|
|
139
|
+
* @param {string} text - The NYML V2 content to parse
|
|
140
|
+
* @returns {Array} - A list representing the parsed data
|
|
141
|
+
*/
|
|
142
|
+
function parseNymlV2(text) {
|
|
143
|
+
const lines = text.split(/\r?\n/);
|
|
144
|
+
const result = [];
|
|
145
|
+
// Stack of [container, baseIndent]
|
|
146
|
+
const stack = [[result, -1]];
|
|
147
|
+
let i = 0;
|
|
148
|
+
while (i < lines.length) {
|
|
149
|
+
const line = lines[i];
|
|
150
|
+
const stripped = line.trim();
|
|
151
|
+
// Skip empty lines
|
|
152
|
+
if (!stripped) {
|
|
153
|
+
i++;
|
|
154
|
+
continue;
|
|
155
|
+
}
|
|
156
|
+
const indent = leadingSpaces(line);
|
|
157
|
+
// Pop stack to find correct parent based on indent
|
|
158
|
+
while (stack.length > 1 && indent <= stack[stack.length - 1][1]) {
|
|
159
|
+
stack.pop();
|
|
160
|
+
}
|
|
161
|
+
const [parent, parentIndent] = stack[stack.length - 1];
|
|
162
|
+
// Parse the line
|
|
163
|
+
const [key, value] = parseKeyValue(stripped);
|
|
164
|
+
if (key === null) {
|
|
165
|
+
// No colon found - plain string
|
|
166
|
+
if (stack.length > 1) {
|
|
167
|
+
// Inside a multi-value context: add as plain string
|
|
168
|
+
parent.push(stripped);
|
|
169
|
+
}
|
|
170
|
+
// At root level: ignore (Rule 9)
|
|
171
|
+
i++;
|
|
172
|
+
continue;
|
|
173
|
+
}
|
|
174
|
+
if (value === "|") {
|
|
175
|
+
// Multiline string
|
|
176
|
+
const [content, nextIdx] = collectMultiline(lines, i, indent);
|
|
177
|
+
parent.push({ [key]: content });
|
|
178
|
+
i = nextIdx;
|
|
179
|
+
continue;
|
|
180
|
+
}
|
|
181
|
+
if (value === "") {
|
|
182
|
+
// Multi-value field: create a list for children
|
|
183
|
+
const newList = [];
|
|
184
|
+
parent.push({ [key]: newList });
|
|
185
|
+
stack.push([newList, indent]);
|
|
186
|
+
i++;
|
|
187
|
+
continue;
|
|
188
|
+
}
|
|
189
|
+
// Single-line key:value
|
|
190
|
+
parent.push({ [key]: value });
|
|
191
|
+
i++;
|
|
192
|
+
}
|
|
193
|
+
return result;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Serialize a V2 data structure back to NYML format.
|
|
197
|
+
*
|
|
198
|
+
* @param {Array} data - List structure as returned by parseNymlV2()
|
|
199
|
+
* @param {number} indent - Current indentation level (spaces)
|
|
200
|
+
* @returns {string} - NYML formatted string
|
|
201
|
+
*/
|
|
202
|
+
function serializeNymlV2(data, indent = 0) {
|
|
203
|
+
const lines = [];
|
|
204
|
+
const prefix = " ".repeat(indent);
|
|
205
|
+
for (const item of data) {
|
|
206
|
+
if (typeof item === "string") {
|
|
207
|
+
// Plain string in multi-value context
|
|
208
|
+
lines.push(`${prefix}${item}`);
|
|
209
|
+
}
|
|
210
|
+
else if (typeof item === "object" && item !== null) {
|
|
211
|
+
// Should have exactly one key
|
|
212
|
+
for (const [key, value] of Object.entries(item)) {
|
|
213
|
+
// Check if key needs quoting
|
|
214
|
+
const quotedKey = key.includes(":") ? `"${key}"` : key;
|
|
215
|
+
if (Array.isArray(value)) {
|
|
216
|
+
// Multi-value field
|
|
217
|
+
lines.push(`${prefix}${quotedKey}:`);
|
|
218
|
+
lines.push(serializeNymlV2(value, indent + 2));
|
|
219
|
+
}
|
|
220
|
+
else if (typeof value === "string" && value.includes("\n")) {
|
|
221
|
+
// Multiline string
|
|
222
|
+
lines.push(`${prefix}${quotedKey}: |`);
|
|
223
|
+
for (const vline of value.replace(/\n$/, "").split("\n")) {
|
|
224
|
+
lines.push(`${prefix} ${vline}`);
|
|
225
|
+
}
|
|
226
|
+
}
|
|
227
|
+
else {
|
|
228
|
+
// Single-line value
|
|
229
|
+
lines.push(`${prefix}${quotedKey}: ${value}`);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return lines.join("\n");
|
|
235
|
+
}
|
|
236
|
+
//# sourceMappingURL=nyml_parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nyml_parser.js","sourceRoot":"","sources":["../../src/plugins/nyml_parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode.d.ts","sourceRoot":"","sources":["../../src/plugins/qrcode.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const qrcode_svg_1 = __importDefault(require("qrcode-svg"));
|
|
7
|
+
const registry_js_1 = require("../registry.js");
|
|
8
|
+
(0, registry_js_1.register)({
|
|
9
|
+
type: 'inline',
|
|
10
|
+
aliases: ['qr', 'qrcode'],
|
|
11
|
+
render(_args, body, _env) {
|
|
12
|
+
const content = body?.trim();
|
|
13
|
+
if (!content)
|
|
14
|
+
return '';
|
|
15
|
+
const size = 96;
|
|
16
|
+
const rawSvg = new qrcode_svg_1.default({ content, width: size, height: size, padding: 0, color: '#000000', background: '#ffffff' }).svg();
|
|
17
|
+
const svg = rawSvg.replace('<svg ', `<svg viewBox="0 0 ${size} ${size}" preserveAspectRatio="xMidYMid meet" `);
|
|
18
|
+
return `<span class="qrcode" role="button" tabindex="0" aria-label="Expand QR code" aria-expanded="false"><span class="qrcode__icon" aria-hidden="true">⤢</span>${svg}</span>`;
|
|
19
|
+
},
|
|
20
|
+
});
|
|
21
|
+
//# sourceMappingURL=qrcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../src/plugins/qrcode.ts"],"names":[],"mappings":";;;;;AAAA,4DAAgC;AAChC,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,IAAI,EAAE,QAAQ,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QAC7B,IAAI,CAAC,OAAO;YAAE,OAAO,EAAE,CAAC;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC;QAChB,MAAM,MAAM,GAAG,IAAI,oBAAM,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,GAAG,EAAE,CAAC;QAC7H,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CACxB,OAAO,EACP,qBAAqB,IAAI,IAAI,IAAI,wCAAwC,CAC1E,CAAC;QACF,OAAO,2JAA2J,GAAG,SAAS,CAAC;IACjL,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smiles.d.ts","sourceRoot":"","sources":["../../src/plugins/smiles.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_js_1 = require("../registry.js");
|
|
4
|
+
function escapeAttr(str) {
|
|
5
|
+
return str
|
|
6
|
+
.replace(/&/g, '&')
|
|
7
|
+
.replace(/"/g, '"')
|
|
8
|
+
.replace(/</g, '<')
|
|
9
|
+
.replace(/>/g, '>');
|
|
10
|
+
}
|
|
11
|
+
(0, registry_js_1.register)({
|
|
12
|
+
type: 'block',
|
|
13
|
+
aliases: ['smiles', 'sm'],
|
|
14
|
+
render(_args, body, _env) {
|
|
15
|
+
const smiles = body?.trim() ?? '';
|
|
16
|
+
return `<div class="smiles-render">\n <canvas data-smiles="${escapeAttr(smiles)}" width="250" height="180"></canvas>\n</div>\n`;
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=smiles.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"smiles.js","sourceRoot":"","sources":["../../src/plugins/smiles.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,GAAG;SACP,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAC3B,CAAC;AAED,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC;IACzB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAClC,OAAO,uDAAuD,UAAU,CAAC,MAAM,CAAC,gDAAgD,CAAC;IACnI,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.d.ts","sourceRoot":"","sources":["../../src/plugins/space.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_js_1 = require("../registry.js");
|
|
4
|
+
(0, registry_js_1.register)({
|
|
5
|
+
type: 'inline',
|
|
6
|
+
aliases: ['space'],
|
|
7
|
+
render(_args, body, _env) {
|
|
8
|
+
const n = parseFloat(body?.trim() ?? '');
|
|
9
|
+
if (!isFinite(n) || n <= 0) {
|
|
10
|
+
return '';
|
|
11
|
+
}
|
|
12
|
+
return `<span style="display:inline-block;width:${n}rem"></span>`;
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
//# sourceMappingURL=space.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"space.js","sourceRoot":"","sources":["../../src/plugins/space.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,OAAO,CAAC;IAClB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,CAAC,GAAG,UAAU,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,CAAC;QACZ,CAAC;QACD,OAAO,2CAA2C,CAAC,cAAc,CAAC;IACpE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span.d.ts","sourceRoot":"","sources":["../../src/plugins/span.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AAG1C,wBAAgB,YAAY,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CAYjD"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerSpan = registerSpan;
|
|
4
|
+
const registry_js_1 = require("../registry.js");
|
|
5
|
+
function registerSpan(md) {
|
|
6
|
+
(0, registry_js_1.register)({
|
|
7
|
+
type: 'inline',
|
|
8
|
+
aliases: ['span', 'sp'],
|
|
9
|
+
render(args, body, _env) {
|
|
10
|
+
const inner = md.renderInline(body ?? '');
|
|
11
|
+
if (!args) {
|
|
12
|
+
return `<span>${inner}</span>`;
|
|
13
|
+
}
|
|
14
|
+
return `<span class="${args}">${inner}</span>`;
|
|
15
|
+
},
|
|
16
|
+
});
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=span.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"span.js","sourceRoot":"","sources":["../../src/plugins/span.ts"],"names":[],"mappings":";;AAGA,oCAYC;AAdD,gDAA0C;AAE1C,SAAgB,YAAY,CAAC,EAAc;IACzC,IAAA,sBAAQ,EAAC;QACP,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC;QACvB,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI;YACrB,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC;YAC1C,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,SAAS,KAAK,SAAS,CAAC;YACjC,CAAC;YACD,OAAO,gBAAgB,IAAI,KAAK,KAAK,SAAS,CAAC;QACjD,CAAC;KACF,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.d.ts","sourceRoot":"","sources":["../../src/plugins/test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_js_1 = require("../registry.js");
|
|
4
|
+
(0, registry_js_1.register)({
|
|
5
|
+
type: 'block',
|
|
6
|
+
aliases: ['test-block'],
|
|
7
|
+
render: (_args, _body, _env) => '<div class="test-block">TestPluginBlock</div>\n',
|
|
8
|
+
});
|
|
9
|
+
(0, registry_js_1.register)({
|
|
10
|
+
type: 'inline',
|
|
11
|
+
aliases: ['test-inline'],
|
|
12
|
+
render: (_args, _body, _env) => '<span class="test-inline">TestPluginInline</span>',
|
|
13
|
+
});
|
|
14
|
+
//# sourceMappingURL=test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"test.js","sourceRoot":"","sources":["../../src/plugins/test.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,YAAY,CAAC;IACvB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC7B,iDAAiD;CACpD,CAAC,CAAC;AAEH,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,QAAQ;IACd,OAAO,EAAE,CAAC,aAAa,CAAC;IACxB,MAAM,EAAE,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,CAC7B,mDAAmD;CACtD,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toc.d.ts","sourceRoot":"","sources":["../../src/plugins/toc.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,aAAa,CAAC;AA8B1C,wBAAgB,WAAW,CAAC,EAAE,EAAE,UAAU,GAAG,IAAI,CA0ChD"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.registerToc = registerToc;
|
|
4
|
+
const registry_js_1 = require("../registry.js");
|
|
5
|
+
function parseRange(body) {
|
|
6
|
+
if (!body || !body.trim())
|
|
7
|
+
return [1, 3];
|
|
8
|
+
const parts = body.trim().split(',').map(s => parseInt(s.trim(), 10));
|
|
9
|
+
if (parts.length >= 2 && !isNaN(parts[0]) && !isNaN(parts[1])) {
|
|
10
|
+
return [parts[0], parts[1]];
|
|
11
|
+
}
|
|
12
|
+
return [1, 3];
|
|
13
|
+
}
|
|
14
|
+
function buildTocHTML(headings) {
|
|
15
|
+
if (!headings.length)
|
|
16
|
+
return '<ul class="toc-list"></ul>\n';
|
|
17
|
+
let html = '<ul class="toc-list">\n';
|
|
18
|
+
for (const h of headings) {
|
|
19
|
+
const href = h.anchor ? `#${h.anchor}` : '';
|
|
20
|
+
html += `<li style="padding-left:${(h.level - 1) * 1.25}em"><a href="${href}">${h.text}</a></li>\n`;
|
|
21
|
+
}
|
|
22
|
+
html += '</ul>\n';
|
|
23
|
+
return html;
|
|
24
|
+
}
|
|
25
|
+
function registerToc(md) {
|
|
26
|
+
// The render function just returns the pre-built HTML injected by the core rule
|
|
27
|
+
(0, registry_js_1.register)({
|
|
28
|
+
type: 'block',
|
|
29
|
+
aliases: ['toc'],
|
|
30
|
+
render(_args, body, _env) {
|
|
31
|
+
return body ?? '';
|
|
32
|
+
},
|
|
33
|
+
});
|
|
34
|
+
md.core.ruler.push('toc_resolve', (state) => {
|
|
35
|
+
const headings = [];
|
|
36
|
+
const tocTokenIndices = [];
|
|
37
|
+
for (let i = 0; i < state.tokens.length; i++) {
|
|
38
|
+
const token = state.tokens[i];
|
|
39
|
+
if (token.type === 'heading_open') {
|
|
40
|
+
const level = parseInt(token.tag.slice(1), 10);
|
|
41
|
+
const inlineToken = state.tokens[i + 1];
|
|
42
|
+
const text = (inlineToken?.children ?? [])
|
|
43
|
+
.filter((t) => t.type === 'text' || t.type === 'code_inline')
|
|
44
|
+
.map((t) => t.content)
|
|
45
|
+
.join('');
|
|
46
|
+
const anchor = token.attrGet('id') ?? '';
|
|
47
|
+
headings.push({ level, text, anchor });
|
|
48
|
+
}
|
|
49
|
+
if (token.type === 'plugin_block' && token.info === 'toc') {
|
|
50
|
+
tocTokenIndices.push(i);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
state.env.tocHeadings = headings;
|
|
54
|
+
for (const idx of tocTokenIndices) {
|
|
55
|
+
const token = state.tokens[idx];
|
|
56
|
+
const [minLevel, maxLevel] = parseRange(token.content || null);
|
|
57
|
+
const filtered = headings.filter(h => h.level >= minLevel && h.level <= maxLevel);
|
|
58
|
+
token.content = buildTocHTML(filtered);
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=toc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"toc.js","sourceRoot":"","sources":["../../src/plugins/toc.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.d.ts","sourceRoot":"","sources":["../../src/plugins/yaml.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_js_1 = require("../registry.js");
|
|
4
|
+
(0, registry_js_1.register)({
|
|
5
|
+
type: 'block',
|
|
6
|
+
aliases: ['yaml', 'yml'],
|
|
7
|
+
render(_args, body, _env) {
|
|
8
|
+
const content = (body ?? '').replace(/<\/script>/gi, '<\\/script>');
|
|
9
|
+
return `<script type="application/yaml">\n${content}\n</script>\n`;
|
|
10
|
+
},
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=yaml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"yaml.js","sourceRoot":"","sources":["../../src/plugins/yaml.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,MAAM,EAAE,KAAK,CAAC;IACxB,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,OAAO,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;QACpE,OAAO,qCAAqC,OAAO,eAAe,CAAC;IACrE,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.d.ts","sourceRoot":"","sources":["../../src/plugins/youtube.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const registry_js_1 = require("../registry.js");
|
|
4
|
+
(0, registry_js_1.register)({
|
|
5
|
+
type: 'block',
|
|
6
|
+
aliases: ['youtube', 'yt'],
|
|
7
|
+
render(_args, body, _env) {
|
|
8
|
+
const id = body?.trim();
|
|
9
|
+
if (!id)
|
|
10
|
+
return '';
|
|
11
|
+
return (`<div class="youtube-embed">\n` +
|
|
12
|
+
` <iframe src="https://www.youtube.com/embed/${id}"\n` +
|
|
13
|
+
` allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"\n` +
|
|
14
|
+
` referrerpolicy="strict-origin-when-cross-origin"\n` +
|
|
15
|
+
` allowfullscreen></iframe>\n` +
|
|
16
|
+
`</div>\n`);
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
//# sourceMappingURL=youtube.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"youtube.js","sourceRoot":"","sources":["../../src/plugins/youtube.ts"],"names":[],"mappings":";;AAAA,gDAA0C;AAE1C,IAAA,sBAAQ,EAAC;IACP,IAAI,EAAE,OAAO;IACb,OAAO,EAAE,CAAC,SAAS,EAAE,IAAI,CAAC;IAC1B,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,IAAI;QACtB,MAAM,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,EAAE;YAAE,OAAO,EAAE,CAAC;QACnB,OAAO,CACL,+BAA+B;YAC/B,gDAAgD,EAAE,KAAK;YACvD,mHAAmH;YACnH,wDAAwD;YACxD,iCAAiC;YACjC,UAAU,CACX,CAAC;IACJ,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pre-processes a markdown source string by fetching any URL-based markdown includes.
|
|
3
|
+
*
|
|
4
|
+
* Scans for `{{markdown https://...}}` or `{{md-include https://...}}` patterns,
|
|
5
|
+
* fetches each URL, and replaces the directive with the fetched markdown content.
|
|
6
|
+
*
|
|
7
|
+
* Call this before `md.render(src)` when URL includes may be present.
|
|
8
|
+
*/
|
|
9
|
+
export declare function prepareSources(src: string): Promise<string>;
|
|
10
|
+
//# sourceMappingURL=prepare-sources.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-sources.d.ts","sourceRoot":"","sources":["../src/prepare-sources.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,wBAAsB,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAiBjE"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.prepareSources = prepareSources;
|
|
4
|
+
/**
|
|
5
|
+
* Pre-processes a markdown source string by fetching any URL-based markdown includes.
|
|
6
|
+
*
|
|
7
|
+
* Scans for `{{markdown https://...}}` or `{{md-include https://...}}` patterns,
|
|
8
|
+
* fetches each URL, and replaces the directive with the fetched markdown content.
|
|
9
|
+
*
|
|
10
|
+
* Call this before `md.render(src)` when URL includes may be present.
|
|
11
|
+
*/
|
|
12
|
+
async function prepareSources(src) {
|
|
13
|
+
const pattern = /\{\{(?:markdown|md-include)\s+(https?:\/\/[^\s}]+)\}\}/g;
|
|
14
|
+
const matches = [...src.matchAll(pattern)];
|
|
15
|
+
if (!matches.length)
|
|
16
|
+
return src;
|
|
17
|
+
let result = src;
|
|
18
|
+
for (const m of matches) {
|
|
19
|
+
const [fullMatch, url] = m;
|
|
20
|
+
try {
|
|
21
|
+
const res = await fetch(url);
|
|
22
|
+
const text = await res.text();
|
|
23
|
+
result = result.replace(fullMatch, text);
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
// If fetch fails, leave the directive in place (block dispatcher will ignore unknown URL)
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return result;
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=prepare-sources.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prepare-sources.js","sourceRoot":"","sources":["../src/prepare-sources.ts"],"names":[],"mappings":";;AAQA,wCAiBC;AAzBD;;;;;;;GAOG;AACI,KAAK,UAAU,cAAc,CAAC,GAAW;IAC9C,MAAM,OAAO,GAAG,yDAAyD,CAAC;IAC1E,MAAM,OAAO,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3C,IAAI,CAAC,OAAO,CAAC,MAAM;QAAE,OAAO,GAAG,CAAC;IAEhC,IAAI,MAAM,GAAG,GAAG,CAAC;IACjB,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE,CAAC;QACxB,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3B,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;YAC7B,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;YAC9B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC3C,CAAC;QAAC,MAAM,CAAC;YACP,0FAA0F;QAC5F,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export interface PluginDefinition {
|
|
2
|
+
type: 'block' | 'inline';
|
|
3
|
+
aliases: string[];
|
|
4
|
+
render: (args: string | null, body: string | null, env: object) => string;
|
|
5
|
+
}
|
|
6
|
+
export declare function register(def: PluginDefinition): void;
|
|
7
|
+
export declare function hasBlock(name: string): boolean;
|
|
8
|
+
export declare function hasInline(name: string): boolean;
|
|
9
|
+
export declare function getDefinition(name: string): PluginDefinition | undefined;
|
|
10
|
+
//# sourceMappingURL=registry.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,OAAO,GAAG,QAAQ,CAAC;IACzB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;CAC3E;AAID,wBAAgB,QAAQ,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,CAIpD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9C;AAED,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAG/C;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,GAAG,SAAS,CAExE"}
|
package/dist/registry.js
ADDED
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.register = register;
|
|
4
|
+
exports.hasBlock = hasBlock;
|
|
5
|
+
exports.hasInline = hasInline;
|
|
6
|
+
exports.getDefinition = getDefinition;
|
|
7
|
+
const registry = new Map();
|
|
8
|
+
function register(def) {
|
|
9
|
+
for (const alias of def.aliases) {
|
|
10
|
+
registry.set(alias, def);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function hasBlock(name) {
|
|
14
|
+
const def = registry.get(name);
|
|
15
|
+
return def !== undefined && def.type === 'block';
|
|
16
|
+
}
|
|
17
|
+
function hasInline(name) {
|
|
18
|
+
const def = registry.get(name);
|
|
19
|
+
return def !== undefined && def.type === 'inline';
|
|
20
|
+
}
|
|
21
|
+
function getDefinition(name) {
|
|
22
|
+
return registry.get(name);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=registry.js.map
|