accept-md-runtime 2.0.1 → 3.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/dist/handler.d.ts +10 -2
- package/dist/handler.d.ts.map +1 -1
- package/dist/handler.js +72 -2
- package/dist/handler.js.map +1 -1
- package/dist/markdown.d.ts +6 -3
- package/dist/markdown.d.ts.map +1 -1
- package/dist/markdown.js +294 -2
- package/dist/markdown.js.map +1 -1
- package/package.json +1 -1
package/dist/handler.d.ts
CHANGED
|
@@ -2,12 +2,20 @@
|
|
|
2
2
|
* Handler logic: fetch page HTML and return markdown. Used by generated route/API.
|
|
3
3
|
*/
|
|
4
4
|
import type { NextMarkdownConfig } from './types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Cache entry with expiration and build ID tracking.
|
|
7
|
+
*/
|
|
8
|
+
export interface CacheEntry {
|
|
9
|
+
markdown: string;
|
|
10
|
+
expiresAt?: number;
|
|
11
|
+
buildId?: string;
|
|
12
|
+
}
|
|
5
13
|
export interface GetMarkdownOptions {
|
|
6
14
|
pathname: string;
|
|
7
15
|
baseUrl: string;
|
|
8
16
|
config: NextMarkdownConfig;
|
|
9
|
-
/** In-memory cache (pathname ->
|
|
10
|
-
cache?: Map<string, string>;
|
|
17
|
+
/** In-memory cache (pathname -> CacheEntry or string for backward compatibility). Caller can pass a Map for caching. */
|
|
18
|
+
cache?: Map<string, CacheEntry | string>;
|
|
11
19
|
/** Optional headers to forward to the internal fetch (e.g., for Vercel deployment protection) */
|
|
12
20
|
headers?: HeadersInit;
|
|
13
21
|
}
|
package/dist/handler.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8BrD,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AA8BrD;;GAEG;AACH,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,kBAAkB;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,kBAAkB,CAAC;IAC3B,wHAAwH;IACxH,KAAK,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAAC,CAAC;IACzC,iGAAiG;IACjG,OAAO,CAAC,EAAE,WAAW,CAAC;CACvB;AAuCD;;GAEG;AACH,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,kBAAkB,GAAG,OAAO,CAAC,MAAM,CAAC,CAyIrF"}
|
package/dist/handler.js
CHANGED
|
@@ -33,6 +33,39 @@ function shouldExclude(pathname, config) {
|
|
|
33
33
|
return true;
|
|
34
34
|
return false;
|
|
35
35
|
}
|
|
36
|
+
/**
|
|
37
|
+
* Extract revalidation time from Next.js response headers.
|
|
38
|
+
*/
|
|
39
|
+
function extractRevalidationTime(res) {
|
|
40
|
+
// Check x-next-revalidate header (seconds)
|
|
41
|
+
const nextRevalidate = res.headers.get('x-next-revalidate');
|
|
42
|
+
if (nextRevalidate) {
|
|
43
|
+
const seconds = parseInt(nextRevalidate, 10);
|
|
44
|
+
if (!isNaN(seconds) && seconds > 0) {
|
|
45
|
+
return seconds;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// Check Cache-Control header for s-maxage or revalidate
|
|
49
|
+
const cacheControl = res.headers.get('cache-control');
|
|
50
|
+
if (cacheControl) {
|
|
51
|
+
// Match s-maxage=3600 or revalidate=3600
|
|
52
|
+
const sMaxAgeMatch = cacheControl.match(/s-maxage=(\d+)/i);
|
|
53
|
+
if (sMaxAgeMatch) {
|
|
54
|
+
return parseInt(sMaxAgeMatch[1], 10);
|
|
55
|
+
}
|
|
56
|
+
const revalidateMatch = cacheControl.match(/revalidate=(\d+)/i);
|
|
57
|
+
if (revalidateMatch) {
|
|
58
|
+
return parseInt(revalidateMatch[1], 10);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
return null;
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Calculate byte size of a string (UTF-8 encoding).
|
|
65
|
+
*/
|
|
66
|
+
function getByteSize(str) {
|
|
67
|
+
return new TextEncoder().encode(str).length;
|
|
68
|
+
}
|
|
36
69
|
/**
|
|
37
70
|
* Fetch the page at baseUrl + pathname (as HTML), convert to markdown, optionally cache.
|
|
38
71
|
*/
|
|
@@ -43,8 +76,31 @@ export async function getMarkdownForPath(options) {
|
|
|
43
76
|
throw new Error(`Path excluded from markdown: ${normalizedPath}`);
|
|
44
77
|
}
|
|
45
78
|
const cacheKey = normalizedPath;
|
|
79
|
+
// Check cache with expiration and build ID validation
|
|
46
80
|
if (config.cache !== false && cache?.has(cacheKey)) {
|
|
47
|
-
|
|
81
|
+
const cached = cache.get(cacheKey);
|
|
82
|
+
const currentBuildId = typeof process !== 'undefined' ? process.env.BUILD_ID : undefined;
|
|
83
|
+
// Backward compatibility: handle both CacheEntry and string (old format)
|
|
84
|
+
let entry;
|
|
85
|
+
if (typeof cached === 'string') {
|
|
86
|
+
// Old format: just a string
|
|
87
|
+
return cached;
|
|
88
|
+
}
|
|
89
|
+
else {
|
|
90
|
+
entry = cached;
|
|
91
|
+
}
|
|
92
|
+
// Invalidate if build changed
|
|
93
|
+
if (entry.buildId && entry.buildId !== currentBuildId) {
|
|
94
|
+
cache.delete(cacheKey);
|
|
95
|
+
}
|
|
96
|
+
else if (entry.expiresAt && Date.now() > entry.expiresAt) {
|
|
97
|
+
// Invalidate if expired
|
|
98
|
+
cache.delete(cacheKey);
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
// Cache hit - return cached markdown
|
|
102
|
+
return entry.markdown;
|
|
103
|
+
}
|
|
48
104
|
}
|
|
49
105
|
// Prefer the public/base URL first; only fall back to VERCEL_URL when needed.
|
|
50
106
|
const primaryOrigin = baseUrl.replace(/\/$/, '');
|
|
@@ -117,12 +173,26 @@ export async function getMarkdownForPath(options) {
|
|
|
117
173
|
throw new Error(`Failed to fetch page: ${message}`);
|
|
118
174
|
}
|
|
119
175
|
const html = await res.text();
|
|
176
|
+
// Extract revalidation time from response headers
|
|
177
|
+
const revalidateSeconds = extractRevalidationTime(res);
|
|
178
|
+
const expiresAt = revalidateSeconds ? Date.now() + revalidateSeconds * 1000 : undefined;
|
|
179
|
+
const buildId = typeof process !== 'undefined' ? process.env.BUILD_ID : undefined;
|
|
180
|
+
// Calculate sizes for debug mode
|
|
181
|
+
const htmlSize = getByteSize(html);
|
|
120
182
|
const md = htmlToMarkdown(html, {
|
|
121
183
|
cleanSelectors: config.cleanSelectors,
|
|
122
184
|
transformers: config.transformers,
|
|
185
|
+
debug: config.debug,
|
|
186
|
+
htmlSize: config.debug ? htmlSize : undefined,
|
|
123
187
|
});
|
|
188
|
+
// Store in cache with expiration and build ID
|
|
124
189
|
if (config.cache !== false && cache) {
|
|
125
|
-
|
|
190
|
+
const entry = {
|
|
191
|
+
markdown: md,
|
|
192
|
+
buildId,
|
|
193
|
+
expiresAt,
|
|
194
|
+
};
|
|
195
|
+
cache.set(cacheKey, entry);
|
|
126
196
|
}
|
|
127
197
|
return md;
|
|
128
198
|
}
|
package/dist/handler.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,SAAS,WAAW,CAAC,QAAgB,EAAE,QAAkB;IACvD,MAAM,IAAI,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,QAAQ,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;IAC3F,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IAC9C,KAAK,MAAM,CAAC,IAAI,QAAQ,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAClC,IAAI,CAAC,GAAG,CAAC,CAAC;QACV,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,IAAI,GAAG,KAAK,IAAI;gBAAE,OAAO,IAAI,CAAC;YAC9B,IAAI,CAAC,IAAI,KAAK,CAAC,MAAM;gBAAE,MAAM;YAC7B,IAAI,GAAG,KAAK,GAAG,IAAI,GAAG,KAAK,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;gBACpC,CAAC,EAAE,CAAC;gBACJ,SAAS;YACX,CAAC;YACD,MAAM;QACR,CAAC;QACD,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,KAAK,CAAC,MAAM;YAAE,OAAO,IAAI,CAAC;IAC3D,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,SAAS,aAAa,CAAC,QAAgB,EAAE,MAA0B;IACjE,IAAI,MAAM,CAAC,OAAO,EAAE,MAAM,IAAI,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;QAAE,OAAO,IAAI,CAAC;IACjF,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,OAAO,CAAC;QACvF,OAAO,IAAI,CAAC;IACd,OAAO,KAAK,CAAC;AACf,CAAC;
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../src/handler.ts"],"names":[],"mappings":"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"}
|
package/dist/markdown.d.ts
CHANGED
|
@@ -7,9 +7,12 @@ export interface MarkdownOptions {
|
|
|
7
7
|
codeBlockStyle?: 'indented' | 'fenced';
|
|
8
8
|
/** Custom transformers applied after conversion (md -> md) */
|
|
9
9
|
transformers?: Array<(md: string) => string>;
|
|
10
|
+
/** Include YAML frontmatter with extracted meta tags (default: true) */
|
|
11
|
+
includeFrontmatter?: boolean;
|
|
12
|
+
/** Enable debug mode to include size information in output (default: false) */
|
|
13
|
+
debug?: boolean;
|
|
14
|
+
/** HTML size in bytes (for debug mode). If not provided, will be calculated. */
|
|
15
|
+
htmlSize?: number;
|
|
10
16
|
}
|
|
11
|
-
/**
|
|
12
|
-
* Convert HTML to Markdown. Preserves headings, images, links, tables; strips scripts/styles.
|
|
13
|
-
*/
|
|
14
17
|
export declare function htmlToMarkdown(html: string, options?: MarkdownOptions): string;
|
|
15
18
|
//# sourceMappingURL=markdown.d.ts.map
|
package/dist/markdown.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAChC,cAAc,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACvC,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,MAAM,WAAW,eAAe;IAC9B,cAAc,CAAC,EAAE,MAAM,EAAE,CAAC;IAC1B,YAAY,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAChC,cAAc,CAAC,EAAE,UAAU,GAAG,QAAQ,CAAC;IACvC,8DAA8D;IAC9D,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC;IAC7C,wEAAwE;IACxE,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,+EAA+E;IAC/E,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gFAAgF;IAChF,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AA+UD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,MAAM,CA8DlF"}
|
package/dist/markdown.js
CHANGED
|
@@ -3,6 +3,227 @@
|
|
|
3
3
|
*/
|
|
4
4
|
import TurndownService from 'turndown';
|
|
5
5
|
import { parseHTML } from 'linkedom';
|
|
6
|
+
/**
|
|
7
|
+
* Extract meta tags and JSON-LD scripts from HTML in a single pass for performance.
|
|
8
|
+
* Returns both metadata and JSON-LD scripts.
|
|
9
|
+
*/
|
|
10
|
+
function extractMetadataAndJsonLd(html) {
|
|
11
|
+
const { document } = parseHTML(html);
|
|
12
|
+
const metadata = {};
|
|
13
|
+
const jsonLdScripts = [];
|
|
14
|
+
// Extract title
|
|
15
|
+
const titleEl = document.querySelector('title');
|
|
16
|
+
if (titleEl?.textContent) {
|
|
17
|
+
metadata.title = titleEl.textContent.trim();
|
|
18
|
+
}
|
|
19
|
+
// Extract language from html lang attribute
|
|
20
|
+
const htmlEl = document.documentElement;
|
|
21
|
+
const lang = htmlEl.getAttribute('lang');
|
|
22
|
+
if (lang) {
|
|
23
|
+
metadata.language = lang;
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
metadata.language = 'en'; // fallback
|
|
27
|
+
}
|
|
28
|
+
// Extract canonical link
|
|
29
|
+
const canonicalLink = document.querySelector('link[rel="canonical"]');
|
|
30
|
+
if (canonicalLink) {
|
|
31
|
+
const href = canonicalLink.getAttribute('href');
|
|
32
|
+
if (href) {
|
|
33
|
+
metadata.canonical = href;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Extract JSON-LD scripts
|
|
37
|
+
document.querySelectorAll('script[type="application/ld+json"]').forEach((script) => {
|
|
38
|
+
const content = script.textContent?.trim();
|
|
39
|
+
if (content) {
|
|
40
|
+
try {
|
|
41
|
+
const parsed = JSON.parse(content);
|
|
42
|
+
jsonLdScripts.push(JSON.stringify(parsed, null, 2));
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
// Invalid JSON, skip it
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
// Extract all meta tags
|
|
50
|
+
document.querySelectorAll('meta').forEach((meta) => {
|
|
51
|
+
const name = meta.getAttribute('name');
|
|
52
|
+
const property = meta.getAttribute('property');
|
|
53
|
+
const content = meta.getAttribute('content');
|
|
54
|
+
if (!content)
|
|
55
|
+
return;
|
|
56
|
+
// Basic meta tags (name attribute)
|
|
57
|
+
if (name) {
|
|
58
|
+
const nameLower = name.toLowerCase();
|
|
59
|
+
switch (nameLower) {
|
|
60
|
+
case 'description':
|
|
61
|
+
metadata.description = content;
|
|
62
|
+
break;
|
|
63
|
+
case 'keywords':
|
|
64
|
+
// Split comma-separated keywords into array
|
|
65
|
+
metadata.keywords = content.split(',').map((k) => k.trim()).filter(Boolean);
|
|
66
|
+
break;
|
|
67
|
+
case 'author':
|
|
68
|
+
metadata.author = content;
|
|
69
|
+
break;
|
|
70
|
+
case 'robots': {
|
|
71
|
+
// Parse robots directive (e.g., "index, follow" or "noindex, nofollow")
|
|
72
|
+
const robots = content.toLowerCase();
|
|
73
|
+
metadata.robots_index = !robots.includes('noindex');
|
|
74
|
+
metadata.robots_follow = !robots.includes('nofollow');
|
|
75
|
+
break;
|
|
76
|
+
}
|
|
77
|
+
default:
|
|
78
|
+
// Twitter card meta tags
|
|
79
|
+
if (name.startsWith('twitter:')) {
|
|
80
|
+
const field = name.replace('twitter:', '');
|
|
81
|
+
switch (field) {
|
|
82
|
+
case 'card':
|
|
83
|
+
metadata.twitter_card = content;
|
|
84
|
+
break;
|
|
85
|
+
case 'title':
|
|
86
|
+
metadata.twitter_title = content;
|
|
87
|
+
break;
|
|
88
|
+
case 'description':
|
|
89
|
+
metadata.twitter_description = content;
|
|
90
|
+
break;
|
|
91
|
+
case 'image':
|
|
92
|
+
metadata.twitter_image = content;
|
|
93
|
+
break;
|
|
94
|
+
case 'creator':
|
|
95
|
+
metadata.twitter_creator = content;
|
|
96
|
+
break;
|
|
97
|
+
case 'site':
|
|
98
|
+
metadata.twitter_site = content;
|
|
99
|
+
break;
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
break;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
// OpenGraph meta tags (property attribute)
|
|
106
|
+
if (property && property.startsWith('og:')) {
|
|
107
|
+
const field = property.replace('og:', '');
|
|
108
|
+
switch (field) {
|
|
109
|
+
case 'title':
|
|
110
|
+
metadata.og_title = content;
|
|
111
|
+
break;
|
|
112
|
+
case 'description':
|
|
113
|
+
metadata.og_description = content;
|
|
114
|
+
break;
|
|
115
|
+
case 'type':
|
|
116
|
+
metadata.og_type = content;
|
|
117
|
+
break;
|
|
118
|
+
case 'url':
|
|
119
|
+
metadata.og_url = content;
|
|
120
|
+
break;
|
|
121
|
+
case 'image':
|
|
122
|
+
metadata.og_image = content;
|
|
123
|
+
break;
|
|
124
|
+
case 'site_name':
|
|
125
|
+
metadata.og_site_name = content;
|
|
126
|
+
break;
|
|
127
|
+
case 'locale':
|
|
128
|
+
metadata.og_locale = content;
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
// Article meta tags (property attribute)
|
|
133
|
+
if (property && property.startsWith('article:')) {
|
|
134
|
+
const field = property.replace('article:', 'article_');
|
|
135
|
+
switch (field) {
|
|
136
|
+
case 'article_author':
|
|
137
|
+
metadata.article_author = content;
|
|
138
|
+
break;
|
|
139
|
+
case 'article_published_time':
|
|
140
|
+
metadata.article_published_time = content;
|
|
141
|
+
break;
|
|
142
|
+
case 'article_modified_time':
|
|
143
|
+
metadata.article_modified_time = content;
|
|
144
|
+
break;
|
|
145
|
+
case 'article_section':
|
|
146
|
+
metadata.article_section = content;
|
|
147
|
+
break;
|
|
148
|
+
case 'article_tag':
|
|
149
|
+
// Article tags can be multiple, collect them
|
|
150
|
+
if (!metadata.article_tag) {
|
|
151
|
+
metadata.article_tag = [];
|
|
152
|
+
}
|
|
153
|
+
metadata.article_tag.push(content);
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
});
|
|
158
|
+
return { metadata, jsonLdScripts };
|
|
159
|
+
}
|
|
160
|
+
/**
|
|
161
|
+
* Escape a string for YAML by quoting it.
|
|
162
|
+
*/
|
|
163
|
+
function escapeYamlString(value) {
|
|
164
|
+
// Always quote strings for consistency and to handle special characters
|
|
165
|
+
// Escape backslashes and quotes for YAML
|
|
166
|
+
const escaped = value.replace(/\\/g, '\\\\').replace(/"/g, '\\"');
|
|
167
|
+
return `"${escaped}"`;
|
|
168
|
+
}
|
|
169
|
+
/**
|
|
170
|
+
* Format metadata as YAML frontmatter.
|
|
171
|
+
*/
|
|
172
|
+
function formatYamlFrontmatter(metadata) {
|
|
173
|
+
const lines = ['---'];
|
|
174
|
+
// Helper to add a line if value exists
|
|
175
|
+
const addLine = (key, value) => {
|
|
176
|
+
if (value === undefined || value === null)
|
|
177
|
+
return;
|
|
178
|
+
if (typeof value === 'boolean') {
|
|
179
|
+
lines.push(`${key}: ${value}`);
|
|
180
|
+
}
|
|
181
|
+
else if (Array.isArray(value)) {
|
|
182
|
+
if (value.length > 0) {
|
|
183
|
+
lines.push(`${key}:`);
|
|
184
|
+
for (const item of value) {
|
|
185
|
+
lines.push(` - ${escapeYamlString(String(item))}`);
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else if (typeof value === 'string' && value.trim() !== '') {
|
|
190
|
+
lines.push(`${key}: ${escapeYamlString(value)}`);
|
|
191
|
+
}
|
|
192
|
+
};
|
|
193
|
+
// Add fields in a logical order
|
|
194
|
+
addLine('title', metadata.title);
|
|
195
|
+
addLine('description', metadata.description);
|
|
196
|
+
addLine('keywords', metadata.keywords);
|
|
197
|
+
addLine('author', metadata.author);
|
|
198
|
+
addLine('canonical', metadata.canonical);
|
|
199
|
+
addLine('language', metadata.language);
|
|
200
|
+
// OpenGraph
|
|
201
|
+
addLine('og_title', metadata.og_title);
|
|
202
|
+
addLine('og_description', metadata.og_description);
|
|
203
|
+
addLine('og_type', metadata.og_type);
|
|
204
|
+
addLine('og_url', metadata.og_url);
|
|
205
|
+
addLine('og_image', metadata.og_image);
|
|
206
|
+
addLine('og_site_name', metadata.og_site_name);
|
|
207
|
+
addLine('og_locale', metadata.og_locale);
|
|
208
|
+
// Article
|
|
209
|
+
addLine('article_author', metadata.article_author);
|
|
210
|
+
addLine('article_published_time', metadata.article_published_time);
|
|
211
|
+
addLine('article_modified_time', metadata.article_modified_time);
|
|
212
|
+
addLine('article_section', metadata.article_section);
|
|
213
|
+
addLine('article_tag', metadata.article_tag);
|
|
214
|
+
// Twitter
|
|
215
|
+
addLine('twitter_card', metadata.twitter_card);
|
|
216
|
+
addLine('twitter_title', metadata.twitter_title);
|
|
217
|
+
addLine('twitter_description', metadata.twitter_description);
|
|
218
|
+
addLine('twitter_image', metadata.twitter_image);
|
|
219
|
+
addLine('twitter_creator', metadata.twitter_creator);
|
|
220
|
+
addLine('twitter_site', metadata.twitter_site);
|
|
221
|
+
// Robots
|
|
222
|
+
addLine('robots_index', metadata.robots_index);
|
|
223
|
+
addLine('robots_follow', metadata.robots_follow);
|
|
224
|
+
lines.push('---');
|
|
225
|
+
return lines.join('\n') + '\n\n';
|
|
226
|
+
}
|
|
6
227
|
/**
|
|
7
228
|
* Parse HTML in Node (linkedom) and optionally remove nodes by selector before conversion.
|
|
8
229
|
*/
|
|
@@ -20,9 +241,53 @@ function cleanHtml(html, selectors) {
|
|
|
20
241
|
}
|
|
21
242
|
/**
|
|
22
243
|
* Convert HTML to Markdown. Preserves headings, images, links, tables; strips scripts/styles.
|
|
244
|
+
* Extracts and includes meta tags as YAML frontmatter and JSON-LD structured data as formatted JSON code blocks.
|
|
245
|
+
*
|
|
246
|
+
* @param html - The HTML string to convert to Markdown
|
|
247
|
+
* @param options - Conversion options
|
|
248
|
+
* @returns The converted Markdown string with optional YAML frontmatter
|
|
249
|
+
*
|
|
250
|
+
* @example
|
|
251
|
+
* ```typescript
|
|
252
|
+
* const html = `
|
|
253
|
+
* <html lang="en">
|
|
254
|
+
* <head>
|
|
255
|
+
* <title>My Page</title>
|
|
256
|
+
* <meta name="description" content="Page description" />
|
|
257
|
+
* <meta property="og:title" content="OG Title" />
|
|
258
|
+
* </head>
|
|
259
|
+
* <body><h1>Content</h1></body>
|
|
260
|
+
* </html>
|
|
261
|
+
* `;
|
|
262
|
+
* const markdown = htmlToMarkdown(html);
|
|
263
|
+
* // Returns:
|
|
264
|
+
* // ---
|
|
265
|
+
* // title: "My Page"
|
|
266
|
+
* // description: "Page description"
|
|
267
|
+
* // language: "en"
|
|
268
|
+
* // og_title: "OG Title"
|
|
269
|
+
* // ---
|
|
270
|
+
* //
|
|
271
|
+
* // # Content
|
|
272
|
+
* ```
|
|
273
|
+
*
|
|
274
|
+
* @example
|
|
275
|
+
* ```typescript
|
|
276
|
+
* // Disable frontmatter
|
|
277
|
+
* const markdown = htmlToMarkdown(html, { includeFrontmatter: false });
|
|
278
|
+
* // Returns just the markdown content without frontmatter
|
|
279
|
+
* ```
|
|
23
280
|
*/
|
|
281
|
+
/**
|
|
282
|
+
* Calculate byte size of a string (UTF-8 encoding).
|
|
283
|
+
*/
|
|
284
|
+
function getByteSize(str) {
|
|
285
|
+
return new TextEncoder().encode(str).length;
|
|
286
|
+
}
|
|
24
287
|
export function htmlToMarkdown(html, options = {}) {
|
|
25
|
-
const { cleanSelectors = ['nav', 'footer', '.no-markdown', '[data-no-markdown]', 'script', 'style'], headingStyle = 'atx', codeBlockStyle = 'fenced', transformers = [], } = options;
|
|
288
|
+
const { cleanSelectors = ['nav', 'footer', '.no-markdown', '[data-no-markdown]', 'script', 'style'], headingStyle = 'atx', codeBlockStyle = 'fenced', transformers = [], includeFrontmatter = true, debug = false, htmlSize, } = options;
|
|
289
|
+
// Single-pass extraction: get both metadata and JSON-LD scripts in one parse
|
|
290
|
+
const { metadata, jsonLdScripts } = extractMetadataAndJsonLd(html);
|
|
26
291
|
const cleaned = cleanHtml(html, cleanSelectors);
|
|
27
292
|
const service = new TurndownService({
|
|
28
293
|
headingStyle,
|
|
@@ -36,6 +301,33 @@ export function htmlToMarkdown(html, options = {}) {
|
|
|
36
301
|
for (const fn of transformers) {
|
|
37
302
|
md = fn(md);
|
|
38
303
|
}
|
|
39
|
-
|
|
304
|
+
// Prepend YAML frontmatter if enabled and we have any metadata
|
|
305
|
+
let result = '';
|
|
306
|
+
if (includeFrontmatter) {
|
|
307
|
+
const hasMetadata = Object.keys(metadata).some((key) => {
|
|
308
|
+
const value = metadata[key];
|
|
309
|
+
return value !== undefined && value !== null && value !== '';
|
|
310
|
+
});
|
|
311
|
+
if (hasMetadata) {
|
|
312
|
+
result = formatYamlFrontmatter(metadata);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
result += md;
|
|
316
|
+
// Add debug comment with size information if debug mode is enabled
|
|
317
|
+
if (debug) {
|
|
318
|
+
const htmlBytes = htmlSize ?? getByteSize(html);
|
|
319
|
+
const markdownBytes = getByteSize(result);
|
|
320
|
+
const reduction = htmlBytes > 0 ? Math.round(((htmlBytes - markdownBytes) / htmlBytes) * 100) : 0;
|
|
321
|
+
const debugComment = `<!-- accept-md: html_size=${htmlBytes} bytes, markdown_size=${markdownBytes} bytes, reduction=${reduction}% -->\n\n`;
|
|
322
|
+
result = debugComment + result;
|
|
323
|
+
}
|
|
324
|
+
// Append JSON-LD structured data as code blocks
|
|
325
|
+
if (jsonLdScripts.length > 0) {
|
|
326
|
+
result += '\n\n## Structured Data (JSON-LD)\n\n';
|
|
327
|
+
for (const jsonLd of jsonLdScripts) {
|
|
328
|
+
result += '```json\n' + jsonLd + '\n```\n\n';
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return result.trim();
|
|
40
332
|
}
|
|
41
333
|
//# sourceMappingURL=markdown.js.map
|
package/dist/markdown.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,eAAe,MAAM,UAAU,CAAC;AACvC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../src/markdown.ts"],"names":[],"mappings":"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"}
|