@page2ai/core 0.1.6 → 0.1.7
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/README.md +0 -1
- package/dist/shared/constants.d.ts +1 -1
- package/dist/shared/constants.js +1 -1
- package/package.json +3 -3
- package/dist/shared/md-postprocess.d.ts +0 -18
- package/dist/shared/md-postprocess.d.ts.map +0 -1
- package/dist/shared/md-postprocess.js +0 -541
- package/dist/shared/md-postprocess.js.map +0 -1
package/README.md
CHANGED
|
@@ -93,7 +93,6 @@ src/
|
|
|
93
93
|
├── shared/ # No DOM assumptions — works with any adapter
|
|
94
94
|
│ ├── page-adapter.ts # PageAdapter interface + defaults + nodeCssEscape
|
|
95
95
|
│ ├── utils.ts # pure helpers (absUrl, escapeMd, etc.)
|
|
96
|
-
│ ├── md-postprocess.ts # pure string transforms
|
|
97
96
|
│ ├── types.ts # all TypeScript interfaces
|
|
98
97
|
│ ├── constants.ts # DEFAULTS, BLOCK_TAGS, PII patterns
|
|
99
98
|
│ └── profiles.ts # profile presets
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ExtractorConfig } from './types.js';
|
|
2
|
-
export declare const CORE_VERSION = "0.1.
|
|
2
|
+
export declare const CORE_VERSION = "0.1.7";
|
|
3
3
|
export declare const INDENT = " ";
|
|
4
4
|
export declare const DEFAULTS: ExtractorConfig;
|
|
5
5
|
export declare const BLOCK_TAGS: Set<string>;
|
package/dist/shared/constants.js
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
// carries the other copy; a release bumps both in the same commit and the publish workflow's
|
|
5
5
|
// tag check enforces the package.json side. A third hardcoded copy drifted once (SERVER_VERSION
|
|
6
6
|
// in @page2ai/mcp, caught T51) — never add another literal.
|
|
7
|
-
export const CORE_VERSION = '0.1.
|
|
7
|
+
export const CORE_VERSION = '0.1.7';
|
|
8
8
|
// Indent constant: 3 spaces for CommonMark-compatible nested lists.
|
|
9
9
|
export const INDENT = ' ';
|
|
10
10
|
export const DEFAULTS = {
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@page2ai/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.7",
|
|
4
4
|
"description": "Extract clean Markdown from any web page HTML. Works in Node.js (via linkedom) and browsers. Powers the Page2AI extension and @page2ai/mcp server.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -52,9 +52,9 @@
|
|
|
52
52
|
},
|
|
53
53
|
"devDependencies": {
|
|
54
54
|
"@types/css.escape": "^1.5.2",
|
|
55
|
-
"@types/node": "^
|
|
55
|
+
"@types/node": "^26.2.0",
|
|
56
56
|
"typescript": "^5.7.2",
|
|
57
|
-
"vitest": "^
|
|
57
|
+
"vitest": "^4.1.10"
|
|
58
58
|
},
|
|
59
59
|
"keywords": [
|
|
60
60
|
"html-to-markdown",
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
import type { ProgressCallback, ResolvedConfig } from './types.js';
|
|
2
|
-
export interface FenceTracker {
|
|
3
|
-
readonly inFence: boolean;
|
|
4
|
-
check(trimmedLine: string): boolean;
|
|
5
|
-
}
|
|
6
|
-
export declare const createFenceTracker: () => FenceTracker;
|
|
7
|
-
export declare const normalizeMarkdownPreserveCode: (text: string | null | undefined) => string;
|
|
8
|
-
export declare const dedupeConsecutiveDuplicateLines: (text: string, config: Pick<ResolvedConfig, "dedupeConsecutiveDuplicates" | "minConsecutiveDuplicatesToCollapse">) => string;
|
|
9
|
-
export declare const collapseShortAdjacentLines: (text: string, config: Pick<ResolvedConfig, "collapseShortAdjacentLines" | "shortLineCollapseMaxChars">) => string;
|
|
10
|
-
export declare const cleanupPunctuation: (text: string, config: Pick<ResolvedConfig, "cleanupPunctuation">) => string;
|
|
11
|
-
export declare const dedupeAdjacentLinks: (text: string, config: Pick<ResolvedConfig, "dedupeAdjacentLinks">) => string;
|
|
12
|
-
export declare const suppressRepeatedImages: (text: string, config: Pick<ResolvedConfig, "suppressRepeatedImages" | "suppressRepeatedImageThreshold">) => string;
|
|
13
|
-
export declare const compactLinkLabels: (text: string, config: Pick<ResolvedConfig, "compactLinkLabels" | "maxLinkLabelChars">) => string;
|
|
14
|
-
export declare const dedupeRepeatedBlocks: (text: string) => string;
|
|
15
|
-
export declare const dedupeTabPanelDuplicates: (text: string) => string;
|
|
16
|
-
export declare const aggressiveCleanup: (text: string, config: Pick<ResolvedConfig, "aggressiveCleanup" | "aggressiveCleanupMaxLinkTextLength" | "aggressiveCleanupHtmlTagPattern">, progress?: ProgressCallback) => string;
|
|
17
|
-
export declare const postProcessMarkdown: (text: string, config: ResolvedConfig, progress?: ProgressCallback) => string;
|
|
18
|
-
//# sourceMappingURL=md-postprocess.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"md-postprocess.d.ts","sourceRoot":"","sources":["../../src/shared/md-postprocess.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnE,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,KAAK,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACrC;AAED,eAAO,MAAM,kBAAkB,QAAO,YAyBrC,CAAC;AAGF,eAAO,MAAM,6BAA6B,GAAI,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,KAAG,MA+B/E,CAAC;AAEF,eAAO,MAAM,+BAA+B,GAC1C,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,6BAA6B,GAAG,oCAAoC,CAAC,KACjG,MAkCF,CAAC;AAGF,eAAO,MAAM,0BAA0B,GACrC,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,4BAA4B,GAAG,2BAA2B,CAAC,KACvF,MAqFF,CAAC;AAGF,eAAO,MAAM,kBAAkB,GAC7B,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,oBAAoB,CAAC,KACjD,MA0CF,CAAC;AAGF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,qBAAqB,CAAC,KAClD,MA8DF,CAAC;AAGF,eAAO,MAAM,sBAAsB,GACjC,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,wBAAwB,GAAG,gCAAgC,CAAC,KACxF,MAwCF,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,QAAQ,IAAI,CAAC,cAAc,EAAE,mBAAmB,GAAG,mBAAmB,CAAC,KACtE,MAwBF,CAAC;AAIF,eAAO,MAAM,oBAAoB,GAAI,MAAM,MAAM,KAAG,MAkDnD,CAAC;AAGF,eAAO,MAAM,wBAAwB,GAAI,MAAM,MAAM,KAAG,MA6FvD,CAAC;AAEF,eAAO,MAAM,iBAAiB,GAC5B,MAAM,MAAM,EACZ,QAAQ,IAAI,CACV,cAAc,EACd,mBAAmB,GAAG,oCAAoC,GAAG,iCAAiC,CAC/F,EACD,WAAW,gBAAgB,KAC1B,MAgCF,CAAC;AAGF,eAAO,MAAM,mBAAmB,GAC9B,MAAM,MAAM,EACZ,QAAQ,cAAc,EACtB,WAAW,gBAAgB,KAC1B,MAYF,CAAC"}
|
|
@@ -1,541 +0,0 @@
|
|
|
1
|
-
// Markdown post-processing: pure string transforms over the composed document.
|
|
2
|
-
// Ported from Rev-032v2 prototype (Sections 10-11 + aggressive cleanup pass).
|
|
3
|
-
export const createFenceTracker = () => {
|
|
4
|
-
let inFence = false;
|
|
5
|
-
let fenceChar = '';
|
|
6
|
-
let fenceLen = 0;
|
|
7
|
-
return {
|
|
8
|
-
get inFence() {
|
|
9
|
-
return inFence;
|
|
10
|
-
},
|
|
11
|
-
check(trimmedLine) {
|
|
12
|
-
const m = trimmedLine.match(/^(`{3,}|~{3,})/);
|
|
13
|
-
if (!m)
|
|
14
|
-
return false;
|
|
15
|
-
const c = m[1][0];
|
|
16
|
-
const l = m[1].length;
|
|
17
|
-
if (!inFence) {
|
|
18
|
-
inFence = true;
|
|
19
|
-
fenceChar = c;
|
|
20
|
-
fenceLen = l;
|
|
21
|
-
}
|
|
22
|
-
else if (c === fenceChar && l >= fenceLen) {
|
|
23
|
-
inFence = false;
|
|
24
|
-
fenceChar = '';
|
|
25
|
-
fenceLen = 0;
|
|
26
|
-
}
|
|
27
|
-
return true;
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
};
|
|
31
|
-
// Preserves leading whitespace on non-blank lines; collapses only internal runs.
|
|
32
|
-
export const normalizeMarkdownPreserveCode = (text) => {
|
|
33
|
-
const lines = String(text || '').replace(/\u00a0/g, ' ').split('\n');
|
|
34
|
-
const out = [];
|
|
35
|
-
const fence = createFenceTracker();
|
|
36
|
-
let blankCount = 0;
|
|
37
|
-
for (const line of lines) {
|
|
38
|
-
const trimmed = line.trim();
|
|
39
|
-
if (fence.check(trimmed)) {
|
|
40
|
-
out.push(line.trimEnd());
|
|
41
|
-
blankCount = 0;
|
|
42
|
-
continue;
|
|
43
|
-
}
|
|
44
|
-
if (fence.inFence) {
|
|
45
|
-
out.push(line.replace(/\s+$/g, ''));
|
|
46
|
-
continue;
|
|
47
|
-
}
|
|
48
|
-
if (trimmed === '') {
|
|
49
|
-
blankCount += 1;
|
|
50
|
-
if (blankCount <= 2)
|
|
51
|
-
out.push('');
|
|
52
|
-
continue;
|
|
53
|
-
}
|
|
54
|
-
blankCount = 0;
|
|
55
|
-
const m = line.match(/^(\s*)(.*?)$/);
|
|
56
|
-
const lead = m ? m[1] : '';
|
|
57
|
-
const rest = (m ? m[2] : line).replace(/[ \t]+/g, ' ').trimEnd();
|
|
58
|
-
out.push(lead + rest);
|
|
59
|
-
}
|
|
60
|
-
return out.join('\n').replace(/^\n+|\n+$/g, '');
|
|
61
|
-
};
|
|
62
|
-
export const dedupeConsecutiveDuplicateLines = (text, config) => {
|
|
63
|
-
if (!config.dedupeConsecutiveDuplicates)
|
|
64
|
-
return text;
|
|
65
|
-
const threshold = Math.max(2, config.minConsecutiveDuplicatesToCollapse);
|
|
66
|
-
const lines = String(text || '').split('\n');
|
|
67
|
-
const out = [];
|
|
68
|
-
const fence = createFenceTracker();
|
|
69
|
-
let i = 0;
|
|
70
|
-
while (i < lines.length) {
|
|
71
|
-
const line = lines[i];
|
|
72
|
-
const trimmed = line.trim();
|
|
73
|
-
if (fence.check(trimmed)) {
|
|
74
|
-
out.push(line);
|
|
75
|
-
i++;
|
|
76
|
-
continue;
|
|
77
|
-
}
|
|
78
|
-
if (fence.inFence) {
|
|
79
|
-
out.push(line);
|
|
80
|
-
i++;
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
if (trimmed.length > 0) {
|
|
84
|
-
let j = i + 1;
|
|
85
|
-
while (j < lines.length && lines[j].trim() === trimmed)
|
|
86
|
-
j++;
|
|
87
|
-
if (j - i >= threshold) {
|
|
88
|
-
out.push(line);
|
|
89
|
-
out.push(`<!-- AI: collapsed ${j - i - 1} consecutive duplicate line(s) -->`);
|
|
90
|
-
i = j;
|
|
91
|
-
continue;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
out.push(line);
|
|
95
|
-
i++;
|
|
96
|
-
}
|
|
97
|
-
return out.join('\n');
|
|
98
|
-
};
|
|
99
|
-
// Protects YAML frontmatter from collapsing.
|
|
100
|
-
export const collapseShortAdjacentLines = (text, config) => {
|
|
101
|
-
if (!config.collapseShortAdjacentLines)
|
|
102
|
-
return text;
|
|
103
|
-
const maxLen = config.shortLineCollapseMaxChars;
|
|
104
|
-
const lines = String(text || '').split('\n');
|
|
105
|
-
const out = [];
|
|
106
|
-
const fence = createFenceTracker();
|
|
107
|
-
let buffer = [];
|
|
108
|
-
let inFrontmatter = false;
|
|
109
|
-
let seenFirstDashes = false;
|
|
110
|
-
const isStructural = (l) => {
|
|
111
|
-
const t = l.trimStart();
|
|
112
|
-
return /^#{1,6}\s/.test(t) || /^[-*+]\s/.test(t) || /^\d+\.\s/.test(t) ||
|
|
113
|
-
/^>\s/.test(t) || /^\|/.test(t) || /^!\[/.test(t) || /^\[/.test(t) ||
|
|
114
|
-
/^<!--/.test(t) || /^<\w/.test(t) || /^[*_]{2}/.test(t) || /^---/.test(t) || /^===/.test(t);
|
|
115
|
-
};
|
|
116
|
-
const flush = () => {
|
|
117
|
-
if (buffer.length === 0)
|
|
118
|
-
return;
|
|
119
|
-
if (buffer.length === 1) {
|
|
120
|
-
out.push(buffer[0]);
|
|
121
|
-
buffer = [];
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
// If every buffered line starts with an uppercase letter, digit, or emoji —
|
|
125
|
-
// these are separate items (security features, stats, etc.), not fragments
|
|
126
|
-
// of a broken sentence. Don't collapse them.
|
|
127
|
-
const allStartWithUpper = buffer.every((s) => /^[\p{Lu}\d\p{Emoji}]/u.test(s.trim()));
|
|
128
|
-
if (allStartWithUpper) {
|
|
129
|
-
buffer.forEach((s) => out.push(s));
|
|
130
|
-
}
|
|
131
|
-
else {
|
|
132
|
-
out.push(buffer.map((s) => s.trim()).join(' '));
|
|
133
|
-
}
|
|
134
|
-
buffer = [];
|
|
135
|
-
};
|
|
136
|
-
for (let i = 0; i < lines.length; i++) {
|
|
137
|
-
const line = lines[i];
|
|
138
|
-
const trimmed = line.trim();
|
|
139
|
-
if (trimmed === '---') {
|
|
140
|
-
flush();
|
|
141
|
-
out.push(line);
|
|
142
|
-
if (!seenFirstDashes && i <= 1) {
|
|
143
|
-
inFrontmatter = true;
|
|
144
|
-
seenFirstDashes = true;
|
|
145
|
-
}
|
|
146
|
-
else if (inFrontmatter) {
|
|
147
|
-
inFrontmatter = false;
|
|
148
|
-
}
|
|
149
|
-
continue;
|
|
150
|
-
}
|
|
151
|
-
if (inFrontmatter) {
|
|
152
|
-
flush();
|
|
153
|
-
out.push(line);
|
|
154
|
-
continue;
|
|
155
|
-
}
|
|
156
|
-
if (fence.check(trimmed)) {
|
|
157
|
-
flush();
|
|
158
|
-
out.push(line);
|
|
159
|
-
continue;
|
|
160
|
-
}
|
|
161
|
-
if (fence.inFence) {
|
|
162
|
-
flush();
|
|
163
|
-
out.push(line);
|
|
164
|
-
continue;
|
|
165
|
-
}
|
|
166
|
-
if (trimmed === '') {
|
|
167
|
-
flush();
|
|
168
|
-
out.push(line);
|
|
169
|
-
continue;
|
|
170
|
-
}
|
|
171
|
-
if (isStructural(line)) {
|
|
172
|
-
flush();
|
|
173
|
-
out.push(line);
|
|
174
|
-
continue;
|
|
175
|
-
}
|
|
176
|
-
if (trimmed.length < maxLen) {
|
|
177
|
-
buffer.push(line);
|
|
178
|
-
continue;
|
|
179
|
-
}
|
|
180
|
-
flush();
|
|
181
|
-
out.push(line);
|
|
182
|
-
}
|
|
183
|
-
flush();
|
|
184
|
-
return out.join('\n');
|
|
185
|
-
};
|
|
186
|
-
// Punctuation cleanup (space before period, comma, etc.).
|
|
187
|
-
export const cleanupPunctuation = (text, config) => {
|
|
188
|
-
if (!config.cleanupPunctuation)
|
|
189
|
-
return text;
|
|
190
|
-
const lines = String(text || '').split('\n');
|
|
191
|
-
const out = [];
|
|
192
|
-
const fence = createFenceTracker();
|
|
193
|
-
let inFrontmatter = false;
|
|
194
|
-
let seenFirstDashes = false;
|
|
195
|
-
for (let i = 0; i < lines.length; i++) {
|
|
196
|
-
const line = lines[i];
|
|
197
|
-
const trimmed = line.trim();
|
|
198
|
-
if (trimmed === '---') {
|
|
199
|
-
if (!seenFirstDashes && i <= 1) {
|
|
200
|
-
inFrontmatter = true;
|
|
201
|
-
seenFirstDashes = true;
|
|
202
|
-
}
|
|
203
|
-
else if (inFrontmatter) {
|
|
204
|
-
inFrontmatter = false;
|
|
205
|
-
}
|
|
206
|
-
out.push(line);
|
|
207
|
-
continue;
|
|
208
|
-
}
|
|
209
|
-
if (inFrontmatter) {
|
|
210
|
-
out.push(line);
|
|
211
|
-
continue;
|
|
212
|
-
}
|
|
213
|
-
if (fence.check(trimmed)) {
|
|
214
|
-
out.push(line);
|
|
215
|
-
continue;
|
|
216
|
-
}
|
|
217
|
-
if (fence.inFence) {
|
|
218
|
-
out.push(line);
|
|
219
|
-
continue;
|
|
220
|
-
}
|
|
221
|
-
if (trimmed.startsWith('|')) {
|
|
222
|
-
out.push(line);
|
|
223
|
-
continue;
|
|
224
|
-
}
|
|
225
|
-
out.push(line.replace(/\s+([.,!?;:])/g, '$1'));
|
|
226
|
-
}
|
|
227
|
-
return out.join('\n');
|
|
228
|
-
};
|
|
229
|
-
// Dedupe adjacent identical markdown links.
|
|
230
|
-
export const dedupeAdjacentLinks = (text, config) => {
|
|
231
|
-
if (!config.dedupeAdjacentLinks)
|
|
232
|
-
return text;
|
|
233
|
-
const lines = String(text || '').split('\n');
|
|
234
|
-
const out = [];
|
|
235
|
-
const fence = createFenceTracker();
|
|
236
|
-
// URL capture tolerates one level of balanced parens (Wikipedia-style
|
|
237
|
-
// "/Foo_(bar)"); a bare [^)]+ would cut the URL at the inner ')' and leak
|
|
238
|
-
// the tail into the output.
|
|
239
|
-
const linkRe = /\[([^\]]*)\]\(([^\s()]*(?:\([^\s()]*\)[^\s()]*)*)\)/g;
|
|
240
|
-
const extractLinkSigs = (line) => {
|
|
241
|
-
const sigs = [];
|
|
242
|
-
let m;
|
|
243
|
-
linkRe.lastIndex = 0;
|
|
244
|
-
while ((m = linkRe.exec(line)) !== null)
|
|
245
|
-
sigs.push(m[1] + '|' + m[2]);
|
|
246
|
-
return sigs;
|
|
247
|
-
};
|
|
248
|
-
let prevSigs = [];
|
|
249
|
-
for (const line of lines) {
|
|
250
|
-
const trimmed = line.trim();
|
|
251
|
-
if (fence.check(trimmed)) {
|
|
252
|
-
out.push(line);
|
|
253
|
-
prevSigs = [];
|
|
254
|
-
continue;
|
|
255
|
-
}
|
|
256
|
-
if (fence.inFence) {
|
|
257
|
-
out.push(line);
|
|
258
|
-
continue;
|
|
259
|
-
}
|
|
260
|
-
if (trimmed === '') {
|
|
261
|
-
out.push(line);
|
|
262
|
-
prevSigs = [];
|
|
263
|
-
continue;
|
|
264
|
-
}
|
|
265
|
-
const curSigs = extractLinkSigs(trimmed);
|
|
266
|
-
if (curSigs.length > 0 &&
|
|
267
|
-
curSigs.length === prevSigs.length &&
|
|
268
|
-
curSigs.every((s, idx) => s === prevSigs[idx])) {
|
|
269
|
-
continue;
|
|
270
|
-
}
|
|
271
|
-
// Also handle inline duplicates: [A](url) [A](url) on same line.
|
|
272
|
-
const seen = new Set();
|
|
273
|
-
const cleaned = line
|
|
274
|
-
.replace(/\[([^\]]*)\]\(([^\s()]*(?:\([^\s()]*\)[^\s()]*)*)\)/g, (match, label, url) => {
|
|
275
|
-
const sig = label + '|' + url;
|
|
276
|
-
if (seen.has(sig))
|
|
277
|
-
return '';
|
|
278
|
-
seen.add(sig);
|
|
279
|
-
return match;
|
|
280
|
-
})
|
|
281
|
-
.replace(/\s{2,}/g, ' ')
|
|
282
|
-
.trimEnd();
|
|
283
|
-
out.push(cleaned);
|
|
284
|
-
prevSigs = extractLinkSigs(cleaned.trim());
|
|
285
|
-
}
|
|
286
|
-
return out.join('\n');
|
|
287
|
-
};
|
|
288
|
-
// Suppress repeated images (same src, generic alt, threshold+ times).
|
|
289
|
-
export const suppressRepeatedImages = (text, config) => {
|
|
290
|
-
if (!config.suppressRepeatedImages)
|
|
291
|
-
return text;
|
|
292
|
-
const threshold = config.suppressRepeatedImageThreshold;
|
|
293
|
-
const lines = String(text || '').split('\n');
|
|
294
|
-
const imgRe = /^(\s*)!\[([^\]]*)\]\(([^)]+)\)\s*$/;
|
|
295
|
-
const srcCounts = new Map();
|
|
296
|
-
for (const line of lines) {
|
|
297
|
-
const m = line.match(imgRe);
|
|
298
|
-
if (m) {
|
|
299
|
-
const alt = m[2];
|
|
300
|
-
const src = m[3];
|
|
301
|
-
const isGeneric = !alt || alt === 'image' || alt === 'Image link';
|
|
302
|
-
if (isGeneric)
|
|
303
|
-
srcCounts.set(src, (srcCounts.get(src) || 0) + 1);
|
|
304
|
-
}
|
|
305
|
-
}
|
|
306
|
-
const srcSeen = new Map();
|
|
307
|
-
const out = [];
|
|
308
|
-
for (const line of lines) {
|
|
309
|
-
const m = line.match(imgRe);
|
|
310
|
-
if (m) {
|
|
311
|
-
const alt = m[2];
|
|
312
|
-
const src = m[3];
|
|
313
|
-
const isGeneric = !alt || alt === 'image' || alt === 'Image link';
|
|
314
|
-
if (isGeneric && (srcCounts.get(src) || 0) >= threshold) {
|
|
315
|
-
const seen = srcSeen.get(src) || 0;
|
|
316
|
-
srcSeen.set(src, seen + 1);
|
|
317
|
-
if (seen === 0) {
|
|
318
|
-
out.push(line);
|
|
319
|
-
out.push(`<!-- AI: this decorative image repeats ${srcCounts.get(src)} times; subsequent occurrences suppressed -->`);
|
|
320
|
-
}
|
|
321
|
-
continue;
|
|
322
|
-
}
|
|
323
|
-
}
|
|
324
|
-
out.push(line);
|
|
325
|
-
}
|
|
326
|
-
return out.join('\n');
|
|
327
|
-
};
|
|
328
|
-
export const compactLinkLabels = (text, config) => {
|
|
329
|
-
if (!config.compactLinkLabels)
|
|
330
|
-
return text;
|
|
331
|
-
const max = config.maxLinkLabelChars;
|
|
332
|
-
const fence = createFenceTracker();
|
|
333
|
-
const lines = String(text || '').split('\n');
|
|
334
|
-
const out = [];
|
|
335
|
-
for (const line of lines) {
|
|
336
|
-
const trimmed = line.trim();
|
|
337
|
-
if (fence.check(trimmed)) {
|
|
338
|
-
out.push(line);
|
|
339
|
-
continue;
|
|
340
|
-
}
|
|
341
|
-
if (fence.inFence) {
|
|
342
|
-
out.push(line);
|
|
343
|
-
continue;
|
|
344
|
-
}
|
|
345
|
-
out.push(line.replace(/\[([^\]]+)\]\(([^\s()]*(?:\([^\s()]*\)[^\s()]*)*)\)/g, (match, label, url) => {
|
|
346
|
-
if (label.length > max)
|
|
347
|
-
return `[${label.slice(0, max)}…](${url})`;
|
|
348
|
-
return match;
|
|
349
|
-
}));
|
|
350
|
-
}
|
|
351
|
-
return out.join('\n');
|
|
352
|
-
};
|
|
353
|
-
// Collapse repeated blocks (marquee/carousel loops): a sequence of N lines
|
|
354
|
-
// (N>=3) repeating K times (K>=2) consecutively keeps only the first copy.
|
|
355
|
-
export const dedupeRepeatedBlocks = (text) => {
|
|
356
|
-
const lines = String(text || '').split('\n');
|
|
357
|
-
const out = [];
|
|
358
|
-
const fence = createFenceTracker();
|
|
359
|
-
let i = 0;
|
|
360
|
-
while (i < lines.length) {
|
|
361
|
-
const trimmed = lines[i].trim();
|
|
362
|
-
if (fence.check(trimmed)) {
|
|
363
|
-
out.push(lines[i]);
|
|
364
|
-
i++;
|
|
365
|
-
continue;
|
|
366
|
-
}
|
|
367
|
-
if (fence.inFence) {
|
|
368
|
-
out.push(lines[i]);
|
|
369
|
-
i++;
|
|
370
|
-
continue;
|
|
371
|
-
}
|
|
372
|
-
let collapsed = false;
|
|
373
|
-
for (let blockSize = 3; blockSize <= 15 && i + blockSize * 2 <= lines.length; blockSize++) {
|
|
374
|
-
const block = lines.slice(i, i + blockSize).map((l) => l.trim()).join('\n');
|
|
375
|
-
if (!block || block.length < 10)
|
|
376
|
-
continue;
|
|
377
|
-
let repeats = 1;
|
|
378
|
-
let j = i + blockSize;
|
|
379
|
-
while (j + blockSize <= lines.length) {
|
|
380
|
-
const nextBlock = lines.slice(j, j + blockSize).map((l) => l.trim()).join('\n');
|
|
381
|
-
if (nextBlock === block) {
|
|
382
|
-
repeats++;
|
|
383
|
-
j += blockSize;
|
|
384
|
-
}
|
|
385
|
-
else
|
|
386
|
-
break;
|
|
387
|
-
}
|
|
388
|
-
if (repeats >= 2) {
|
|
389
|
-
for (let k = i; k < i + blockSize; k++)
|
|
390
|
-
out.push(lines[k]);
|
|
391
|
-
out.push(`<!-- AI: repeated block (${blockSize} lines × ${repeats} times) collapsed -->`);
|
|
392
|
-
i = j;
|
|
393
|
-
collapsed = true;
|
|
394
|
-
break;
|
|
395
|
-
}
|
|
396
|
-
}
|
|
397
|
-
if (!collapsed) {
|
|
398
|
-
out.push(lines[i]);
|
|
399
|
-
i++;
|
|
400
|
-
}
|
|
401
|
-
}
|
|
402
|
-
return out.join('\n');
|
|
403
|
-
};
|
|
404
|
-
// Remove tab panel content that also appears in the main flow.
|
|
405
|
-
export const dedupeTabPanelDuplicates = (text) => {
|
|
406
|
-
const lines = String(text || '').split('\n');
|
|
407
|
-
const normForDedup = (s) => s.trim().replace(/^#{1,6}\s+/, '').replace(/^[-*+]\s+/, '').replace(/^\d+\.\s+/, '').trim();
|
|
408
|
-
const panelTexts = [];
|
|
409
|
-
let inPanel = false;
|
|
410
|
-
let panelLines = [];
|
|
411
|
-
for (const line of lines) {
|
|
412
|
-
if (/<!-- AI: TAB PANEL START:/.test(line)) {
|
|
413
|
-
inPanel = true;
|
|
414
|
-
panelLines = [];
|
|
415
|
-
continue;
|
|
416
|
-
}
|
|
417
|
-
if (/<!-- AI: TAB PANEL END:/.test(line)) {
|
|
418
|
-
if (panelLines.length) {
|
|
419
|
-
const normalized = panelLines.map((l) => normForDedup(l)).filter(Boolean);
|
|
420
|
-
if (normalized.length >= 1)
|
|
421
|
-
panelTexts.push(new Set(normalized));
|
|
422
|
-
}
|
|
423
|
-
inPanel = false;
|
|
424
|
-
continue;
|
|
425
|
-
}
|
|
426
|
-
if (inPanel)
|
|
427
|
-
panelLines.push(line);
|
|
428
|
-
}
|
|
429
|
-
if (!panelTexts.length)
|
|
430
|
-
return text;
|
|
431
|
-
const out = [];
|
|
432
|
-
inPanel = false;
|
|
433
|
-
let matchBuffer = [];
|
|
434
|
-
let matchedPanelIdx = -1;
|
|
435
|
-
const flushMatch = () => {
|
|
436
|
-
if (matchBuffer.length >= 3 && matchedPanelIdx >= 0) {
|
|
437
|
-
out.push('<!-- AI: TAB PANEL CONTENT ALREADY EXPORTED ABOVE (deduplicated) -->');
|
|
438
|
-
}
|
|
439
|
-
else {
|
|
440
|
-
matchBuffer.forEach((l) => out.push(l));
|
|
441
|
-
}
|
|
442
|
-
matchBuffer = [];
|
|
443
|
-
matchedPanelIdx = -1;
|
|
444
|
-
};
|
|
445
|
-
for (const line of lines) {
|
|
446
|
-
if (/<!-- AI: TAB PANEL START:/.test(line)) {
|
|
447
|
-
flushMatch();
|
|
448
|
-
inPanel = true;
|
|
449
|
-
out.push(line);
|
|
450
|
-
continue;
|
|
451
|
-
}
|
|
452
|
-
if (/<!-- AI: TAB PANEL END:/.test(line)) {
|
|
453
|
-
inPanel = false;
|
|
454
|
-
out.push(line);
|
|
455
|
-
continue;
|
|
456
|
-
}
|
|
457
|
-
if (inPanel) {
|
|
458
|
-
out.push(line);
|
|
459
|
-
continue;
|
|
460
|
-
}
|
|
461
|
-
const trimmed = line.trim();
|
|
462
|
-
if (!trimmed) {
|
|
463
|
-
flushMatch();
|
|
464
|
-
out.push(line);
|
|
465
|
-
continue;
|
|
466
|
-
}
|
|
467
|
-
const norm = normForDedup(line);
|
|
468
|
-
let found = -1;
|
|
469
|
-
for (let p = 0; p < panelTexts.length; p++) {
|
|
470
|
-
if (panelTexts[p].has(norm)) {
|
|
471
|
-
found = p;
|
|
472
|
-
break;
|
|
473
|
-
}
|
|
474
|
-
}
|
|
475
|
-
if (found >= 0) {
|
|
476
|
-
if (matchBuffer.length === 0)
|
|
477
|
-
matchedPanelIdx = found;
|
|
478
|
-
if (matchedPanelIdx === found) {
|
|
479
|
-
matchBuffer.push(line);
|
|
480
|
-
}
|
|
481
|
-
else {
|
|
482
|
-
flushMatch();
|
|
483
|
-
matchBuffer.push(line);
|
|
484
|
-
matchedPanelIdx = found;
|
|
485
|
-
}
|
|
486
|
-
}
|
|
487
|
-
else {
|
|
488
|
-
flushMatch();
|
|
489
|
-
out.push(line);
|
|
490
|
-
}
|
|
491
|
-
}
|
|
492
|
-
flushMatch();
|
|
493
|
-
return out.join('\n');
|
|
494
|
-
};
|
|
495
|
-
export const aggressiveCleanup = (text, config, progress) => {
|
|
496
|
-
if (!config.aggressiveCleanup)
|
|
497
|
-
return text;
|
|
498
|
-
const lines = String(text || '').split('\n');
|
|
499
|
-
const out = [];
|
|
500
|
-
const fence = createFenceTracker();
|
|
501
|
-
const maxLT = config.aggressiveCleanupMaxLinkTextLength;
|
|
502
|
-
const htmlP = config.aggressiveCleanupHtmlTagPattern;
|
|
503
|
-
let sc = 0;
|
|
504
|
-
for (const line of lines) {
|
|
505
|
-
const trimmed = line.trim();
|
|
506
|
-
if (fence.check(trimmed)) {
|
|
507
|
-
out.push(line);
|
|
508
|
-
continue;
|
|
509
|
-
}
|
|
510
|
-
if (fence.inFence) {
|
|
511
|
-
out.push(line);
|
|
512
|
-
continue;
|
|
513
|
-
}
|
|
514
|
-
const cleaned = line.replace(/(\[)([^\]]*?)(\]\()([^\s()]*(?:\([^\s()]*\)[^\s()]*)*)(\))/g, (match, _o, lt, _m, url) => {
|
|
515
|
-
if (lt.length > maxLT || htmlP.test(lt)) {
|
|
516
|
-
sc++;
|
|
517
|
-
return `[link](${url})`;
|
|
518
|
-
}
|
|
519
|
-
return match;
|
|
520
|
-
});
|
|
521
|
-
out.push(cleaned);
|
|
522
|
-
}
|
|
523
|
-
if (sc > 0)
|
|
524
|
-
progress?.('postprocess', `aggressive cleanup stripped ${sc} link(s)`);
|
|
525
|
-
return out.join('\n');
|
|
526
|
-
};
|
|
527
|
-
// Full post-processing chain in prototype order (Section 41).
|
|
528
|
-
export const postProcessMarkdown = (text, config, progress) => {
|
|
529
|
-
let md = normalizeMarkdownPreserveCode(text);
|
|
530
|
-
md = dedupeConsecutiveDuplicateLines(md, config);
|
|
531
|
-
md = dedupeRepeatedBlocks(md);
|
|
532
|
-
md = dedupeTabPanelDuplicates(md);
|
|
533
|
-
md = collapseShortAdjacentLines(md, config);
|
|
534
|
-
md = cleanupPunctuation(md, config);
|
|
535
|
-
md = dedupeAdjacentLinks(md, config);
|
|
536
|
-
md = suppressRepeatedImages(md, config);
|
|
537
|
-
md = aggressiveCleanup(md, config, progress);
|
|
538
|
-
md = compactLinkLabels(md, config);
|
|
539
|
-
return md;
|
|
540
|
-
};
|
|
541
|
-
//# sourceMappingURL=md-postprocess.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"md-postprocess.js","sourceRoot":"","sources":["../../src/shared/md-postprocess.ts"],"names":[],"mappings":"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"}
|