@jacobbubu/md-zh-format 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.
@@ -0,0 +1,373 @@
1
+ import { unified } from "unified";
2
+ import remarkParse from "remark-parse";
3
+ const HAN_SCRIPT_PATTERN = "\\p{Script=Han}";
4
+ const CJK_RE = new RegExp(HAN_SCRIPT_PATTERN, "u");
5
+ const CJK_TO_ALNUM_RE = new RegExp(`(${HAN_SCRIPT_PATTERN})([A-Za-z0-9])`, "gu");
6
+ const ALNUM_TO_CJK_RE = new RegExp(`([A-Za-z0-9])(${HAN_SCRIPT_PATTERN})`, "gu");
7
+ const CJK_TO_OPEN_QUOTE_RE = new RegExp(`(${HAN_SCRIPT_PATTERN})\\s+([“‘])`, "gu");
8
+ const CLOSE_QUOTE_TO_CJK_RE = new RegExp(`([”’])\\s+(${HAN_SCRIPT_PATTERN})`, "gu");
9
+ const CJK_TO_OPEN_FULLWIDTH_PAREN_RE = new RegExp(`(${HAN_SCRIPT_PATTERN})\\s+(`, "gu");
10
+ const CLOSE_FULLWIDTH_PAREN_TO_CJK_RE = new RegExp(`)\\s+(${HAN_SCRIPT_PATTERN})`, "gu");
11
+ const FULLWIDTH_PUNCT_SPACE_BEFORE_RE = /\s+([,。!?:;、)】」』》])/g;
12
+ const FULLWIDTH_OPEN_PUNCT_SPACE_AFTER_RE = /([(【「『《])\s+/g;
13
+ const CJK_ASCII_PUNCT_LATIN_RE = new RegExp(`(${HAN_SCRIPT_PATTERN})([,.;:!?])([A-Za-z])`, "gu");
14
+ const EN_TERM_WITH_HAN_GLOSS_RE = new RegExp(`([A-Za-z][A-Za-z0-9_.-]*(?: [A-Za-z0-9_.-]+)*)\\s*(\\s*(${HAN_SCRIPT_PATTERN}[^)]*?)\\s*)`, "gu");
15
+ const ASCII_PUNCT_LATIN_RE = /([,;:!?])([A-Za-z])/g;
16
+ const NUMBER_PERCENT_OR_DEGREE_WITH_SPACE_RE = /(\d)\s+([%°])/g;
17
+ const NUMBER_UNIT_NO_SPACE_RE = /\b(\d+(?:\.\d+)?)(?:\s*)(Gbps|Mbps|Kbps|bps|TB|GB|MB|KB|ms|s|m|h|Hz|kHz|MHz|GHz)\b/g;
18
+ const MARKDOWN_TABLE_ROW_RE = /^\s*\|.*\|\s*$/;
19
+ const TOKEN_RE = /\uE000P(\d+)P\uE001/g;
20
+ const TOKEN_EXISTS_RE = /\uE000P\d+P\uE001/;
21
+ const INLINE_HTML_PARENT_TYPES = new Set([
22
+ "paragraph",
23
+ "heading",
24
+ "emphasis",
25
+ "strong",
26
+ "delete",
27
+ "link",
28
+ "linkReference",
29
+ "tableCell",
30
+ ]);
31
+ function toGlobalRegex(pattern) {
32
+ const flags = pattern.flags.includes("g")
33
+ ? pattern.flags
34
+ : `${pattern.flags}g`;
35
+ return new RegExp(pattern.source, flags);
36
+ }
37
+ function protectByRegex(input, segments, pattern) {
38
+ const globalPattern = toGlobalRegex(pattern);
39
+ return input.replace(globalPattern, (match) => {
40
+ const token = `\uE000P${segments.length}P\uE001`;
41
+ segments.push(match);
42
+ return token;
43
+ });
44
+ }
45
+ function collectHtmlBlockRangesFromAst(node, parentType, ranges) {
46
+ if (node.type === "html" && !INLINE_HTML_PARENT_TYPES.has(parentType ?? "")) {
47
+ const start = node.position?.start?.offset;
48
+ const end = node.position?.end?.offset;
49
+ if (typeof start === "number" &&
50
+ Number.isFinite(start) &&
51
+ typeof end === "number" &&
52
+ Number.isFinite(end) &&
53
+ end > start) {
54
+ ranges.push({ start, end });
55
+ }
56
+ }
57
+ if (!Array.isArray(node.children)) {
58
+ return;
59
+ }
60
+ for (const child of node.children) {
61
+ collectHtmlBlockRangesFromAst(child, node.type, ranges);
62
+ }
63
+ }
64
+ function mergeOffsetRanges(ranges) {
65
+ if (ranges.length <= 1) {
66
+ return ranges;
67
+ }
68
+ const sorted = [...ranges].sort((a, b) => {
69
+ if (a.start !== b.start)
70
+ return a.start - b.start;
71
+ return a.end - b.end;
72
+ });
73
+ const merged = [sorted[0]];
74
+ for (let index = 1; index < sorted.length; index++) {
75
+ const current = sorted[index];
76
+ const previous = merged[merged.length - 1];
77
+ if (current.start <= previous.end) {
78
+ previous.end = Math.max(previous.end, current.end);
79
+ continue;
80
+ }
81
+ merged.push(current);
82
+ }
83
+ return merged;
84
+ }
85
+ function collectCommonMarkHtmlBlockRanges(input) {
86
+ try {
87
+ const ast = unified()
88
+ .use(remarkParse)
89
+ .parse(input);
90
+ const ranges = [];
91
+ collectHtmlBlockRangesFromAst(ast, undefined, ranges);
92
+ return mergeOffsetRanges(ranges);
93
+ }
94
+ catch {
95
+ return [];
96
+ }
97
+ }
98
+ function protectByOffsetRanges(input, segments, ranges) {
99
+ if (ranges.length === 0) {
100
+ return input;
101
+ }
102
+ let cursor = 0;
103
+ let output = "";
104
+ for (const range of ranges) {
105
+ if (range.start < cursor) {
106
+ continue;
107
+ }
108
+ if (range.start >= input.length) {
109
+ break;
110
+ }
111
+ const safeStart = Math.max(0, range.start);
112
+ const safeEnd = Math.min(input.length, range.end);
113
+ if (safeEnd <= safeStart) {
114
+ continue;
115
+ }
116
+ output += input.slice(cursor, safeStart);
117
+ const token = `\uE000P${segments.length}P\uE001`;
118
+ segments.push(input.slice(safeStart, safeEnd));
119
+ output += token;
120
+ cursor = safeEnd;
121
+ }
122
+ output += input.slice(cursor);
123
+ return output;
124
+ }
125
+ function protectCommonMarkHtmlBlocks(input, segments) {
126
+ const ranges = collectCommonMarkHtmlBlockRanges(input);
127
+ return protectByOffsetRanges(input, segments, ranges);
128
+ }
129
+ function protectFencedCodeBlocks(input, segments) {
130
+ const lines = input.split("\n");
131
+ const output = [];
132
+ let index = 0;
133
+ while (index < lines.length) {
134
+ const startMatch = lines[index].match(/^\s*(```+|~~~+)[^\n]*$/);
135
+ if (!startMatch) {
136
+ output.push(lines[index]);
137
+ index += 1;
138
+ continue;
139
+ }
140
+ const startMarker = startMatch[1];
141
+ const markerChar = startMarker[0];
142
+ const markerLen = startMarker.length;
143
+ const blockLines = [lines[index]];
144
+ index += 1;
145
+ const endPattern = new RegExp(`^\\s*${markerChar}{${markerLen},}\\s*$`);
146
+ while (index < lines.length) {
147
+ blockLines.push(lines[index]);
148
+ const isEnd = endPattern.test(lines[index]);
149
+ index += 1;
150
+ if (isEnd)
151
+ break;
152
+ }
153
+ const token = `\uE000P${segments.length}P\uE001`;
154
+ segments.push(blockLines.join("\n"));
155
+ output.push(token);
156
+ }
157
+ return output.join("\n");
158
+ }
159
+ function isIndentedCodeLine(line) {
160
+ return /^(?:\t| {4})/.test(line);
161
+ }
162
+ function protectIndentedCodeBlocks(input, segments) {
163
+ const lines = input.split("\n");
164
+ const output = [];
165
+ let index = 0;
166
+ while (index < lines.length) {
167
+ const line = lines[index];
168
+ const previousLine = index > 0 ? lines[index - 1] : "";
169
+ const canStartBlock = isIndentedCodeLine(line) &&
170
+ (index === 0 || previousLine.trim().length === 0);
171
+ if (!canStartBlock) {
172
+ output.push(line);
173
+ index += 1;
174
+ continue;
175
+ }
176
+ const blockLines = [line];
177
+ index += 1;
178
+ while (index < lines.length) {
179
+ const currentLine = lines[index];
180
+ if (isIndentedCodeLine(currentLine) || currentLine.trim().length === 0) {
181
+ blockLines.push(currentLine);
182
+ index += 1;
183
+ continue;
184
+ }
185
+ break;
186
+ }
187
+ const token = `\uE000P${segments.length}P\uE001`;
188
+ segments.push(blockLines.join("\n"));
189
+ output.push(token);
190
+ }
191
+ return output.join("\n");
192
+ }
193
+ function isEscaped(text, index) {
194
+ let slashCount = 0;
195
+ for (let i = index - 1; i >= 0 && text[i] === "\\"; i--) {
196
+ slashCount += 1;
197
+ }
198
+ return slashCount % 2 === 1;
199
+ }
200
+ function isWhitespaceChar(ch) {
201
+ return ch !== undefined && /\s/.test(ch);
202
+ }
203
+ function findMathClosingDelimiter(input, startIndex, delimiterLength) {
204
+ const searchEndExclusive = delimiterLength === 1
205
+ ? (() => {
206
+ const lineBreakIndex = input.indexOf("\n", startIndex + delimiterLength);
207
+ return lineBreakIndex >= 0 ? lineBreakIndex : input.length;
208
+ })()
209
+ : input.length;
210
+ for (let i = startIndex + delimiterLength; i < searchEndExclusive; i++) {
211
+ if (input[i] !== "$" || isEscaped(input, i))
212
+ continue;
213
+ if (delimiterLength === 2) {
214
+ if (input[i + 1] === "$" && !isEscaped(input, i + 1)) {
215
+ return i;
216
+ }
217
+ continue;
218
+ }
219
+ if (input[i + 1] === "$")
220
+ continue;
221
+ if (isWhitespaceChar(input[i - 1]))
222
+ continue;
223
+ return i;
224
+ }
225
+ return -1;
226
+ }
227
+ function protectMathExpressions(input, segments) {
228
+ let output = "";
229
+ let index = 0;
230
+ while (index < input.length) {
231
+ if (input[index] !== "$" || isEscaped(input, index)) {
232
+ output += input[index];
233
+ index += 1;
234
+ continue;
235
+ }
236
+ const delimiterLength = input[index + 1] === "$" && !isEscaped(input, index + 1) ? 2 : 1;
237
+ const openingLength = delimiterLength;
238
+ const nextChar = input[index + openingLength];
239
+ if (delimiterLength === 1) {
240
+ if (!nextChar || isWhitespaceChar(nextChar) || nextChar === "$") {
241
+ output += input[index];
242
+ index += 1;
243
+ continue;
244
+ }
245
+ }
246
+ else if (!nextChar) {
247
+ output += "$$";
248
+ index += 2;
249
+ continue;
250
+ }
251
+ const closeIndex = findMathClosingDelimiter(input, index, delimiterLength);
252
+ if (closeIndex < 0) {
253
+ output += input.slice(index, index + openingLength);
254
+ index += openingLength;
255
+ continue;
256
+ }
257
+ const closingLength = delimiterLength;
258
+ const segment = input.slice(index, closeIndex + closingLength);
259
+ const token = `\uE000P${segments.length}P\uE001`;
260
+ segments.push(segment);
261
+ output += token;
262
+ index = closeIndex + closingLength;
263
+ }
264
+ return output;
265
+ }
266
+ function restoreProtected(input, segments) {
267
+ let restored = input;
268
+ // A protected segment may contain older placeholder tokens; iterate until stable.
269
+ for (let pass = 0; pass <= segments.length; pass++) {
270
+ const next = restored.replace(TOKEN_RE, (_full, indexRaw) => {
271
+ const index = Number.parseInt(indexRaw, 10);
272
+ return Number.isFinite(index) && segments[index] !== undefined
273
+ ? segments[index]
274
+ : "";
275
+ });
276
+ restored = next;
277
+ if (!TOKEN_EXISTS_RE.test(restored))
278
+ break;
279
+ }
280
+ return restored;
281
+ }
282
+ function protectMarkdownSensitiveParts(input) {
283
+ const segments = [];
284
+ let protectedText = input;
285
+ protectedText = protectCommonMarkHtmlBlocks(protectedText, segments);
286
+ protectedText = protectFencedCodeBlocks(protectedText, segments);
287
+ protectedText = protectIndentedCodeBlocks(protectedText, segments);
288
+ protectedText = protectByRegex(protectedText, segments, /`+[^`\n]*`+/g);
289
+ protectedText = protectMathExpressions(protectedText, segments);
290
+ // Preserve hard-break markers (2+ trailing spaces) during normalization.
291
+ protectedText = protectByRegex(protectedText, segments, / {2,}(?=\r?\n|$)/g);
292
+ protectedText = protectByRegex(protectedText, segments, /!?\[[^\]\n]*\]\((?:\\.|[^)\n])*\)/g);
293
+ protectedText = protectByRegex(protectedText, segments, /<\/?[A-Za-z][^>\n]*>/g);
294
+ protectedText = protectByRegex(protectedText, segments, /\bhttps?:\/\/[^\s<>()]+/g);
295
+ return {
296
+ text: protectedText,
297
+ segments,
298
+ };
299
+ }
300
+ function hasCjk(input) {
301
+ return CJK_RE.test(input);
302
+ }
303
+ function normalizeQuotesInChineseContext(line) {
304
+ if (!hasCjk(line))
305
+ return line;
306
+ let normalized = line;
307
+ normalized = normalized.replace(/"([^"\n]+)"/g, "“$1”");
308
+ normalized = normalized.replace(/'([^'\n]+)'/g, "‘$1’");
309
+ normalized = normalized.replace(CJK_TO_OPEN_QUOTE_RE, "$1$2");
310
+ normalized = normalized.replace(CLOSE_QUOTE_TO_CJK_RE, "$1$2");
311
+ return normalized;
312
+ }
313
+ function normalizeParenthesesInChineseContext(line) {
314
+ if (!hasCjk(line))
315
+ return line;
316
+ let normalized = line;
317
+ // Default in Chinese context: use full-width parentheses.
318
+ normalized = normalized.replace(/\(\s*/g, "(");
319
+ normalized = normalized.replace(/\s*\)/g, ")");
320
+ // Exception: English term + Chinese gloss should keep half-width parentheses.
321
+ normalized = normalized.replace(EN_TERM_WITH_HAN_GLOSS_RE, "$1 ($2)");
322
+ // Half-width parentheses spacing (for the exception).
323
+ normalized = normalized.replace(/\s*\(\s*/g, " (");
324
+ normalized = normalized.replace(/\s*\)\s*/g, ") ");
325
+ normalized = normalized.replace(/\s+([,。!?:;,.!?;:])/g, "$1");
326
+ // Full-width parentheses around Chinese should not add spaces.
327
+ normalized = normalized.replace(CJK_TO_OPEN_FULLWIDTH_PAREN_RE, "$1(");
328
+ normalized = normalized.replace(CLOSE_FULLWIDTH_PAREN_TO_CJK_RE, ")$1");
329
+ return normalized;
330
+ }
331
+ function normalizePunctuationSpacing(line) {
332
+ let normalized = line;
333
+ normalized = normalized.replace(FULLWIDTH_PUNCT_SPACE_BEFORE_RE, "$1");
334
+ normalized = normalized.replace(FULLWIDTH_OPEN_PUNCT_SPACE_AFTER_RE, "$1");
335
+ normalized = normalized.replace(CJK_ASCII_PUNCT_LATIN_RE, "$1$2 $3");
336
+ normalized = normalized.replace(ASCII_PUNCT_LATIN_RE, "$1 $2");
337
+ return normalized;
338
+ }
339
+ function normalizeMixedSpacing(line) {
340
+ let normalized = line;
341
+ normalized = normalized.replace(CJK_TO_ALNUM_RE, "$1 $2");
342
+ normalized = normalized.replace(ALNUM_TO_CJK_RE, "$1 $2");
343
+ normalized = normalized.replace(NUMBER_UNIT_NO_SPACE_RE, "$1 $2");
344
+ normalized = normalized.replace(NUMBER_PERCENT_OR_DEGREE_WITH_SPACE_RE, "$1$2");
345
+ return normalized;
346
+ }
347
+ function compressSpaces(line) {
348
+ if (MARKDOWN_TABLE_ROW_RE.test(line)) {
349
+ return line.trimEnd();
350
+ }
351
+ const leading = line.match(/^\s*/)?.[0] ?? "";
352
+ const content = line.slice(leading.length).replace(/ {2,}/g, " ");
353
+ return `${leading}${content}`.trimEnd();
354
+ }
355
+ function normalizeLine(line) {
356
+ let normalized = line;
357
+ normalized = normalizeQuotesInChineseContext(normalized);
358
+ normalized = normalizeParenthesesInChineseContext(normalized);
359
+ normalized = normalizePunctuationSpacing(normalized);
360
+ normalized = normalizeMixedSpacing(normalized);
361
+ normalized = compressSpaces(normalized);
362
+ return normalized;
363
+ }
364
+ export function normalizeChsEngLayout(input) {
365
+ const { text: protectedText, segments } = protectMarkdownSensitiveParts(input);
366
+ const normalized = protectedText
367
+ .split("\n")
368
+ .map((line) => normalizeLine(line))
369
+ .join("\n")
370
+ .replace(/[ \t]+$/gm, "");
371
+ return restoreProtected(normalized, segments);
372
+ }
373
+ //# sourceMappingURL=chs-eng-layout.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chs-eng-layout.js","sourceRoot":"","sources":["../../src/prettify/chs-eng-layout.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,31 @@
1
+ export interface FrontmatterData {
2
+ [key: string]: string | undefined;
3
+ }
4
+ export type MarkdownPrettierProseWrap = "always" | "never" | "preserve";
5
+ export interface MarkdownPrettierOptions {
6
+ printWidth?: number;
7
+ proseWrap?: MarkdownPrettierProseWrap;
8
+ tabWidth?: number;
9
+ useTabs?: boolean;
10
+ }
11
+ export interface PrettifyOptions {
12
+ prettier?: MarkdownPrettierOptions;
13
+ preserveFrontmatter?: boolean;
14
+ promoteHeadings?: boolean;
15
+ }
16
+ export interface PrettifyResult {
17
+ sourcePath: string;
18
+ baseName: string;
19
+ hasFrontmatter: boolean;
20
+ frontmatter: FrontmatterData;
21
+ body: string;
22
+ prettifiedContent: string;
23
+ }
24
+ export declare const DEFAULT_MARKDOWN_PRETTIER_OPTIONS: Readonly<Required<MarkdownPrettierOptions>>;
25
+ export declare function findEarliestHeadingTitle(body: string): string | undefined;
26
+ export declare function resolveMarkdownPrettierOptions(options?: MarkdownPrettierOptions): Required<MarkdownPrettierOptions>;
27
+ export declare function formatMarkdownWithPrettier(content: string, options?: MarkdownPrettierOptions): Promise<string>;
28
+ export declare function prettifyMarkdownContent(content: string, sourcePath: string, options?: PrettifyOptions): Promise<PrettifyResult>;
29
+ export declare function prettifyMarkdownFile(sourcePath: string, options?: PrettifyOptions): Promise<PrettifyResult>;
30
+ export { normalizeChsEngLayout } from "./chs-eng-layout.js";
31
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/prettify/index.ts"],"names":[],"mappings":"AAKA,MAAM,WAAW,eAAe;IAC9B,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAAC;CACnC;AASD,MAAM,MAAM,yBAAyB,GAAG,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;AAExE,MAAM,WAAW,uBAAuB;IACtC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAED,MAAM,WAAW,eAAe;IAC9B,QAAQ,CAAC,EAAE,uBAAuB,CAAC;IACnC,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,eAAe,CAAC,EAAE,OAAO,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,OAAO,CAAC;IACxB,WAAW,EAAE,eAAe,CAAC;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,iBAAiB,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,iCAAiC,EAAE,QAAQ,CACtD,QAAQ,CAAC,uBAAuB,CAAC,CAMjC,CAAC;AAgFH,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CA0BzE;AAmED,wBAAgB,8BAA8B,CAC5C,OAAO,CAAC,EAAE,uBAAuB,GAChC,QAAQ,CAAC,uBAAuB,CAAC,CASnC;AAED,wBAAsB,0BAA0B,CAC9C,OAAO,EAAE,MAAM,EACf,OAAO,CAAC,EAAE,uBAAuB,GAChC,OAAO,CAAC,MAAM,CAAC,CAWjB;AAED,wBAAsB,uBAAuB,CAC3C,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAkCzB;AAED,wBAAsB,oBAAoB,CACxC,UAAU,EAAE,MAAM,EAClB,OAAO,GAAE,eAAoB,GAC5B,OAAO,CAAC,cAAc,CAAC,CAIzB;AAED,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC"}
@@ -0,0 +1,210 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+ import { format as prettierFormat } from "prettier";
4
+ import { normalizeChsEngLayout } from "./chs-eng-layout.js";
5
+ export const DEFAULT_MARKDOWN_PRETTIER_OPTIONS = Object.freeze({
6
+ printWidth: 80,
7
+ proseWrap: "preserve",
8
+ tabWidth: 2,
9
+ useTabs: false,
10
+ });
11
+ const ORDERED_HEADING_RE = /^\s*["'“”]?\s*(\d+)\s*(?:[.\-、]|[)\)])\s*(.*)$/;
12
+ const ATX_HEADING_RE = /^(\s{0,3})(#{1,6})([ \t]+)(.*)$/;
13
+ const FENCE_MARK_RE = /^\s{0,3}(```+|~~~+)/;
14
+ function normalizeLineBreaks(text) {
15
+ return text.replace(/\r\n/g, "\n");
16
+ }
17
+ function splitLines(text) {
18
+ return normalizeLineBreaks(text).split("\n");
19
+ }
20
+ function parseFrontmatter(content) {
21
+ const normalizedContent = normalizeLineBreaks(content);
22
+ const lines = splitLines(normalizedContent);
23
+ if (lines.length === 0 || lines[0].trim() !== "---") {
24
+ return {
25
+ hasFrontmatter: false,
26
+ data: {},
27
+ body: normalizedContent,
28
+ };
29
+ }
30
+ let closingIndex = -1;
31
+ for (let i = 1; i < lines.length; i++) {
32
+ if (lines[i].trim() === "---") {
33
+ closingIndex = i;
34
+ break;
35
+ }
36
+ }
37
+ if (closingIndex < 0) {
38
+ return {
39
+ hasFrontmatter: false,
40
+ data: {},
41
+ body: normalizedContent,
42
+ };
43
+ }
44
+ const frontmatterLines = lines.slice(1, closingIndex);
45
+ const rawFrontmatterBlock = lines.slice(0, closingIndex + 1).join("\n");
46
+ const body = lines.slice(closingIndex + 1).join("\n");
47
+ const data = {};
48
+ for (const line of frontmatterLines) {
49
+ const match = line.match(/^\s*([A-Za-z0-9_-]+)\s*:\s*(.*?)\s*$/);
50
+ if (!match) {
51
+ continue;
52
+ }
53
+ const key = match[1];
54
+ let value = match[2] ?? "";
55
+ if ((value.startsWith('"') && value.endsWith('"')) ||
56
+ (value.startsWith("'") && value.endsWith("'"))) {
57
+ value = value.slice(1, -1);
58
+ }
59
+ data[key] = value;
60
+ }
61
+ return {
62
+ hasFrontmatter: true,
63
+ data,
64
+ rawFrontmatterBlock,
65
+ body,
66
+ };
67
+ }
68
+ function normalizeHeadingTitle(rawHeadingText) {
69
+ const trimmed = rawHeadingText.replace(/\s+#+\s*$/, "").trim();
70
+ const orderedMatch = trimmed.match(ORDERED_HEADING_RE);
71
+ if (!orderedMatch)
72
+ return trimmed;
73
+ const rest = (orderedMatch[2] ?? "").replace(/^\s*["'“”]+/, "").trim();
74
+ return rest.length > 0 ? rest : trimmed;
75
+ }
76
+ export function findEarliestHeadingTitle(body) {
77
+ const lines = splitLines(body);
78
+ let fenceMark = null;
79
+ for (const line of lines) {
80
+ const fenceMatch = line.match(FENCE_MARK_RE);
81
+ if (fenceMatch) {
82
+ const ch = fenceMatch[1][0];
83
+ if (!fenceMark) {
84
+ fenceMark = ch;
85
+ continue;
86
+ }
87
+ if (fenceMark === ch) {
88
+ fenceMark = null;
89
+ }
90
+ continue;
91
+ }
92
+ if (fenceMark)
93
+ continue;
94
+ const headingMatch = line.match(ATX_HEADING_RE);
95
+ if (!headingMatch)
96
+ continue;
97
+ const title = normalizeHeadingTitle(headingMatch[4] ?? "");
98
+ if (title.length > 0)
99
+ return title;
100
+ }
101
+ return undefined;
102
+ }
103
+ function promoteHeadingsToH1(body) {
104
+ const lines = splitLines(body);
105
+ let fenceMark = null;
106
+ let minDepth = 7;
107
+ const headingIndexes = [];
108
+ for (let i = 0; i < lines.length; i++) {
109
+ const line = lines[i];
110
+ const fenceMatch = line.match(FENCE_MARK_RE);
111
+ if (fenceMatch) {
112
+ const ch = fenceMatch[1][0];
113
+ if (!fenceMark) {
114
+ fenceMark = ch;
115
+ continue;
116
+ }
117
+ if (fenceMark === ch) {
118
+ fenceMark = null;
119
+ }
120
+ continue;
121
+ }
122
+ if (fenceMark)
123
+ continue;
124
+ const match = line.match(ATX_HEADING_RE);
125
+ if (!match)
126
+ continue;
127
+ headingIndexes.push(i);
128
+ const depth = match[2].length;
129
+ if (depth < minDepth)
130
+ minDepth = depth;
131
+ }
132
+ if (headingIndexes.length === 0 || minDepth <= 1) {
133
+ return lines.join("\n");
134
+ }
135
+ const offset = minDepth - 1;
136
+ for (const index of headingIndexes) {
137
+ const line = lines[index];
138
+ const match = line.match(ATX_HEADING_RE);
139
+ if (!match)
140
+ continue;
141
+ const indent = match[1] ?? "";
142
+ const hashes = match[2] ?? "";
143
+ const spacing = match[3] ?? " ";
144
+ const tail = match[4] ?? "";
145
+ const oldDepth = hashes.length;
146
+ const newDepth = Math.max(1, oldDepth - offset);
147
+ lines[index] = `${indent}${"#".repeat(newDepth)}${spacing}${tail}`;
148
+ }
149
+ return lines.join("\n");
150
+ }
151
+ function ensureTrailingNewline(text) {
152
+ return text.endsWith("\n") ? text : `${text}\n`;
153
+ }
154
+ function mergeFrontmatterAndBody(frontmatterBlock, body) {
155
+ const normalizedBody = body.replace(/^\n+/, "");
156
+ if (normalizedBody.length === 0) {
157
+ return ensureTrailingNewline(frontmatterBlock);
158
+ }
159
+ return ensureTrailingNewline(`${frontmatterBlock}\n${normalizedBody}`);
160
+ }
161
+ export function resolveMarkdownPrettierOptions(options) {
162
+ return {
163
+ printWidth: options?.printWidth ?? DEFAULT_MARKDOWN_PRETTIER_OPTIONS.printWidth,
164
+ proseWrap: options?.proseWrap ?? DEFAULT_MARKDOWN_PRETTIER_OPTIONS.proseWrap,
165
+ tabWidth: options?.tabWidth ?? DEFAULT_MARKDOWN_PRETTIER_OPTIONS.tabWidth,
166
+ useTabs: options?.useTabs ?? DEFAULT_MARKDOWN_PRETTIER_OPTIONS.useTabs,
167
+ };
168
+ }
169
+ export async function formatMarkdownWithPrettier(content, options) {
170
+ const normalizedInput = normalizeLineBreaks(content);
171
+ const resolved = resolveMarkdownPrettierOptions(options);
172
+ return prettierFormat(normalizedInput, {
173
+ parser: "markdown",
174
+ printWidth: resolved.printWidth,
175
+ proseWrap: resolved.proseWrap,
176
+ tabWidth: resolved.tabWidth,
177
+ useTabs: resolved.useTabs,
178
+ });
179
+ }
180
+ export async function prettifyMarkdownContent(content, sourcePath, options = {}) {
181
+ const absoluteSourcePath = path.resolve(sourcePath);
182
+ const baseName = path.basename(absoluteSourcePath, path.extname(absoluteSourcePath));
183
+ const preserveFrontmatter = options.preserveFrontmatter ?? true;
184
+ const promoteHeadings = options.promoteHeadings ?? true;
185
+ const parsed = parseFrontmatter(content);
186
+ const prettierBody = await formatMarkdownWithPrettier(parsed.body, options.prettier);
187
+ const promotedBody = promoteHeadings
188
+ ? promoteHeadingsToH1(prettierBody)
189
+ : prettierBody;
190
+ const normalizedBody = normalizeChsEngLayout(promotedBody);
191
+ const formattedBody = ensureTrailingNewline(normalizedBody);
192
+ const prettifiedContent = preserveFrontmatter && parsed.hasFrontmatter && parsed.rawFrontmatterBlock
193
+ ? mergeFrontmatterAndBody(parsed.rawFrontmatterBlock, formattedBody)
194
+ : formattedBody;
195
+ return {
196
+ sourcePath: absoluteSourcePath,
197
+ baseName,
198
+ hasFrontmatter: parsed.hasFrontmatter,
199
+ frontmatter: parsed.data,
200
+ body: normalizedBody,
201
+ prettifiedContent,
202
+ };
203
+ }
204
+ export async function prettifyMarkdownFile(sourcePath, options = {}) {
205
+ const absoluteSourcePath = path.resolve(sourcePath);
206
+ const content = await fs.readFile(absoluteSourcePath, "utf-8");
207
+ return prettifyMarkdownContent(content, absoluteSourcePath, options);
208
+ }
209
+ export { normalizeChsEngLayout } from "./chs-eng-layout.js";
210
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/prettify/index.ts"],"names":[],"mappings":"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"}