@blankdotpage/cake 0.1.7 → 0.1.10

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.
Files changed (147) hide show
  1. package/dist/cake/clipboard.d.ts +1 -0
  2. package/dist/cake/clipboard.d.ts.map +1 -0
  3. package/dist/cake/clipboard.js +391 -0
  4. package/dist/cake/core/mapping/cursor-source-map.d.ts +1 -0
  5. package/dist/cake/core/mapping/cursor-source-map.d.ts.map +1 -0
  6. package/dist/cake/core/mapping/cursor-source-map.js +146 -0
  7. package/dist/cake/core/runtime.d.ts +3 -0
  8. package/dist/cake/core/runtime.d.ts.map +1 -0
  9. package/dist/cake/core/runtime.js +1758 -0
  10. package/dist/cake/core/types.d.ts +1 -0
  11. package/dist/cake/core/types.d.ts.map +1 -0
  12. package/dist/cake/core/types.js +1 -0
  13. package/dist/cake/dom/dom-map.d.ts +1 -0
  14. package/dist/cake/dom/dom-map.d.ts.map +1 -0
  15. package/dist/cake/dom/dom-map.js +151 -0
  16. package/dist/cake/dom/dom-selection.d.ts +1 -0
  17. package/dist/cake/dom/dom-selection.d.ts.map +1 -0
  18. package/dist/cake/dom/dom-selection.js +216 -0
  19. package/dist/cake/dom/render.d.ts +1 -0
  20. package/dist/cake/dom/render.d.ts.map +1 -0
  21. package/dist/cake/dom/render.js +470 -0
  22. package/dist/cake/dom/types.d.ts +1 -0
  23. package/dist/cake/dom/types.d.ts.map +1 -0
  24. package/dist/cake/dom/types.js +1 -0
  25. package/dist/cake/engine/cake-engine.d.ts +1 -0
  26. package/dist/cake/engine/cake-engine.d.ts.map +1 -0
  27. package/dist/cake/engine/cake-engine.js +3589 -0
  28. package/dist/cake/engine/selection/selection-geometry-dom.d.ts +1 -0
  29. package/dist/cake/engine/selection/selection-geometry-dom.d.ts.map +1 -0
  30. package/dist/cake/engine/selection/selection-geometry-dom.js +302 -0
  31. package/dist/cake/engine/selection/selection-geometry.d.ts +1 -0
  32. package/dist/cake/engine/selection/selection-geometry.d.ts.map +1 -0
  33. package/dist/cake/engine/selection/selection-geometry.js +158 -0
  34. package/dist/cake/engine/selection/selection-layout-dom.d.ts +1 -0
  35. package/dist/cake/engine/selection/selection-layout-dom.d.ts.map +1 -0
  36. package/dist/cake/engine/selection/selection-layout-dom.js +781 -0
  37. package/dist/cake/engine/selection/selection-layout.d.ts +1 -0
  38. package/dist/cake/engine/selection/selection-layout.d.ts.map +1 -0
  39. package/dist/cake/engine/selection/selection-layout.js +128 -0
  40. package/dist/cake/engine/selection/selection-navigation.d.ts +1 -0
  41. package/dist/cake/engine/selection/selection-navigation.d.ts.map +1 -0
  42. package/dist/cake/engine/selection/selection-navigation.js +229 -0
  43. package/dist/cake/engine/selection/visible-text.d.ts +1 -0
  44. package/dist/cake/engine/selection/visible-text.d.ts.map +1 -0
  45. package/dist/cake/engine/selection/visible-text.js +66 -0
  46. package/dist/cake/extensions/blockquote/blockquote.d.ts +1 -0
  47. package/dist/cake/extensions/blockquote/blockquote.d.ts.map +1 -0
  48. package/dist/cake/extensions/blockquote/blockquote.js +177 -0
  49. package/dist/cake/extensions/blockquote/index.d.ts +2 -0
  50. package/dist/cake/extensions/blockquote/index.d.ts.map +1 -0
  51. package/dist/cake/extensions/blockquote/index.js +1 -0
  52. package/dist/cake/extensions/bold/bold.d.ts +1 -0
  53. package/dist/cake/extensions/bold/bold.d.ts.map +1 -0
  54. package/dist/cake/extensions/bold/bold.js +113 -0
  55. package/dist/cake/extensions/bold/index.d.ts +2 -0
  56. package/dist/cake/extensions/bold/index.d.ts.map +1 -0
  57. package/dist/cake/extensions/bold/index.js +1 -0
  58. package/dist/cake/extensions/bundles.d.ts +1 -0
  59. package/dist/cake/extensions/bundles.d.ts.map +1 -0
  60. package/dist/cake/extensions/bundles.js +12 -0
  61. package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts +1 -0
  62. package/dist/cake/extensions/combined-emphasis/combined-emphasis.d.ts.map +1 -0
  63. package/dist/cake/extensions/combined-emphasis/combined-emphasis.js +42 -0
  64. package/dist/cake/extensions/combined-emphasis/index.d.ts +2 -0
  65. package/dist/cake/extensions/combined-emphasis/index.d.ts.map +1 -0
  66. package/dist/cake/extensions/combined-emphasis/index.js +1 -0
  67. package/dist/cake/extensions/heading/heading.d.ts +1 -0
  68. package/dist/cake/extensions/heading/heading.d.ts.map +1 -0
  69. package/dist/cake/extensions/heading/heading.js +337 -0
  70. package/dist/cake/extensions/heading/index.d.ts +2 -0
  71. package/dist/cake/extensions/heading/index.d.ts.map +1 -0
  72. package/dist/cake/extensions/heading/index.js +1 -0
  73. package/dist/cake/extensions/image/image.d.ts +1 -0
  74. package/dist/cake/extensions/image/image.d.ts.map +1 -0
  75. package/dist/cake/extensions/image/image.js +120 -0
  76. package/dist/cake/extensions/image/index.d.ts +2 -0
  77. package/dist/cake/extensions/image/index.d.ts.map +1 -0
  78. package/dist/cake/extensions/image/index.js +1 -0
  79. package/dist/cake/extensions/index.d.ts +2 -2
  80. package/dist/cake/extensions/index.d.ts.map +1 -0
  81. package/dist/cake/extensions/index.js +25 -0
  82. package/dist/cake/extensions/italic/index.d.ts +2 -0
  83. package/dist/cake/extensions/italic/index.d.ts.map +1 -0
  84. package/dist/cake/extensions/italic/index.js +1 -0
  85. package/dist/cake/extensions/italic/italic.d.ts +1 -0
  86. package/dist/cake/extensions/italic/italic.d.ts.map +1 -0
  87. package/dist/cake/extensions/italic/italic.js +91 -0
  88. package/dist/cake/extensions/link/index.d.ts +2 -0
  89. package/dist/cake/extensions/link/index.d.ts.map +1 -0
  90. package/dist/cake/extensions/link/index.js +1 -0
  91. package/dist/cake/extensions/link/link-popover.d.ts +1 -0
  92. package/dist/cake/extensions/link/link-popover.d.ts.map +1 -0
  93. package/dist/cake/extensions/link/link-popover.js +205 -0
  94. package/dist/cake/extensions/link/link.d.ts +1 -0
  95. package/dist/cake/extensions/link/link.d.ts.map +1 -0
  96. package/dist/cake/extensions/link/link.js +202 -0
  97. package/dist/cake/extensions/list/index.d.ts +2 -0
  98. package/dist/cake/extensions/list/index.d.ts.map +1 -0
  99. package/dist/cake/extensions/list/index.js +1 -0
  100. package/dist/cake/extensions/list/list-ast.d.ts +1 -0
  101. package/dist/cake/extensions/list/list-ast.d.ts.map +1 -0
  102. package/dist/cake/extensions/list/list-ast.js +248 -0
  103. package/dist/cake/extensions/list/list.d.ts +1 -0
  104. package/dist/cake/extensions/list/list.d.ts.map +1 -0
  105. package/dist/cake/extensions/list/list.js +859 -0
  106. package/dist/cake/extensions/scrollbar/index.d.ts +1 -0
  107. package/dist/cake/extensions/scrollbar/index.d.ts.map +1 -0
  108. package/dist/cake/extensions/scrollbar/index.js +216 -0
  109. package/dist/cake/extensions/strikethrough/index.d.ts +2 -0
  110. package/dist/cake/extensions/strikethrough/index.d.ts.map +1 -0
  111. package/dist/cake/extensions/strikethrough/index.js +1 -0
  112. package/dist/cake/extensions/strikethrough/strikethrough.d.ts +1 -0
  113. package/dist/cake/extensions/strikethrough/strikethrough.d.ts.map +1 -0
  114. package/dist/cake/extensions/strikethrough/strikethrough.js +84 -0
  115. package/dist/cake/extensions/types.d.ts +1 -0
  116. package/dist/cake/extensions/types.d.ts.map +1 -0
  117. package/dist/cake/extensions/types.js +1 -0
  118. package/dist/cake/index.d.ts +1 -0
  119. package/dist/cake/index.d.ts.map +1 -0
  120. package/dist/cake/index.js +1 -0
  121. package/dist/cake/react/CakeEditor.d.ts +1 -0
  122. package/dist/cake/react/CakeEditor.d.ts.map +1 -0
  123. package/dist/cake/react/CakeEditor.js +233 -0
  124. package/dist/cake/shared/platform.d.ts +1 -0
  125. package/dist/cake/shared/platform.d.ts.map +1 -0
  126. package/dist/cake/shared/platform.js +19 -0
  127. package/dist/cake/shared/segmenter.d.ts +1 -0
  128. package/dist/cake/shared/segmenter.d.ts.map +1 -0
  129. package/dist/cake/shared/segmenter.js +46 -0
  130. package/dist/cake/shared/url.d.ts +1 -0
  131. package/dist/cake/shared/url.d.ts.map +1 -0
  132. package/dist/cake/shared/url.js +37 -0
  133. package/dist/cake/shared/word-break.d.ts +1 -0
  134. package/dist/cake/shared/word-break.d.ts.map +1 -0
  135. package/dist/cake/shared/word-break.js +178 -0
  136. package/dist/cake/test/harness.d.ts +1 -0
  137. package/dist/cake/test/harness.d.ts.map +1 -0
  138. package/dist/cake/test/harness.js +504 -0
  139. package/dist/codemirror/markdown-commands.d.ts +1 -0
  140. package/dist/codemirror/markdown-commands.d.ts.map +1 -0
  141. package/dist/codemirror/markdown-commands.js +532 -0
  142. package/dist/index.d.ts +1 -0
  143. package/dist/index.d.ts.map +1 -0
  144. package/dist/index.js +3 -11740
  145. package/package.json +8 -6
  146. package/dist/cake/extensions/pipe-link/pipe-link.d.ts +0 -1
  147. package/dist/index.cjs +0 -11740
