@knpkv/confluence-to-markdown 0.5.0 → 0.6.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.
Files changed (108) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +45 -10
  3. package/dist/ConfluenceAuth.d.ts.map +1 -1
  4. package/dist/ConfluenceAuth.js +12 -22
  5. package/dist/ConfluenceAuth.js.map +1 -1
  6. package/dist/ConfluenceClient.d.ts +13 -3
  7. package/dist/ConfluenceClient.d.ts.map +1 -1
  8. package/dist/ConfluenceClient.js +34 -70
  9. package/dist/ConfluenceClient.js.map +1 -1
  10. package/dist/ConfluenceError.d.ts +12 -12
  11. package/dist/GitError.d.ts +5 -5
  12. package/dist/GitService.d.ts.map +1 -1
  13. package/dist/GitService.js +0 -3
  14. package/dist/GitService.js.map +1 -1
  15. package/dist/SchemaConverterError.d.ts +3 -3
  16. package/dist/ast/BlockNode.d.ts +48 -33
  17. package/dist/ast/BlockNode.d.ts.map +1 -1
  18. package/dist/ast/BlockNode.js +11 -2
  19. package/dist/ast/BlockNode.js.map +1 -1
  20. package/dist/ast/Document.d.ts +30 -2
  21. package/dist/ast/Document.d.ts.map +1 -1
  22. package/dist/parsers/ConfluenceParser.d.ts.map +1 -1
  23. package/dist/parsers/ConfluenceParser.js +7 -12
  24. package/dist/parsers/ConfluenceParser.js.map +1 -1
  25. package/dist/parsers/MarkdownParser.js +8 -117
  26. package/dist/parsers/MarkdownParser.js.map +1 -1
  27. package/dist/parsers/preprocessing/ConfluencePreprocessing.d.ts +23 -0
  28. package/dist/parsers/preprocessing/ConfluencePreprocessing.d.ts.map +1 -0
  29. package/dist/parsers/preprocessing/ConfluencePreprocessing.js +323 -0
  30. package/dist/parsers/preprocessing/ConfluencePreprocessing.js.map +1 -0
  31. package/dist/parsers/preprocessing/index.d.ts +7 -0
  32. package/dist/parsers/preprocessing/index.d.ts.map +1 -0
  33. package/dist/parsers/preprocessing/index.js +7 -0
  34. package/dist/parsers/preprocessing/index.js.map +1 -0
  35. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts +29 -0
  36. package/dist/schemas/preprocessing/ConfluencePreprocessor.d.ts.map +1 -1
  37. package/dist/schemas/preprocessing/ConfluencePreprocessor.js +5 -15
  38. package/dist/schemas/preprocessing/ConfluencePreprocessor.js.map +1 -1
  39. package/dist/serializers/ConfluenceSerializer.js +0 -9
  40. package/dist/serializers/ConfluenceSerializer.js.map +1 -1
  41. package/dist/serializers/MarkdownSerializer.js +9 -49
  42. package/dist/serializers/MarkdownSerializer.js.map +1 -1
  43. package/package.json +35 -26
  44. package/src/AdfPlaceholders.ts +266 -0
  45. package/src/AdfSchemaValidator.ts +67 -0
  46. package/src/AdfWalker.ts +511 -0
  47. package/src/AtlaskitTransformers.ts +72 -0
  48. package/src/ConfluenceClient.ts +4 -4
  49. package/src/ConfluenceError.ts +65 -3
  50. package/src/MarkdownConverter.ts +106 -139
  51. package/src/Schemas.ts +4 -4
  52. package/src/SyncEngine.ts +130 -83
  53. package/src/atlaskit-adf-schema.d.ts +3 -0
  54. package/src/commands/clone.ts +8 -1
  55. package/src/commands/layers.ts +11 -4
  56. package/src/index.ts +3 -18
  57. package/test/AdfPlaceholders.test.ts +295 -0
  58. package/test/AdfSchemaValidator.test.ts +34 -0
  59. package/test/AdfWalker.test.ts +530 -0
  60. package/test/AtlaskitTransformers.test.ts +25 -0
  61. package/test/MarkdownConverter.test.ts +120 -105
  62. package/test/RoundTrip.test.ts +266 -0
  63. package/LICENSE +0 -21
  64. package/src/SchemaConverterError.ts +0 -108
  65. package/src/ast/BlockNode.ts +0 -469
  66. package/src/ast/Document.ts +0 -90
  67. package/src/ast/InlineNode.ts +0 -323
  68. package/src/ast/MacroNode.ts +0 -245
  69. package/src/ast/index.ts +0 -83
  70. package/src/parsers/ConfluenceParser.ts +0 -956
  71. package/src/parsers/MarkdownParser.ts +0 -1338
  72. package/src/parsers/index.ts +0 -8
  73. package/src/schemas/ConfluenceSchema.ts +0 -56
  74. package/src/schemas/ConversionSchema.ts +0 -318
  75. package/src/schemas/MarkdownSchema.ts +0 -56
  76. package/src/schemas/hast/HastFromHtml.ts +0 -153
  77. package/src/schemas/hast/HastSchema.ts +0 -274
  78. package/src/schemas/hast/index.ts +0 -35
  79. package/src/schemas/index.ts +0 -20
  80. package/src/schemas/mdast/MdastFromMarkdown.ts +0 -118
  81. package/src/schemas/mdast/MdastSchema.ts +0 -566
  82. package/src/schemas/mdast/index.ts +0 -59
  83. package/src/schemas/mdast/mdastToString.ts +0 -102
  84. package/src/schemas/nodes/block/BlockSchema.ts +0 -773
  85. package/src/schemas/nodes/block/index.ts +0 -13
  86. package/src/schemas/nodes/index.ts +0 -20
  87. package/src/schemas/nodes/inline/InlineSchema.ts +0 -523
  88. package/src/schemas/nodes/inline/index.ts +0 -14
  89. package/src/schemas/nodes/macro/MacroSchema.ts +0 -226
  90. package/src/schemas/nodes/macro/index.ts +0 -6
  91. package/src/schemas/preprocessing/ConfluencePreprocessor.ts +0 -455
  92. package/src/schemas/preprocessing/index.ts +0 -8
  93. package/src/serializers/ConfluenceSerializer.ts +0 -737
  94. package/src/serializers/MarkdownSerializer.ts +0 -543
  95. package/src/serializers/index.ts +0 -8
  96. package/test/ast/BlockNode.test.ts +0 -265
  97. package/test/ast/Document.test.ts +0 -126
  98. package/test/ast/InlineNode.test.ts +0 -161
  99. package/test/fixtures/integration-test.html.fixture +0 -103
  100. package/test/fixtures/integration-test.md.expected +0 -257
  101. package/test/parsers/ConfluenceParser.test.ts +0 -452
  102. package/test/schemas/ConfluencePreprocessor.test.ts +0 -180
  103. package/test/schemas/ConversionSchema.test.ts +0 -159
  104. package/test/schemas/HastSchema.test.ts +0 -138
  105. package/test/schemas/MdastSchema.test.ts +0 -145
  106. package/test/schemas/nodes/block/BlockSchema.test.ts +0 -173
  107. package/test/schemas/nodes/inline/InlineSchema.test.ts +0 -198
  108. package/test/schemas/nodes/macro/MacroSchema.test.ts +0 -142
