marked-frontmatter 1.0.0 → 1.0.1
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/index.cjs +10 -14
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +10 -14
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/index.ts +17 -15
package/dist/index.cjs
CHANGED
|
@@ -52,21 +52,17 @@ var frontmatterExtension = {
|
|
|
52
52
|
name: "frontmatter",
|
|
53
53
|
level: "block",
|
|
54
54
|
start(src) {
|
|
55
|
-
|
|
56
|
-
return 0;
|
|
57
|
-
}
|
|
58
|
-
return void 0;
|
|
55
|
+
return src.startsWith("---") ? 0 : void 0;
|
|
59
56
|
},
|
|
60
|
-
tokenizer(src) {
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
}
|
|
69
|
-
return void 0;
|
|
57
|
+
tokenizer(src, tokens) {
|
|
58
|
+
if (tokens.length > 0) return void 0;
|
|
59
|
+
const match = src.match(/^---\s*\r?\n([\s\S]*?)\r?\n\s*---\s*(?:\r?\n|$)/);
|
|
60
|
+
if (!match) return void 0;
|
|
61
|
+
return {
|
|
62
|
+
type: "frontmatter",
|
|
63
|
+
raw: match[0],
|
|
64
|
+
text: match[1]
|
|
65
|
+
};
|
|
70
66
|
},
|
|
71
67
|
renderer(token) {
|
|
72
68
|
const escaped = token.text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { TokenizerExtension, RendererExtension } from 'marked'\nimport { load as parseYaml } from 'js-yaml'\nimport { renderJson, JsonValue } from 'json-to-frontmatter-html'\n\n/**\n * Parse frontmatter content as YAML or JSON.\n * If content starts with '{', parse as JSON; otherwise parse as YAML.\n */\nexport function parseFrontmatter(content: string): JsonValue {\n const trimmed = content.trim()\n if (trimmed.startsWith('{')) {\n return JSON.parse(trimmed)\n }\n return parseYaml(trimmed) as JsonValue\n}\n\n/**\n * Post-process rendered HTML to convert frontmatter placeholders to actual HTML.\n * Call this after marked.parse() completes and DOM is ready.\n */\nexport function renderFrontmatterBlocks(): void {\n const containers = document.querySelectorAll<HTMLElement>('.frontmatter-raw')\n\n for (const container of containers) {\n const content = container.textContent || ''\n if (!content.trim()) continue\n\n try {\n const data = parseFrontmatter(content)\n const html = renderJson(data)\n // Wrap in frontmatter-specific container for styling\n container.outerHTML = `<div class=\"frontmatter-container\">${html}</div>`\n } catch (error) {\n console.error('Failed to render frontmatter:', error)\n }\n }\n}\n\n/**\n * Marked extension that intercepts YAML/JSON frontmatter at the start of documents.\n * Use with: marked.use({ extensions: [frontmatterExtension] })\n */\nexport const frontmatterExtension: TokenizerExtension & RendererExtension = {\n name: 'frontmatter',\n level: 'block',\n start(src: string) {\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { TokenizerExtension, RendererExtension } from 'marked'\nimport { load as parseYaml } from 'js-yaml'\nimport { renderJson, JsonValue } from 'json-to-frontmatter-html'\n\n/**\n * Parse frontmatter content as YAML or JSON.\n * If content starts with '{', parse as JSON; otherwise parse as YAML.\n */\nexport function parseFrontmatter(content: string): JsonValue {\n const trimmed = content.trim()\n if (trimmed.startsWith('{')) {\n return JSON.parse(trimmed)\n }\n return parseYaml(trimmed) as JsonValue\n}\n\n/**\n * Post-process rendered HTML to convert frontmatter placeholders to actual HTML.\n * Call this after marked.parse() completes and DOM is ready.\n */\nexport function renderFrontmatterBlocks(): void {\n const containers = document.querySelectorAll<HTMLElement>('.frontmatter-raw')\n\n for (const container of containers) {\n const content = container.textContent || ''\n if (!content.trim()) continue\n\n try {\n const data = parseFrontmatter(content)\n const html = renderJson(data)\n // Wrap in frontmatter-specific container for styling\n container.outerHTML = `<div class=\"frontmatter-container\">${html}</div>`\n } catch (error) {\n console.error('Failed to render frontmatter:', error)\n }\n }\n}\n\n/**\n * Marked extension that intercepts YAML/JSON frontmatter at the start of documents.\n * Frontmatter is only recognized when the entire document starts with \"---\";\n * only the first block (until the next \"---\") is extracted.\n * Use with: marked.use({ extensions: [frontmatterExtension] })\n *\n * Note: marked passes the remaining source as `src` and the tokens produced so far as `tokens`.\n * We only match when no tokens exist yet (document start) so that later \"---\" blocks are not treated as frontmatter.\n */\nexport const frontmatterExtension: TokenizerExtension & RendererExtension = {\n name: 'frontmatter',\n level: 'block',\n start(src: string) {\n return src.startsWith('---') ? 0 : undefined\n },\n tokenizer(src: string, tokens: unknown[]) {\n // Only extract frontmatter at document start (no tokens yet). Later \"---\" blocks are body content.\n if (tokens.length > 0) return undefined\n\n const match = src.match(/^---\\s*\\r?\\n([\\s\\S]*?)\\r?\\n\\s*---\\s*(?:\\r?\\n|$)/)\n if (!match) return undefined\n\n return {\n type: 'frontmatter',\n raw: match[0],\n text: match[1],\n }\n },\n renderer(token) {\n // Escape HTML in the raw content\n const escaped = token.text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n return `<div class=\"frontmatter-raw\">${escaped}</div>\\n`\n },\n}\n\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,qBAAkC;AAClC,sCAAsC;AAM/B,SAAS,iBAAiB,SAA4B;AAC3D,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACA,aAAO,eAAAA,MAAU,OAAO;AAC1B;AAMO,SAAS,0BAAgC;AAC9C,QAAM,aAAa,SAAS,iBAA8B,kBAAkB;AAE5E,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,UAAU,eAAe;AACzC,QAAI,CAAC,QAAQ,KAAK,EAAG;AAErB,QAAI;AACF,YAAM,OAAO,iBAAiB,OAAO;AACrC,YAAM,WAAO,4CAAW,IAAI;AAE5B,gBAAU,YAAY,sCAAsC,IAAI;AAAA,IAClE,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AACF;AAWO,IAAM,uBAA+D;AAAA,EAC1E,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,KAAa;AACjB,WAAO,IAAI,WAAW,KAAK,IAAI,IAAI;AAAA,EACrC;AAAA,EACA,UAAU,KAAa,QAAmB;AAExC,QAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,UAAM,QAAQ,IAAI,MAAM,iDAAiD;AACzE,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,MAAM,CAAC;AAAA,MACZ,MAAM,MAAM,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,OAAO;AAEd,UAAM,UAAU,MAAM,KACnB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACvB,WAAO,gCAAgC,OAAO;AAAA;AAAA,EAChD;AACF;","names":["parseYaml"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -13,7 +13,12 @@ declare function parseFrontmatter(content: string): JsonValue;
|
|
|
13
13
|
declare function renderFrontmatterBlocks(): void;
|
|
14
14
|
/**
|
|
15
15
|
* Marked extension that intercepts YAML/JSON frontmatter at the start of documents.
|
|
16
|
+
* Frontmatter is only recognized when the entire document starts with "---";
|
|
17
|
+
* only the first block (until the next "---") is extracted.
|
|
16
18
|
* Use with: marked.use({ extensions: [frontmatterExtension] })
|
|
19
|
+
*
|
|
20
|
+
* Note: marked passes the remaining source as `src` and the tokens produced so far as `tokens`.
|
|
21
|
+
* We only match when no tokens exist yet (document start) so that later "---" blocks are not treated as frontmatter.
|
|
17
22
|
*/
|
|
18
23
|
declare const frontmatterExtension: TokenizerExtension & RendererExtension;
|
|
19
24
|
|
package/dist/index.d.ts
CHANGED
|
@@ -13,7 +13,12 @@ declare function parseFrontmatter(content: string): JsonValue;
|
|
|
13
13
|
declare function renderFrontmatterBlocks(): void;
|
|
14
14
|
/**
|
|
15
15
|
* Marked extension that intercepts YAML/JSON frontmatter at the start of documents.
|
|
16
|
+
* Frontmatter is only recognized when the entire document starts with "---";
|
|
17
|
+
* only the first block (until the next "---") is extracted.
|
|
16
18
|
* Use with: marked.use({ extensions: [frontmatterExtension] })
|
|
19
|
+
*
|
|
20
|
+
* Note: marked passes the remaining source as `src` and the tokens produced so far as `tokens`.
|
|
21
|
+
* We only match when no tokens exist yet (document start) so that later "---" blocks are not treated as frontmatter.
|
|
17
22
|
*/
|
|
18
23
|
declare const frontmatterExtension: TokenizerExtension & RendererExtension;
|
|
19
24
|
|
package/dist/index.js
CHANGED
|
@@ -26,21 +26,17 @@ var frontmatterExtension = {
|
|
|
26
26
|
name: "frontmatter",
|
|
27
27
|
level: "block",
|
|
28
28
|
start(src) {
|
|
29
|
-
|
|
30
|
-
return 0;
|
|
31
|
-
}
|
|
32
|
-
return void 0;
|
|
29
|
+
return src.startsWith("---") ? 0 : void 0;
|
|
33
30
|
},
|
|
34
|
-
tokenizer(src) {
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
43
|
-
return void 0;
|
|
31
|
+
tokenizer(src, tokens) {
|
|
32
|
+
if (tokens.length > 0) return void 0;
|
|
33
|
+
const match = src.match(/^---\s*\r?\n([\s\S]*?)\r?\n\s*---\s*(?:\r?\n|$)/);
|
|
34
|
+
if (!match) return void 0;
|
|
35
|
+
return {
|
|
36
|
+
type: "frontmatter",
|
|
37
|
+
raw: match[0],
|
|
38
|
+
text: match[1]
|
|
39
|
+
};
|
|
44
40
|
},
|
|
45
41
|
renderer(token) {
|
|
46
42
|
const escaped = token.text.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { TokenizerExtension, RendererExtension } from 'marked'\nimport { load as parseYaml } from 'js-yaml'\nimport { renderJson, JsonValue } from 'json-to-frontmatter-html'\n\n/**\n * Parse frontmatter content as YAML or JSON.\n * If content starts with '{', parse as JSON; otherwise parse as YAML.\n */\nexport function parseFrontmatter(content: string): JsonValue {\n const trimmed = content.trim()\n if (trimmed.startsWith('{')) {\n return JSON.parse(trimmed)\n }\n return parseYaml(trimmed) as JsonValue\n}\n\n/**\n * Post-process rendered HTML to convert frontmatter placeholders to actual HTML.\n * Call this after marked.parse() completes and DOM is ready.\n */\nexport function renderFrontmatterBlocks(): void {\n const containers = document.querySelectorAll<HTMLElement>('.frontmatter-raw')\n\n for (const container of containers) {\n const content = container.textContent || ''\n if (!content.trim()) continue\n\n try {\n const data = parseFrontmatter(content)\n const html = renderJson(data)\n // Wrap in frontmatter-specific container for styling\n container.outerHTML = `<div class=\"frontmatter-container\">${html}</div>`\n } catch (error) {\n console.error('Failed to render frontmatter:', error)\n }\n }\n}\n\n/**\n * Marked extension that intercepts YAML/JSON frontmatter at the start of documents.\n * Use with: marked.use({ extensions: [frontmatterExtension] })\n */\nexport const frontmatterExtension: TokenizerExtension & RendererExtension = {\n name: 'frontmatter',\n level: 'block',\n start(src: string) {\n
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"sourcesContent":["import type { TokenizerExtension, RendererExtension } from 'marked'\nimport { load as parseYaml } from 'js-yaml'\nimport { renderJson, JsonValue } from 'json-to-frontmatter-html'\n\n/**\n * Parse frontmatter content as YAML or JSON.\n * If content starts with '{', parse as JSON; otherwise parse as YAML.\n */\nexport function parseFrontmatter(content: string): JsonValue {\n const trimmed = content.trim()\n if (trimmed.startsWith('{')) {\n return JSON.parse(trimmed)\n }\n return parseYaml(trimmed) as JsonValue\n}\n\n/**\n * Post-process rendered HTML to convert frontmatter placeholders to actual HTML.\n * Call this after marked.parse() completes and DOM is ready.\n */\nexport function renderFrontmatterBlocks(): void {\n const containers = document.querySelectorAll<HTMLElement>('.frontmatter-raw')\n\n for (const container of containers) {\n const content = container.textContent || ''\n if (!content.trim()) continue\n\n try {\n const data = parseFrontmatter(content)\n const html = renderJson(data)\n // Wrap in frontmatter-specific container for styling\n container.outerHTML = `<div class=\"frontmatter-container\">${html}</div>`\n } catch (error) {\n console.error('Failed to render frontmatter:', error)\n }\n }\n}\n\n/**\n * Marked extension that intercepts YAML/JSON frontmatter at the start of documents.\n * Frontmatter is only recognized when the entire document starts with \"---\";\n * only the first block (until the next \"---\") is extracted.\n * Use with: marked.use({ extensions: [frontmatterExtension] })\n *\n * Note: marked passes the remaining source as `src` and the tokens produced so far as `tokens`.\n * We only match when no tokens exist yet (document start) so that later \"---\" blocks are not treated as frontmatter.\n */\nexport const frontmatterExtension: TokenizerExtension & RendererExtension = {\n name: 'frontmatter',\n level: 'block',\n start(src: string) {\n return src.startsWith('---') ? 0 : undefined\n },\n tokenizer(src: string, tokens: unknown[]) {\n // Only extract frontmatter at document start (no tokens yet). Later \"---\" blocks are body content.\n if (tokens.length > 0) return undefined\n\n const match = src.match(/^---\\s*\\r?\\n([\\s\\S]*?)\\r?\\n\\s*---\\s*(?:\\r?\\n|$)/)\n if (!match) return undefined\n\n return {\n type: 'frontmatter',\n raw: match[0],\n text: match[1],\n }\n },\n renderer(token) {\n // Escape HTML in the raw content\n const escaped = token.text\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n return `<div class=\"frontmatter-raw\">${escaped}</div>\\n`\n },\n}\n\n"],"mappings":";AACA,SAAS,QAAQ,iBAAiB;AAClC,SAAS,kBAA6B;AAM/B,SAAS,iBAAiB,SAA4B;AAC3D,QAAM,UAAU,QAAQ,KAAK;AAC7B,MAAI,QAAQ,WAAW,GAAG,GAAG;AAC3B,WAAO,KAAK,MAAM,OAAO;AAAA,EAC3B;AACA,SAAO,UAAU,OAAO;AAC1B;AAMO,SAAS,0BAAgC;AAC9C,QAAM,aAAa,SAAS,iBAA8B,kBAAkB;AAE5E,aAAW,aAAa,YAAY;AAClC,UAAM,UAAU,UAAU,eAAe;AACzC,QAAI,CAAC,QAAQ,KAAK,EAAG;AAErB,QAAI;AACF,YAAM,OAAO,iBAAiB,OAAO;AACrC,YAAM,OAAO,WAAW,IAAI;AAE5B,gBAAU,YAAY,sCAAsC,IAAI;AAAA,IAClE,SAAS,OAAO;AACd,cAAQ,MAAM,iCAAiC,KAAK;AAAA,IACtD;AAAA,EACF;AACF;AAWO,IAAM,uBAA+D;AAAA,EAC1E,MAAM;AAAA,EACN,OAAO;AAAA,EACP,MAAM,KAAa;AACjB,WAAO,IAAI,WAAW,KAAK,IAAI,IAAI;AAAA,EACrC;AAAA,EACA,UAAU,KAAa,QAAmB;AAExC,QAAI,OAAO,SAAS,EAAG,QAAO;AAE9B,UAAM,QAAQ,IAAI,MAAM,iDAAiD;AACzE,QAAI,CAAC,MAAO,QAAO;AAEnB,WAAO;AAAA,MACL,MAAM;AAAA,MACN,KAAK,MAAM,CAAC;AAAA,MACZ,MAAM,MAAM,CAAC;AAAA,IACf;AAAA,EACF;AAAA,EACA,SAAS,OAAO;AAEd,UAAM,UAAU,MAAM,KACnB,QAAQ,MAAM,OAAO,EACrB,QAAQ,MAAM,MAAM,EACpB,QAAQ,MAAM,MAAM;AACvB,WAAO,gCAAgC,OAAO;AAAA;AAAA,EAChD;AACF;","names":[]}
|
package/package.json
CHANGED
package/src/index.ts
CHANGED
|
@@ -38,29 +38,31 @@ export function renderFrontmatterBlocks(): void {
|
|
|
38
38
|
|
|
39
39
|
/**
|
|
40
40
|
* Marked extension that intercepts YAML/JSON frontmatter at the start of documents.
|
|
41
|
+
* Frontmatter is only recognized when the entire document starts with "---";
|
|
42
|
+
* only the first block (until the next "---") is extracted.
|
|
41
43
|
* Use with: marked.use({ extensions: [frontmatterExtension] })
|
|
44
|
+
*
|
|
45
|
+
* Note: marked passes the remaining source as `src` and the tokens produced so far as `tokens`.
|
|
46
|
+
* We only match when no tokens exist yet (document start) so that later "---" blocks are not treated as frontmatter.
|
|
42
47
|
*/
|
|
43
48
|
export const frontmatterExtension: TokenizerExtension & RendererExtension = {
|
|
44
49
|
name: 'frontmatter',
|
|
45
50
|
level: 'block',
|
|
46
51
|
start(src: string) {
|
|
47
|
-
|
|
48
|
-
if (src.match(/^---\r?\n/)) {
|
|
49
|
-
return 0
|
|
50
|
-
}
|
|
51
|
-
return undefined
|
|
52
|
+
return src.startsWith('---') ? 0 : undefined
|
|
52
53
|
},
|
|
53
|
-
tokenizer(src: string) {
|
|
54
|
-
//
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
54
|
+
tokenizer(src: string, tokens: unknown[]) {
|
|
55
|
+
// Only extract frontmatter at document start (no tokens yet). Later "---" blocks are body content.
|
|
56
|
+
if (tokens.length > 0) return undefined
|
|
57
|
+
|
|
58
|
+
const match = src.match(/^---\s*\r?\n([\s\S]*?)\r?\n\s*---\s*(?:\r?\n|$)/)
|
|
59
|
+
if (!match) return undefined
|
|
60
|
+
|
|
61
|
+
return {
|
|
62
|
+
type: 'frontmatter',
|
|
63
|
+
raw: match[0],
|
|
64
|
+
text: match[1],
|
|
62
65
|
}
|
|
63
|
-
return undefined
|
|
64
66
|
},
|
|
65
67
|
renderer(token) {
|
|
66
68
|
// Escape HTML in the raw content
|