@foldkit/markdown 0.8.1-canary.f26af9919036 → 0.8.1-canary.ff1c88cd2f65
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 +4 -0
- package/dist/view/view.d.ts +4 -2
- package/dist/view/view.d.ts.map +1 -1
- package/dist/view/view.js +18 -11
- package/package.json +3 -3
package/README.md
CHANGED
|
@@ -65,10 +65,14 @@ Markdown.view(about, {
|
|
|
65
65
|
h.p([h.Class('leading-relaxed text-stone-700')], content),
|
|
66
66
|
Link: ({ url }, content) =>
|
|
67
67
|
h.a([h.Href(url), h.Class('underline underline-offset-2')], content),
|
|
68
|
+
CodeBlock: ({ value }, occurrenceIndex) =>
|
|
69
|
+
h.pre([h.Id(`code-${occurrenceIndex}`)], [h.code([], [value])]),
|
|
68
70
|
},
|
|
69
71
|
})
|
|
70
72
|
```
|
|
71
73
|
|
|
74
|
+
The `CodeBlock` view's second argument is its zero-based occurrence index in document order, for deriving stable per-instance identifiers.
|
|
75
|
+
|
|
72
76
|
`Markdown.viewBlocks` returns one `Html` per top-level block instead, for when the blocks should land directly inside your own container element.
|
|
73
77
|
|
|
74
78
|
## Islands
|
package/dist/view/view.d.ts
CHANGED
|
@@ -23,7 +23,9 @@ export type IslandViewsFor<Definitions extends IslandDefinitions> = Readonly<{
|
|
|
23
23
|
}>;
|
|
24
24
|
/**
|
|
25
25
|
* One view function per markdown node. Container nodes receive their already
|
|
26
|
-
* rendered content alongside the node itself.
|
|
26
|
+
* rendered content alongside the node itself. Code blocks additionally receive
|
|
27
|
+
* their zero-based occurrence index in document order so consumers can derive
|
|
28
|
+
* stable per-instance identifiers.
|
|
27
29
|
*/
|
|
28
30
|
export type Views = Readonly<{
|
|
29
31
|
Text: (text: Text) => Html | string;
|
|
@@ -36,7 +38,7 @@ export type Views = Readonly<{
|
|
|
36
38
|
Image: (image: Image) => Html;
|
|
37
39
|
Heading: (heading: Heading, content: InlineContent) => Html;
|
|
38
40
|
Paragraph: (paragraph: Paragraph, content: InlineContent) => Html;
|
|
39
|
-
CodeBlock: (codeBlock: CodeBlock) => Html;
|
|
41
|
+
CodeBlock: (codeBlock: CodeBlock, occurrenceIndex: number) => Html;
|
|
40
42
|
List: (list: List, items: ReadonlyArray<Html>) => Html;
|
|
41
43
|
ListItem: (listItem: ListItem, blocks: ReadonlyArray<Html>) => Html;
|
|
42
44
|
Blockquote: (blockquote: Blockquote, blocks: ReadonlyArray<Html>) => Html;
|
package/dist/view/view.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/view/view.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,IAAI,EAAmB,MAAM,cAAc,CAAA;AAEpD,OAAO,EACL,SAAS,EAET,UAAU,EACV,SAAS,EACT,QAAQ,EACR,SAAS,EACT,OAAO,EACP,KAAK,EAEL,UAAU,EAEV,IAAI,EACJ,IAAI,EACJ,QAAQ,EACR,gBAAgB,EAChB,SAAS,EACT,aAAa,EACb,MAAM,EACN,KAAK,EACL,SAAS,EACT,QAAQ,EACR,IAAI,EACJ,aAAa,EACd,MAAM,iBAAiB,CAAA;AACxB,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAA;AAE3D,kEAAkE;AAClE,MAAM,MAAM,aAAa,GAAG,aAAa,CAAC,IAAI,GAAG,MAAM,CAAC,CAAA;AAExD;;;;;;GAMG;AACH,MAAM,MAAM,UAAU,GAAG,CACvB,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,EACvD,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAC5B,eAAe,EAAE,MAAM,KACpB,IAAI,CAAA;AAET,sCAAsC;AACtC,MAAM,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAA;AAErE;;;;GAIG;AACH,MAAM,MAAM,cAAc,CAAC,WAAW,SAAS,iBAAiB,IAAI,QAAQ,CAAC;KAC1E,IAAI,IAAI,MAAM,WAAW,GAAG,CAC3B,UAAU,EAAE,WAAW,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,EACrC,OAAO,EAAE,aAAa,CAAC,IAAI,CAAC,EAC5B,eAAe,EAAE,MAAM,KACpB,IAAI;CACV,CAAC,CAAA;AAEF
|
|
1
|
+
{"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/view/view.ts"],"names":[],"mappings":"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"}
|
package/dist/view/view.js
CHANGED
|
@@ -124,26 +124,30 @@ const warnMissingIslandOnce = (islandName) => {
|
|
|
124
124
|
'Add it to the islands record passed to Markdown.view.');
|
|
125
125
|
}
|
|
126
126
|
};
|
|
127
|
-
const
|
|
128
|
-
const occurrenceIndex =
|
|
129
|
-
|
|
127
|
+
const nextOccurrenceIndex = (occurrenceCounts, key) => {
|
|
128
|
+
const occurrenceIndex = occurrenceCounts.get(key) ?? 0;
|
|
129
|
+
occurrenceCounts.set(key, occurrenceIndex + 1);
|
|
130
|
+
return occurrenceIndex;
|
|
131
|
+
};
|
|
132
|
+
const islandView = (views, islands, viewState, island) => {
|
|
133
|
+
const occurrenceIndex = nextOccurrenceIndex(viewState.islandOccurrenceCounts, island.name);
|
|
130
134
|
return Option.match(Record.get(islands, island.name), {
|
|
131
135
|
onNone: () => {
|
|
132
136
|
warnMissingIslandOnce(island.name);
|
|
133
137
|
return null;
|
|
134
138
|
},
|
|
135
|
-
onSome: renderIsland => renderIsland(island.attributes, Array.map(island.blocks, block => blockView(views, islands,
|
|
139
|
+
onSome: renderIsland => renderIsland(island.attributes, Array.map(island.blocks, block => blockView(views, islands, viewState, block)), occurrenceIndex),
|
|
136
140
|
});
|
|
137
141
|
};
|
|
138
|
-
const blockView = (views, islands,
|
|
142
|
+
const blockView = (views, islands, viewState, block) => Match.value(block).pipe(Match.withReturnType(), Match.tagsExhaustive({
|
|
139
143
|
Heading: heading => views.Heading(heading, inlineContent(views, heading.content)),
|
|
140
144
|
Paragraph: paragraph => views.Paragraph(paragraph, inlineContent(views, paragraph.content)),
|
|
141
|
-
CodeBlock: views.CodeBlock,
|
|
142
|
-
List: list => views.List(list, Array.map(list.items, item => views.ListItem(item, Array.map(item.blocks, child => blockView(views, islands,
|
|
143
|
-
Blockquote: blockquote => views.Blockquote(blockquote, Array.map(blockquote.blocks, child => blockView(views, islands,
|
|
145
|
+
CodeBlock: codeBlock => views.CodeBlock(codeBlock, nextOccurrenceIndex(viewState.blockOccurrenceCounts, codeBlock._tag)),
|
|
146
|
+
List: list => views.List(list, Array.map(list.items, item => views.ListItem(item, Array.map(item.blocks, child => blockView(views, islands, viewState, child))))),
|
|
147
|
+
Blockquote: blockquote => views.Blockquote(blockquote, Array.map(blockquote.blocks, child => blockView(views, islands, viewState, child))),
|
|
144
148
|
ThematicBreak: views.ThematicBreak,
|
|
145
149
|
Table: table => views.Table(table, tableRowView(views, table, table.headerRow, true), Array.map(table.bodyRows, row => tableRowView(views, table, row, false))),
|
|
146
|
-
Island: island => islandView(views, islands,
|
|
150
|
+
Island: island => islandView(views, islands, viewState, island),
|
|
147
151
|
}));
|
|
148
152
|
/**
|
|
149
153
|
* Folds a document into one Html node per top-level block. Use this when the
|
|
@@ -152,8 +156,11 @@ const blockView = (views, islands, islandOccurrenceCounts, block) => Match.value
|
|
|
152
156
|
export const viewBlocks = (document, config = {}) => {
|
|
153
157
|
const views = { ...defaultViews, ...config.views };
|
|
154
158
|
const islands = config.islands ?? {};
|
|
155
|
-
const
|
|
156
|
-
|
|
159
|
+
const viewState = {
|
|
160
|
+
islandOccurrenceCounts: new Map(),
|
|
161
|
+
blockOccurrenceCounts: new Map(),
|
|
162
|
+
};
|
|
163
|
+
return Array.map(document.blocks, block => blockView(views, islands, viewState, block));
|
|
157
164
|
};
|
|
158
165
|
/**
|
|
159
166
|
* Folds a document into a single Html tree. Every node renders through
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@foldkit/markdown",
|
|
3
|
-
"version": "0.8.1-canary.
|
|
3
|
+
"version": "0.8.1-canary.ff1c88cd2f65",
|
|
4
4
|
"description": "Write markdown files, get Foldkit views with live islands.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
],
|
|
27
27
|
"peerDependencies": {
|
|
28
28
|
"effect": "4.0.0-rc.112",
|
|
29
|
-
"foldkit": "0.156.0-canary.
|
|
29
|
+
"foldkit": "0.156.0-canary.ff1c88cd2f65",
|
|
30
30
|
"vite": "^7.0.0 || ^8.0.0"
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"typescript": "^7.0.2",
|
|
47
47
|
"vite": "^8.2.2",
|
|
48
48
|
"vitest": "^4.1.11",
|
|
49
|
-
"foldkit": "0.156.0-canary.
|
|
49
|
+
"foldkit": "0.156.0-canary.ff1c88cd2f65"
|
|
50
50
|
},
|
|
51
51
|
"keywords": [
|
|
52
52
|
"foldkit",
|