@@ -0,0 +1,470 @@
1
+ import { createDomMap, createTextRun as createTextRunBase, } from "./dom-map";
2
+ function normalizeNodes(result) {
3
+ if (!result) {
4
+ return [];
5
+ }
6
+ return Array.isArray(result) ? result : [result];
7
+ }
8
+ export function renderDocContent(doc, extensions, root) {
9
+ const runs = [];
10
+ let cursorOffset = 0;
11
+ let lineIndex = 0;
12
+ function createTextRun(node) {
13
+ const run = createTextRunBase(node, cursorOffset);
14
+ cursorOffset = run.cursorEnd;
15
+ runs.push(run);
16
+ return run;
17
+ }
18
+ const context = {
19
+ renderInline,
20
+ renderBlock,
21
+ renderBlocks,
22
+ createTextRun,
23
+ getLineIndex: () => lineIndex,
24
+ incrementLineIndex: () => {
25
+ lineIndex += 1;
26
+ },
27
+ };
28
+ function getBlockKey(block) {
29
+ if (block.type === "paragraph") {
30
+ return "paragraph";
31
+ }
32
+ if (block.type === "block-wrapper") {
33
+ return `block-wrapper:${block.kind}`;
34
+ }
35
+ if (block.type === "block-atom") {
36
+ return `block-atom:${block.kind}`;
37
+ }
38
+ return "unknown";
39
+ }
40
+ function getElementKey(element) {
41
+ if (element.classList.contains("cake-line")) {
42
+ if (element.hasAttribute("data-block-atom")) {
43
+ return `block-atom:${element.getAttribute("data-block-atom")}`;
44
+ }
45
+ return "paragraph";
46
+ }
47
+ if (element.hasAttribute("data-block-wrapper")) {
48
+ return `block-wrapper:${element.getAttribute("data-block-wrapper")}`;
49
+ }
50
+ if (element.hasAttribute("data-block-atom")) {
51
+ return `block-atom:${element.getAttribute("data-block-atom")}`;
52
+ }
53
+ return "unknown";
54
+ }
55
+ function getInlineKey(inline) {
56
+ if (inline.type === "text") {
57
+ return "text";
58
+ }
59
+ if (inline.type === "inline-wrapper") {
60
+ return `inline-wrapper:${inline.kind}`;
61
+ }
62
+ if (inline.type === "inline-atom") {
63
+ return `inline-atom:${inline.kind}`;
64
+ }
65
+ return "unknown";
66
+ }
67
+ function getInlineElementKey(element) {
68
+ if (element.classList.contains("cake-text")) {
69
+ return "text";
70
+ }
71
+ for (const cls of Array.from(element.classList)) {
72
+ if (cls.startsWith("cake-inline--")) {
73
+ return `inline-wrapper:${cls.slice("cake-inline--".length)}`;
74
+ }
75
+ if (cls.startsWith("cake-inline-atom--")) {
76
+ return `inline-atom:${cls.slice("cake-inline-atom--".length)}`;
77
+ }
78
+ }
79
+ return "unknown";
80
+ }
81
+ function reconcileInline(inline, existing) {
82
+ for (const extension of extensions) {
83
+ const render = extension.renderInline;
84
+ if (!render) {
85
+ continue;
86
+ }
87
+ const result = render(inline, context);
88
+ if (result) {
89
+ return normalizeNodes(result);
90
+ }
91
+ }
92
+ if (inline.type === "text") {
93
+ const canReuse = existing &&
94
+ existing instanceof HTMLSpanElement &&
95
+ getInlineElementKey(existing) === "text";
96
+ if (canReuse) {
97
+ const textNode = existing.firstChild;
98
+ if (textNode instanceof Text) {
99
+ if (textNode.textContent !== inline.text) {
100
+ textNode.textContent = inline.text;
101
+ }
102
+ createTextRun(textNode);
103
+ return [existing];
104
+ }
105
+ }
106
+ const element = document.createElement("span");
107
+ element.className = "cake-text";
108
+ const node = document.createTextNode(inline.text);
109
+ createTextRun(node);
110
+ element.append(node);
111
+ return [element];
112
+ }
113
+ if (inline.type === "inline-wrapper") {
114
+ const canReuse = existing &&
115
+ existing instanceof HTMLSpanElement &&
116
+ getInlineElementKey(existing) === getInlineKey(inline);
117
+ if (canReuse) {
118
+ existing.removeAttribute("data-inline");
119
+ existing.classList.add("cake-inline", `cake-inline--${inline.kind}`);
120
+ reconcileInlineChildren(existing, inline.children);
121
+ return [existing];
122
+ }
123
+ const element = document.createElement("span");
124
+ element.classList.add("cake-inline", `cake-inline--${inline.kind}`);
125
+ for (const child of inline.children) {
126
+ for (const node of reconcileInline(child, null)) {
127
+ element.append(node);
128
+ }
129
+ }
130
+ return [element];
131
+ }
132
+ if (inline.type === "inline-atom") {
133
+ const canReuse = existing &&
134
+ existing instanceof HTMLSpanElement &&
135
+ getInlineElementKey(existing) === getInlineKey(inline);
136
+ if (canReuse) {
137
+ existing.removeAttribute("data-inline-atom");
138
+ existing.classList.add("cake-inline-atom", `cake-inline-atom--${inline.kind}`);
139
+ const textNode = existing.firstChild;
140
+ if (textNode instanceof Text) {
141
+ createTextRun(textNode);
142
+ return [existing];
143
+ }
144
+ }
145
+ const element = document.createElement("span");
146
+ element.classList.add("cake-inline-atom", `cake-inline-atom--${inline.kind}`);
147
+ const node = document.createTextNode(" ");
148
+ createTextRun(node);
149
+ element.append(node);
150
+ return [element];
151
+ }
152
+ return [];
153
+ }
154
+ function reconcileInlineChildren(parent, inlines) {
155
+ const mergedInlines = mergeInlineForRender(inlines);
156
+ const existingChildren = Array.from(parent.children);
157
+ const newChildren = [];
158
+ mergedInlines.forEach((inline, i) => {
159
+ const existingChild = existingChildren[i] ?? null;
160
+ const canReuse = existingChild && getInlineElementKey(existingChild) === getInlineKey(inline);
161
+ const nodes = reconcileInline(inline, canReuse ? existingChild : null);
162
+ newChildren.push(...nodes);
163
+ });
164
+ if (newChildren.length === existingChildren.length &&
165
+ newChildren.every((node, i) => node === existingChildren[i])) {
166
+ return;
167
+ }
168
+ parent.replaceChildren(...newChildren);
169
+ }
170
+ function renderInline(inline) {
171
+ return reconcileInline(inline, null);
172
+ }
173
+ function reconcileBlock(block, existing) {
174
+ for (const extension of extensions) {
175
+ const render = extension.renderBlock;
176
+ if (!render) {
177
+ continue;
178
+ }
179
+ const result = render(block, context);
180
+ if (result) {
181
+ return normalizeNodes(result);
182
+ }
183
+ }
184
+ if (block.type === "paragraph") {
185
+ const canReuse = existing &&
186
+ existing instanceof HTMLDivElement &&
187
+ getElementKey(existing) === "paragraph";
188
+ const currentLineIndex = context.getLineIndex();
189
+ context.incrementLineIndex();
190
+ if (canReuse) {
191
+ existing.setAttribute("data-line-index", String(currentLineIndex));
192
+ existing.removeAttribute("data-block");
193
+ delete existing.dataset.lineKind;
194
+ delete existing.dataset.headingLevel;
195
+ delete existing.dataset.headingPlaceholder;
196
+ existing.removeAttribute("aria-placeholder");
197
+ existing.className = "cake-line";
198
+ existing.removeAttribute("style");
199
+ if (block.content.length === 0) {
200
+ const firstChild = existing.firstChild;
201
+ if (firstChild instanceof Text && existing.querySelector("br")) {
202
+ if (firstChild.textContent !== "") {
203
+ firstChild.textContent = "";
204
+ }
205
+ createTextRun(firstChild);
206
+ return [existing];
207
+ }
208
+ existing.replaceChildren();
209
+ const textNode = document.createTextNode("");
210
+ createTextRun(textNode);
211
+ existing.append(textNode);
212
+ existing.append(document.createElement("br"));
213
+ return [existing];
214
+ }
215
+ reconcileInlineChildren(existing, block.content);
216
+ return [existing];
217
+ }
218
+ const element = document.createElement("div");
219
+ element.setAttribute("data-line-index", String(currentLineIndex));
220
+ element.classList.add("cake-line");
221
+ if (block.content.length === 0) {
222
+ const textNode = document.createTextNode("");
223
+ createTextRun(textNode);
224
+ element.append(textNode);
225
+ element.append(document.createElement("br"));
226
+ }
227
+ else {
228
+ const mergedContent = mergeInlineForRender(block.content);
229
+ for (const inline of mergedContent) {
230
+ for (const node of reconcileInline(inline, null)) {
231
+ element.append(node);
232
+ }
233
+ }
234
+ }
235
+ return [element];
236
+ }
237
+ if (block.type === "block-wrapper") {
238
+ const canReuse = existing &&
239
+ existing instanceof HTMLDivElement &&
240
+ getElementKey(existing) === getBlockKey(block);
241
+ if (canReuse) {
242
+ reconcileBlockChildren(existing, block.blocks);
243
+ return [existing];
244
+ }
245
+ const element = document.createElement("div");
246
+ element.setAttribute("data-block-wrapper", block.kind);
247
+ for (const node of renderBlocks(block.blocks)) {
248
+ element.append(node);
249
+ }
250
+ return [element];
251
+ }
252
+ if (block.type === "block-atom") {
253
+ const canReuse = existing &&
254
+ existing instanceof HTMLDivElement &&
255
+ getElementKey(existing) === getBlockKey(block);
256
+ const currentLineIndex = context.getLineIndex();
257
+ context.incrementLineIndex();
258
+ if (canReuse) {
259
+ existing.setAttribute("data-line-index", String(currentLineIndex));
260
+ return [existing];
261
+ }
262
+ const element = document.createElement("div");
263
+ element.setAttribute("data-block-atom", block.kind);
264
+ element.setAttribute("data-line-index", String(currentLineIndex));
265
+ element.classList.add("cake-line");
266
+ return [element];
267
+ }
268
+ return [];
269
+ }
270
+ function reconcileBlockChildren(parent, blocks) {
271
+ const existingChildren = Array.from(parent.children);
272
+ const newChildren = [];
273
+ blocks.forEach((block, index) => {
274
+ const existingChild = existingChildren[index] ?? null;
275
+ const canReuse = existingChild && getElementKey(existingChild) === getBlockKey(block);
276
+ const nodes = reconcileBlock(block, canReuse ? existingChild : null);
277
+ newChildren.push(...nodes);
278
+ if (index < blocks.length - 1) {
279
+ cursorOffset += 1;
280
+ }
281
+ });
282
+ if (newChildren.length === existingChildren.length &&
283
+ newChildren.every((node, i) => node === existingChildren[i])) {
284
+ return;
285
+ }
286
+ parent.replaceChildren(...newChildren);
287
+ }
288
+ function renderBlock(block) {
289
+ return reconcileBlock(block, null);
290
+ }
291
+ function renderBlocks(blocks) {
292
+ const nodes = [];
293
+ blocks.forEach((block, index) => {
294
+ nodes.push(...renderBlock(block));
295
+ if (index < blocks.length - 1) {
296
+ cursorOffset += 1;
297
+ }
298
+ });
299
+ return nodes;
300
+ }
301
+ const existingChildren = root ? Array.from(root.children) : [];
302
+ const contentNodes = [];
303
+ doc.blocks.forEach((block, index) => {
304
+ const existingChild = existingChildren[index] ?? null;
305
+ const canReuse = existingChild && getElementKey(existingChild) === getBlockKey(block);
306
+ const nodes = reconcileBlock(block, canReuse ? existingChild : null);
307
+ contentNodes.push(...nodes);
308
+ if (index < doc.blocks.length - 1) {
309
+ cursorOffset += 1;
310
+ }
311
+ });
312
+ return { content: contentNodes, map: createDomMap(runs) };
313
+ }
314
+ export function renderDoc(doc, extensions) {
315
+ const root = document.createElement("div");
316
+ root.className = "cake-content";
317
+ root.setAttribute("contenteditable", "true");
318
+ const runs = [];
319
+ let cursorOffset = 0;
320
+ let lineIndex = 0;
321
+ function createTextRun(node) {
322
+ const run = createTextRunBase(node, cursorOffset);
323
+ cursorOffset = run.cursorEnd;
324
+ runs.push(run);
325
+ return run;
326
+ }
327
+ const context = {
328
+ renderInline,
329
+ renderBlock,
330
+ renderBlocks,
331
+ createTextRun,
332
+ getLineIndex: () => lineIndex,
333
+ incrementLineIndex: () => {
334
+ lineIndex += 1;
335
+ },
336
+ };
337
+ function renderInline(inline) {
338
+ for (const extension of extensions) {
339
+ const render = extension.renderInline;
340
+ if (!render) {
341
+ continue;
342
+ }
343
+ const result = render(inline, context);
344
+ if (result) {
345
+ return normalizeNodes(result);
346
+ }
347
+ }
348
+ if (inline.type === "text") {
349
+ const element = document.createElement("span");
350
+ element.className = "cake-text";
351
+ const node = document.createTextNode(inline.text);
352
+ createTextRun(node);
353
+ element.append(node);
354
+ return [element];
355
+ }
356
+ if (inline.type === "inline-wrapper") {
357
+ const element = document.createElement("span");
358
+ element.classList.add("cake-inline", `cake-inline--${inline.kind}`);
359
+ for (const child of inline.children) {
360
+ for (const node of renderInline(child)) {
361
+ element.append(node);
362
+ }
363
+ }
364
+ return [element];
365
+ }
366
+ if (inline.type === "inline-atom") {
367
+ const element = document.createElement("span");
368
+ element.classList.add("cake-inline-atom", `cake-inline-atom--${inline.kind}`);
369
+ const node = document.createTextNode(" ");
370
+ createTextRun(node);
371
+ element.append(node);
372
+ return [element];
373
+ }
374
+ return [];
375
+ }
376
+ function renderBlock(block) {
377
+ for (const extension of extensions) {
378
+ const render = extension.renderBlock;
379
+ if (!render) {
380
+ continue;
381
+ }
382
+ const result = render(block, context);
383
+ if (result) {
384
+ return normalizeNodes(result);
385
+ }
386
+ }
387
+ if (block.type === "paragraph") {
388
+ const element = document.createElement("div");
389
+ element.setAttribute("data-line-index", String(context.getLineIndex()));
390
+ element.classList.add("cake-line");
391
+ context.incrementLineIndex();
392
+ if (block.content.length === 0) {
393
+ // Use <br> to maintain line height for empty lines (like v1)
394
+ // Also create an empty text node for cursor positioning
395
+ const textNode = document.createTextNode("");
396
+ createTextRun(textNode);
397
+ element.append(textNode);
398
+ element.append(document.createElement("br"));
399
+ }
400
+ else {
401
+ const mergedContent = mergeInlineForRender(block.content);
402
+ for (const inline of mergedContent) {
403
+ for (const node of renderInline(inline)) {
404
+ element.append(node);
405
+ }
406
+ }
407
+ }
408
+ return [element];
409
+ }
410
+ if (block.type === "block-wrapper") {
411
+ const element = document.createElement("div");
412
+ element.setAttribute("data-block-wrapper", block.kind);
413
+ for (const node of renderBlocks(block.blocks)) {
414
+ element.append(node);
415
+ }
416
+ return [element];
417
+ }
418
+ if (block.type === "block-atom") {
419
+ const element = document.createElement("div");
420
+ element.setAttribute("data-block-atom", block.kind);
421
+ element.setAttribute("data-line-index", String(context.getLineIndex()));
422
+ element.classList.add("cake-line");
423
+ context.incrementLineIndex();
424
+ return [element];
425
+ }
426
+ return [];
427
+ }
428
+ function renderBlocks(blocks) {
429
+ const nodes = [];
430
+ blocks.forEach((block, index) => {
431
+ nodes.push(...renderBlock(block));
432
+ if (index < blocks.length - 1) {
433
+ cursorOffset += 1;
434
+ }
435
+ });
436
+ return nodes;
437
+ }
438
+ for (const node of renderBlocks(doc.blocks)) {
439
+ root.append(node);
440
+ }
441
+ return { root, map: createDomMap(runs) };
442
+ }
443
+ export function mergeInlineForRender(inlines) {
444
+ const merged = [];
445
+ let buffer = "";
446
+ const flushText = () => {
447
+ if (!buffer) {
448
+ return;
449
+ }
450
+ merged.push({ type: "text", text: buffer });
451
+ buffer = "";
452
+ };
453
+ for (const inline of inlines) {
454
+ if (inline.type === "text") {
455
+ buffer += inline.text;
456
+ continue;
457
+ }
458
+ flushText();
459
+ if (inline.type === "inline-wrapper") {
460
+ merged.push({
461
+ ...inline,
462
+ children: mergeInlineForRender(inline.children),
463
+ });
464
+ continue;
465
+ }
466
+ merged.push(inline);
467
+ }
468
+ flushText();
469
+ return merged;
470
+ }
@@ -8,3 +8,4 @@ export type DomRenderContext = {
8
8
  getLineIndex: () => number;
9
9
  incrementLineIndex: () => void;
10
10
  };
11
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/cake/dom/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEzC,MAAM,MAAM,gBAAgB,GAAG;IAC7B,YAAY,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,IAAI,EAAE,CAAC;IACzC,WAAW,EAAE,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,EAAE,CAAC;IACtC,YAAY,EAAE,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,CAAC;IAC1C,aAAa,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,OAAO,CAAC;IACvC,YAAY,EAAE,MAAM,MAAM,CAAC;IAC3B,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC,CAAC"}
@@ -0,0 +1 @@
1
+ export {};
@@ -227,3 +227,4 @@ export declare class CakeEngine {
227
227
  private dataTransferHasImageFile;
228
228
  }
229
229
  export {};
230
+ //# sourceMappingURL=cake-engine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cake-engine.d.ts","sourceRoot":"","sources":["../../../src/cake/engine/cake-engine.ts"],"names":[],"mappings":"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"}