@@ -1,13 +0,0 @@
1
- /**
2
- * Block node transform schemas.
3
- *
4
- * @module
5
- */
6
- export {
7
- blockNodeFromHastElement,
8
- blockNodeFromMdast,
9
- BlockNodesFromHast,
10
- BlockNodesFromMdast,
11
- blockNodeToHast,
12
- blockNodeToMdast
13
- } from "./BlockSchema.js"
@@ -1,20 +0,0 @@
1
- /**
2
- * Node transform schemas for all AST node types.
3
- *
4
- * @module
5
- */
6
-
7
- // Re-export inline node schemas
8
- export {
9
- inlineNodeFromHastElement,
10
- inlineNodeFromMdast,
11
- inlineNodeToHast,
12
- inlineNodeToMdast,
13
- textFromHastText
14
- } from "./inline/index.js"
15
-
16
- // Re-export block node schemas
17
- export { blockNodeFromHastElement, blockNodeFromMdast, blockNodeToHast, blockNodeToMdast } from "./block/index.js"
18
-
19
- // Re-export macro node schemas
20
- export { macroNodeFromHastElement, macroNodeToHast, macroNodeToMdast } from "./macro/index.js"
@@ -1,523 +0,0 @@
1
- /**
2
- * Transform schemas for inline nodes (Hast <-> AST <-> Mdast).
3
- *
4
- * Provides bidirectional transforms between HAST elements, AST inline nodes,
5
- * and MDAST phrasing content for text-level formatting.
6
- *
7
- * @module
8
- */
9
- import * as Effect from "effect/Effect"
10
- import * as ParseResult from "effect/ParseResult"
11
- import * as Schema from "effect/Schema"
12
- import {
13
- ColoredText,
14
- DateTime,
15
- Emoticon,
16
- Emphasis,
17
- Highlight,
18
- InlineCode,
19
- type InlineNode,
20
- LineBreak,
21
- Link,
22
- Strikethrough,
23
- Strong,
24
- Subscript,
25
- Superscript,
26
- Text,
27
- Underline,
28
- UnsupportedInline,
29
- UserMention
30
- } from "../../../ast/InlineNode.js"
31
- import type { HastElement, HastNode, HastText } from "../../hast/index.js"
32
- import { getTextContent, isHastElement, isHastText, makeHastElement, makeHastText } from "../../hast/index.js"
33
- import type { MdastPhrasingContent } from "../../mdast/index.js"
34
- import { makeMdastText } from "../../mdast/index.js"
35
-
36
- /**
37
- * Convert HAST text node to AST Text.
38
- */
39
- export const textFromHastText = (node: HastText): Text => new Text({ value: node.value })
40
-
41
- /**
42
- * Convert HAST element to AST inline node.
43
- */
44
- export const inlineNodeFromHastElement = (
45
- element: HastElement,
46
- parseChildren: (children: ReadonlyArray<HastNode>) => Effect.Effect<ReadonlyArray<InlineNode>, ParseResult.ParseError>
47
- ): Effect.Effect<InlineNode | null, ParseResult.ParseError> =>
48
- Effect.gen(function*() {
49
- const tagName = element.tagName.toLowerCase()
50
-
51
- // Strong/bold
52
- if (tagName === "strong" || tagName === "b") {
53
- const children = yield* parseChildrenToBase(element.children, parseChildren)
54
- return new Strong({ children })
55
- }
56
-
57
- // Emphasis/italic
58
- if (tagName === "em" || tagName === "i") {
59
- const children = yield* parseChildrenToBase(element.children, parseChildren)
60
- return new Emphasis({ children })
61
- }
62
-
63
- // Underline
64
- if (tagName === "u") {
65
- const children = yield* parseChildrenToBase(element.children, parseChildren)
66
- return new Underline({ children })
67
- }
68
-
69
- // Strikethrough
70
- if (tagName === "del" || tagName === "s") {
71
- const children = yield* parseChildrenToBase(element.children, parseChildren)
72
- return new Strikethrough({ children })
73
- }
74
-
75
- // Subscript
76
- if (tagName === "sub") {
77
- const children = yield* parseChildrenToBase(element.children, parseChildren)
78
- return new Subscript({ children })
79
- }
80
-
81
- // Superscript
82
- if (tagName === "sup") {
83
- const children = yield* parseChildrenToBase(element.children, parseChildren)
84
- return new Superscript({ children })
85
- }
86
-
87
- // Inline code
88
- if (tagName === "code") {
89
- return new InlineCode({ value: getTextContent(element) })
90
- }
91
-
92
- // Link
93
- if (tagName === "a") {
94
- const href = element.properties?.href as string | undefined
95
- if (!href) return null
96
- const children = yield* parseChildrenToBase(element.children, parseChildren)
97
- return new Link({
98
- href,
99
- title: (element.properties?.title as string) || undefined,
100
- children
101
- })
102
- }
103
-
104
- // Line break
105
- if (tagName === "br") {
106
- return new LineBreak({})
107
- }
108
-
109
- // Date/time
110
- if (tagName === "time") {
111
- const datetime = (element.properties?.dateTime as string) || ""
112
- return new DateTime({ datetime })
113
- }
114
-
115
- // Emoticon (preprocessed from ac:emoticon)
116
- if (tagName === "span" && element.properties?.["dataEmoji"]) {
117
- const shortname = (element.properties["dataEmoji"] as string) || ""
118
- const emojiId = (element.properties["dataEmojiId"] as string) || ""
119
- const fallback = getTextContent(element)
120
- return new Emoticon({ shortname, emojiId, fallback })
121
- }
122
-
123
- // User mention (preprocessed from ac:link > ri:user)
124
- if (tagName === "span" && element.properties?.["dataUserMention"]) {
125
- const accountId = (element.properties["dataUserMention"] as string) || ""
126
- return new UserMention({ accountId })
127
- }
128
-
129
- // Confluence link with link-body (preprocessed from ac:link > ac:link-body)
130
- if (tagName === "span" && element.properties?.["dataConfluenceLink"] !== undefined) {
131
- const linkText = getTextContent(element)
132
- return new UnsupportedInline({
133
- raw: `<!--cf:link:${encodeURIComponent(linkText)}-->`,
134
- source: "confluence"
135
- })
136
- }
137
-
138
- // Colored text (span with color style)
139
- if (tagName === "span") {
140
- const style = element.properties?.style as string | undefined
141
- if (style) {
142
- const colorMatch = style.match(/(?:^|;)\s*color:\s*([^;]+)/)
143
- const bgMatch = style.match(/(?:^|;)\s*background-color:\s*([^;]+)/)
144
-
145
- if (colorMatch?.[1]) {
146
- const children = yield* parseChildrenToBase(element.children, parseChildren)
147
- return new ColoredText({ color: colorMatch[1].trim(), children })
148
- }
149
-
150
- if (bgMatch?.[1]) {
151
- const children = yield* parseChildrenToBase(element.children, parseChildren)
152
- return new Highlight({ backgroundColor: bgMatch[1].trim(), children })
153
- }
154
- }
155
-
156
- // Nested span - extract single child
157
- const children = yield* parseChildren(element.children)
158
- if (children.length === 1) {
159
- return children[0] ?? null
160
- }
161
- return null
162
- }
163
-
164
- // Unknown inline element
165
- return new UnsupportedInline({
166
- raw: hastElementToHtml(element),
167
- source: "confluence"
168
- })
169
- })
170
-
171
- /**
172
- * Convert AST inline node to HAST node.
173
- */
174
- export const inlineNodeToHast = (node: InlineNode): HastNode => {
175
- switch (node._tag) {
176
- case "Text":
177
- return makeHastText(node.value)
178
- case "Strong":
179
- return makeHastElement("strong", {}, node.children.map(inlineNodeToHast))
180
- case "Emphasis":
181
- return makeHastElement("em", {}, node.children.map(inlineNodeToHast))
182
- case "InlineCode":
183
- return makeHastElement("code", {}, [makeHastText(node.value)])
184
- case "Link":
185
- return makeHastElement(
186
- "a",
187
- { href: node.href, ...(node.title ? { title: node.title } : {}) },
188
- node.children.map(inlineNodeToHast)
189
- )
190
- case "LineBreak":
191
- return makeHastElement("br")
192
- case "DateTime":
193
- return makeHastElement("time", { dateTime: node.datetime }, [makeHastText(node.datetime)])
194
- case "Emoticon":
195
- return makeHastElement(
196
- "span",
197
- { dataEmoji: node.shortname, dataEmojiId: node.emojiId },
198
- [makeHastText(node.fallback)]
199
- )
200
- case "UserMention":
201
- return makeHastElement("span", { dataUserMention: node.accountId })
202
- case "Underline":
203
- return makeHastElement("u", {}, node.children.map(inlineNodeToHast))
204
- case "Subscript":
205
- return makeHastElement("sub", {}, node.children.map(inlineNodeToHast))
206
- case "Superscript":
207
- return makeHastElement("sup", {}, node.children.map(inlineNodeToHast))
208
- case "Strikethrough":
209
- return makeHastElement("del", {}, node.children.map(inlineNodeToHast))
210
- case "ColoredText":
211
- return makeHastElement("span", { style: `color: ${node.color}` }, node.children.map(inlineNodeToHast))
212
- case "Highlight":
213
- return makeHastElement(
214
- "span",
215
- { style: `background-color: ${node.backgroundColor}` },
216
- node.children.map(inlineNodeToHast)
217
- )
218
- case "UnsupportedInline":
219
- // Return raw HTML wrapped in span
220
- return makeHastElement("span", { dangerouslySetInnerHTML: node.raw })
221
- }
222
- }
223
-
224
- /**
225
- * Convert AST inline node to MDAST phrasing content.
226
- */
227
- export const inlineNodeToMdast = (node: InlineNode): MdastPhrasingContent => {
228
- switch (node._tag) {
229
- case "Text":
230
- return makeMdastText(node.value)
231
- case "Strong":
232
- return {
233
- type: "strong",
234
- children: node.children.map(inlineNodeToMdast)
235
- }
236
- case "Emphasis":
237
- return {
238
- type: "emphasis",
239
- children: node.children.map(inlineNodeToMdast)
240
- }
241
- case "InlineCode":
242
- return {
243
- type: "inlineCode",
244
- value: node.value
245
- }
246
- case "Link":
247
- return {
248
- type: "link",
249
- url: node.href,
250
- title: node.title ?? null,
251
- children: node.children.map(inlineNodeToMdast)
252
- }
253
- case "LineBreak":
254
- return { type: "break" }
255
- case "DateTime":
256
- // Markdown doesn't have native datetime - render as text
257
- return makeMdastText(node.datetime)
258
- case "Emoticon":
259
- // Render emoji fallback
260
- return makeMdastText(node.fallback || node.shortname)
261
- case "UserMention":
262
- // Render as @mention text
263
- return makeMdastText(`@${node.accountId}`)
264
- case "Underline":
265
- // Markdown doesn't have underline - render as HTML
266
- return {
267
- type: "html",
268
- value: `<u>${node.children.map((c) => inlineNodeToMdastText(c)).join("")}</u>`
269
- }
270
- case "Subscript":
271
- return {
272
- type: "html",
273
- value: `<sub>${node.children.map((c) => inlineNodeToMdastText(c)).join("")}</sub>`
274
- }
275
- case "Superscript":
276
- return {
277
- type: "html",
278
- value: `<sup>${node.children.map((c) => inlineNodeToMdastText(c)).join("")}</sup>`
279
- }
280
- case "Strikethrough":
281
- return {
282
- type: "delete",
283
- children: node.children.map(inlineNodeToMdast)
284
- }
285
- case "ColoredText":
286
- // Markdown doesn't have colored text - render as plain text
287
- return makeMdastText(node.children.map((c) => inlineNodeToMdastText(c)).join(""))
288
- case "Highlight":
289
- // Markdown doesn't have highlight - render as plain text
290
- return makeMdastText(node.children.map((c) => inlineNodeToMdastText(c)).join(""))
291
- case "UnsupportedInline":
292
- return {
293
- type: "html",
294
- value: node.raw
295
- }
296
- }
297
- }
298
-
299
- /**
300
- * Base inline node type for children of Strong/Emphasis/Link.
301
- */
302
- type BaseInlineNode = Text | InlineCode | LineBreak | UnsupportedInline | Emoticon | UserMention | DateTime
303
-
304
- /**
305
- * Convert full InlineNode to base type (for Strong/Emphasis/Link children).
306
- * Complex nodes are converted to UnsupportedInline.
307
- */
308
- const toBaseInlineNode = (node: InlineNode): BaseInlineNode => {
309
- switch (node._tag) {
310
- case "Text":
311
- case "InlineCode":
312
- case "LineBreak":
313
- case "UnsupportedInline":
314
- case "Emoticon":
315
- case "UserMention":
316
- case "DateTime":
317
- return node
318
- case "Strong":
319
- case "Emphasis":
320
- case "Link":
321
- case "Underline":
322
- case "Subscript":
323
- case "Superscript":
324
- case "Strikethrough":
325
- case "ColoredText":
326
- case "Highlight":
327
- // Flatten complex nodes to plain text
328
- return new Text({ value: inlineNodeToMdastText(node) })
329
- }
330
- }
331
-
332
- /**
333
- * Convert MDAST phrasing content to AST inline node.
334
- */
335
- export const inlineNodeFromMdast = (node: MdastPhrasingContent): InlineNode => {
336
- switch (node.type) {
337
- case "text":
338
- return new Text({ value: node.value })
339
- case "strong":
340
- return new Strong({ children: node.children.map(inlineNodeFromMdast).map(toBaseInlineNode) })
341
- case "emphasis":
342
- return new Emphasis({ children: node.children.map(inlineNodeFromMdast).map(toBaseInlineNode) })
343
- case "inlineCode":
344
- return new InlineCode({ value: node.value })
345
- case "link":
346
- return new Link({
347
- href: node.url,
348
- title: node.title ?? undefined,
349
- children: node.children.map(inlineNodeFromMdast).map(toBaseInlineNode)
350
- })
351
- case "break":
352
- return new LineBreak({})
353
- case "image":
354
- // Inline images become unsupported
355
- return new UnsupportedInline({
356
- raw: `![${node.alt ?? ""}](${node.url})`,
357
- source: "markdown"
358
- })
359
- case "delete":
360
- return new Strikethrough({ children: node.children.map(inlineNodeFromMdast).map(toBaseInlineNode) })
361
- case "html":
362
- return new UnsupportedInline({ raw: node.value, source: "markdown" })
363
- default:
364
- return new UnsupportedInline({
365
- raw: JSON.stringify(node),
366
- source: "markdown"
367
- })
368
- }
369
- }
370
-
371
- // Helper functions
372
-
373
- /**
374
- * Parse HAST children to base inline nodes (for Strong/Emphasis/Link children).
375
- */
376
- const parseChildrenToBase = (
377
- children: ReadonlyArray<HastNode>,
378
- _parseChildren: (
379
- children: ReadonlyArray<HastNode>
380
- ) => Effect.Effect<ReadonlyArray<InlineNode>, ParseResult.ParseError>
381
- ): Effect.Effect<ReadonlyArray<Text | InlineCode | LineBreak | UnsupportedInline>, ParseResult.ParseError> =>
382
- Effect.gen(function*() {
383
- const nodes: Array<Text | InlineCode | LineBreak | UnsupportedInline> = []
384
- for (const child of children) {
385
- if (isHastText(child)) {
386
- nodes.push(new Text({ value: child.value }))
387
- } else if (isHastElement(child)) {
388
- const tagName = child.tagName.toLowerCase()
389
- if (tagName === "code") {
390
- nodes.push(new InlineCode({ value: getTextContent(child) }))
391
- } else if (tagName === "br") {
392
- nodes.push(new LineBreak({}))
393
- } else {
394
- nodes.push(new UnsupportedInline({ raw: hastElementToHtml(child), source: "confluence" }))
395
- }
396
- }
397
- }
398
- return nodes
399
- })
400
-
401
- /**
402
- * Extract plain text from inline node.
403
- */
404
- const inlineNodeToMdastText = (node: InlineNode): string => {
405
- switch (node._tag) {
406
- case "Text":
407
- return node.value
408
- case "InlineCode":
409
- return node.value
410
- case "LineBreak":
411
- return "\n"
412
- case "DateTime":
413
- return node.datetime
414
- case "Emoticon":
415
- return node.fallback || node.shortname
416
- case "UserMention":
417
- return `@${node.accountId}`
418
- case "Strong":
419
- case "Emphasis":
420
- case "Underline":
421
- case "Subscript":
422
- case "Superscript":
423
- case "Strikethrough":
424
- case "ColoredText":
425
- case "Highlight":
426
- return node.children.map(inlineNodeToMdastText).join("")
427
- case "Link":
428
- return node.children.map(inlineNodeToMdastText).join("")
429
- case "UnsupportedInline":
430
- return ""
431
- }
432
- }
433
-
434
- /**
435
- * Convert HAST element to HTML string.
436
- */
437
- const hastElementToHtml = (element: HastElement): string => {
438
- const props = Object.entries(element.properties || {})
439
- .map(([k, v]) => {
440
- const attrName = k.replace(/([A-Z])/g, "-$1").toLowerCase()
441
- return `${attrName}="${String(v)}"`
442
- })
443
- .join(" ")
444
- const openTag = props ? `<${element.tagName} ${props}>` : `<${element.tagName}>`
445
- const closeTag = `</${element.tagName}>`
446
- const content = element.children
447
- .map((c) => {
448
- if (isHastText(c)) return c.value
449
- if (isHastElement(c)) return hastElementToHtml(c)
450
- return ""
451
- })
452
- .join("")
453
- return `${openTag}${content}${closeTag}`
454
- }
455
-
456
- /**
457
- * Schema-based HAST to InlineNode array transform.
458
- * This is the main transform schema for parsing inline content from HAST.
459
- *
460
- * @category Schemas
461
- */
462
- export const InlineNodesFromHast = Schema.transformOrFail(
463
- Schema.Array(Schema.Unknown),
464
- Schema.Array(Schema.Any),
465
- {
466
- strict: false,
467
- decode: (hastNodes, _options, ast) =>
468
- Effect.gen(function*() {
469
- const results: Array<InlineNode> = []
470
-
471
- const parseChildren = (children: ReadonlyArray<HastNode>): Effect.Effect<
472
- ReadonlyArray<InlineNode>,
473
- ParseResult.ParseError
474
- > =>
475
- Effect.gen(function*() {
476
- const childResults: Array<InlineNode> = []
477
- for (const child of children) {
478
- if (isHastText(child)) {
479
- childResults.push(textFromHastText(child))
480
- } else if (isHastElement(child)) {
481
- const node = yield* inlineNodeFromHastElement(child, parseChildren)
482
- if (node) childResults.push(node)
483
- }
484
- }
485
- return childResults
486
- })
487
-
488
- for (const hastNode of hastNodes) {
489
- if (isHastText(hastNode as HastNode)) {
490
- results.push(textFromHastText(hastNode as HastText))
491
- } else if (isHastElement(hastNode as HastNode)) {
492
- const node = yield* inlineNodeFromHastElement(hastNode as HastElement, parseChildren)
493
- if (node) results.push(node)
494
- }
495
- }
496
-
497
- return results
498
- }).pipe(
499
- Effect.mapError((e) =>
500
- e instanceof ParseResult.ParseError
501
- ? e.issue
502
- : new ParseResult.Type(ast, hastNodes, String(e))
503
- )
504
- ),
505
- encode: (nodes, _options, _ast) => Effect.succeed(nodes.map(inlineNodeToHast) as ReadonlyArray<unknown>)
506
- }
507
- )
508
-
509
- /**
510
- * Schema-based MDAST to InlineNode array transform.
511
- *
512
- * @category Schemas
513
- */
514
- export const InlineNodesFromMdast = Schema.transformOrFail(
515
- Schema.Array(Schema.Unknown),
516
- Schema.Array(Schema.Any),
517
- {
518
- strict: false,
519
- decode: (mdastNodes, _options, _ast) =>
520
- Effect.succeed(mdastNodes.map((n) => inlineNodeFromMdast(n as MdastPhrasingContent))),
521
- encode: (nodes, _options, _ast) => Effect.succeed(nodes.map(inlineNodeToMdast) as ReadonlyArray<unknown>)
522
- }
523
- )
@@ -1,14 +0,0 @@
1
- /**
2
- * Inline node transform schemas.
3
- *
4
- * @module
5
- */
6
- export {
7
- inlineNodeFromHastElement,
8
- inlineNodeFromMdast,
9
- InlineNodesFromHast,
10
- InlineNodesFromMdast,
11
- inlineNodeToHast,
12
- inlineNodeToMdast,
13
- textFromHastText
14
- } from "./InlineSchema.js"