@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 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
@@ -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;
@@ -1 +1 @@
1
- {"version":3,"file":"view.d.ts","sourceRoot":"","sources":["../../src/view/view.ts"],"names":[],"mappings":"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"}
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 islandView = (views, islands, islandOccurrenceCounts, island) => {
128
- const occurrenceIndex = islandOccurrenceCounts.get(island.name) ?? 0;
129
- islandOccurrenceCounts.set(island.name, occurrenceIndex + 1);
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, islandOccurrenceCounts, block)), occurrenceIndex),
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, islandOccurrenceCounts, block) => Match.value(block).pipe(Match.withReturnType(), Match.tagsExhaustive({
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, islandOccurrenceCounts, child))))),
143
- Blockquote: blockquote => views.Blockquote(blockquote, Array.map(blockquote.blocks, child => blockView(views, islands, islandOccurrenceCounts, child))),
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, islandOccurrenceCounts, island),
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 islandOccurrenceCounts = new Map();
156
- return Array.map(document.blocks, block => blockView(views, islands, islandOccurrenceCounts, block));
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.f26af9919036",
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.f26af9919036",
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.f26af9919036"
49
+ "foldkit": "0.156.0-canary.ff1c88cd2f65"
50
50
  },
51
51
  "keywords": [
52
52
  "foldkit",