@portabletext/markdown 1.0.4 → 1.0.6

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.d.ts CHANGED
@@ -1,146 +1,150 @@
1
1
  import { PortableTextBlock, PortableTextObject, Schema } from "@portabletext/schema";
2
2
  /**
3
- * Any object with an `_type` that is a string. Can hold any other properties.
4
- * @public
5
- */
6
- declare type ArbitraryTypedObject = TypedObject & {
3
+ * Any object with an `_type` property (which is required in portable text arrays),
4
+ * as well as a _potential_ `_key` (highly encouraged)
5
+ * @public
6
+ */
7
+ interface TypedObject {
8
+ /**
9
+ * Identifies the type of object/span this is, and is used to pick the correct React components
10
+ * to use when rendering a span or inline object with this type.
11
+ */
12
+ _type: string;
13
+ /**
14
+ * Uniquely identifies this object within its parent block.
15
+ * Not _required_, but highly encouraged.
16
+ */
17
+ _key?: string;
18
+ }
19
+ /**
20
+ * Any object with an `_type` that is a string. Can hold any other properties.
21
+ * @public
22
+ */
23
+ type ArbitraryTypedObject = TypedObject & {
7
24
  [key: string]: any;
8
25
  };
9
26
  /**
10
- * A Portable Text Block can be thought of as one paragraph, quote or list item.
11
- * In other words, it is a container for text, that can have a visual style associated with it.
12
- * The actual text value is stored in portable text spans inside of the `childen` array.
13
- *
14
- * @typeParam M - Mark types that be used for text spans
15
- * @typeParam C - Types allowed as children of this block
16
- * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)
17
- * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)
18
- * @public
19
- */
20
- declare interface PortableTextBlock$1<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = ArbitraryTypedObject | PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends TypedObject {
21
- /**
22
- * Type name identifying this as a portable text block.
23
- * All items within a portable text array should have a `_type` property.
24
- *
25
- * Usually 'block', but can be customized to other values
26
- */
27
- _type: "block" | string;
28
- /**
29
- * A key that identifies this block uniquely within the parent array. Used to more easily address
30
- * the block when editing collaboratively, but is also very useful for keys inside of React and
31
- * other rendering frameworks that can use keys to optimize operations.
32
- */
27
+ * A Portable Text Block can be thought of as one paragraph, quote or list item.
28
+ * In other words, it is a container for text, that can have a visual style associated with it.
29
+ * The actual text value is stored in portable text spans inside of the `childen` array.
30
+ *
31
+ * @typeParam M - Mark types that be used for text spans
32
+ * @typeParam C - Types allowed as children of this block
33
+ * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)
34
+ * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)
35
+ * @public
36
+ */
37
+ interface PortableTextBlock$1<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = ArbitraryTypedObject | PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends TypedObject {
38
+ /**
39
+ * Type name identifying this as a portable text block.
40
+ * All items within a portable text array should have a `_type` property.
41
+ *
42
+ * Usually 'block', but can be customized to other values
43
+ */
44
+ _type: "block" | (string & {});
45
+ /**
46
+ * A key that identifies this block uniquely within the parent array. Used to more easily address
47
+ * the block when editing collaboratively, but is also very useful for keys inside of React and
48
+ * other rendering frameworks that can use keys to optimize operations.
49
+ */
33
50
  _key?: string;
34
51
  /**
35
- * Array of inline items for this block. Usually contain text spans, but can be
36
- * configured to include inline objects of other types as well.
37
- */
52
+ * Array of inline items for this block. Usually contain text spans, but can be
53
+ * configured to include inline objects of other types as well.
54
+ */
38
55
  children: C[];
39
56
  /**
40
- * Array of mark definitions used in child text spans. By having them be on the block level,
41
- * the same mark definition can be reused for multiple text spans, which is often the case
42
- * with nested marks.
43
- */
57
+ * Array of mark definitions used in child text spans. By having them be on the block level,
58
+ * the same mark definition can be reused for multiple text spans, which is often the case
59
+ * with nested marks.
60
+ */
44
61
  markDefs?: M[];
45
62
  /**
46
- * Visual style of the block
47
- * Common values: 'normal', 'blockquote', 'h1'...'h6'
48
- */
63
+ * Visual style of the block
64
+ * Common values: 'normal', 'blockquote', 'h1'...'h6'
65
+ */
49
66
  style?: S;
50
67
  /**
51
- * If this block is a list item, identifies which style of list item this is
52
- * Common values: 'bullet', 'number', but can be configured
53
- */
68
+ * If this block is a list item, identifies which style of list item this is
69
+ * Common values: 'bullet', 'number', but can be configured
70
+ */
54
71
  listItem?: L;
55
72
  /**
56
- * If this block is a list item, identifies which level of nesting it belongs within
57
- */
73
+ * If this block is a list item, identifies which level of nesting it belongs within
74
+ */
58
75
  level?: number;
59
76
  }
60
77
  /**
61
- * A set of _common_ (but not required/standarized) block styles
62
- * @public
63
- */
64
- declare type PortableTextBlockStyle = "normal" | "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | string;
65
- /**
66
- * Strictly speaking the same as a portable text block, but `listItem` is required
67
- *
68
- * @typeParam M - Mark types that be used for text spans
69
- * @typeParam C - Types allowed as children of this block
70
- * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)
71
- * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)
72
- * @public
73
- */
74
- declare interface PortableTextListItemBlock<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends Omit<PortableTextBlock$1<M, C, S, L>, "listItem"> {
78
+ * Strictly speaking the same as a portable text block, but `listItem` is required
79
+ *
80
+ * @typeParam M - Mark types that be used for text spans
81
+ * @typeParam C - Types allowed as children of this block
82
+ * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)
83
+ * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)
84
+ * @public
85
+ */
86
+ interface PortableTextListItemBlock<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends Omit<PortableTextBlock$1<M, C, S, L>, "listItem"> {
75
87
  listItem: L;
76
88
  }
77
89
  /**
78
- * A set of _common_ (but not required/standardized) list item types
79
- * @public
80
- */
81
- declare type PortableTextListItemType = "bullet" | "number" | string;
82
- /**
83
- * A mark definition holds information for marked text. For instance, a text span could reference
84
- * a mark definition for a hyperlink, a geoposition, a reference to a document or anything that is
85
- * representable as a JSON object.
86
- * @public
87
- */
88
- declare interface PortableTextMarkDefinition {
89
- /**
90
- * Unknown properties
91
- */
90
+ * A set of _common_ (but not required/standarized) block styles
91
+ * @public
92
+ */
93
+ type PortableTextBlockStyle = "normal" | "blockquote" | "h1" | "h2" | "h3" | "h4" | "h5" | "h6" | (string & {});
94
+ /**
95
+ * A set of _common_ (but not required/standardized) list item types
96
+ * @public
97
+ */
98
+ type PortableTextListItemType = "bullet" | "number" | (string & {});
99
+ /**
100
+ * A mark definition holds information for marked text. For instance, a text span could reference
101
+ * a mark definition for a hyperlink, a geoposition, a reference to a document or anything that is
102
+ * representable as a JSON object.
103
+ * @public
104
+ */
105
+ interface PortableTextMarkDefinition {
106
+ /**
107
+ * Unknown properties
108
+ */
92
109
  [key: string]: unknown;
93
110
  /**
94
- * Identifies the type of mark this is, and is used to pick the correct React components to use
95
- * when rendering a text span marked with this mark type.
96
- */
111
+ * Identifies the type of mark this is, and is used to pick the correct React components to use
112
+ * when rendering a text span marked with this mark type.
113
+ */
97
114
  _type: string;
98
115
  /**
99
- * Uniquely identifies this mark definition within the block
100
- */
116
+ * Uniquely identifies this mark definition within the block
117
+ */
101
118
  _key: string;
102
119
  }
103
120
  /**
104
- * A Portable Text Span holds a chunk of the actual text value of a Portable Text Block
105
- * @public
106
- */
107
- declare interface PortableTextSpan {
121
+ * A Portable Text Span holds a chunk of the actual text value of a Portable Text Block
122
+ * @public
123
+ */
124
+ interface PortableTextSpan {
108
125
  /**
109
- * Type is always `span` for portable text spans, as these don't vary in shape
110
- */
126
+ * Type is always `span` for portable text spans, as these don't vary in shape
127
+ */
111
128
  _type: "span";
112
129
  /**
113
- * Unique (within parent block) key for this portable text span
114
- */
130
+ * Unique (within parent block) key for this portable text span
131
+ */
115
132
  _key?: string;
116
133
  /**
117
- * The actual text value of this text span
118
- */
134
+ * The actual text value of this text span
135
+ */
119
136
  text: string;
120
137
  /**
121
- * An array of marks this text span is annotated with, identified by its `_key`.
122
- * If the key cannot be found in the parent blocks mark definition, the mark is assumed to be a
123
- * decorator (a simpler mark without any properties - for instance `strong` or `em`)
124
- */
138
+ * An array of marks this text span is annotated with, identified by its `_key`.
139
+ * If the key cannot be found in the parent blocks mark definition, the mark is assumed to be a
140
+ * decorator (a simpler mark without any properties - for instance `strong` or `em`)
141
+ */
125
142
  marks?: string[];
126
143
  }
127
144
  /**
128
- * Any object with an `_type` property (which is required in portable text arrays),
129
- * as well as a _potential_ `_key` (highly encouraged)
130
- * @public
131
- */
132
- declare interface TypedObject {
133
- /**
134
- * Identifies the type of object/span this is, and is used to pick the correct React components
135
- * to use when rendering a span or inline object with this type.
136
- */
137
- _type: string;
138
- /**
139
- * Uniquely identifies this object within its parent block.
140
- * Not _required_, but highly encouraged.
141
- */
142
- _key?: string;
143
- }
145
+ * The simplest representation of a link
146
+ * @public
147
+ */
144
148
  /**
145
149
  * @public
146
150
  */
@@ -152,6 +156,7 @@ type BlockSpacingRenderer = (options: {
152
156
  * @public
153
157
  */
154
158
  declare const DefaultBlockSpacingRenderer: BlockSpacingRenderer;
159
+ type LooseRecord<K extends string, V> = Record<string, V> & { [P in K]?: V };
155
160
  /**
156
161
  * Generic type for portable text renderers that takes blocks/inline blocks
157
162
  *
@@ -213,7 +218,7 @@ interface PortableTextRenderers {
213
218
  *
214
219
  * Can also be set to a single renderer function, which would handle block styles of _any_ type.
215
220
  */
216
- block: Record<PortableTextBlockStyle, PortableTextBlockRenderer | undefined> | PortableTextBlockRenderer;
221
+ block: LooseRecord<PortableTextBlockStyle, PortableTextBlockRenderer | undefined> | PortableTextBlockRenderer;
217
222
  /**
218
223
  * Object of renderer functions used to render different list item styles.
219
224
  *
@@ -222,7 +227,7 @@ interface PortableTextRenderers {
222
227
  *
223
228
  * Can also be set to a single renderer function, which would handle list items of _any_ type.
224
229
  */
225
- listItem: Record<PortableTextListItemType, PortableTextListItemRenderer | undefined> | PortableTextListItemRenderer;
230
+ listItem: LooseRecord<PortableTextListItemType, PortableTextListItemRenderer | undefined> | PortableTextListItemRenderer;
226
231
  /**
227
232
  * Renderer for "hard breaks", eg `\n` inside of text spans.
228
233
  * By default renders as Markdown hard break (` \n` - two trailing spaces).
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","names":["ArbitraryTypedObject","TypedObject","PortableTextBlock","M","C","S","L","PortableTextMarkDefinition","PortableTextSpan","PortableTextBlockStyle","PortableTextListItemType","PortableTextLink","PortableTextListItemBlock","Omit"],"sources":["../../../node_modules/.pnpm/@portabletext+types@3.0.0/node_modules/@portabletext/types/dist/index.d.ts","../src/from-portable-text/renderers/block-spacing.ts","../src/from-portable-text/types.ts","../src/from-portable-text/portable-text-to-markdown.ts","../src/from-portable-text/renderers/hard-break.ts","../src/from-portable-text/renderers/list-item.ts","../src/from-portable-text/renderers/style.ts","../src/from-portable-text/renderers/marks.ts","../src/from-portable-text/renderers/type.ts","../src/to-portable-text/matchers.ts","../src/to-portable-text/markdown-to-portable-text.ts"],"sourcesContent":["/**\n * Any object with an `_type` that is a string. Can hold any other properties.\n * @public\n */\nexport declare type ArbitraryTypedObject = TypedObject & {\n [key: string]: any;\n};\n\n/**\n * A Portable Text Block can be thought of as one paragraph, quote or list item.\n * In other words, it is a container for text, that can have a visual style associated with it.\n * The actual text value is stored in portable text spans inside of the `childen` array.\n *\n * @typeParam M - Mark types that be used for text spans\n * @typeParam C - Types allowed as children of this block\n * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)\n * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)\n * @public\n */\nexport declare interface PortableTextBlock<\n M extends PortableTextMarkDefinition = PortableTextMarkDefinition,\n C extends TypedObject = ArbitraryTypedObject | PortableTextSpan,\n S extends string = PortableTextBlockStyle,\n L extends string = PortableTextListItemType,\n> extends TypedObject {\n /**\n * Type name identifying this as a portable text block.\n * All items within a portable text array should have a `_type` property.\n *\n * Usually 'block', but can be customized to other values\n */\n _type: \"block\" | string;\n /**\n * A key that identifies this block uniquely within the parent array. Used to more easily address\n * the block when editing collaboratively, but is also very useful for keys inside of React and\n * other rendering frameworks that can use keys to optimize operations.\n */\n _key?: string;\n /**\n * Array of inline items for this block. Usually contain text spans, but can be\n * configured to include inline objects of other types as well.\n */\n children: C[];\n /**\n * Array of mark definitions used in child text spans. By having them be on the block level,\n * the same mark definition can be reused for multiple text spans, which is often the case\n * with nested marks.\n */\n markDefs?: M[];\n /**\n * Visual style of the block\n * Common values: 'normal', 'blockquote', 'h1'...'h6'\n */\n style?: S;\n /**\n * If this block is a list item, identifies which style of list item this is\n * Common values: 'bullet', 'number', but can be configured\n */\n listItem?: L;\n /**\n * If this block is a list item, identifies which level of nesting it belongs within\n */\n level?: number;\n}\n\n/**\n * A set of _common_ (but not required/standarized) block styles\n * @public\n */\nexport declare type PortableTextBlockStyle =\n | \"normal\"\n | \"blockquote\"\n | \"h1\"\n | \"h2\"\n | \"h3\"\n | \"h4\"\n | \"h5\"\n | \"h6\"\n | string;\n\n/**\n * The simplest representation of a link\n * @public\n */\nexport declare interface PortableTextLink {\n _type: \"link\";\n href: string;\n}\n\n/**\n * Strictly speaking the same as a portable text block, but `listItem` is required\n *\n * @typeParam M - Mark types that be used for text spans\n * @typeParam C - Types allowed as children of this block\n * @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)\n * @typeParam L - Allowed list item types (eg `number`, `bullet` etc)\n * @public\n */\nexport declare interface PortableTextListItemBlock<\n M extends PortableTextMarkDefinition = PortableTextMarkDefinition,\n C extends TypedObject = PortableTextSpan,\n S extends string = PortableTextBlockStyle,\n L extends string = PortableTextListItemType,\n> extends Omit<PortableTextBlock<M, C, S, L>, \"listItem\"> {\n listItem: L;\n}\n\n/**\n * A set of _common_ (but not required/standardized) list item types\n * @public\n */\nexport declare type PortableTextListItemType = \"bullet\" | \"number\" | string;\n\n/**\n * A mark definition holds information for marked text. For instance, a text span could reference\n * a mark definition for a hyperlink, a geoposition, a reference to a document or anything that is\n * representable as a JSON object.\n * @public\n */\nexport declare interface PortableTextMarkDefinition {\n /**\n * Unknown properties\n */\n [key: string]: unknown;\n /**\n * Identifies the type of mark this is, and is used to pick the correct React components to use\n * when rendering a text span marked with this mark type.\n */\n _type: string;\n /**\n * Uniquely identifies this mark definition within the block\n */\n _key: string;\n}\n\n/**\n * A Portable Text Span holds a chunk of the actual text value of a Portable Text Block\n * @public\n */\nexport declare interface PortableTextSpan {\n /**\n * Type is always `span` for portable text spans, as these don't vary in shape\n */\n _type: \"span\";\n /**\n * Unique (within parent block) key for this portable text span\n */\n _key?: string;\n /**\n * The actual text value of this text span\n */\n text: string;\n /**\n * An array of marks this text span is annotated with, identified by its `_key`.\n * If the key cannot be found in the parent blocks mark definition, the mark is assumed to be a\n * decorator (a simpler mark without any properties - for instance `strong` or `em`)\n */\n marks?: string[];\n}\n\n/**\n * Any object with an `_type` property (which is required in portable text arrays),\n * as well as a _potential_ `_key` (highly encouraged)\n * @public\n */\nexport declare interface TypedObject {\n /**\n * Identifies the type of object/span this is, and is used to pick the correct React components\n * to use when rendering a span or inline object with this type.\n */\n _type: string;\n /**\n * Uniquely identifies this object within its parent block.\n * Not _required_, but highly encouraged.\n */\n _key?: string;\n}\n\nexport {};\n"],"x_google_ignoreList":[0],"mappings":"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xKH;EACA,CAAA,GAAA,EAAA,MAAA,CAAA,EAAA,OAAA;EACA,KAAA,EAAA,MAAA;CACA,GRuKL,WQvKK;AACA,KRwKG,UAAA,GQxKH,CAAA,URwK2B,WQxK3B,CAAA,CAAA,OAAA,ERyKE,YQzKF,CRyKe,CQzKf,CAAA,EAAA,GAAA,MAAA;AACA,UR2KQ,YQ3KR,CAAA,CAAA,CAAA,CAAA;EAGI,IAAA,ERyKL,CQzKK;EACA,KAAA,EAAA,MAAA;EAGF,QAAA,EAAA,OAAA;EACU,UAAA,ERuKP,UQvKO;;AVpDrB,KGkDK,SAAA,GAAU,OHlDUC,CGkDF,qBHlDmBI,CAAAA,GAAA;EAC9BC,YAAAA,CAAAA,EGkDK,oBHlDLA;CAA6BA;;;;AAEpBE,iBGsDL,sBHtDKA,CAAAA,cGuDL,WHvDKA,GGuDS,mBHvDTA,GGuD6B,oBHvD7BA,CAAAA,CAAAA,MAAAA,EGwDX,KHxDWA,CGwDL,KHxDKA,CAAAA,EAAAA,OAAAA,CAAAA,EGwDY,SHxDZA,CAAAA,EAAAA,MAAAA;;;AAlBrB;AAeyBP,cIhBZ,wBJgB6BI,EAAAA,GAAA,GAAA,MAAA;;AAf1C;AAeA;AACYC,cKfC,uBLeDA,EKf0B,4BLe1BA;AAhBZ,KMDK,2BAAA,GAA4B,oBNCqB,CMDA,mBNCA,CAAA;AAetD;;;AAEYN,cMbC,qBNaDA,EMbwB,2BNaxBA;;;;AAESS,cMDR,yBNCQA,EMDmB,2BNCnBA;;;;AAmCRJ,cMlBA,iBNkBAA,EMlBmB,2BNkBnBA;;;AAWb;AA6ByBM,cMpDZ,iBNoDqC,EMpDlB,2BNoDkB;;;;AAExBJ,cMhDb,iBNgDaA,EMhDM,2BNgDNA;;;;AAGUJ,cM7CvB,iBN6CuBA,EM7CJ,2BN6CIA;;;;AACxBE,cMxCC,iBNwCDA,EMxCoB,2BNwCpBA;;;AAOZ;AAQyBC,cMjDZ,iBNiDsC,EMjDnB,2BNiDmB;AAnHnD;AAeA;;AACyCA,cOd5B,iBPc4BA,EOdT,wBPcSA;;;;AAEpBE,cOVR,qBPUQA,EOVe,wBPUfA;;;;AA+BXJ,cOnCG,mBPmCHA,EOnCwB,wBPmCxBA;;;;AAgBUI,cO7CP,wBP6C6B,EO7CH,wBP6CG;AA6B1C;;;A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"}
1
+ {"version":3,"file":"index.d.ts","names":["TypedObject","ArbitraryTypedObject","PortableTextBlock","M","C","S","L","PortableTextMarkDefinition","PortableTextSpan","PortableTextBlockStyle","PortableTextListItemType","PortableTextListItemBlock","Omit","PortableTextLink"],"sources":["../../../node_modules/.pnpm/@portabletext+types@4.0.0/node_modules/@portabletext/types/dist/index.d.ts","../src/from-portable-text/renderers/block-spacing.ts","../src/from-portable-text/types.ts","../src/from-portable-text/portable-text-to-markdown.ts","../src/from-portable-text/renderers/hard-break.ts","../src/from-portable-text/renderers/list-item.ts","../src/from-portable-text/renderers/style.ts","../src/from-portable-text/renderers/marks.ts","../src/from-portable-text/renderers/type.ts","../src/to-portable-text/matchers.ts","../src/to-portable-text/markdown-to-portable-text.ts"],"sourcesContent":["/**\n* Any object with an `_type` property (which is required in portable text arrays),\n* as well as a _potential_ `_key` (highly encouraged)\n* @public\n*/\ninterface TypedObject {\n /**\n * Identifies the type of object/span this is, and is used to pick the correct React components\n * to use when rendering a span or inline object with this type.\n */\n _type: string;\n /**\n * Uniquely identifies this object within its parent block.\n * Not _required_, but highly encouraged.\n */\n _key?: string;\n}\n/**\n* Any object with an `_type` that is a string. Can hold any other properties.\n* @public\n*/\ntype ArbitraryTypedObject = TypedObject & {\n [key: string]: any;\n};\n/**\n* A Portable Text Block can be thought of as one paragraph, quote or list item.\n* In other words, it is a container for text, that can have a visual style associated with it.\n* The actual text value is stored in portable text spans inside of the `childen` array.\n*\n* @typeParam M - Mark types that be used for text spans\n* @typeParam C - Types allowed as children of this block\n* @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)\n* @typeParam L - Allowed list item types (eg `number`, `bullet` etc)\n* @public\n*/\ninterface PortableTextBlock<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = ArbitraryTypedObject | PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends TypedObject {\n /**\n * Type name identifying this as a portable text block.\n * All items within a portable text array should have a `_type` property.\n *\n * Usually 'block', but can be customized to other values\n */\n _type: \"block\" | (string & {});\n /**\n * A key that identifies this block uniquely within the parent array. Used to more easily address\n * the block when editing collaboratively, but is also very useful for keys inside of React and\n * other rendering frameworks that can use keys to optimize operations.\n */\n _key?: string;\n /**\n * Array of inline items for this block. Usually contain text spans, but can be\n * configured to include inline objects of other types as well.\n */\n children: C[];\n /**\n * Array of mark definitions used in child text spans. By having them be on the block level,\n * the same mark definition can be reused for multiple text spans, which is often the case\n * with nested marks.\n */\n markDefs?: M[];\n /**\n * Visual style of the block\n * Common values: 'normal', 'blockquote', 'h1'...'h6'\n */\n style?: S;\n /**\n * If this block is a list item, identifies which style of list item this is\n * Common values: 'bullet', 'number', but can be configured\n */\n listItem?: L;\n /**\n * If this block is a list item, identifies which level of nesting it belongs within\n */\n level?: number;\n}\n/**\n* Strictly speaking the same as a portable text block, but `listItem` is required\n*\n* @typeParam M - Mark types that be used for text spans\n* @typeParam C - Types allowed as children of this block\n* @typeParam S - Allowed block styles (eg `normal`, `blockquote`, `h3` etc)\n* @typeParam L - Allowed list item types (eg `number`, `bullet` etc)\n* @public\n*/\ninterface PortableTextListItemBlock<M extends PortableTextMarkDefinition = PortableTextMarkDefinition, C extends TypedObject = PortableTextSpan, S extends string = PortableTextBlockStyle, L extends string = PortableTextListItemType> extends Omit<PortableTextBlock<M, C, S, L>, \"listItem\"> {\n listItem: L;\n}\n/**\n* A set of _common_ (but not required/standarized) block styles\n* @public\n*/\ntype PortableTextBlockStyle = \"normal\" | \"blockquote\" | \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\" | (string & {});\n/**\n* A set of _common_ (but not required/standardized) list item types\n* @public\n*/\ntype PortableTextListItemType = \"bullet\" | \"number\" | (string & {});\n/**\n* A mark definition holds information for marked text. For instance, a text span could reference\n* a mark definition for a hyperlink, a geoposition, a reference to a document or anything that is\n* representable as a JSON object.\n* @public\n*/\ninterface PortableTextMarkDefinition {\n /**\n * Unknown properties\n */\n [key: string]: unknown;\n /**\n * Identifies the type of mark this is, and is used to pick the correct React components to use\n * when rendering a text span marked with this mark type.\n */\n _type: string;\n /**\n * Uniquely identifies this mark definition within the block\n */\n _key: string;\n}\n/**\n* A Portable Text Span holds a chunk of the actual text value of a Portable Text Block\n* @public\n*/\ninterface PortableTextSpan {\n /**\n * Type is always `span` for portable text spans, as these don't vary in shape\n */\n _type: \"span\";\n /**\n * Unique (within parent block) key for this portable text span\n */\n _key?: string;\n /**\n * The actual text value of this text span\n */\n text: string;\n /**\n * An array of marks this text span is annotated with, identified by its `_key`.\n * If the key cannot be found in the parent blocks mark definition, the mark is assumed to be a\n * decorator (a simpler mark without any properties - for instance `strong` or `em`)\n */\n marks?: string[];\n}\n/**\n* The simplest representation of a link\n* @public\n*/\ninterface PortableTextLink {\n _type: \"link\";\n href: string;\n}\nexport { ArbitraryTypedObject, PortableTextBlock, PortableTextBlockStyle, PortableTextLink, PortableTextListItemBlock, PortableTextListItemType, PortableTextMarkDefinition, PortableTextSpan, TypedObject };\n//# sourceMappingURL=index.d.ts.map"],"x_google_ignoreList":[0],"mappings":"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"}
package/dist/index.js CHANGED
@@ -160,7 +160,17 @@ const DefaultBlockSpacingRenderer = ({
160
160
  }, DefaultUnknownListItemRenderer = ({
161
161
  children
162
162
  }) => `- ${children}
163
- `, DefaultEmRenderer = ({ children }) => `_${children}_`, DefaultStrongRenderer = ({ children }) => `**${children}**`, DefaultCodeRenderer = ({ children }) => `\`${children}\``, DefaultUnderlineRenderer = ({
163
+ `;
164
+ function escapeAltAndLinkText(text) {
165
+ return text.replace(/([[\]\\])/g, "\\$1");
166
+ }
167
+ function unescapeAltText(text) {
168
+ return text.replace(/\\([!"#$%&'()*+,\-./:;<=>?@[\\\]^_`{|}~])/g, "$1");
169
+ }
170
+ function escapeTitle(text) {
171
+ return text.replace(/([\\"])/g, "\\$1");
172
+ }
173
+ const DefaultEmRenderer = ({ children }) => `_${children}_`, DefaultStrongRenderer = ({ children }) => `**${children}**`, DefaultCodeRenderer = ({ children }) => `\`${children}\``, DefaultUnderlineRenderer = ({
164
174
  children
165
175
  }) => `<u>${children}</u>`, DefaultStrikeThroughRenderer = ({
166
176
  children
@@ -172,9 +182,9 @@ const DefaultBlockSpacingRenderer = ({
172
182
  if (uriLooksSafe(href)) {
173
183
  if (/["'][^"']*[<>]|[<>][^<>]*["']/.test(href)) {
174
184
  const encodedHref = href.replace(/["<>() ]/g, (char) => `%${char.charCodeAt(0).toString(16).toUpperCase()}`);
175
- return `[${children}](${encodedHref})`;
185
+ return `[${escapeAltAndLinkText(children)}](${encodedHref})`;
176
186
  }
177
- return `[${children}](${href}${title ? ` "${title}"` : ""})`;
187
+ return `[${escapeAltAndLinkText(children)}](${href}${title ? ` "${escapeTitle(title)}"` : ""})`;
178
188
  }
179
189
  return children;
180
190
  };
@@ -207,7 +217,7 @@ const DefaultUnknownMarkRenderer = ({
207
217
  }) => children ?? "", DefaultCodeBlockRenderer = ({ value }) => `\`\`\`${value.language ?? ""}
208
218
  ${value.code}
209
219
  \`\`\``, DefaultHorizontalRuleRenderer = () => "---", DefaultHtmlRenderer = ({ value }) => value.html, DefaultImageRenderer = ({ value }) => {
210
- const alt = value.alt ?? "", title = value.title ? ` "${value.title}"` : "";
220
+ const alt = escapeAltAndLinkText(value.alt ?? ""), title = value.title ? ` "${escapeTitle(value.title)}"` : "";
211
221
  return `![${alt}](${value.src}${title})`;
212
222
  }, DefaultTableRenderer = ({ value, renderNode }) => {
213
223
  const headerRows = value.headerRows || 0, rows = value.rows, lines = [], getCellText = (cellBlocks) => cellBlocks.map(
@@ -884,7 +894,7 @@ function markdownToPortableText(markdown, options) {
884
894
  const imageToken = token.children[0];
885
895
  if (!imageToken)
886
896
  break;
887
- const src = imageToken.attrs?.find(([name]) => name === "src")?.at(1) || "", alt = imageToken.content || "", title = imageToken.attrs?.find(([name]) => name === "title")?.at(1) || void 0, blockImageObject = consolidatedOptions.types.image({
897
+ const src = imageToken.attrs?.find(([name]) => name === "src")?.at(1) || "", alt = unescapeAltText(imageToken.content || ""), title = imageToken.attrs?.find(([name]) => name === "title")?.at(1) || void 0, blockImageObject = consolidatedOptions.types.image({
888
898
  context: {
889
899
  schema: consolidatedOptions.schema,
890
900
  keyGenerator: consolidatedOptions.keyGenerator
@@ -1012,7 +1022,7 @@ function markdownToPortableText(markdown, options) {
1012
1022
  break;
1013
1023
  }
1014
1024
  case "image": {
1015
- const src = childToken.attrs?.find(([name]) => name === "src")?.at(1) || "", alt = childToken.content || "", inlineImageObject = consolidatedOptions.types.image({
1025
+ const src = childToken.attrs?.find(([name]) => name === "src")?.at(1) || "", alt = unescapeAltText(childToken.content || ""), inlineImageObject = consolidatedOptions.types.image({
1016
1026
  context: {
1017
1027
  schema: consolidatedOptions.schema,
1018
1028
  keyGenerator: consolidatedOptions.keyGenerator
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/key-generator.ts","../src/from-portable-text/build-list-index-map.ts","../src/from-portable-text/render-node.ts","../src/from-portable-text/renderers/block-spacing.ts","../src/from-portable-text/renderers/hard-break.ts","../src/from-portable-text/renderers/list-item.ts","../src/from-portable-text/renderers/marks.ts","../src/from-portable-text/renderers/style.ts","../src/from-portable-text/renderers/type.ts","../src/from-portable-text/portable-text-to-markdown.ts","../src/default-schema.ts","../src/to-portable-text/matchers.ts","../src/to-portable-text/markdown-to-portable-text.ts"],"sourcesContent":["export function defaultKeyGenerator() {\n return randomKey(12)\n}\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {\n compileSchema,\n defineSchema,\n isTextBlock,\n type PortableTextBlock,\n} from '@portabletext/schema'\nimport type {ArbitraryTypedObject, TypedObject} from '@portabletext/types'\nimport {defaultKeyGenerator} from '../key-generator'\n\nconst schema = compileSchema(defineSchema({}))\n\n/**\n * Builds a map of list item `_key`s to their index.\n *\n * Mutates the blocks in place by adding a `_key` if necessary.\n */\nexport function buildListIndexMap<\n Block extends TypedObject = PortableTextBlock | ArbitraryTypedObject,\n>(blocks: Array<Block>): Map<string, number> {\n const levelIndexMaps = new Map<string, Map<number, number>>()\n const listIndexMap = new Map<string, number>()\n\n let previousListItem:\n | {\n listItem: string\n level: number\n }\n | undefined\n\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const block = blocks.at(blockIndex)\n\n if (block === undefined) {\n continue\n }\n\n if (!block._key) {\n block._key = defaultKeyGenerator()\n }\n\n // Clear the state if we encounter a non-text block\n if (!isTextBlock({schema}, block)) {\n levelIndexMaps.clear()\n previousListItem = undefined\n\n continue\n }\n\n // Clear the state if we encounter a non-list text block\n if (block.listItem === undefined || block.level === undefined) {\n levelIndexMaps.clear()\n previousListItem = undefined\n\n continue\n }\n\n // If we encounter a new list item, we set the initial index to 1 for the\n // list type on that level.\n if (!previousListItem) {\n const listIndex = 1\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n levelIndexMap.set(block.level, listIndex)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, listIndex)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n\n continue\n }\n\n // If the previous list item is of the same type but on a lower level, we\n // need to reset the level index map for that type.\n if (\n previousListItem.listItem === block.listItem &&\n previousListItem.level < block.level\n ) {\n const listIndex = 1\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n levelIndexMap.set(block.level, listIndex)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, listIndex)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n\n continue\n }\n\n // Reset other list types at current level and deeper\n levelIndexMaps.forEach((levelIndexMap, listItem) => {\n if (listItem === block.listItem) {\n return\n }\n\n // Reset all levels that are >= current level\n const levelsToDelete: number[] = []\n\n levelIndexMap.forEach((_, level) => {\n if (level >= block.level!) {\n levelsToDelete.push(level)\n }\n })\n\n levelsToDelete.forEach((level) => {\n levelIndexMap.delete(level)\n })\n })\n\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n const levelCounter = levelIndexMap.get(block.level) ?? 0\n levelIndexMap.set(block.level, levelCounter + 1)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, levelCounter + 1)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n }\n\n return listIndexMap\n}\n","import {\n buildMarksTree,\n isPortableTextBlock,\n isPortableTextListItemBlock,\n isPortableTextToolkitSpan,\n isPortableTextToolkitTextNode,\n spanToPlainText,\n type ToolkitNestedPortableTextSpan,\n type ToolkitTextNode,\n} from '@portabletext/toolkit'\nimport type {\n PortableTextBlock,\n PortableTextListItemBlock,\n PortableTextMarkDefinition,\n PortableTextSpan,\n TypedObject,\n} from '@portabletext/types'\nimport {defaultKeyGenerator} from '../key-generator'\nimport type {PortableTextRenderers, RenderNode, Serializable} from './types'\n\ninterface SerializedBlock {\n _key: string\n children: string\n index: number\n isInline: boolean\n node: PortableTextBlock | PortableTextListItemBlock\n}\n\nexport const createRenderNode = (\n renderers: PortableTextRenderers,\n listIndexMap: Map<string, number>,\n): RenderNode => {\n function renderNode<N extends TypedObject>(options: Serializable<N>): string {\n const {node, index, isInline} = options\n\n if (isPortableTextListItemBlock(node)) {\n return renderListItem(node, index)\n }\n\n if (isPortableTextToolkitSpan(node)) {\n return renderSpan(node)\n }\n\n if (isPortableTextBlock(node)) {\n return renderBlock(node, index, isInline)\n }\n\n if (isPortableTextToolkitTextNode(node)) {\n return renderText(node)\n }\n\n return renderCustomBlock(node, index, isInline)\n }\n\n function renderListItem(\n node: PortableTextListItemBlock<\n PortableTextMarkDefinition,\n PortableTextSpan\n >,\n index: number,\n ): string {\n const renderer = renderers.listItem\n const handler =\n typeof renderer === 'function' ? renderer : renderer[node.listItem]\n const itemHandler = handler || renderers.unknownListItem\n\n // Build the text content from the block\n const tree = buildMarksTree(node)\n const textContent = tree\n .map((child, i) => {\n return renderNode({node: child, isInline: true, index: i, renderNode})\n })\n .join('')\n\n let children = textContent\n\n if (node.style && node.style !== 'normal') {\n // Wrap any other style in whatever the block component says to use\n const {listItem: _listItem, ...blockNode} = node\n children = renderNode({\n node: blockNode,\n index,\n isInline: false,\n renderNode,\n })\n // Strip trailing newlines from block styles - list item component handles spacing\n children = children.replace(/\\n+$/, '')\n }\n\n return itemHandler({\n value: node,\n index,\n listIndex: node._key ? listIndexMap.get(node._key) : undefined,\n isInline: false,\n renderNode,\n children,\n })\n }\n\n function renderSpan(node: ToolkitNestedPortableTextSpan): string {\n const {markDef, markType, markKey} = node\n const span = renderers.marks[markType] || renderers.unknownMark\n const children = node.children.map((child, childIndex) =>\n renderNode({node: child, index: childIndex, isInline: true, renderNode}),\n )\n\n return span({\n text: spanToPlainText(node),\n value: markDef,\n markType,\n markKey,\n renderNode,\n children: children.join(''),\n })\n }\n\n function renderBlock(\n node: PortableTextBlock,\n index: number,\n isInline: boolean,\n ): string {\n const {_key, ...props} = serializeBlock({node, index, isInline, renderNode})\n const style = props.node.style || 'normal'\n const handler =\n typeof renderers.block === 'function'\n ? renderers.block\n : renderers.block[style]\n const block = handler || renderers.unknownBlockStyle\n\n return block({...props, value: props.node, renderNode})\n }\n\n function renderText(node: ToolkitTextNode): string {\n if (node.text === '\\n') {\n return renderers.hardBreak()\n }\n\n return node.text\n }\n\n function renderCustomBlock(\n value: TypedObject,\n index: number,\n isInline: boolean,\n ): string {\n const component = renderers.types[value._type] ?? renderers.unknownType\n\n return component({\n value,\n isInline,\n index,\n renderNode,\n })\n }\n\n return renderNode\n}\n\nfunction serializeBlock(\n options: Serializable<PortableTextBlock>,\n): SerializedBlock {\n const {node, index, isInline, renderNode} = options\n const tree = buildMarksTree(node)\n\n const renderedChildren = tree.map((child, i) =>\n renderNode({node: child, isInline: true, index: i, renderNode}),\n )\n\n return {\n _key: node._key || defaultKeyGenerator(),\n children: renderedChildren.join(''),\n index,\n isInline,\n node,\n }\n}\n","import {\n isPortableTextBlock,\n isPortableTextListItemBlock,\n} from '@portabletext/toolkit'\nimport type {TypedObject} from '@portabletext/types'\n\n/**\n * @public\n */\nexport type BlockSpacingRenderer = (options: {\n current: TypedObject\n next: TypedObject\n}) => string | undefined\n\n/**\n * @public\n */\nexport const DefaultBlockSpacingRenderer: BlockSpacingRenderer = ({\n current,\n next,\n}) => {\n if (\n isPortableTextListItemBlock(current) &&\n isPortableTextListItemBlock(next)\n ) {\n return '\\n'\n }\n\n if (\n isPortableTextBlock(current) &&\n isPortableTextBlock(next) &&\n current.style === 'blockquote' &&\n next.style === 'blockquote'\n ) {\n return '\\n>\\n'\n }\n\n return '\\n\\n'\n}\n","/**\n * @public\n */\nexport const DefaultHardBreakRenderer = (): string => ' \\n'\n","import type {PortableTextListItemRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultListItemRenderer: PortableTextListItemRenderer = ({\n children,\n value,\n listIndex,\n}) => {\n const listStyle = value.listItem || 'bullet'\n const level = value.level || 1\n\n if (listStyle === 'number') {\n const indent = ' '.repeat(level - 1)\n\n return `${indent}${listIndex ?? 1}. ${children}`\n }\n\n const indent = ' '.repeat(level - 1)\n\n return `${indent}- ${children}`\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownListItemRenderer: PortableTextListItemRenderer = ({\n children,\n}) => {\n return `- ${children}\\n`\n}\n","import type {TypedObject} from '@portabletext/types'\nimport type {PortableTextMarkRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultEmRenderer: PortableTextMarkRenderer = ({children}) =>\n `_${children}_`\n\n/**\n * @public\n */\nexport const DefaultStrongRenderer: PortableTextMarkRenderer = ({children}) =>\n `**${children}**`\n\n/**\n * @public\n */\nexport const DefaultCodeRenderer: PortableTextMarkRenderer = ({children}) =>\n `\\`${children}\\``\n\n/**\n * @public\n */\nexport const DefaultUnderlineRenderer: PortableTextMarkRenderer = ({\n children,\n}) => `<u>${children}</u>`\n\n/**\n * @public\n */\nexport const DefaultStrikeThroughRenderer: PortableTextMarkRenderer = ({\n children,\n}) => `~~${children}~~`\n\ninterface DefaultLink extends TypedObject {\n _type: 'link'\n href: string\n title: string | undefined\n}\n\n/**\n * @public\n */\nexport const DefaultLinkRenderer: PortableTextMarkRenderer<DefaultLink> = ({\n children,\n value,\n}) => {\n const href = value?.href || ''\n const title = value?.title || ''\n const looksSafe = uriLooksSafe(href)\n\n if (looksSafe) {\n // Check if the URL looks like an HTML injection attempt\n // If it has quotes AND angle brackets, or other suspicious patterns, encode more aggressively\n const looksLikeInjection = /[\"'][^\"']*[<>]|[<>][^<>]*[\"']/.test(href)\n\n if (looksLikeInjection) {\n // Encode all special characters that could be used for injection\n const encodedHref = href.replace(/[\"<>() ]/g, (char) => {\n return `%${char.charCodeAt(0).toString(16).toUpperCase()}`\n })\n return `[${children}](${encodedHref})`\n }\n\n // For normal URLs, don't encode parentheses - Markdown handles balanced parens fine\n return `[${children}](${href}${title ? ` \"${title}\"` : ''})`\n }\n\n // Return children without link when URL is unsafe\n return children\n}\n\nfunction uriLooksSafe(uri: string): boolean {\n const url = (uri || '').trim()\n const first = url.charAt(0)\n\n if (first === '#' || first === '/') {\n return true\n }\n\n const colonIndex = url.indexOf(':')\n if (colonIndex === -1) {\n return true\n }\n\n const allowedProtocols = ['http', 'https', 'mailto', 'tel']\n const proto = url.slice(0, colonIndex).toLowerCase()\n if (allowedProtocols.indexOf(proto) !== -1) {\n return true\n }\n\n const queryIndex = url.indexOf('?')\n if (queryIndex !== -1 && colonIndex > queryIndex) {\n return true\n }\n\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1 && colonIndex > hashIndex) {\n return true\n }\n\n return false\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownMarkRenderer: PortableTextMarkRenderer = ({\n children,\n}) => {\n return children\n}\n","import type {PortableTextBlock} from '@portabletext/types'\nimport type {PortableTextRenderer} from '../types'\n\ntype PortableTextBlockRenderer = PortableTextRenderer<PortableTextBlock>\n\n/**\n * @public\n */\nexport const DefaultNormalRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n // Empty blocks should not add extra spacing\n if (!children || children.trim() === '') {\n return ''\n }\n\n return children\n}\n\n/**\n * @public\n */\nexport const DefaultBlockquoteRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n // Prefix each line with \"> \" for proper blockquote formatting\n // This handles multi-line content and preserves empty lines\n if (!children) {\n return '>'\n }\n\n return children\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n')\n}\n\n/**\n * @public\n */\nexport const DefaultH1Renderer: PortableTextBlockRenderer = ({children}) =>\n `# ${children}`\n\n/**\n * @public\n */\nexport const DefaultH2Renderer: PortableTextBlockRenderer = ({children}) =>\n `## ${children}`\n\n/**\n * @public\n */\nexport const DefaultH3Renderer: PortableTextBlockRenderer = ({children}) =>\n `### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH4Renderer: PortableTextBlockRenderer = ({children}) =>\n `#### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH5Renderer: PortableTextBlockRenderer = ({children}) =>\n `##### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH6Renderer: PortableTextBlockRenderer = ({children}) =>\n `###### ${children}`\n\n/**\n * @public\n */\nexport const DefaultUnknownStyleRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n return children ?? ''\n}\n","import type {PortableTextBlock} from '@portabletext/types'\nimport type {PortableTextTypeRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultCodeBlockRenderer: PortableTextTypeRenderer<{\n _type: 'code'\n code: string\n language: string | undefined\n}> = ({value}) => {\n return `\\`\\`\\`${value.language ?? ''}\\n${value.code}\\n\\`\\`\\``\n}\n\n/**\n * @public\n */\nexport const DefaultHorizontalRuleRenderer: PortableTextTypeRenderer = () => {\n return '---'\n}\n\n/**\n * @public\n */\nexport const DefaultHtmlRenderer: PortableTextTypeRenderer<{\n _type: 'html'\n html: string\n}> = ({value}) => {\n return value.html\n}\n\n/**\n * @public\n */\nexport const DefaultImageRenderer: PortableTextTypeRenderer<{\n _type: 'image'\n src: string\n alt: string | undefined\n title: string | undefined\n}> = ({value}) => {\n const alt = value.alt ?? ''\n const title = value.title ? ` \"${value.title}\"` : ''\n return `![${alt}](${value.src}${title})`\n}\n\n/**\n * @public\n */\nexport const DefaultTableRenderer: PortableTextTypeRenderer<{\n _type: 'table'\n headerRows: number | undefined\n rows: Array<{\n _key: string\n cells: Array<{\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n}> = ({value, renderNode}) => {\n const headerRows = value.headerRows || 0\n const rows = value.rows as Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<{_type: string; children?: Array<unknown>}>\n }>\n }>\n const lines: string[] = []\n\n // Helper to extract text from cell blocks\n const getCellText = (\n cellBlocks: Array<{_type: string; children?: Array<unknown>}>,\n ): string => {\n return cellBlocks\n .map((block, index) =>\n renderNode({\n node: block as {_type: string},\n index,\n isInline: false,\n renderNode,\n }),\n )\n .join(' ')\n .trim()\n }\n\n // Add header rows\n for (let i = 0; i < headerRows; i++) {\n const row = rows[i]\n if (row) {\n const cellTexts = row.cells.map((cell) => getCellText(cell.value))\n lines.push(`| ${cellTexts.join(' | ')} |`)\n }\n }\n\n // Add separator line if there are headers\n if (headerRows > 0 && rows[0]) {\n const separators = rows[0].cells.map(() => ' --- ')\n lines.push(`|${separators.join('|')}|`)\n }\n\n // Add body rows\n for (let i = headerRows; i < rows.length; i++) {\n const row = rows[i]\n if (row) {\n const cellTexts = row.cells.map((cell) => getCellText(cell.value))\n lines.push(`| ${cellTexts.join(' | ')} |`)\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownTypeRenderer: PortableTextTypeRenderer = ({\n value,\n isInline,\n}) => {\n const json = `\\`\\`\\`json\\n${JSON.stringify(value, null, 2)}\\n\\`\\`\\``\n // For inline unknown types, add newlines to break them out of the text flow\n return isInline ? `\\n${json}\\n` : json\n}\n","import type {\n ArbitraryTypedObject,\n PortableTextBlock,\n TypedObject,\n} from '@portabletext/types'\nimport {buildListIndexMap} from './build-list-index-map'\nimport {createRenderNode} from './render-node'\nimport {\n DefaultBlockSpacingRenderer,\n type BlockSpacingRenderer,\n} from './renderers/block-spacing'\nimport {DefaultHardBreakRenderer} from './renderers/hard-break'\nimport {\n DefaultListItemRenderer,\n DefaultUnknownListItemRenderer,\n} from './renderers/list-item'\nimport {\n DefaultCodeRenderer,\n DefaultEmRenderer,\n DefaultLinkRenderer,\n DefaultStrikeThroughRenderer,\n DefaultStrongRenderer,\n DefaultUnderlineRenderer,\n DefaultUnknownMarkRenderer,\n} from './renderers/marks'\nimport {\n DefaultBlockquoteRenderer,\n DefaultH1Renderer,\n DefaultH2Renderer,\n DefaultH3Renderer,\n DefaultH4Renderer,\n DefaultH5Renderer,\n DefaultH6Renderer,\n DefaultNormalRenderer,\n DefaultUnknownStyleRenderer,\n} from './renderers/style'\nimport {DefaultUnknownTypeRenderer} from './renderers/type'\nimport type {PortableTextRenderers} from './types'\n\nconst defaultRenderers: PortableTextRenderers = {\n types: {},\n\n block: {\n normal: DefaultNormalRenderer,\n blockquote: DefaultBlockquoteRenderer,\n h1: DefaultH1Renderer,\n h2: DefaultH2Renderer,\n h3: DefaultH3Renderer,\n h4: DefaultH4Renderer,\n h5: DefaultH5Renderer,\n h6: DefaultH6Renderer,\n },\n marks: {\n 'em': DefaultEmRenderer,\n 'strong': DefaultStrongRenderer,\n 'code': DefaultCodeRenderer,\n 'underline': DefaultUnderlineRenderer,\n 'strike-through': DefaultStrikeThroughRenderer,\n 'link': DefaultLinkRenderer,\n },\n listItem: DefaultListItemRenderer,\n hardBreak: DefaultHardBreakRenderer,\n\n unknownType: DefaultUnknownTypeRenderer,\n unknownMark: DefaultUnknownMarkRenderer,\n unknownListItem: DefaultUnknownListItemRenderer,\n unknownBlockStyle: DefaultUnknownStyleRenderer,\n}\n\ntype Options = Partial<PortableTextRenderers> & {\n blockSpacing?: BlockSpacingRenderer\n}\n\n/**\n * @public\n */\nexport function portableTextToMarkdown<\n Block extends TypedObject = PortableTextBlock | ArbitraryTypedObject,\n>(blocks: Array<Block>, options: Options = {}): string {\n const renderers = {\n block: {\n ...defaultRenderers.block,\n ...options.block,\n },\n listItem: options.listItem ?? defaultRenderers.listItem,\n marks: {\n ...defaultRenderers.marks,\n ...options.marks,\n },\n types: {\n ...defaultRenderers.types,\n ...options.types,\n },\n hardBreak: options.hardBreak ?? defaultRenderers.hardBreak,\n unknownType: options.unknownType ?? defaultRenderers.unknownType,\n unknownBlockStyle:\n options.unknownBlockStyle ?? defaultRenderers.unknownBlockStyle,\n unknownListItem:\n options.unknownListItem ?? defaultRenderers.unknownListItem,\n unknownMark: options.unknownMark ?? defaultRenderers.unknownMark,\n }\n const renderBlockSpacing = options.blockSpacing ?? DefaultBlockSpacingRenderer\n\n const listIndexMap = buildListIndexMap(blocks)\n const renderNode = createRenderNode(renderers, listIndexMap)\n\n return blocks\n .map((node, index) => {\n const renderedNode = renderNode({\n node,\n index,\n isInline: false,\n renderNode,\n })\n\n if (index === blocks.length - 1) {\n return renderedNode\n }\n\n const nextNode = blocks.at(index + 1)\n\n if (!nextNode) {\n return renderedNode\n }\n\n const blockSpacing =\n renderBlockSpacing({\n current: node,\n next: nextNode,\n }) ?? '\\n\\n'\n\n return `${renderedNode}${blockSpacing}`\n })\n .join('')\n}\n","import {\n compileSchema,\n defineSchema,\n type AnnotationDefinition,\n type BlockObjectDefinition,\n type DecoratorDefinition,\n type ListDefinition,\n type StyleDefinition,\n} from '@portabletext/schema'\n\n/********************\n * Default style definitions\n ********************/\n\nexport const normalStyleDefinition = {\n name: 'normal',\n} as const satisfies StyleDefinition\n\nexport const h1StyleDefinition = {\n name: 'h1',\n} as const satisfies StyleDefinition\n\nexport const h2StyleDefinition = {\n name: 'h2',\n} as const satisfies StyleDefinition\n\nexport const h3StyleDefinition = {\n name: 'h3',\n} as const satisfies StyleDefinition\n\nexport const h4StyleDefinition = {\n name: 'h4',\n} as const satisfies StyleDefinition\n\nexport const h5StyleDefinition = {\n name: 'h5',\n} as const satisfies StyleDefinition\n\nexport const h6StyleDefinition = {\n name: 'h6',\n} as const satisfies StyleDefinition\n\nexport const blockquoteStyleDefinition = {\n name: 'blockquote',\n} as const satisfies StyleDefinition\n\n/********************\n * Default list definitions\n ********************/\n\nexport const defaultOrderedListItemDefinition = {\n name: 'number',\n} as const satisfies ListDefinition\n\nexport const defaultUnorderedListItemDefinition = {\n name: 'bullet',\n} as const satisfies ListDefinition\n\n/********************\n * Default decorator definitions\n ********************/\n\nexport const defaultStrongDecoratorDefinition = {\n name: 'strong',\n} as const satisfies DecoratorDefinition\n\nexport const defaultEmDecoratorDefinition = {\n name: 'em',\n} as const satisfies DecoratorDefinition\n\nexport const defaultCodeDecoratorDefinition = {\n name: 'code',\n} as const satisfies DecoratorDefinition\n\nexport const defaultStrikeThroughDecoratorDefinition = {\n name: 'strike-through',\n} as const satisfies DecoratorDefinition\n\n/********************\n * Default annotation definitions\n ********************/\n\nexport const defaultLinkObjectDefinition = {\n name: 'link',\n fields: [\n {name: 'href', type: 'string'},\n {name: 'title', type: 'string'},\n ],\n} as const satisfies AnnotationDefinition\n\n/********************\n * Default object definitions\n ********************/\n\nexport const defaultCodeObjectDefinition = {\n name: 'code',\n fields: [\n {name: 'language', type: 'string'},\n {name: 'code', type: 'string'},\n ],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultImageObjectDefinition = {\n name: 'image',\n fields: [\n {name: 'src', type: 'string'},\n {name: 'alt', type: 'string'},\n {name: 'title', type: 'string'},\n ],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultHorizontalRuleObjectDefinition = {\n name: 'horizontal-rule',\n} as const satisfies BlockObjectDefinition\n\nexport const defaultHtmlObjectDefinition = {\n name: 'html',\n fields: [{name: 'html', type: 'string'}],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultTableObjectDefinition = {\n name: 'table',\n fields: [\n {name: 'headerRows', type: 'number'},\n {name: 'rows', type: 'array'},\n ],\n} as const satisfies BlockObjectDefinition\n\n/**\n * The default schema for converting markdown to Portable Text.\n *\n * @public\n */\nexport const defaultSchema = compileSchema(\n defineSchema({\n styles: [\n normalStyleDefinition,\n h1StyleDefinition,\n h2StyleDefinition,\n h3StyleDefinition,\n h4StyleDefinition,\n h5StyleDefinition,\n h6StyleDefinition,\n blockquoteStyleDefinition,\n ],\n lists: [\n defaultOrderedListItemDefinition,\n defaultUnorderedListItemDefinition,\n ],\n decorators: [\n defaultStrongDecoratorDefinition,\n defaultEmDecoratorDefinition,\n defaultCodeDecoratorDefinition,\n defaultStrikeThroughDecoratorDefinition,\n ],\n annotations: [defaultLinkObjectDefinition],\n blockObjects: [\n defaultCodeObjectDefinition,\n defaultHorizontalRuleObjectDefinition,\n defaultImageObjectDefinition,\n defaultHtmlObjectDefinition,\n defaultTableObjectDefinition,\n ],\n inlineObjects: [defaultImageObjectDefinition],\n }),\n)\n","import type {\n PortableTextObject,\n Schema,\n SchemaDefinition,\n} from '@portabletext/schema'\n\n/**\n * Matcher function for mapping markdown elements to Portable Text block styles.\n *\n * @public\n */\nexport type StyleMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildStyleMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): StyleMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.styles.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown list items to Portable Text list types.\n *\n * @public\n */\nexport type ListItemMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildListItemMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): ListItemMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.lists.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown inline formatting to Portable Text decorators.\n *\n * @public\n */\nexport type DecoratorMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildDecoratorMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): DecoratorMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.decorators.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown links to Portable Text annotations.\n *\n * @public\n */\nexport type AnnotationMatcher<\n TValue extends Record<string, unknown> = Record<string, never>,\n> = ({\n context,\n value,\n}: {\n context: {schema: Schema; keyGenerator: () => string}\n value: TValue\n}) => PortableTextObject | undefined\n\nexport function buildAnnotationMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): AnnotationMatcher<ExtractValue<TDefinition>> {\n return ({context, value}) => {\n const schemaDefinition = context.schema.annotations.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n const filteredValue = schemaDefinition.fields.reduce<\n Record<string, unknown>\n >((filteredValue, field) => {\n const fieldValue = value[field.name as keyof typeof value]\n\n if (fieldValue !== undefined) {\n filteredValue[field.name] = fieldValue\n }\n\n return filteredValue\n }, {})\n\n return {\n _key: context.keyGenerator(),\n _type: schemaDefinition.name,\n ...filteredValue,\n }\n }\n}\n\n/**\n * Matcher function for mapping markdown objects to Portable Text block or inline objects.\n *\n * @public\n */\nexport type ObjectMatcher<\n TValue extends Record<string, unknown> = Record<string, never>,\n> = ({\n context,\n value,\n isInline,\n}: {\n context: {schema: Schema; keyGenerator: () => string}\n value: TValue\n isInline: boolean\n}) => PortableTextObject | undefined\n\nexport function buildObjectMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): ObjectMatcher<ExtractValue<TDefinition>> {\n return ({context, value, isInline}) => {\n const schemaCollection = isInline\n ? context.schema.inlineObjects\n : context.schema.blockObjects\n\n const schemaDefinition = schemaCollection.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n const filteredValue = schemaDefinition.fields.reduce<\n Record<string, unknown>\n >((filteredValue, field) => {\n const fieldValue = value[field.name as keyof typeof value]\n\n if (fieldValue !== undefined) {\n filteredValue[field.name] = fieldValue\n }\n\n return filteredValue\n }, {})\n\n return {\n _key: context.keyGenerator(),\n _type: schemaDefinition.name,\n ...filteredValue,\n }\n }\n}\n\nexport type ExtractValue<\n TDefinition extends NonNullable<SchemaDefinition['blockObjects']>[0],\n> = TDefinition extends {fields: ReadonlyArray<{name: infer TNames}>}\n ? Record<TNames & string, unknown>\n : Record<string, never>\n","import {\n isSpan,\n type PortableTextBlock,\n type PortableTextObject,\n type PortableTextTextBlock,\n type Schema,\n} from '@portabletext/schema'\nimport markdownit from 'markdown-it'\nimport {\n blockquoteStyleDefinition,\n defaultCodeDecoratorDefinition,\n defaultCodeObjectDefinition,\n defaultEmDecoratorDefinition,\n defaultHorizontalRuleObjectDefinition,\n defaultHtmlObjectDefinition,\n defaultImageObjectDefinition,\n defaultLinkObjectDefinition,\n defaultOrderedListItemDefinition,\n defaultSchema,\n defaultStrikeThroughDecoratorDefinition,\n defaultStrongDecoratorDefinition,\n defaultUnorderedListItemDefinition,\n h1StyleDefinition,\n h2StyleDefinition,\n h3StyleDefinition,\n h4StyleDefinition,\n h5StyleDefinition,\n h6StyleDefinition,\n normalStyleDefinition,\n} from '../default-schema'\nimport {defaultKeyGenerator} from '../key-generator'\nimport {\n buildAnnotationMatcher,\n buildDecoratorMatcher,\n buildListItemMatcher,\n buildObjectMatcher,\n buildStyleMatcher,\n type AnnotationMatcher,\n type DecoratorMatcher,\n type ExtractValue,\n type ListItemMatcher,\n type ObjectMatcher,\n type StyleMatcher,\n} from './matchers'\n\ntype Options = {\n schema?: Schema\n keyGenerator?: () => string\n marks?: {\n strong?: DecoratorMatcher\n em?: DecoratorMatcher\n code?: DecoratorMatcher\n strikeThrough?: DecoratorMatcher\n link?: AnnotationMatcher<{href: string; title: string | undefined}>\n }\n block?: {\n normal?: StyleMatcher\n blockquote?: StyleMatcher\n h1?: StyleMatcher\n h2?: StyleMatcher\n h3?: StyleMatcher\n h4?: StyleMatcher\n h5?: StyleMatcher\n h6?: StyleMatcher\n }\n listItem?: {\n number?: ListItemMatcher\n bullet?: ListItemMatcher\n }\n types?: {\n code?: ObjectMatcher<{language: string | undefined; code: string}>\n horizontalRule?: ObjectMatcher\n html?: ObjectMatcher<{html: string}>\n table?: ObjectMatcher<{\n headerRows: number | undefined\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n }>\n image?: ObjectMatcher<{src: string; alt: string; title: string | undefined}>\n }\n html?: {\n /**\n * How to handle inline HTML.\n * - 'skip': Ignore inline HTML (default)\n * - 'text': Convert inline HTML to plain text\n *\n * @defaultValue 'skip'\n */\n inline?: 'skip' | 'text'\n }\n}\n\nconst codeBlockMatcher: ObjectMatcher<\n ExtractValue<typeof defaultCodeObjectDefinition>\n> = ({context, value, isInline}) => {\n const defaultMatcher = buildObjectMatcher(defaultCodeObjectDefinition)\n const codeObject = defaultMatcher({context, value, isInline})\n\n if (!codeObject) {\n return undefined\n }\n\n if (!('code' in codeObject)) {\n return undefined\n }\n\n return codeObject\n}\n\nconst imageBlockMatcher: ObjectMatcher<\n ExtractValue<typeof defaultImageObjectDefinition>\n> = ({context, value, isInline}) => {\n const defaultMatcher = buildObjectMatcher(defaultImageObjectDefinition)\n const imageObject = defaultMatcher({context, value, isInline})\n\n if (!imageObject) {\n return undefined\n }\n\n if (!('src' in imageObject)) {\n return undefined\n }\n\n return imageObject\n}\n\nconst defaultOptions = {\n schema: defaultSchema,\n keyGenerator: defaultKeyGenerator,\n html: {\n inline: 'skip',\n },\n block: {\n normal: buildStyleMatcher(normalStyleDefinition),\n blockquote: buildStyleMatcher(blockquoteStyleDefinition),\n h1: buildStyleMatcher(h1StyleDefinition),\n h2: buildStyleMatcher(h2StyleDefinition),\n h3: buildStyleMatcher(h3StyleDefinition),\n h4: buildStyleMatcher(h4StyleDefinition),\n h5: buildStyleMatcher(h5StyleDefinition),\n h6: buildStyleMatcher(h6StyleDefinition),\n },\n listItem: {\n number: buildListItemMatcher(defaultOrderedListItemDefinition),\n bullet: buildListItemMatcher(defaultUnorderedListItemDefinition),\n },\n marks: {\n strong: buildDecoratorMatcher(defaultStrongDecoratorDefinition),\n em: buildDecoratorMatcher(defaultEmDecoratorDefinition),\n code: buildDecoratorMatcher(defaultCodeDecoratorDefinition),\n strikeThrough: buildDecoratorMatcher(\n defaultStrikeThroughDecoratorDefinition,\n ),\n link: buildAnnotationMatcher(defaultLinkObjectDefinition),\n },\n types: {\n code: codeBlockMatcher,\n horizontalRule: buildObjectMatcher(defaultHorizontalRuleObjectDefinition),\n html: buildObjectMatcher(defaultHtmlObjectDefinition),\n image: imageBlockMatcher,\n },\n} as const satisfies Options\n\n/**\n * Flattens a table structure by lifting all blocks from all cells.\n */\nfunction flattenTable(\n table: {\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n headerRows: number\n },\n portableText: Array<PortableTextBlock>,\n): void {\n // Flatten the table by lifting all blocks from all cells\n for (const row of table.rows) {\n for (const cell of row.cells) {\n for (const block of cell.value) {\n portableText.push(block)\n }\n }\n }\n}\n\n/**\n * Converts a markdown string to an array of Portable Text blocks.\n *\n * @public\n */\nexport function markdownToPortableText(\n markdown: string,\n options?: Options,\n): Array<PortableTextBlock> {\n const consolidatedOptions = {\n schema: options?.schema ?? defaultSchema,\n keyGenerator: options?.keyGenerator ?? defaultKeyGenerator,\n html: {\n inline: options?.html?.inline ?? 'skip',\n },\n marks: {\n ...defaultOptions.marks,\n ...options?.marks,\n },\n block: {\n ...defaultOptions.block,\n ...options?.block,\n },\n listItem: {\n ...defaultOptions.listItem,\n ...options?.listItem,\n },\n types: {\n ...defaultOptions.types,\n ...options?.types,\n },\n }\n\n const md = markdownit({\n html: true,\n linkify: true,\n typographer: false,\n }).enable(['strikethrough', 'table'])\n\n const tokens = md.parse(markdown, {})\n\n const portableText: Array<PortableTextBlock> = []\n\n // State\n let currentBlock: PortableTextTextBlock | null = null\n const currentListStack: Array<string | null> = []\n const markDefRefs: Array<string> = [] // mark keys: 'strong', 'em', 'code', or link keys\n let currentMarkDefs: Array<PortableTextObject> = []\n let currentBlockquoteStyle: string | null = null // Track blockquote style when inside blockquote\n let inListItem = false // Track if we're inside a list item\n\n // Table state\n let currentTable: {\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n headerRows: number\n } | null = null\n let currentTableRow: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }> | null = null\n let inTableHead = false\n\n const startBlock = (style: string) => {\n flushBlock()\n currentBlock = {\n _type: 'block' as const,\n style,\n children: [],\n _key: consolidatedOptions.keyGenerator(),\n markDefs: [],\n }\n currentMarkDefs = []\n }\n\n const flushBlock = () => {\n if (!currentBlock) {\n return\n }\n\n // Text blocks must have at least one child span\n if (currentBlock.children.length === 0) {\n currentBlock.children.push({\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: '',\n marks: [],\n })\n }\n\n // Assign accumulated markDefs to the block\n currentBlock.markDefs = currentMarkDefs\n\n portableText.push(currentBlock)\n\n currentBlock = null\n currentMarkDefs = []\n }\n\n const addSpan = (text: string) => {\n if (text.length === 0) {\n return\n }\n\n if (!currentBlock) {\n throw new Error('Expected current block')\n }\n\n const lastChild = currentBlock.children.at(-1)\n\n if (\n isSpan({schema: consolidatedOptions.schema}, lastChild) &&\n lastChild.marks?.every((mark) => markDefRefs.includes(mark)) &&\n markDefRefs.every((mark) => lastChild.marks?.includes(mark))\n ) {\n // Merge with previous span if marks match\n lastChild.text += text\n } else {\n currentBlock.children.push({\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: text,\n marks: [...markDefRefs],\n })\n }\n }\n\n // Helpers for lists\n const listLevel = () => currentListStack.length\n const ensureListBlock = (listItem: string) => {\n if (!currentBlock) {\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n }\n\n if (!currentBlock) {\n throw new Error('Expected current block')\n }\n\n if (\n currentBlock.listItem !== listItem ||\n currentBlock.level !== listLevel()\n ) {\n currentBlock.listItem = listItem\n currentBlock.level = listLevel()\n }\n }\n\n // Walk tokens\n for (const token of tokens) {\n switch (token.type) {\n // Paragraphs\n case 'paragraph_open': {\n // Skip creating a new block if we're inside a list item (the list item is the block)\n if (inListItem) {\n break\n }\n\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n break\n }\n\n startBlock(style)\n break\n }\n case 'paragraph_close':\n // Skip flushing if we're inside a list item (list_item_close will flush)\n if (inListItem) {\n break\n }\n flushBlock()\n break\n\n // Headings\n case 'heading_open': {\n const level = Number(token?.tag?.slice(1))\n\n // Map level to the appropriate heading matcher\n const headingMatchers = {\n 1: consolidatedOptions.block.h1,\n 2: consolidatedOptions.block.h2,\n 3: consolidatedOptions.block.h3,\n 4: consolidatedOptions.block.h4,\n 5: consolidatedOptions.block.h5,\n 6: consolidatedOptions.block.h6,\n } as const\n\n const headingMatcher =\n headingMatchers[level as keyof typeof headingMatchers]\n\n const style =\n headingMatcher?.({\n context: {schema: consolidatedOptions.schema},\n }) ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No heading style found, using \"normal\"')\n startBlock('normal')\n break\n }\n\n startBlock(style)\n break\n }\n case 'heading_close':\n flushBlock()\n break\n\n // Blockquote\n case 'blockquote_open': {\n // Set the blockquote style for paragraphs inside the blockquote\n const style =\n consolidatedOptions.block.blockquote({\n context: {schema: consolidatedOptions.schema},\n }) ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n currentBlockquoteStyle = style ?? 'normal'\n break\n }\n case 'blockquote_close': {\n currentBlockquoteStyle = null\n break\n }\n // Lists\n case 'bullet_list_open': {\n const listItem = consolidatedOptions.listItem.bullet({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!listItem) {\n // No list definition in schema, push null to indicate we should skip list properties\n currentListStack.push(null)\n break\n }\n\n currentListStack.push(listItem)\n break\n }\n case 'ordered_list_open': {\n const listItem = consolidatedOptions.listItem.number({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!listItem) {\n // No list definition in schema, push null to indicate we should skip list properties\n currentListStack.push(null)\n break\n }\n\n currentListStack.push(listItem)\n break\n }\n case 'bullet_list_close':\n case 'ordered_list_close':\n currentListStack.pop()\n break\n case 'list_item_open': {\n const listType = currentListStack.at(-1)\n\n if (listType === undefined) {\n throw new Error('Expected an open list')\n }\n\n // Flush any previous list item block before starting a new one\n // This is needed for proper separation of list items\n if (currentBlock) {\n flushBlock()\n }\n\n // If listType is null, it means there's no list definition in the schema\n // Just create a normal block without list properties\n if (listType === null) {\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n inListItem = true\n break\n }\n\n ensureListBlock(listType)\n inListItem = true\n break\n }\n case 'list_item_close':\n inListItem = false\n flushBlock()\n break\n\n // Code fences / blocks\n case 'fence': {\n flushBlock()\n\n const language = token.info.trim() || undefined\n // Remove trailing newline from code content\n const code = token.content.replace(/\\n$/, '')\n\n const codeObject = consolidatedOptions.types.code({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {language, code},\n isInline: false,\n })\n\n if (!codeObject) {\n // For fallback to text block, check if it's multi-line\n const hasMultipleLines = code.includes('\\n')\n\n if (hasMultipleLines) {\n // Multi-line code without definition should still be a code object\n portableText.push({\n _type: 'code',\n _key: consolidatedOptions.keyGenerator(),\n code,\n })\n } else {\n // Single-line code becomes a text block\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(code)\n }\n\n break\n }\n\n portableText.push(codeObject)\n\n break\n }\n\n // Horizontal rule\n case 'hr': {\n flushBlock()\n\n const hrObject = consolidatedOptions.types.horizontalRule({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {},\n isInline: false,\n })\n\n if (!hrObject) {\n // If there's no break definition in the schema, parse as text\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan('---')\n flushBlock()\n break\n }\n\n portableText.push(hrObject)\n\n break\n }\n\n // HTML block\n case 'html_block': {\n flushBlock()\n\n const htmlContent = token.content.trim()\n\n if (!htmlContent) {\n break\n }\n\n const htmlObject = consolidatedOptions.types.html({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {html: htmlContent},\n isInline: false,\n })\n\n if (!htmlObject) {\n // If there's no HTML block definition in the schema, parse as text\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(htmlContent)\n flushBlock()\n break\n }\n\n portableText.push(htmlObject)\n\n break\n }\n\n case 'code_block': {\n flushBlock()\n\n // Remove trailing newline from code content\n const code = token.content.replace(/\\n$/, '')\n\n const codeObject = consolidatedOptions.types.code({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {language: undefined, code},\n isInline: false,\n })\n\n if (!codeObject) {\n // For fallback to text block, check if it's multi-line\n const hasMultipleLines = code.includes('\\n')\n\n if (hasMultipleLines) {\n // Multi-line code without definition should still be a code object\n portableText.push({\n _type: 'code',\n _key: consolidatedOptions.keyGenerator(),\n code,\n })\n } else {\n // Single-line code becomes a text block\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(code)\n }\n } else {\n portableText.push(codeObject)\n }\n\n break\n }\n\n // Tables\n case 'table_open':\n flushBlock()\n currentTable = {rows: [], headerRows: 0}\n break\n\n case 'table_close': {\n if (!currentTable) {\n break\n }\n\n // Only create table object if table type is defined\n if (consolidatedOptions.types.table) {\n const tableObject = consolidatedOptions.types.table({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {\n rows: currentTable.rows,\n headerRows:\n currentTable.headerRows > 0\n ? currentTable.headerRows\n : undefined,\n },\n isInline: false,\n })\n\n if (tableObject) {\n portableText.push(tableObject)\n } else {\n // If table object couldn't be created, flatten the table\n flattenTable(currentTable, portableText)\n }\n } else {\n // If there's no table definition in the schema, flatten the table\n flattenTable(currentTable, portableText)\n }\n\n currentTable = null\n break\n }\n\n case 'thead_open':\n inTableHead = true\n break\n\n case 'thead_close':\n inTableHead = false\n break\n\n case 'tbody_open':\n case 'tbody_close':\n // Just markers, no action needed\n break\n\n case 'tr_open':\n currentTableRow = []\n break\n\n case 'tr_close':\n if (currentTable && currentTableRow) {\n currentTable.rows.push({\n _key: consolidatedOptions.keyGenerator(),\n _type: 'row',\n cells: currentTableRow,\n })\n if (inTableHead) {\n currentTable.headerRows++\n }\n }\n currentTableRow = null\n break\n\n case 'th_open':\n case 'td_open': {\n // Start a new block for the table cell\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n break\n }\n\n case 'th_close':\n case 'td_close': {\n // Flush the current block into the cell\n flushBlock()\n\n // Get all blocks that were added since this cell started\n // We need to extract them from portableText array\n const cellBlocks: Array<PortableTextBlock> = []\n\n // Check if we have blocks to extract (added after table_open)\n if (portableText.length > 0) {\n const lastBlock = portableText.at(-1)\n if (lastBlock && lastBlock._type === 'block') {\n cellBlocks.push(portableText.pop()!)\n }\n }\n\n // If no blocks were created (empty cell), create an empty block\n if (cellBlocks.length === 0) {\n cellBlocks.push({\n _type: 'block' as const,\n style:\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n }) || 'normal',\n children: [\n {\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: '',\n marks: [],\n },\n ],\n _key: consolidatedOptions.keyGenerator(),\n markDefs: [],\n })\n }\n\n // Check if the cell contains a single block with a single image child\n // If so, extract the image as a block-level image\n const firstBlock = cellBlocks[0]\n if (\n cellBlocks.length === 1 &&\n firstBlock &&\n firstBlock._type === 'block' &&\n 'children' in firstBlock &&\n Array.isArray(firstBlock.children) &&\n firstBlock.children.length === 1\n ) {\n const onlyChild = firstBlock.children[0]\n // Check if it's an image object (not a span)\n if (\n typeof onlyChild === 'object' &&\n onlyChild !== null &&\n '_type' in onlyChild &&\n onlyChild._type !== consolidatedOptions.schema.span.name &&\n onlyChild._type === 'image'\n ) {\n // Replace the block with just the image\n cellBlocks[0] = onlyChild as PortableTextBlock\n }\n }\n\n if (currentTableRow !== null) {\n currentTableRow.push({\n _type: 'cell',\n _key: consolidatedOptions.keyGenerator(),\n value: cellBlocks,\n })\n }\n break\n }\n\n // Inline container\n case 'inline': {\n // Check if we're in a table cell\n const inTableCell = currentTableRow !== null\n\n // Check if this is a standalone image (paragraph with only an image)\n if (\n token.children?.length === 1 &&\n token.children[0]?.type === 'image'\n ) {\n const imageToken = token.children[0]\n if (!imageToken) {\n break\n }\n\n const src =\n imageToken.attrs?.find(([name]) => name === 'src')?.at(1) || ''\n const alt = imageToken.content || ''\n const title =\n imageToken.attrs?.find(([name]) => name === 'title')?.at(1) ||\n undefined\n\n const blockImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title},\n isInline: false,\n })\n\n if (blockImageObject) {\n if (inTableCell) {\n // In table cells, we can't push to portableText directly\n // The block image will be handled in th_close/td_close extraction logic\n // For now, add it as a child of the current block\n if (currentBlock && 'children' in currentBlock) {\n ;(currentBlock as PortableTextTextBlock).children.push(\n blockImageObject as PortableTextObject,\n )\n }\n } else {\n // Discard the empty paragraph block that was created by paragraph_open\n currentBlock = null\n currentMarkDefs = []\n portableText.push(blockImageObject)\n }\n break\n }\n\n addSpan(`![${alt}](${src})`)\n break\n }\n\n // Walk its children for text/marks/links\n for (const childToken of token.children ?? []) {\n switch (childToken.type) {\n case 'text':\n addSpan(childToken.content)\n break\n case 'softbreak':\n case 'hardbreak':\n addSpan('\\n')\n break\n case 'code_inline': {\n const decorator = consolidatedOptions.marks.code({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n // No code decorator defined, just add the content without marks\n addSpan(childToken.content)\n break\n }\n\n markDefRefs.push(decorator)\n addSpan(childToken.content)\n\n // code_inline is self-contained, so we need to pop the decorator\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'strong_open': {\n const decorator = consolidatedOptions.marks.strong({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n break\n }\n case 'strong_close': {\n const decorator = consolidatedOptions.marks.strong({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'em_open': {\n const decorator = consolidatedOptions.marks.em({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n\n break\n }\n case 'em_close': {\n const decorator = consolidatedOptions.marks.em({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 's_open': {\n const decorator = consolidatedOptions.marks.strikeThrough({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n\n break\n }\n case 's_close': {\n const decorator = consolidatedOptions.marks.strikeThrough({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'link_open': {\n const href = childToken.attrs\n ?.find(([name]) => name === 'href')\n ?.at(1)\n\n if (!href) {\n break\n }\n\n const title = childToken.attrs\n ?.find(([name]) => name === 'title')\n ?.at(1)\n\n const linkObject = consolidatedOptions.marks.link({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {href, title},\n })\n\n if (!linkObject) {\n break\n }\n\n currentMarkDefs.push(linkObject)\n markDefRefs.push(linkObject._key)\n break\n }\n case 'link_close': {\n // remove the last link key\n const markDefKeys = new Set(currentMarkDefs.map((d) => d._key))\n let lastLinkIndex: number | undefined\n\n for (const markDefRef of markDefRefs.reverse()) {\n if (markDefKeys.has(markDefRef)) {\n lastLinkIndex = markDefRefs.indexOf(markDefRef)\n break\n }\n }\n\n if (lastLinkIndex !== undefined) {\n const realIndex = markDefRefs.length - 1 - lastLinkIndex\n markDefRefs.splice(realIndex, 1)\n }\n break\n }\n case 'image': {\n const src =\n childToken.attrs?.find(([name]) => name === 'src')?.at(1) || ''\n const alt = childToken.content || ''\n\n // Try to create an inline image first\n const inlineImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title: undefined},\n isInline: true,\n })\n\n if (inlineImageObject) {\n // Inline image is supported - add it to current block\n if (!currentBlock) {\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n }\n\n // At this point currentBlock should exist\n if (!currentBlock) {\n throw new Error('Expected current block after startBlock')\n }\n\n // Add the image as an inline object (TypeScript assertion needed for type narrowing)\n ;(currentBlock as PortableTextTextBlock).children.push(\n inlineImageObject as PortableTextObject,\n )\n break\n }\n\n // Inline image not supported - try block image as fallback\n const blockImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title: undefined},\n isInline: false,\n })\n\n if (!blockImageObject) {\n // Neither inline nor block image supported\n addSpan(`![${alt}](${src})`)\n break\n }\n\n // Block image supported - flush current block and add as block-level\n // Skip if we're in a table cell (images in cells are handled differently)\n if (inTableCell) {\n // In table cells, add the image to current block (will be extracted later)\n if (currentBlock && 'children' in currentBlock) {\n ;(currentBlock as PortableTextTextBlock).children.push(\n blockImageObject as PortableTextObject,\n )\n }\n break\n }\n\n // Not in table - flush current block, add image as block, start new block\n flushBlock()\n portableText.push(blockImageObject)\n\n // Start a new block for any remaining content\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (style) {\n startBlock(style)\n }\n\n break\n }\n case 'html_inline': {\n // Handle inline HTML based on configuration\n if (consolidatedOptions.html.inline === 'text') {\n addSpan(childToken.content)\n }\n // 'skip' - do nothing, ignore the HTML\n break\n }\n default:\n // Ignore other inline token types by default\n break\n }\n }\n break\n }\n\n default:\n break\n }\n }\n\n flushBlock()\n\n return portableText\n}\n"],"names":["levelIndexMap","filteredValue","style"],"mappings":";;;AAAO,SAAS,sBAAsB;AACpC,SAAO,UAAU,EAAE;AACrB;AAEA,MAAM,kBAAmB,uBAAM;AAC7B,MAAI;AACJ,SAAO,MAAM;AACX,QAAI;AACF,aAAO;AAGT,YAAQ,CAAA;AACR,aAAS,IAAI,GAAG,IAAI,KAAK,EAAE;AACzB,YAAM,CAAC,KAAK,IAAI,KAAO,SAAS,EAAE,EAAE,MAAM,CAAC;AAE7C,WAAO;AAAA,EACT;AACF,GAAA;AAGA,SAAS,UAAU,SAAS,IAAI;AAC9B,QAAM,QAAQ,IAAI,WAAW,MAAM;AACnC,SAAA,OAAO,gBAAgB,KAAK,GACrB;AACT;AAEA,SAAS,UAAU,QAAyB;AAC1C,QAAM,QAAQ,gBAAA;AACd,SAAO,UAAU,MAAM,EACpB,OAAO,CAAC,KAAK,MAAM,MAAM,MAAM,CAAC,GAAG,EAAE,EACrC,MAAM,GAAG,MAAM;AACpB;ACtBA,MAAM,SAAS,cAAc,aAAa,CAAA,CAAE,CAAC;AAOtC,SAAS,kBAEd,QAA2C;AAC3C,QAAM,iBAAiB,oBAAI,IAAA,GACrB,mCAAmB,IAAA;AAEzB,MAAI;AAOJ,WAAS,aAAa,GAAG,aAAa,OAAO,QAAQ,cAAc;AACjE,UAAM,QAAQ,OAAO,GAAG,UAAU;AAElC,QAAI,UAAU;AACZ;AAQF,QALK,MAAM,SACT,MAAM,OAAO,oBAAA,IAIX,CAAC,YAAY,EAAC,OAAA,GAAS,KAAK,GAAG;AACjC,qBAAe,SACf,mBAAmB;AAEnB;AAAA,IACF;AAGA,QAAI,MAAM,aAAa,UAAa,MAAM,UAAU,QAAW;AAC7D,qBAAe,SACf,mBAAmB;AAEnB;AAAA,IACF;AAIA,QAAI,CAAC,kBAAkB;AAErB,YAAMA,iBACJ,eAAe,IAAI,MAAM,QAAQ,yBAAS,IAAA;AAC5CA,qBAAc,IAAI,MAAM,OAAO,CAAS,GACxC,eAAe,IAAI,MAAM,UAAUA,cAAa,GAEhD,aAAa,IAAI,MAAM,MAAM,CAAS,GAEtC,mBAAmB;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,MAAA;AAGf;AAAA,IACF;AAIA,QACE,iBAAiB,aAAa,MAAM,YACpC,iBAAiB,QAAQ,MAAM,OAC/B;AAEA,YAAMA,iBACJ,eAAe,IAAI,MAAM,QAAQ,yBAAS,IAAA;AAC5CA,qBAAc,IAAI,MAAM,OAAO,CAAS,GACxC,eAAe,IAAI,MAAM,UAAUA,cAAa,GAEhD,aAAa,IAAI,MAAM,MAAM,CAAS,GAEtC,mBAAmB;AAAA,QACjB,UAAU,MAAM;AAAA,QAChB,OAAO,MAAM;AAAA,MAAA;AAGf;AAAA,IACF;AAGA,mBAAe,QAAQ,CAACA,gBAAe,aAAa;AAClD,UAAI,aAAa,MAAM;AACrB;AAIF,YAAM,iBAA2B,CAAA;AAEjCA,qBAAc,QAAQ,CAAC,GAAG,UAAU;AAC9B,iBAAS,MAAM,SACjB,eAAe,KAAK,KAAK;AAAA,MAE7B,CAAC,GAED,eAAe,QAAQ,CAAC,UAAU;AAChCA,uBAAc,OAAO,KAAK;AAAA,MAC5B,CAAC;AAAA,IACH,CAAC;AAED,UAAM,gBACJ,eAAe,IAAI,MAAM,QAAQ,KAAK,oBAAI,IAAA,GACtC,eAAe,cAAc,IAAI,MAAM,KAAK,KAAK;AACvD,kBAAc,IAAI,MAAM,OAAO,eAAe,CAAC,GAC/C,eAAe,IAAI,MAAM,UAAU,aAAa,GAEhD,aAAa,IAAI,MAAM,MAAM,eAAe,CAAC,GAE7C,mBAAmB;AAAA,MACjB,UAAU,MAAM;AAAA,MAChB,OAAO,MAAM;AAAA,IAAA;AAAA,EAEjB;AAEA,SAAO;AACT;ACxGO,MAAM,mBAAmB,CAC9B,WACA,iBACe;AACf,WAAS,WAAkC,SAAkC;AAC3E,UAAM,EAAC,MAAM,OAAO,SAAA,IAAY;AAEhC,WAAI,4BAA4B,IAAI,IAC3B,eAAe,MAAM,KAAK,IAG/B,0BAA0B,IAAI,IACzB,WAAW,IAAI,IAGpB,oBAAoB,IAAI,IACnB,YAAY,MAAM,OAAO,QAAQ,IAGtC,8BAA8B,IAAI,IAC7B,WAAW,IAAI,IAGjB,kBAAkB,MAAM,OAAO,QAAQ;AAAA,EAChD;AAEA,WAAS,eACP,MAIA,OACQ;AACR,UAAM,WAAW,UAAU,UAGrB,eADJ,OAAO,YAAa,aAAa,WAAW,SAAS,KAAK,QAAQ,MACrC,UAAU;AAUzC,QAAI,WAPS,eAAe,IAAI,EAE7B,IAAI,CAAC,OAAO,MACJ,WAAW,EAAC,MAAM,OAAO,UAAU,IAAM,OAAO,EAAa,CAAC,CACtE,EACA,KAAK,EAAE;AAIV,QAAI,KAAK,SAAS,KAAK,UAAU,UAAU;AAEzC,YAAM,EAAC,UAAU,WAAW,GAAG,cAAa;AAC5C,iBAAW,WAAW;AAAA,QACpB,MAAM;AAAA,QACN;AAAA,QACA,UAAU;AAAA,MAEZ,CAAC,GAED,WAAW,SAAS,QAAQ,QAAQ,EAAE;AAAA,IACxC;AAEA,WAAO,YAAY;AAAA,MACjB,OAAO;AAAA,MACP;AAAA,MACA,WAAW,KAAK,OAAO,aAAa,IAAI,KAAK,IAAI,IAAI;AAAA,MACrD,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAEA,WAAS,WAAW,MAA6C;AAC/D,UAAM,EAAC,SAAS,UAAU,QAAA,IAAW,MAC/B,OAAO,UAAU,MAAM,QAAQ,KAAK,UAAU,aAC9C,WAAW,KAAK,SAAS;AAAA,MAAI,CAAC,OAAO,eACzC,WAAW,EAAC,MAAM,OAAO,OAAO,YAAY,UAAU,GAAgB,CAAC;AAAA,IAAA;AAGzE,WAAO,KAAK;AAAA,MACV,MAAM,gBAAgB,IAAI;AAAA,MAC1B,OAAO;AAAA,MACP;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU,SAAS,KAAK,EAAE;AAAA,IAAA,CAC3B;AAAA,EACH;AAEA,WAAS,YACP,MACA,OACA,UACQ;AACR,UAAM,EAAC,MAAM,GAAG,MAAA,IAAS,eAAe,EAAC,MAAM,OAAO,UAAU,YAAW,GACrE,QAAQ,MAAM,KAAK,SAAS;AAOlC,aALE,OAAO,UAAU,SAAU,aACvB,UAAU,QACV,UAAU,MAAM,KAAK,MACF,UAAU,mBAEtB,EAAC,GAAG,OAAO,OAAO,MAAM,MAAM,YAAW;AAAA,EACxD;AAEA,WAAS,WAAW,MAA+B;AACjD,WAAI,KAAK,SAAS;AAAA,IACT,UAAU,cAGZ,KAAK;AAAA,EACd;AAEA,WAAS,kBACP,OACA,OACA,UACQ;AAGR,YAFkB,UAAU,MAAM,MAAM,KAAK,KAAK,UAAU,aAE3C;AAAA,MACf;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,CACD;AAAA,EACH;AAEA,SAAO;AACT;AAEA,SAAS,eACP,SACiB;AACjB,QAAM,EAAC,MAAM,OAAO,UAAU,WAAA,IAAc,SAGtC,mBAFO,eAAe,IAAI,EAEF;AAAA,IAAI,CAAC,OAAO,MACxC,WAAW,EAAC,MAAM,OAAO,UAAU,IAAM,OAAO,GAAG,WAAA,CAAW;AAAA,EAAA;AAGhE,SAAO;AAAA,IACL,MAAM,KAAK,QAAQ,oBAAA;AAAA,IACnB,UAAU,iBAAiB,KAAK,EAAE;AAAA,IAClC;AAAA,IACA;AAAA,IACA;AAAA,EAAA;AAEJ;AC9JO,MAAM,8BAAoD,CAAC;AAAA,EAChE;AAAA,EACA;AACF,MAEI,4BAA4B,OAAO,KACnC,4BAA4B,IAAI,IAEzB;AAAA,IAIP,oBAAoB,OAAO,KAC3B,oBAAoB,IAAI,KACxB,QAAQ,UAAU,gBAClB,KAAK,UAAU,eAER;AAAA;AAAA,IAGF;AAAA;AAAA,GClCI,2BAA2B,MAAc;AAAA,GCEzC,0BAAwD,CAAC;AAAA,EACpE;AAAA,EACA;AAAA,EACA;AACF,MAAM;AACJ,QAAM,YAAY,MAAM,YAAY,UAC9B,QAAQ,MAAM,SAAS;AAE7B,SAAI,cAAc,WAGT,GAFQ,MAAM,OAAO,QAAQ,CAAC,CAErB,GAAG,aAAa,CAAC,KAAK,QAAQ,KAKzC,GAFQ,MAAM,OAAO,QAAQ,CAAC,CAErB,KAAK,QAAQ;AAC/B,GAKa,iCAA+D,CAAC;AAAA,EAC3E;AACF,MACS,KAAK,QAAQ;AAAA,GCxBT,oBAA8C,CAAC,EAAC,SAAA,MAC3D,IAAI,QAAQ,KAKD,wBAAkD,CAAC,EAAC,SAAA,MAC/D,KAAK,QAAQ,MAKF,sBAAgD,CAAC,EAAC,SAAA,MAC7D,KAAK,QAAQ,MAKF,2BAAqD,CAAC;AAAA,EACjE;AACF,MAAM,MAAM,QAAQ,QAKP,+BAAyD,CAAC;AAAA,EACrE;AACF,MAAM,KAAK,QAAQ,MAWN,sBAA6D,CAAC;AAAA,EACzE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO,OAAO,QAAQ,IACtB,QAAQ,OAAO,SAAS;AAG9B,MAFkB,aAAa,IAAI,GAEpB;AAKb,QAF2B,gCAAgC,KAAK,IAAI,GAE5C;AAEtB,YAAM,cAAc,KAAK,QAAQ,aAAa,CAAC,SACtC,IAAI,KAAK,WAAW,CAAC,EAAE,SAAS,EAAE,EAAE,YAAA,CAAa,EACzD;AACD,aAAO,IAAI,QAAQ,KAAK,WAAW;AAAA,IACrC;AAGA,WAAO,IAAI,QAAQ,KAAK,IAAI,GAAG,QAAQ,KAAK,KAAK,MAAM,EAAE;AAAA,EAC3D;AAGA,SAAO;AACT;AAEA,SAAS,aAAa,KAAsB;AAC1C,QAAM,OAAO,OAAO,IAAI,KAAA,GAClB,QAAQ,IAAI,OAAO,CAAC;AAE1B,MAAI,UAAU,OAAO,UAAU;AAC7B,WAAO;AAGT,QAAM,aAAa,IAAI,QAAQ,GAAG;AAClC,MAAI,eAAe;AACjB,WAAO;AAGT,QAAM,mBAAmB,CAAC,QAAQ,SAAS,UAAU,KAAK,GACpD,QAAQ,IAAI,MAAM,GAAG,UAAU,EAAE,YAAA;AACvC,MAAI,iBAAiB,QAAQ,KAAK,MAAM;AACtC,WAAO;AAGT,QAAM,aAAa,IAAI,QAAQ,GAAG;AAClC,MAAI,eAAe,MAAM,aAAa;AACpC,WAAO;AAGT,QAAM,YAAY,IAAI,QAAQ,GAAG;AACjC,SAAI,cAAc,MAAM,aAAa;AAKvC;AAKO,MAAM,6BAAuD,CAAC;AAAA,EACnE;AACF,MACS,UCvGI,wBAAmD,CAAC;AAAA,EAC/D;AACF,MAEM,CAAC,YAAY,SAAS,KAAA,MAAW,KAC5B,KAGF,UAMI,4BAAuD,CAAC;AAAA,EACnE;AACF,MAGO,WAIE,SACJ,MAAM;AAAA,CAAI,EACV,IAAI,CAAC,SAAS,KAAK,IAAI,EAAE,EACzB,KAAK;AAAA,CAAI,IANH,KAYE,oBAA+C,CAAC,EAAC,eAC5D,KAAK,QAAQ,IAKF,oBAA+C,CAAC,EAAC,SAAA,MAC5D,MAAM,QAAQ,IAKH,oBAA+C,CAAC,EAAC,SAAA,MAC5D,OAAO,QAAQ,IAKJ,oBAA+C,CAAC,EAAC,SAAA,MAC5D,QAAQ,QAAQ,IAKL,oBAA+C,CAAC,EAAC,SAAA,MAC5D,SAAS,QAAQ,IAKN,oBAA+C,CAAC,EAAC,SAAA,MAC5D,UAAU,QAAQ,IAKP,8BAAyD,CAAC;AAAA,EACrE;AACF,MACS,YAAY,ICzER,2BAIR,CAAC,EAAC,MAAA,MACE,SAAS,MAAM,YAAY,EAAE;AAAA,EAAK,MAAM,IAAI;AAAA,SAMxC,gCAA0D,MAC9D,OAMI,sBAGR,CAAC,EAAC,MAAA,MACE,MAAM,MAMF,uBAKR,CAAC,EAAC,YAAW;AAChB,QAAM,MAAM,MAAM,OAAO,IACnB,QAAQ,MAAM,QAAQ,KAAK,MAAM,KAAK,MAAM;AAClD,SAAO,KAAK,GAAG,KAAK,MAAM,GAAG,GAAG,KAAK;AACvC,GAKa,uBAUR,CAAC,EAAC,OAAO,iBAAgB;AAC5B,QAAM,aAAa,MAAM,cAAc,GACjC,OAAO,MAAM,MASb,QAAkB,CAAA,GAGlB,cAAc,CAClB,eAEO,WACJ;AAAA,IAAI,CAAC,OAAO,UACX,WAAW;AAAA,MACT,MAAM;AAAA,MACN;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IAAA,CACD;AAAA,EAAA,EAEF,KAAK,GAAG,EACR,KAAA;AAIL,WAAS,IAAI,GAAG,IAAI,YAAY,KAAK;AACnC,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,KAAK;AACP,YAAM,YAAY,IAAI,MAAM,IAAI,CAAC,SAAS,YAAY,KAAK,KAAK,CAAC;AACjE,YAAM,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI;AAAA,IAC3C;AAAA,EACF;AAGA,MAAI,aAAa,KAAK,KAAK,CAAC,GAAG;AAC7B,UAAM,aAAa,KAAK,CAAC,EAAE,MAAM,IAAI,MAAM,OAAO;AAClD,UAAM,KAAK,IAAI,WAAW,KAAK,GAAG,CAAC,GAAG;AAAA,EACxC;AAGA,WAAS,IAAI,YAAY,IAAI,KAAK,QAAQ,KAAK;AAC7C,UAAM,MAAM,KAAK,CAAC;AAClB,QAAI,KAAK;AACP,YAAM,YAAY,IAAI,MAAM,IAAI,CAAC,SAAS,YAAY,KAAK,KAAK,CAAC;AACjE,YAAM,KAAK,KAAK,UAAU,KAAK,KAAK,CAAC,IAAI;AAAA,IAC3C;AAAA,EACF;AAEA,SAAO,MAAM,KAAK;AAAA,CAAI;AACxB,GAKa,6BAAuD,CAAC;AAAA,EACnE;AAAA,EACA;AACF,MAAM;AACJ,QAAM,OAAO;AAAA,EAAe,KAAK,UAAU,OAAO,MAAM,CAAC,CAAC;AAAA;AAE1D,SAAO,WAAW;AAAA,EAAK,IAAI;AAAA,IAAO;AACpC,GCtFM,mBAA0C;AAAA,EAC9C,OAAO,CAAA;AAAA,EAEP,OAAO;AAAA,IACL,QAAQ;AAAA,IACR,YAAY;AAAA,IACZ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,IACJ,IAAI;AAAA,EAAA;AAAA,EAEN,OAAO;AAAA,IACL,IAAM;AAAA,IACN,QAAU;AAAA,IACV,MAAQ;AAAA,IACR,WAAa;AAAA,IACb,kBAAkB;AAAA,IAClB,MAAQ;AAAA,EAAA;AAAA,EAEV,UAAU;AAAA,EACV,WAAW;AAAA,EAEX,aAAa;AAAA,EACb,aAAa;AAAA,EACb,iBAAiB;AAAA,EACjB,mBAAmB;AACrB;AASO,SAAS,uBAEd,QAAsB,UAAmB,IAAY;AACrD,QAAM,YAAY;AAAA,IAChB,OAAO;AAAA,MACL,GAAG,iBAAiB;AAAA,MACpB,GAAG,QAAQ;AAAA,IAAA;AAAA,IAEb,UAAU,QAAQ,YAAY,iBAAiB;AAAA,IAC/C,OAAO;AAAA,MACL,GAAG,iBAAiB;AAAA,MACpB,GAAG,QAAQ;AAAA,IAAA;AAAA,IAEb,OAAO;AAAA,MACL,GAAG,iBAAiB;AAAA,MACpB,GAAG,QAAQ;AAAA,IAAA;AAAA,IAEb,WAAW,QAAQ,aAAa,iBAAiB;AAAA,IACjD,aAAa,QAAQ,eAAe,iBAAiB;AAAA,IACrD,mBACE,QAAQ,qBAAqB,iBAAiB;AAAA,IAChD,iBACE,QAAQ,mBAAmB,iBAAiB;AAAA,IAC9C,aAAa,QAAQ,eAAe,iBAAiB;AAAA,EAAA,GAEjD,qBAAqB,QAAQ,gBAAgB,6BAE7C,eAAe,kBAAkB,MAAM,GACvC,aAAa,iBAAiB,WAAW,YAAY;AAE3D,SAAO,OACJ,IAAI,CAAC,MAAM,UAAU;AACpB,UAAM,eAAe,WAAW;AAAA,MAC9B;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,IAAA,CACD;AAED,QAAI,UAAU,OAAO,SAAS;AAC5B,aAAO;AAGT,UAAM,WAAW,OAAO,GAAG,QAAQ,CAAC;AAEpC,QAAI,CAAC;AACH,aAAO;AAGT,UAAM,eACJ,mBAAmB;AAAA,MACjB,SAAS;AAAA,MACT,MAAM;AAAA,IAAA,CACP,KAAK;AAAA;AAAA;AAER,WAAO,GAAG,YAAY,GAAG,YAAY;AAAA,EACvC,CAAC,EACA,KAAK,EAAE;AACZ;ACxHO,MAAM,wBAAwB;AAAA,EACnC,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,oBAAoB;AAAA,EAC/B,MAAM;AACR,GAEa,4BAA4B;AAAA,EACvC,MAAM;AACR,GAMa,mCAAmC;AAAA,EAC9C,MAAM;AACR,GAEa,qCAAqC;AAAA,EAChD,MAAM;AACR,GAMa,mCAAmC;AAAA,EAC9C,MAAM;AACR,GAEa,+BAA+B;AAAA,EAC1C,MAAM;AACR,GAEa,iCAAiC;AAAA,EAC5C,MAAM;AACR,GAEa,0CAA0C;AAAA,EACrD,MAAM;AACR,GAMa,8BAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAC,MAAM,QAAQ,MAAM,SAAA;AAAA,IACrB,EAAC,MAAM,SAAS,MAAM,SAAA;AAAA,EAAQ;AAElC,GAMa,8BAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAC,MAAM,YAAY,MAAM,SAAA;AAAA,IACzB,EAAC,MAAM,QAAQ,MAAM,SAAA;AAAA,EAAQ;AAEjC,GAEa,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAC,MAAM,OAAO,MAAM,SAAA;AAAA,IACpB,EAAC,MAAM,OAAO,MAAM,SAAA;AAAA,IACpB,EAAC,MAAM,SAAS,MAAM,SAAA;AAAA,EAAQ;AAElC,GAEa,wCAAwC;AAAA,EACnD,MAAM;AACR,GAEa,8BAA8B;AAAA,EACzC,MAAM;AAAA,EACN,QAAQ,CAAC,EAAC,MAAM,QAAQ,MAAM,UAAS;AACzC,GAEa,+BAA+B;AAAA,EAC1C,MAAM;AAAA,EACN,QAAQ;AAAA,IACN,EAAC,MAAM,cAAc,MAAM,SAAA;AAAA,IAC3B,EAAC,MAAM,QAAQ,MAAM,QAAA;AAAA,EAAO;AAEhC,GAOa,gBAAgB;AAAA,EAC3B,aAAa;AAAA,IACX,QAAQ;AAAA,MACN;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,OAAO;AAAA,MACL;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,YAAY;AAAA,MACV;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,aAAa,CAAC,2BAA2B;AAAA,IACzC,cAAc;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA;AAAA,IAEF,eAAe,CAAC,4BAA4B;AAAA,EAAA,CAC7C;AACH;ACpJO,SAAS,kBACd,YACc;AACd,SAAO,CAAC,EAAC,cAAa;AACpB,UAAM,mBAAmB,QAAQ,OAAO,OAAO;AAAA,MAC7C,CAAC,SAAS,KAAK,SAAS,WAAW;AAAA,IAAA;AAGrC,QAAK;AAIL,aAAO,iBAAiB;AAAA,EAC1B;AACF;AAaO,SAAS,qBACd,YACiB;AACjB,SAAO,CAAC,EAAC,cAAa;AACpB,UAAM,mBAAmB,QAAQ,OAAO,MAAM;AAAA,MAC5C,CAAC,SAAS,KAAK,SAAS,WAAW;AAAA,IAAA;AAGrC,QAAK;AAIL,aAAO,iBAAiB;AAAA,EAC1B;AACF;AAaO,SAAS,sBACd,YACkB;AAClB,SAAO,CAAC,EAAC,cAAa;AACpB,UAAM,mBAAmB,QAAQ,OAAO,WAAW;AAAA,MACjD,CAAC,SAAS,KAAK,SAAS,WAAW;AAAA,IAAA;AAGrC,QAAK;AAIL,aAAO,iBAAiB;AAAA,EAC1B;AACF;AAiBO,SAAS,uBACd,YAC8C;AAC9C,SAAO,CAAC,EAAC,SAAS,YAAW;AAC3B,UAAM,mBAAmB,QAAQ,OAAO,YAAY;AAAA,MAClD,CAAC,SAAS,KAAK,SAAS,WAAW;AAAA,IAAA;AAGrC,QAAI,CAAC;AACH;AAGF,UAAM,gBAAgB,iBAAiB,OAAO,OAE5C,CAACC,gBAAe,UAAU;AAC1B,YAAM,aAAa,MAAM,MAAM,IAA0B;AAEzD,aAAI,eAAe,WACjBA,eAAc,MAAM,IAAI,IAAI,aAGvBA;AAAAA,IACT,GAAG,CAAA,CAAE;AAEL,WAAO;AAAA,MACL,MAAM,QAAQ,aAAA;AAAA,MACd,OAAO,iBAAiB;AAAA,MACxB,GAAG;AAAA,IAAA;AAAA,EAEP;AACF;AAmBO,SAAS,mBACd,YAC0C;AAC1C,SAAO,CAAC,EAAC,SAAS,OAAO,eAAc;AAKrC,UAAM,oBAJmB,WACrB,QAAQ,OAAO,gBACf,QAAQ,OAAO,cAEuB;AAAA,MACxC,CAAC,SAAS,KAAK,SAAS,WAAW;AAAA,IAAA;AAGrC,QAAI,CAAC;AACH;AAGF,UAAM,gBAAgB,iBAAiB,OAAO,OAE5C,CAACA,gBAAe,UAAU;AAC1B,YAAM,aAAa,MAAM,MAAM,IAA0B;AAEzD,aAAI,eAAe,WACjBA,eAAc,MAAM,IAAI,IAAI,aAGvBA;AAAAA,IACT,GAAG,CAAA,CAAE;AAEL,WAAO;AAAA,MACL,MAAM,QAAQ,aAAA;AAAA,MACd,OAAO,iBAAiB;AAAA,MACxB,GAAG;AAAA,IAAA;AAAA,EAEP;AACF;ACtFA,MAAM,mBAEF,CAAC,EAAC,SAAS,OAAO,eAAc;AAElC,QAAM,aADiB,mBAAmB,2BAA2B,EACnC,EAAC,SAAS,OAAO,UAAS;AAE5D,MAAK,cAIC,UAAU;AAIhB,WAAO;AACT,GAEM,oBAEF,CAAC,EAAC,SAAS,OAAO,eAAc;AAElC,QAAM,cADiB,mBAAmB,4BAA4B,EACnC,EAAC,SAAS,OAAO,UAAS;AAE7D,MAAK,eAIC,SAAS;AAIf,WAAO;AACT,GAEM,iBAAiB;AAAA,EAMrB,OAAO;AAAA,IACL,QAAQ,kBAAkB,qBAAqB;AAAA,IAC/C,YAAY,kBAAkB,yBAAyB;AAAA,IACvD,IAAI,kBAAkB,iBAAiB;AAAA,IACvC,IAAI,kBAAkB,iBAAiB;AAAA,IACvC,IAAI,kBAAkB,iBAAiB;AAAA,IACvC,IAAI,kBAAkB,iBAAiB;AAAA,IACvC,IAAI,kBAAkB,iBAAiB;AAAA,IACvC,IAAI,kBAAkB,iBAAiB;AAAA,EAAA;AAAA,EAEzC,UAAU;AAAA,IACR,QAAQ,qBAAqB,gCAAgC;AAAA,IAC7D,QAAQ,qBAAqB,kCAAkC;AAAA,EAAA;AAAA,EAEjE,OAAO;AAAA,IACL,QAAQ,sBAAsB,gCAAgC;AAAA,IAC9D,IAAI,sBAAsB,4BAA4B;AAAA,IACtD,MAAM,sBAAsB,8BAA8B;AAAA,IAC1D,eAAe;AAAA,MACb;AAAA,IAAA;AAAA,IAEF,MAAM,uBAAuB,2BAA2B;AAAA,EAAA;AAAA,EAE1D,OAAO;AAAA,IACL,MAAM;AAAA,IACN,gBAAgB,mBAAmB,qCAAqC;AAAA,IACxE,MAAM,mBAAmB,2BAA2B;AAAA,IACpD,OAAO;AAAA,EAAA;AAEX;AAKA,SAAS,aACP,OAYA,cACM;AAEN,aAAW,OAAO,MAAM;AACtB,eAAW,QAAQ,IAAI;AACrB,iBAAW,SAAS,KAAK;AACvB,qBAAa,KAAK,KAAK;AAI/B;AAOO,SAAS,uBACd,UACA,SAC0B;AAC1B,QAAM,sBAAsB;AAAA,IAC1B,QAAQ,SAAS,UAAU;AAAA,IAC3B,cAAc,SAAS,gBAAgB;AAAA,IACvC,MAAM;AAAA,MACJ,QAAQ,SAAS,MAAM,UAAU;AAAA,IAAA;AAAA,IAEnC,OAAO;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,GAAG,SAAS;AAAA,IAAA;AAAA,IAEd,OAAO;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,GAAG,SAAS;AAAA,IAAA;AAAA,IAEd,UAAU;AAAA,MACR,GAAG,eAAe;AAAA,MAClB,GAAG,SAAS;AAAA,IAAA;AAAA,IAEd,OAAO;AAAA,MACL,GAAG,eAAe;AAAA,MAClB,GAAG,SAAS;AAAA,IAAA;AAAA,EACd,GASI,SANK,WAAW;AAAA,IACpB,MAAM;AAAA,IACN,SAAS;AAAA,IACT,aAAa;AAAA,EAAA,CACd,EAAE,OAAO,CAAC,iBAAiB,OAAO,CAAC,EAElB,MAAM,UAAU,CAAA,CAAE,GAE9B,eAAyC,CAAA;AAG/C,MAAI,eAA6C;AACjD,QAAM,mBAAyC,IACzC,cAA6B,CAAA;AACnC,MAAI,kBAA6C,CAAA,GAC7C,yBAAwC,MACxC,aAAa,IAGb,eAWO,MACP,kBAIQ,MACR,cAAc;AAElB,QAAM,aAAa,CAAC,UAAkB;AACpC,eAAA,GACA,eAAe;AAAA,MACb,OAAO;AAAA,MACP;AAAA,MACA,UAAU,CAAA;AAAA,MACV,MAAM,oBAAoB,aAAA;AAAA,MAC1B,UAAU,CAAA;AAAA,IAAC,GAEb,kBAAkB,CAAA;AAAA,EACpB,GAEM,aAAa,MAAM;AAClB,qBAKD,aAAa,SAAS,WAAW,KACnC,aAAa,SAAS,KAAK;AAAA,MACzB,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,MAAM,oBAAoB,aAAA;AAAA,MAC1B,MAAM;AAAA,MACN,OAAO,CAAA;AAAA,IAAC,CACT,GAIH,aAAa,WAAW,iBAExB,aAAa,KAAK,YAAY,GAE9B,eAAe,MACf,kBAAkB,CAAA;AAAA,EACpB,GAEM,UAAU,CAAC,SAAiB;AAChC,QAAI,KAAK,WAAW;AAClB;AAGF,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,wBAAwB;AAG1C,UAAM,YAAY,aAAa,SAAS,GAAG,EAAE;AAG3C,WAAO,EAAC,QAAQ,oBAAoB,UAAS,SAAS,KACtD,UAAU,OAAO,MAAM,CAAC,SAAS,YAAY,SAAS,IAAI,CAAC,KAC3D,YAAY,MAAM,CAAC,SAAS,UAAU,OAAO,SAAS,IAAI,CAAC,IAG3D,UAAU,QAAQ,OAElB,aAAa,SAAS,KAAK;AAAA,MACzB,OAAO,oBAAoB,OAAO,KAAK;AAAA,MACvC,MAAM,oBAAoB,aAAA;AAAA,MAC1B;AAAA,MACA,OAAO,CAAC,GAAG,WAAW;AAAA,IAAA,CACvB;AAAA,EAEL,GAGM,YAAY,MAAM,iBAAiB,QACnC,kBAAkB,CAAC,aAAqB;AAC5C,QAAI,CAAC,cAAc;AAEjB,YAAM,QACJ,0BACA,oBAAoB,MAAM,OAAO;AAAA,QAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,MAAM,CAC7C;AAEE,cAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ;AAAA,IAIvB;AAEA,QAAI,CAAC;AACH,YAAM,IAAI,MAAM,wBAAwB;AAG1C,KACE,aAAa,aAAa,YAC1B,aAAa,UAAU,UAAA,OAEvB,aAAa,WAAW,UACxB,aAAa,QAAQ,UAAA;AAAA,EAEzB;AAGA,aAAW,SAAS;AAClB,YAAQ,MAAM,MAAA;AAAA;AAAA,MAEZ,KAAK,kBAAkB;AAErB,YAAI;AACF;AAIF,cAAM,QACJ,0BACA,oBAAoB,MAAM,OAAO;AAAA,UAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C;AAEH,YAAI,CAAC,OAAO;AACV,kBAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ;AACnB;AAAA,QACF;AAEA,mBAAW,KAAK;AAChB;AAAA,MACF;AAAA,MACA,KAAK;AAEH,YAAI;AACF;AAEF,mBAAA;AACA;AAAA;AAAA,MAGF,KAAK,gBAAgB;AACnB,cAAM,QAAQ,OAAO,OAAO,KAAK,MAAM,CAAC,CAAC,GAYnC,iBATkB;AAAA,UACtB,GAAG,oBAAoB,MAAM;AAAA,UAC7B,GAAG,oBAAoB,MAAM;AAAA,UAC7B,GAAG,oBAAoB,MAAM;AAAA,UAC7B,GAAG,oBAAoB,MAAM;AAAA,UAC7B,GAAG,oBAAoB,MAAM;AAAA,UAC7B,GAAG,oBAAoB,MAAM;AAAA,QAAA,EAIb,KAAqC,GAEjD,QACJ,iBAAiB;AAAA,UACf,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C,KACD,oBAAoB,MAAM,OAAO;AAAA,UAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C;AAEH,YAAI,CAAC,OAAO;AACV,kBAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ;AACnB;AAAA,QACF;AAEA,mBAAW,KAAK;AAChB;AAAA,MACF;AAAA,MACA,KAAK;AACH,mBAAA;AACA;AAAA;AAAA,MAGF,KAAK,mBAAmB;AAUtB,iCAPE,oBAAoB,MAAM,WAAW;AAAA,UACnC,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C,KACD,oBAAoB,MAAM,OAAO;AAAA,UAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C,KAE+B;AAClC;AAAA,MACF;AAAA,MACA,KAAK,oBAAoB;AACvB,iCAAyB;AACzB;AAAA,MACF;AAAA;AAAA,MAEA,KAAK,oBAAoB;AACvB,cAAM,WAAW,oBAAoB,SAAS,OAAO;AAAA,UACnD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C;AAED,YAAI,CAAC,UAAU;AAEb,2BAAiB,KAAK,IAAI;AAC1B;AAAA,QACF;AAEA,yBAAiB,KAAK,QAAQ;AAC9B;AAAA,MACF;AAAA,MACA,KAAK,qBAAqB;AACxB,cAAM,WAAW,oBAAoB,SAAS,OAAO;AAAA,UACnD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C;AAED,YAAI,CAAC,UAAU;AAEb,2BAAiB,KAAK,IAAI;AAC1B;AAAA,QACF;AAEA,yBAAiB,KAAK,QAAQ;AAC9B;AAAA,MACF;AAAA,MACA,KAAK;AAAA,MACL,KAAK;AACH,yBAAiB,IAAA;AACjB;AAAA,MACF,KAAK,kBAAkB;AACrB,cAAM,WAAW,iBAAiB,GAAG,EAAE;AAEvC,YAAI,aAAa;AACf,gBAAM,IAAI,MAAM,uBAAuB;AAWzC,YANI,gBACF,cAKE,aAAa,MAAM;AAErB,gBAAM,QACJ,0BACA,oBAAoB,MAAM,OAAO;AAAA,YAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,UAAM,CAC7C;AAEE,kBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ,IAIrB,aAAa;AACb;AAAA,QACF;AAEA,wBAAgB,QAAQ,GACxB,aAAa;AACb;AAAA,MACF;AAAA,MACA,KAAK;AACH,qBAAa,IACb,WAAA;AACA;AAAA;AAAA,MAGF,KAAK,SAAS;AACZ,mBAAA;AAEA,cAAM,WAAW,MAAM,KAAK,KAAA,KAAU,QAEhC,OAAO,MAAM,QAAQ,QAAQ,OAAO,EAAE,GAEtC,aAAa,oBAAoB,MAAM,KAAK;AAAA,UAChD,SAAS;AAAA,YACP,QAAQ,oBAAoB;AAAA,YAC5B,cAAc,oBAAoB;AAAA,UAAA;AAAA,UAEpC,OAAO,EAAC,UAAU,KAAA;AAAA,UAClB,UAAU;AAAA,QAAA,CACX;AAED,YAAI,CAAC,YAAY;AAIf,cAFyB,KAAK,SAAS;AAAA,CAAI;AAIzC,yBAAa,KAAK;AAAA,cAChB,OAAO;AAAA,cACP,MAAM,oBAAoB,aAAA;AAAA,cAC1B;AAAA,YAAA,CACD;AAAA,eACI;AAEL,kBAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,cAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,YAAM,CAC7C;AAEI,oBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ,IAKrB,QAAQ,IAAI;AAAA,UACd;AAEA;AAAA,QACF;AAEA,qBAAa,KAAK,UAAU;AAE5B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,MAAM;AACT,mBAAA;AAEA,cAAM,WAAW,oBAAoB,MAAM,eAAe;AAAA,UACxD,SAAS;AAAA,YACP,QAAQ,oBAAoB;AAAA,YAC5B,cAAc,oBAAoB;AAAA,UAAA;AAAA,UAEpC,OAAO,CAAA;AAAA,UACP,UAAU;AAAA,QAAA,CACX;AAED,YAAI,CAAC,UAAU;AAEb,gBAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,YAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,UAAM,CAC7C;AAEI,kBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ,IAKrB,QAAQ,KAAK,GACb,WAAA;AACA;AAAA,QACF;AAEA,qBAAa,KAAK,QAAQ;AAE1B;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,cAAc;AACjB,mBAAA;AAEA,cAAM,cAAc,MAAM,QAAQ,KAAA;AAElC,YAAI,CAAC;AACH;AAGF,cAAM,aAAa,oBAAoB,MAAM,KAAK;AAAA,UAChD,SAAS;AAAA,YACP,QAAQ,oBAAoB;AAAA,YAC5B,cAAc,oBAAoB;AAAA,UAAA;AAAA,UAEpC,OAAO,EAAC,MAAM,YAAA;AAAA,UACd,UAAU;AAAA,QAAA,CACX;AAED,YAAI,CAAC,YAAY;AAEf,gBAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,YAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,UAAM,CAC7C;AAEI,kBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ,IAKrB,QAAQ,WAAW,GACnB,WAAA;AACA;AAAA,QACF;AAEA,qBAAa,KAAK,UAAU;AAE5B;AAAA,MACF;AAAA,MAEA,KAAK,cAAc;AACjB,mBAAA;AAGA,cAAM,OAAO,MAAM,QAAQ,QAAQ,OAAO,EAAE,GAEtC,aAAa,oBAAoB,MAAM,KAAK;AAAA,UAChD,SAAS;AAAA,YACP,QAAQ,oBAAoB;AAAA,YAC5B,cAAc,oBAAoB;AAAA,UAAA;AAAA,UAEpC,OAAO,EAAC,UAAU,QAAW,KAAA;AAAA,UAC7B,UAAU;AAAA,QAAA,CACX;AAED,YAAK;AA2BH,uBAAa,KAAK,UAAU;AAAA,iBAzBH,KAAK,SAAS;AAAA,CAAI;AAIzC,uBAAa,KAAK;AAAA,YAChB,OAAO;AAAA,YACP,MAAM,oBAAoB,aAAA;AAAA,YAC1B;AAAA,UAAA,CACD;AAAA,aACI;AAEL,gBAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,YAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,UAAM,CAC7C;AAEI,kBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ,IAKrB,QAAQ,IAAI;AAAA,QACd;AAKF;AAAA,MACF;AAAA;AAAA,MAGA,KAAK;AACH,mBAAA,GACA,eAAe,EAAC,MAAM,CAAA,GAAI,YAAY,EAAA;AACtC;AAAA,MAEF,KAAK,eAAe;AAClB,YAAI,CAAC;AACH;AAIF,YAAI,oBAAoB,MAAM,OAAO;AACnC,gBAAM,cAAc,oBAAoB,MAAM,MAAM;AAAA,YAClD,SAAS;AAAA,cACP,QAAQ,oBAAoB;AAAA,cAC5B,cAAc,oBAAoB;AAAA,YAAA;AAAA,YAEpC,OAAO;AAAA,cACL,MAAM,aAAa;AAAA,cACnB,YACE,aAAa,aAAa,IACtB,aAAa,aACb;AAAA,YAAA;AAAA,YAER,UAAU;AAAA,UAAA,CACX;AAEG,wBACF,aAAa,KAAK,WAAW,IAG7B,aAAa,cAAc,YAAY;AAAA,QAE3C;AAEE,uBAAa,cAAc,YAAY;AAGzC,uBAAe;AACf;AAAA,MACF;AAAA,MAEA,KAAK;AACH,sBAAc;AACd;AAAA,MAEF,KAAK;AACH,sBAAc;AACd;AAAA,MAEF,KAAK;AAAA,MACL,KAAK;AAEH;AAAA,MAEF,KAAK;AACH,0BAAkB,CAAA;AAClB;AAAA,MAEF,KAAK;AACC,wBAAgB,oBAClB,aAAa,KAAK,KAAK;AAAA,UACrB,MAAM,oBAAoB,aAAA;AAAA,UAC1B,OAAO;AAAA,UACP,OAAO;AAAA,QAAA,CACR,GACG,eACF,aAAa,eAGjB,kBAAkB;AAClB;AAAA,MAEF,KAAK;AAAA,MACL,KAAK,WAAW;AAEd,cAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,UAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,QAAM,CAC7C;AAEI,gBAIH,WAAW,KAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ;AAIrB;AAAA,MACF;AAAA,MAEA,KAAK;AAAA,MACL,KAAK,YAAY;AAEf,mBAAA;AAIA,cAAM,aAAuC,CAAA;AAG7C,YAAI,aAAa,SAAS,GAAG;AAC3B,gBAAM,YAAY,aAAa,GAAG,EAAE;AAChC,uBAAa,UAAU,UAAU,WACnC,WAAW,KAAK,aAAa,KAAM;AAAA,QAEvC;AAGI,mBAAW,WAAW,KACxB,WAAW,KAAK;AAAA,UACd,OAAO;AAAA,UACP,OACE,oBAAoB,MAAM,OAAO;AAAA,YAC/B,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,UAAM,CAC7C,KAAK;AAAA,UACR,UAAU;AAAA,YACR;AAAA,cACE,OAAO,oBAAoB,OAAO,KAAK;AAAA,cACvC,MAAM,oBAAoB,aAAA;AAAA,cAC1B,MAAM;AAAA,cACN,OAAO,CAAA;AAAA,YAAC;AAAA,UACV;AAAA,UAEF,MAAM,oBAAoB,aAAA;AAAA,UAC1B,UAAU,CAAA;AAAA,QAAC,CACZ;AAKH,cAAM,aAAa,WAAW,CAAC;AAC/B,YACE,WAAW,WAAW,KACtB,cACA,WAAW,UAAU,WACrB,cAAc,cACd,MAAM,QAAQ,WAAW,QAAQ,KACjC,WAAW,SAAS,WAAW,GAC/B;AACA,gBAAM,YAAY,WAAW,SAAS,CAAC;AAGrC,iBAAO,aAAc,YACrB,cAAc,QACd,WAAW,aACX,UAAU,UAAU,oBAAoB,OAAO,KAAK,QACpD,UAAU,UAAU,YAGpB,WAAW,CAAC,IAAI;AAAA,QAEpB;AAEI,4BAAoB,QACtB,gBAAgB,KAAK;AAAA,UACnB,OAAO;AAAA,UACP,MAAM,oBAAoB,aAAA;AAAA,UAC1B,OAAO;AAAA,QAAA,CACR;AAEH;AAAA,MACF;AAAA;AAAA,MAGA,KAAK,UAAU;AAEb,cAAM,cAAc,oBAAoB;AAGxC,YACE,MAAM,UAAU,WAAW,KAC3B,MAAM,SAAS,CAAC,GAAG,SAAS,SAC5B;AACA,gBAAM,aAAa,MAAM,SAAS,CAAC;AACnC,cAAI,CAAC;AACH;AAGF,gBAAM,MACJ,WAAW,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,KAAK,GAAG,GAAG,CAAC,KAAK,IACzD,MAAM,WAAW,WAAW,IAC5B,QACJ,WAAW,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,OAAO,GAAG,GAAG,CAAC,KAC1D,QAEI,mBAAmB,oBAAoB,MAAM,MAAM;AAAA,YACvD,SAAS;AAAA,cACP,QAAQ,oBAAoB;AAAA,cAC5B,cAAc,oBAAoB;AAAA,YAAA;AAAA,YAEpC,OAAO,EAAC,KAAK,KAAK,MAAA;AAAA,YAClB,UAAU;AAAA,UAAA,CACX;AAED,cAAI,kBAAkB;AAChB,0BAIE,gBAAgB,cAAc,gBAC9B,aAAuC,SAAS;AAAA,cAChD;AAAA,YAAA,KAKJ,eAAe,MACf,kBAAkB,CAAA,GAClB,aAAa,KAAK,gBAAgB;AAEpC;AAAA,UACF;AAEA,kBAAQ,KAAK,GAAG,KAAK,GAAG,GAAG;AAC3B;AAAA,QACF;AAGA,mBAAW,cAAc,MAAM,YAAY,CAAA;AACzC,kBAAQ,WAAW,MAAA;AAAA,YACjB,KAAK;AACH,sBAAQ,WAAW,OAAO;AAC1B;AAAA,YACF,KAAK;AAAA,YACL,KAAK;AACH,sBAAQ;AAAA,CAAI;AACZ;AAAA,YACF,KAAK,eAAe;AAClB,oBAAM,YAAY,oBAAoB,MAAM,KAAK;AAAA,gBAC/C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC,WAAW;AAEd,wBAAQ,WAAW,OAAO;AAC1B;AAAA,cACF;AAEA,0BAAY,KAAK,SAAS,GAC1B,QAAQ,WAAW,OAAO;AAG1B,oBAAM,QAAQ,YAAY,YAAY,SAAS;AAE3C,wBAAU,MACZ,YAAY,OAAO,OAAO,CAAC;AAG7B;AAAA,YACF;AAAA,YACA,KAAK,eAAe;AAClB,oBAAM,YAAY,oBAAoB,MAAM,OAAO;AAAA,gBACjD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,0BAAY,KAAK,SAAS;AAC1B;AAAA,YACF;AAAA,YACA,KAAK,gBAAgB;AACnB,oBAAM,YAAY,oBAAoB,MAAM,OAAO;AAAA,gBACjD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,oBAAM,QAAQ,YAAY,YAAY,SAAS;AAE3C,wBAAU,MACZ,YAAY,OAAO,OAAO,CAAC;AAG7B;AAAA,YACF;AAAA,YACA,KAAK,WAAW;AACd,oBAAM,YAAY,oBAAoB,MAAM,GAAG;AAAA,gBAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,0BAAY,KAAK,SAAS;AAE1B;AAAA,YACF;AAAA,YACA,KAAK,YAAY;AACf,oBAAM,YAAY,oBAAoB,MAAM,GAAG;AAAA,gBAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,oBAAM,QAAQ,YAAY,YAAY,SAAS;AAE3C,wBAAU,MACZ,YAAY,OAAO,OAAO,CAAC;AAG7B;AAAA,YACF;AAAA,YACA,KAAK,UAAU;AACb,oBAAM,YAAY,oBAAoB,MAAM,cAAc;AAAA,gBACxD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,0BAAY,KAAK,SAAS;AAE1B;AAAA,YACF;AAAA,YACA,KAAK,WAAW;AACd,oBAAM,YAAY,oBAAoB,MAAM,cAAc;AAAA,gBACxD,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAED,kBAAI,CAAC;AACH;AAGF,oBAAM,QAAQ,YAAY,YAAY,SAAS;AAE3C,wBAAU,MACZ,YAAY,OAAO,OAAO,CAAC;AAG7B;AAAA,YACF;AAAA,YACA,KAAK,aAAa;AAChB,oBAAM,OAAO,WAAW,OACpB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,MAAM,GAChC,GAAG,CAAC;AAER,kBAAI,CAAC;AACH;AAGF,oBAAM,QAAQ,WAAW,OACrB,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,OAAO,GACjC,GAAG,CAAC,GAEF,aAAa,oBAAoB,MAAM,KAAK;AAAA,gBAChD,SAAS;AAAA,kBACP,QAAQ,oBAAoB;AAAA,kBAC5B,cAAc,oBAAoB;AAAA,gBAAA;AAAA,gBAEpC,OAAO,EAAC,MAAM,MAAA;AAAA,cAAK,CACpB;AAED,kBAAI,CAAC;AACH;AAGF,8BAAgB,KAAK,UAAU,GAC/B,YAAY,KAAK,WAAW,IAAI;AAChC;AAAA,YACF;AAAA,YACA,KAAK,cAAc;AAEjB,oBAAM,cAAc,IAAI,IAAI,gBAAgB,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;AAC9D,kBAAI;AAEJ,yBAAW,cAAc,YAAY,QAAA;AACnC,oBAAI,YAAY,IAAI,UAAU,GAAG;AAC/B,kCAAgB,YAAY,QAAQ,UAAU;AAC9C;AAAA,gBACF;AAGF,kBAAI,kBAAkB,QAAW;AAC/B,sBAAM,YAAY,YAAY,SAAS,IAAI;AAC3C,4BAAY,OAAO,WAAW,CAAC;AAAA,cACjC;AACA;AAAA,YACF;AAAA,YACA,KAAK,SAAS;AACZ,oBAAM,MACJ,WAAW,OAAO,KAAK,CAAC,CAAC,IAAI,MAAM,SAAS,KAAK,GAAG,GAAG,CAAC,KAAK,IACzD,MAAM,WAAW,WAAW,IAG5B,oBAAoB,oBAAoB,MAAM,MAAM;AAAA,gBACxD,SAAS;AAAA,kBACP,QAAQ,oBAAoB;AAAA,kBAC5B,cAAc,oBAAoB;AAAA,gBAAA;AAAA,gBAEpC,OAAO,EAAC,KAAK,KAAK,OAAO,OAAA;AAAA,gBACzB,UAAU;AAAA,cAAA,CACX;AAED,kBAAI,mBAAmB;AAErB,oBAAI,CAAC,cAAc;AACjB,wBAAMC,SAAQ,oBAAoB,MAAM,OAAO;AAAA,oBAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,kBAAM,CAC7C;AAEIA,2BAIH,WAAWA,MAAK,KAHhB,QAAQ,KAAK,wCAAwC,GACrD,WAAW,QAAQ;AAAA,gBAIvB;AAGA,oBAAI,CAAC;AACH,wBAAM,IAAI,MAAM,yCAAyC;AAIzD,6BAAuC,SAAS;AAAA,kBAChD;AAAA,gBAAA;AAEF;AAAA,cACF;AAGA,oBAAM,mBAAmB,oBAAoB,MAAM,MAAM;AAAA,gBACvD,SAAS;AAAA,kBACP,QAAQ,oBAAoB;AAAA,kBAC5B,cAAc,oBAAoB;AAAA,gBAAA;AAAA,gBAEpC,OAAO,EAAC,KAAK,KAAK,OAAO,OAAA;AAAA,gBACzB,UAAU;AAAA,cAAA,CACX;AAED,kBAAI,CAAC,kBAAkB;AAErB,wBAAQ,KAAK,GAAG,KAAK,GAAG,GAAG;AAC3B;AAAA,cACF;AAIA,kBAAI,aAAa;AAEX,gCAAgB,cAAc,gBAC9B,aAAuC,SAAS;AAAA,kBAChD;AAAA,gBAAA;AAGJ;AAAA,cACF;AAGA,4BACA,aAAa,KAAK,gBAAgB;AAGlC,oBAAM,QAAQ,oBAAoB,MAAM,OAAO;AAAA,gBAC7C,SAAS,EAAC,QAAQ,oBAAoB,OAAA;AAAA,cAAM,CAC7C;AAEG,uBACF,WAAW,KAAK;AAGlB;AAAA,YACF;AAAA,YACA,KAAK,eAAe;AAEd,kCAAoB,KAAK,WAAW,UACtC,QAAQ,WAAW,OAAO;AAG5B;AAAA,YACF;AAAA,UAGE;AAGN;AAAA,MACF;AAAA,IAGE;AAIN,SAAA,WAAA,GAEO;AACT;"}
1
+ {"version":3,"file":"index.js","sources":["../src/key-generator.ts","../src/from-portable-text/build-list-index-map.ts","../src/from-portable-text/render-node.ts","../src/from-portable-text/renderers/block-spacing.ts","../src/from-portable-text/renderers/hard-break.ts","../src/from-portable-text/renderers/list-item.ts","../src/escape.ts","../src/from-portable-text/renderers/marks.ts","../src/from-portable-text/renderers/style.ts","../src/from-portable-text/renderers/type.ts","../src/from-portable-text/portable-text-to-markdown.ts","../src/default-schema.ts","../src/to-portable-text/matchers.ts","../src/to-portable-text/markdown-to-portable-text.ts"],"sourcesContent":["export function defaultKeyGenerator() {\n return randomKey(12)\n}\n\nconst getByteHexTable = (() => {\n let table: any[]\n return () => {\n if (table) {\n return table\n }\n\n table = []\n for (let i = 0; i < 256; ++i) {\n table[i] = (i + 0x100).toString(16).slice(1)\n }\n return table\n }\n})()\n\n// WHATWG crypto RNG - https://w3c.github.io/webcrypto/Overview.html\nfunction whatwgRNG(length = 16) {\n const rnds8 = new Uint8Array(length)\n crypto.getRandomValues(rnds8)\n return rnds8\n}\n\nfunction randomKey(length?: number): string {\n const table = getByteHexTable()\n return whatwgRNG(length)\n .reduce((str, n) => str + table[n], '')\n .slice(0, length)\n}\n","import {\n compileSchema,\n defineSchema,\n isTextBlock,\n type PortableTextBlock,\n} from '@portabletext/schema'\nimport type {ArbitraryTypedObject, TypedObject} from '@portabletext/types'\nimport {defaultKeyGenerator} from '../key-generator'\n\nconst schema = compileSchema(defineSchema({}))\n\n/**\n * Builds a map of list item `_key`s to their index.\n *\n * Mutates the blocks in place by adding a `_key` if necessary.\n */\nexport function buildListIndexMap<\n Block extends TypedObject = PortableTextBlock | ArbitraryTypedObject,\n>(blocks: Array<Block>): Map<string, number> {\n const levelIndexMaps = new Map<string, Map<number, number>>()\n const listIndexMap = new Map<string, number>()\n\n let previousListItem:\n | {\n listItem: string\n level: number\n }\n | undefined\n\n for (let blockIndex = 0; blockIndex < blocks.length; blockIndex++) {\n const block = blocks.at(blockIndex)\n\n if (block === undefined) {\n continue\n }\n\n if (!block._key) {\n block._key = defaultKeyGenerator()\n }\n\n // Clear the state if we encounter a non-text block\n if (!isTextBlock({schema}, block)) {\n levelIndexMaps.clear()\n previousListItem = undefined\n\n continue\n }\n\n // Clear the state if we encounter a non-list text block\n if (block.listItem === undefined || block.level === undefined) {\n levelIndexMaps.clear()\n previousListItem = undefined\n\n continue\n }\n\n // If we encounter a new list item, we set the initial index to 1 for the\n // list type on that level.\n if (!previousListItem) {\n const listIndex = 1\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n levelIndexMap.set(block.level, listIndex)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, listIndex)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n\n continue\n }\n\n // If the previous list item is of the same type but on a lower level, we\n // need to reset the level index map for that type.\n if (\n previousListItem.listItem === block.listItem &&\n previousListItem.level < block.level\n ) {\n const listIndex = 1\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n levelIndexMap.set(block.level, listIndex)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, listIndex)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n\n continue\n }\n\n // Reset other list types at current level and deeper\n levelIndexMaps.forEach((levelIndexMap, listItem) => {\n if (listItem === block.listItem) {\n return\n }\n\n // Reset all levels that are >= current level\n const levelsToDelete: number[] = []\n\n levelIndexMap.forEach((_, level) => {\n if (level >= block.level!) {\n levelsToDelete.push(level)\n }\n })\n\n levelsToDelete.forEach((level) => {\n levelIndexMap.delete(level)\n })\n })\n\n const levelIndexMap =\n levelIndexMaps.get(block.listItem) ?? new Map<number, number>()\n const levelCounter = levelIndexMap.get(block.level) ?? 0\n levelIndexMap.set(block.level, levelCounter + 1)\n levelIndexMaps.set(block.listItem, levelIndexMap)\n\n listIndexMap.set(block._key, levelCounter + 1)\n\n previousListItem = {\n listItem: block.listItem,\n level: block.level,\n }\n }\n\n return listIndexMap\n}\n","import {\n buildMarksTree,\n isPortableTextBlock,\n isPortableTextListItemBlock,\n isPortableTextToolkitSpan,\n isPortableTextToolkitTextNode,\n spanToPlainText,\n type ToolkitNestedPortableTextSpan,\n type ToolkitTextNode,\n} from '@portabletext/toolkit'\nimport type {\n PortableTextBlock,\n PortableTextListItemBlock,\n PortableTextMarkDefinition,\n PortableTextSpan,\n TypedObject,\n} from '@portabletext/types'\nimport {defaultKeyGenerator} from '../key-generator'\nimport type {PortableTextRenderers, RenderNode, Serializable} from './types'\n\ninterface SerializedBlock {\n _key: string\n children: string\n index: number\n isInline: boolean\n node: PortableTextBlock | PortableTextListItemBlock\n}\n\nexport const createRenderNode = (\n renderers: PortableTextRenderers,\n listIndexMap: Map<string, number>,\n): RenderNode => {\n function renderNode<N extends TypedObject>(options: Serializable<N>): string {\n const {node, index, isInline} = options\n\n if (isPortableTextListItemBlock(node)) {\n return renderListItem(node, index)\n }\n\n if (isPortableTextToolkitSpan(node)) {\n return renderSpan(node)\n }\n\n if (isPortableTextBlock(node)) {\n return renderBlock(node, index, isInline)\n }\n\n if (isPortableTextToolkitTextNode(node)) {\n return renderText(node)\n }\n\n return renderCustomBlock(node, index, isInline)\n }\n\n function renderListItem(\n node: PortableTextListItemBlock<\n PortableTextMarkDefinition,\n PortableTextSpan\n >,\n index: number,\n ): string {\n const renderer = renderers.listItem\n const handler =\n typeof renderer === 'function' ? renderer : renderer[node.listItem]\n const itemHandler = handler || renderers.unknownListItem\n\n // Build the text content from the block\n const tree = buildMarksTree(node)\n const textContent = tree\n .map((child, i) => {\n return renderNode({node: child, isInline: true, index: i, renderNode})\n })\n .join('')\n\n let children = textContent\n\n if (node.style && node.style !== 'normal') {\n // Wrap any other style in whatever the block component says to use\n const {listItem: _listItem, ...blockNode} = node\n children = renderNode({\n node: blockNode,\n index,\n isInline: false,\n renderNode,\n })\n // Strip trailing newlines from block styles - list item component handles spacing\n children = children.replace(/\\n+$/, '')\n }\n\n return itemHandler({\n value: node,\n index,\n listIndex: node._key ? listIndexMap.get(node._key) : undefined,\n isInline: false,\n renderNode,\n children,\n })\n }\n\n function renderSpan(node: ToolkitNestedPortableTextSpan): string {\n const {markDef, markType, markKey} = node\n const span = renderers.marks[markType] || renderers.unknownMark\n const children = node.children.map((child, childIndex) =>\n renderNode({node: child, index: childIndex, isInline: true, renderNode}),\n )\n\n return span({\n text: spanToPlainText(node),\n value: markDef,\n markType,\n markKey,\n renderNode,\n children: children.join(''),\n })\n }\n\n function renderBlock(\n node: PortableTextBlock,\n index: number,\n isInline: boolean,\n ): string {\n const {_key, ...props} = serializeBlock({node, index, isInline, renderNode})\n const style = props.node.style || 'normal'\n const handler =\n typeof renderers.block === 'function'\n ? renderers.block\n : renderers.block[style]\n const block = handler || renderers.unknownBlockStyle\n\n return block({...props, value: props.node, renderNode})\n }\n\n function renderText(node: ToolkitTextNode): string {\n if (node.text === '\\n') {\n return renderers.hardBreak()\n }\n\n return node.text\n }\n\n function renderCustomBlock(\n value: TypedObject,\n index: number,\n isInline: boolean,\n ): string {\n const component = renderers.types[value._type] ?? renderers.unknownType\n\n return component({\n value,\n isInline,\n index,\n renderNode,\n })\n }\n\n return renderNode\n}\n\nfunction serializeBlock(\n options: Serializable<PortableTextBlock>,\n): SerializedBlock {\n const {node, index, isInline, renderNode} = options\n const tree = buildMarksTree(node)\n\n const renderedChildren = tree.map((child, i) =>\n renderNode({node: child, isInline: true, index: i, renderNode}),\n )\n\n return {\n _key: node._key || defaultKeyGenerator(),\n children: renderedChildren.join(''),\n index,\n isInline,\n node,\n }\n}\n","import {\n isPortableTextBlock,\n isPortableTextListItemBlock,\n} from '@portabletext/toolkit'\nimport type {TypedObject} from '@portabletext/types'\n\n/**\n * @public\n */\nexport type BlockSpacingRenderer = (options: {\n current: TypedObject\n next: TypedObject\n}) => string | undefined\n\n/**\n * @public\n */\nexport const DefaultBlockSpacingRenderer: BlockSpacingRenderer = ({\n current,\n next,\n}) => {\n if (\n isPortableTextListItemBlock(current) &&\n isPortableTextListItemBlock(next)\n ) {\n return '\\n'\n }\n\n if (\n isPortableTextBlock(current) &&\n isPortableTextBlock(next) &&\n current.style === 'blockquote' &&\n next.style === 'blockquote'\n ) {\n return '\\n>\\n'\n }\n\n return '\\n\\n'\n}\n","/**\n * @public\n */\nexport const DefaultHardBreakRenderer = (): string => ' \\n'\n","import type {PortableTextListItemRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultListItemRenderer: PortableTextListItemRenderer = ({\n children,\n value,\n listIndex,\n}) => {\n const listStyle = value.listItem || 'bullet'\n const level = value.level || 1\n\n if (listStyle === 'number') {\n const indent = ' '.repeat(level - 1)\n\n return `${indent}${listIndex ?? 1}. ${children}`\n }\n\n const indent = ' '.repeat(level - 1)\n\n return `${indent}- ${children}`\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownListItemRenderer: PortableTextListItemRenderer = ({\n children,\n}) => {\n return `- ${children}\\n`\n}\n","/**\n * Escapes special characters in link texts and image alt texts.\n */\nexport function escapeAltAndLinkText(text: string): string {\n return text.replace(/([[\\]\\\\])/g, '\\\\$1')\n}\n\n/**\n * Unescapes special characters in image alt texts.\n */\nexport function unescapeAltText(text: string): string {\n return text.replace(/\\\\([!\"#$%&'()*+,\\-./:;<=>?@[\\\\\\]^_`{|}~])/g, '$1')\n}\n\n/**\n * Escapes special characters in link/image titles (the part inside quotes).\n */\nexport function escapeTitle(text: string): string {\n return text.replace(/([\\\\\"])/g, '\\\\$1')\n}\n","import type {TypedObject} from '@portabletext/types'\nimport {escapeAltAndLinkText, escapeTitle} from '../../escape'\nimport type {PortableTextMarkRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultEmRenderer: PortableTextMarkRenderer = ({children}) =>\n `_${children}_`\n\n/**\n * @public\n */\nexport const DefaultStrongRenderer: PortableTextMarkRenderer = ({children}) =>\n `**${children}**`\n\n/**\n * @public\n */\nexport const DefaultCodeRenderer: PortableTextMarkRenderer = ({children}) =>\n `\\`${children}\\``\n\n/**\n * @public\n */\nexport const DefaultUnderlineRenderer: PortableTextMarkRenderer = ({\n children,\n}) => `<u>${children}</u>`\n\n/**\n * @public\n */\nexport const DefaultStrikeThroughRenderer: PortableTextMarkRenderer = ({\n children,\n}) => `~~${children}~~`\n\ninterface DefaultLink extends TypedObject {\n _type: 'link'\n href: string\n title: string | undefined\n}\n\n/**\n * @public\n */\nexport const DefaultLinkRenderer: PortableTextMarkRenderer<DefaultLink> = ({\n children,\n value,\n}) => {\n const href = value?.href || ''\n const title = value?.title || ''\n const looksSafe = uriLooksSafe(href)\n\n if (looksSafe) {\n // Check if the URL looks like an HTML injection attempt\n // If it has quotes AND angle brackets, or other suspicious patterns, encode more aggressively\n const looksLikeInjection = /[\"'][^\"']*[<>]|[<>][^<>]*[\"']/.test(href)\n\n if (looksLikeInjection) {\n // Encode all special characters that could be used for injection\n const encodedHref = href.replace(/[\"<>() ]/g, (char) => {\n return `%${char.charCodeAt(0).toString(16).toUpperCase()}`\n })\n return `[${escapeAltAndLinkText(children)}](${encodedHref})`\n }\n\n // For normal URLs, don't encode parentheses - Markdown handles balanced parens fine\n return `[${escapeAltAndLinkText(children)}](${href}${title ? ` \"${escapeTitle(title)}\"` : ''})`\n }\n\n // Return children without link when URL is unsafe\n return children\n}\n\nfunction uriLooksSafe(uri: string): boolean {\n const url = (uri || '').trim()\n const first = url.charAt(0)\n\n if (first === '#' || first === '/') {\n return true\n }\n\n const colonIndex = url.indexOf(':')\n if (colonIndex === -1) {\n return true\n }\n\n const allowedProtocols = ['http', 'https', 'mailto', 'tel']\n const proto = url.slice(0, colonIndex).toLowerCase()\n if (allowedProtocols.indexOf(proto) !== -1) {\n return true\n }\n\n const queryIndex = url.indexOf('?')\n if (queryIndex !== -1 && colonIndex > queryIndex) {\n return true\n }\n\n const hashIndex = url.indexOf('#')\n if (hashIndex !== -1 && colonIndex > hashIndex) {\n return true\n }\n\n return false\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownMarkRenderer: PortableTextMarkRenderer = ({\n children,\n}) => {\n return children\n}\n","import type {PortableTextBlock} from '@portabletext/types'\nimport type {PortableTextRenderer} from '../types'\n\ntype PortableTextBlockRenderer = PortableTextRenderer<PortableTextBlock>\n\n/**\n * @public\n */\nexport const DefaultNormalRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n // Empty blocks should not add extra spacing\n if (!children || children.trim() === '') {\n return ''\n }\n\n return children\n}\n\n/**\n * @public\n */\nexport const DefaultBlockquoteRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n // Prefix each line with \"> \" for proper blockquote formatting\n // This handles multi-line content and preserves empty lines\n if (!children) {\n return '>'\n }\n\n return children\n .split('\\n')\n .map((line) => `> ${line}`)\n .join('\\n')\n}\n\n/**\n * @public\n */\nexport const DefaultH1Renderer: PortableTextBlockRenderer = ({children}) =>\n `# ${children}`\n\n/**\n * @public\n */\nexport const DefaultH2Renderer: PortableTextBlockRenderer = ({children}) =>\n `## ${children}`\n\n/**\n * @public\n */\nexport const DefaultH3Renderer: PortableTextBlockRenderer = ({children}) =>\n `### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH4Renderer: PortableTextBlockRenderer = ({children}) =>\n `#### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH5Renderer: PortableTextBlockRenderer = ({children}) =>\n `##### ${children}`\n\n/**\n * @public\n */\nexport const DefaultH6Renderer: PortableTextBlockRenderer = ({children}) =>\n `###### ${children}`\n\n/**\n * @public\n */\nexport const DefaultUnknownStyleRenderer: PortableTextBlockRenderer = ({\n children,\n}) => {\n return children ?? ''\n}\n","import type {PortableTextBlock} from '@portabletext/types'\nimport {escapeAltAndLinkText, escapeTitle} from '../../escape'\nimport type {PortableTextTypeRenderer} from '../types'\n\n/**\n * @public\n */\nexport const DefaultCodeBlockRenderer: PortableTextTypeRenderer<{\n _type: 'code'\n code: string\n language: string | undefined\n}> = ({value}) => {\n return `\\`\\`\\`${value.language ?? ''}\\n${value.code}\\n\\`\\`\\``\n}\n\n/**\n * @public\n */\nexport const DefaultHorizontalRuleRenderer: PortableTextTypeRenderer = () => {\n return '---'\n}\n\n/**\n * @public\n */\nexport const DefaultHtmlRenderer: PortableTextTypeRenderer<{\n _type: 'html'\n html: string\n}> = ({value}) => {\n return value.html\n}\n\n/**\n * @public\n */\nexport const DefaultImageRenderer: PortableTextTypeRenderer<{\n _type: 'image'\n src: string\n alt: string | undefined\n title: string | undefined\n}> = ({value}) => {\n const alt = escapeAltAndLinkText(value.alt ?? '')\n const title = value.title ? ` \"${escapeTitle(value.title)}\"` : ''\n return `![${alt}](${value.src}${title})`\n}\n\n/**\n * @public\n */\nexport const DefaultTableRenderer: PortableTextTypeRenderer<{\n _type: 'table'\n headerRows: number | undefined\n rows: Array<{\n _key: string\n cells: Array<{\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n}> = ({value, renderNode}) => {\n const headerRows = value.headerRows || 0\n const rows = value.rows as Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<{_type: string; children?: Array<unknown>}>\n }>\n }>\n const lines: string[] = []\n\n // Helper to extract text from cell blocks\n const getCellText = (\n cellBlocks: Array<{_type: string; children?: Array<unknown>}>,\n ): string => {\n return cellBlocks\n .map((block, index) =>\n renderNode({\n node: block as {_type: string},\n index,\n isInline: false,\n renderNode,\n }),\n )\n .join(' ')\n .trim()\n }\n\n // Add header rows\n for (let i = 0; i < headerRows; i++) {\n const row = rows[i]\n if (row) {\n const cellTexts = row.cells.map((cell) => getCellText(cell.value))\n lines.push(`| ${cellTexts.join(' | ')} |`)\n }\n }\n\n // Add separator line if there are headers\n if (headerRows > 0 && rows[0]) {\n const separators = rows[0].cells.map(() => ' --- ')\n lines.push(`|${separators.join('|')}|`)\n }\n\n // Add body rows\n for (let i = headerRows; i < rows.length; i++) {\n const row = rows[i]\n if (row) {\n const cellTexts = row.cells.map((cell) => getCellText(cell.value))\n lines.push(`| ${cellTexts.join(' | ')} |`)\n }\n }\n\n return lines.join('\\n')\n}\n\n/**\n * @public\n */\nexport const DefaultUnknownTypeRenderer: PortableTextTypeRenderer = ({\n value,\n isInline,\n}) => {\n const json = `\\`\\`\\`json\\n${JSON.stringify(value, null, 2)}\\n\\`\\`\\``\n // For inline unknown types, add newlines to break them out of the text flow\n return isInline ? `\\n${json}\\n` : json\n}\n","import type {\n ArbitraryTypedObject,\n PortableTextBlock,\n TypedObject,\n} from '@portabletext/types'\nimport {buildListIndexMap} from './build-list-index-map'\nimport {createRenderNode} from './render-node'\nimport {\n DefaultBlockSpacingRenderer,\n type BlockSpacingRenderer,\n} from './renderers/block-spacing'\nimport {DefaultHardBreakRenderer} from './renderers/hard-break'\nimport {\n DefaultListItemRenderer,\n DefaultUnknownListItemRenderer,\n} from './renderers/list-item'\nimport {\n DefaultCodeRenderer,\n DefaultEmRenderer,\n DefaultLinkRenderer,\n DefaultStrikeThroughRenderer,\n DefaultStrongRenderer,\n DefaultUnderlineRenderer,\n DefaultUnknownMarkRenderer,\n} from './renderers/marks'\nimport {\n DefaultBlockquoteRenderer,\n DefaultH1Renderer,\n DefaultH2Renderer,\n DefaultH3Renderer,\n DefaultH4Renderer,\n DefaultH5Renderer,\n DefaultH6Renderer,\n DefaultNormalRenderer,\n DefaultUnknownStyleRenderer,\n} from './renderers/style'\nimport {DefaultUnknownTypeRenderer} from './renderers/type'\nimport type {PortableTextRenderers} from './types'\n\nconst defaultRenderers: PortableTextRenderers = {\n types: {},\n\n block: {\n normal: DefaultNormalRenderer,\n blockquote: DefaultBlockquoteRenderer,\n h1: DefaultH1Renderer,\n h2: DefaultH2Renderer,\n h3: DefaultH3Renderer,\n h4: DefaultH4Renderer,\n h5: DefaultH5Renderer,\n h6: DefaultH6Renderer,\n },\n marks: {\n 'em': DefaultEmRenderer,\n 'strong': DefaultStrongRenderer,\n 'code': DefaultCodeRenderer,\n 'underline': DefaultUnderlineRenderer,\n 'strike-through': DefaultStrikeThroughRenderer,\n 'link': DefaultLinkRenderer,\n },\n listItem: DefaultListItemRenderer,\n hardBreak: DefaultHardBreakRenderer,\n\n unknownType: DefaultUnknownTypeRenderer,\n unknownMark: DefaultUnknownMarkRenderer,\n unknownListItem: DefaultUnknownListItemRenderer,\n unknownBlockStyle: DefaultUnknownStyleRenderer,\n}\n\ntype Options = Partial<PortableTextRenderers> & {\n blockSpacing?: BlockSpacingRenderer\n}\n\n/**\n * @public\n */\nexport function portableTextToMarkdown<\n Block extends TypedObject = PortableTextBlock | ArbitraryTypedObject,\n>(blocks: Array<Block>, options: Options = {}): string {\n const renderers = {\n block: {\n ...defaultRenderers.block,\n ...options.block,\n },\n listItem: options.listItem ?? defaultRenderers.listItem,\n marks: {\n ...defaultRenderers.marks,\n ...options.marks,\n },\n types: {\n ...defaultRenderers.types,\n ...options.types,\n },\n hardBreak: options.hardBreak ?? defaultRenderers.hardBreak,\n unknownType: options.unknownType ?? defaultRenderers.unknownType,\n unknownBlockStyle:\n options.unknownBlockStyle ?? defaultRenderers.unknownBlockStyle,\n unknownListItem:\n options.unknownListItem ?? defaultRenderers.unknownListItem,\n unknownMark: options.unknownMark ?? defaultRenderers.unknownMark,\n }\n const renderBlockSpacing = options.blockSpacing ?? DefaultBlockSpacingRenderer\n\n const listIndexMap = buildListIndexMap(blocks)\n const renderNode = createRenderNode(renderers, listIndexMap)\n\n return blocks\n .map((node, index) => {\n const renderedNode = renderNode({\n node,\n index,\n isInline: false,\n renderNode,\n })\n\n if (index === blocks.length - 1) {\n return renderedNode\n }\n\n const nextNode = blocks.at(index + 1)\n\n if (!nextNode) {\n return renderedNode\n }\n\n const blockSpacing =\n renderBlockSpacing({\n current: node,\n next: nextNode,\n }) ?? '\\n\\n'\n\n return `${renderedNode}${blockSpacing}`\n })\n .join('')\n}\n","import {\n compileSchema,\n defineSchema,\n type AnnotationDefinition,\n type BlockObjectDefinition,\n type DecoratorDefinition,\n type ListDefinition,\n type StyleDefinition,\n} from '@portabletext/schema'\n\n/********************\n * Default style definitions\n ********************/\n\nexport const normalStyleDefinition = {\n name: 'normal',\n} as const satisfies StyleDefinition\n\nexport const h1StyleDefinition = {\n name: 'h1',\n} as const satisfies StyleDefinition\n\nexport const h2StyleDefinition = {\n name: 'h2',\n} as const satisfies StyleDefinition\n\nexport const h3StyleDefinition = {\n name: 'h3',\n} as const satisfies StyleDefinition\n\nexport const h4StyleDefinition = {\n name: 'h4',\n} as const satisfies StyleDefinition\n\nexport const h5StyleDefinition = {\n name: 'h5',\n} as const satisfies StyleDefinition\n\nexport const h6StyleDefinition = {\n name: 'h6',\n} as const satisfies StyleDefinition\n\nexport const blockquoteStyleDefinition = {\n name: 'blockquote',\n} as const satisfies StyleDefinition\n\n/********************\n * Default list definitions\n ********************/\n\nexport const defaultOrderedListItemDefinition = {\n name: 'number',\n} as const satisfies ListDefinition\n\nexport const defaultUnorderedListItemDefinition = {\n name: 'bullet',\n} as const satisfies ListDefinition\n\n/********************\n * Default decorator definitions\n ********************/\n\nexport const defaultStrongDecoratorDefinition = {\n name: 'strong',\n} as const satisfies DecoratorDefinition\n\nexport const defaultEmDecoratorDefinition = {\n name: 'em',\n} as const satisfies DecoratorDefinition\n\nexport const defaultCodeDecoratorDefinition = {\n name: 'code',\n} as const satisfies DecoratorDefinition\n\nexport const defaultStrikeThroughDecoratorDefinition = {\n name: 'strike-through',\n} as const satisfies DecoratorDefinition\n\n/********************\n * Default annotation definitions\n ********************/\n\nexport const defaultLinkObjectDefinition = {\n name: 'link',\n fields: [\n {name: 'href', type: 'string'},\n {name: 'title', type: 'string'},\n ],\n} as const satisfies AnnotationDefinition\n\n/********************\n * Default object definitions\n ********************/\n\nexport const defaultCodeObjectDefinition = {\n name: 'code',\n fields: [\n {name: 'language', type: 'string'},\n {name: 'code', type: 'string'},\n ],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultImageObjectDefinition = {\n name: 'image',\n fields: [\n {name: 'src', type: 'string'},\n {name: 'alt', type: 'string'},\n {name: 'title', type: 'string'},\n ],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultHorizontalRuleObjectDefinition = {\n name: 'horizontal-rule',\n} as const satisfies BlockObjectDefinition\n\nexport const defaultHtmlObjectDefinition = {\n name: 'html',\n fields: [{name: 'html', type: 'string'}],\n} as const satisfies BlockObjectDefinition\n\nexport const defaultTableObjectDefinition = {\n name: 'table',\n fields: [\n {name: 'headerRows', type: 'number'},\n {name: 'rows', type: 'array'},\n ],\n} as const satisfies BlockObjectDefinition\n\n/**\n * The default schema for converting markdown to Portable Text.\n *\n * @public\n */\nexport const defaultSchema = compileSchema(\n defineSchema({\n styles: [\n normalStyleDefinition,\n h1StyleDefinition,\n h2StyleDefinition,\n h3StyleDefinition,\n h4StyleDefinition,\n h5StyleDefinition,\n h6StyleDefinition,\n blockquoteStyleDefinition,\n ],\n lists: [\n defaultOrderedListItemDefinition,\n defaultUnorderedListItemDefinition,\n ],\n decorators: [\n defaultStrongDecoratorDefinition,\n defaultEmDecoratorDefinition,\n defaultCodeDecoratorDefinition,\n defaultStrikeThroughDecoratorDefinition,\n ],\n annotations: [defaultLinkObjectDefinition],\n blockObjects: [\n defaultCodeObjectDefinition,\n defaultHorizontalRuleObjectDefinition,\n defaultImageObjectDefinition,\n defaultHtmlObjectDefinition,\n defaultTableObjectDefinition,\n ],\n inlineObjects: [defaultImageObjectDefinition],\n }),\n)\n","import type {\n PortableTextObject,\n Schema,\n SchemaDefinition,\n} from '@portabletext/schema'\n\n/**\n * Matcher function for mapping markdown elements to Portable Text block styles.\n *\n * @public\n */\nexport type StyleMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildStyleMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): StyleMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.styles.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown list items to Portable Text list types.\n *\n * @public\n */\nexport type ListItemMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildListItemMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): ListItemMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.lists.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown inline formatting to Portable Text decorators.\n *\n * @public\n */\nexport type DecoratorMatcher = ({\n context,\n}: {\n context: {schema: Schema}\n}) => string | undefined\n\nexport function buildDecoratorMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): DecoratorMatcher {\n return ({context}) => {\n const schemaDefinition = context.schema.decorators.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n return schemaDefinition.name\n }\n}\n\n/**\n * Matcher function for mapping markdown links to Portable Text annotations.\n *\n * @public\n */\nexport type AnnotationMatcher<\n TValue extends Record<string, unknown> = Record<string, never>,\n> = ({\n context,\n value,\n}: {\n context: {schema: Schema; keyGenerator: () => string}\n value: TValue\n}) => PortableTextObject | undefined\n\nexport function buildAnnotationMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): AnnotationMatcher<ExtractValue<TDefinition>> {\n return ({context, value}) => {\n const schemaDefinition = context.schema.annotations.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n const filteredValue = schemaDefinition.fields.reduce<\n Record<string, unknown>\n >((filteredValue, field) => {\n const fieldValue = value[field.name as keyof typeof value]\n\n if (fieldValue !== undefined) {\n filteredValue[field.name] = fieldValue\n }\n\n return filteredValue\n }, {})\n\n return {\n _key: context.keyGenerator(),\n _type: schemaDefinition.name,\n ...filteredValue,\n }\n }\n}\n\n/**\n * Matcher function for mapping markdown objects to Portable Text block or inline objects.\n *\n * @public\n */\nexport type ObjectMatcher<\n TValue extends Record<string, unknown> = Record<string, never>,\n> = ({\n context,\n value,\n isInline,\n}: {\n context: {schema: Schema; keyGenerator: () => string}\n value: TValue\n isInline: boolean\n}) => PortableTextObject | undefined\n\nexport function buildObjectMatcher<TDefinition extends {name: string}>(\n definition: TDefinition,\n): ObjectMatcher<ExtractValue<TDefinition>> {\n return ({context, value, isInline}) => {\n const schemaCollection = isInline\n ? context.schema.inlineObjects\n : context.schema.blockObjects\n\n const schemaDefinition = schemaCollection.find(\n (item) => item.name === definition.name,\n )\n\n if (!schemaDefinition) {\n return undefined\n }\n\n const filteredValue = schemaDefinition.fields.reduce<\n Record<string, unknown>\n >((filteredValue, field) => {\n const fieldValue = value[field.name as keyof typeof value]\n\n if (fieldValue !== undefined) {\n filteredValue[field.name] = fieldValue\n }\n\n return filteredValue\n }, {})\n\n return {\n _key: context.keyGenerator(),\n _type: schemaDefinition.name,\n ...filteredValue,\n }\n }\n}\n\nexport type ExtractValue<\n TDefinition extends NonNullable<SchemaDefinition['blockObjects']>[0],\n> = TDefinition extends {fields: ReadonlyArray<{name: infer TNames}>}\n ? Record<TNames & string, unknown>\n : Record<string, never>\n","import {\n isSpan,\n type PortableTextBlock,\n type PortableTextObject,\n type PortableTextTextBlock,\n type Schema,\n} from '@portabletext/schema'\nimport markdownit from 'markdown-it'\nimport {\n blockquoteStyleDefinition,\n defaultCodeDecoratorDefinition,\n defaultCodeObjectDefinition,\n defaultEmDecoratorDefinition,\n defaultHorizontalRuleObjectDefinition,\n defaultHtmlObjectDefinition,\n defaultImageObjectDefinition,\n defaultLinkObjectDefinition,\n defaultOrderedListItemDefinition,\n defaultSchema,\n defaultStrikeThroughDecoratorDefinition,\n defaultStrongDecoratorDefinition,\n defaultUnorderedListItemDefinition,\n h1StyleDefinition,\n h2StyleDefinition,\n h3StyleDefinition,\n h4StyleDefinition,\n h5StyleDefinition,\n h6StyleDefinition,\n normalStyleDefinition,\n} from '../default-schema'\nimport {unescapeAltText} from '../escape'\nimport {defaultKeyGenerator} from '../key-generator'\nimport {\n buildAnnotationMatcher,\n buildDecoratorMatcher,\n buildListItemMatcher,\n buildObjectMatcher,\n buildStyleMatcher,\n type AnnotationMatcher,\n type DecoratorMatcher,\n type ExtractValue,\n type ListItemMatcher,\n type ObjectMatcher,\n type StyleMatcher,\n} from './matchers'\n\ntype Options = {\n schema?: Schema\n keyGenerator?: () => string\n marks?: {\n strong?: DecoratorMatcher\n em?: DecoratorMatcher\n code?: DecoratorMatcher\n strikeThrough?: DecoratorMatcher\n link?: AnnotationMatcher<{href: string; title: string | undefined}>\n }\n block?: {\n normal?: StyleMatcher\n blockquote?: StyleMatcher\n h1?: StyleMatcher\n h2?: StyleMatcher\n h3?: StyleMatcher\n h4?: StyleMatcher\n h5?: StyleMatcher\n h6?: StyleMatcher\n }\n listItem?: {\n number?: ListItemMatcher\n bullet?: ListItemMatcher\n }\n types?: {\n code?: ObjectMatcher<{language: string | undefined; code: string}>\n horizontalRule?: ObjectMatcher\n html?: ObjectMatcher<{html: string}>\n table?: ObjectMatcher<{\n headerRows: number | undefined\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n }>\n image?: ObjectMatcher<{src: string; alt: string; title: string | undefined}>\n }\n html?: {\n /**\n * How to handle inline HTML.\n * - 'skip': Ignore inline HTML (default)\n * - 'text': Convert inline HTML to plain text\n *\n * @defaultValue 'skip'\n */\n inline?: 'skip' | 'text'\n }\n}\n\nconst codeBlockMatcher: ObjectMatcher<\n ExtractValue<typeof defaultCodeObjectDefinition>\n> = ({context, value, isInline}) => {\n const defaultMatcher = buildObjectMatcher(defaultCodeObjectDefinition)\n const codeObject = defaultMatcher({context, value, isInline})\n\n if (!codeObject) {\n return undefined\n }\n\n if (!('code' in codeObject)) {\n return undefined\n }\n\n return codeObject\n}\n\nconst imageBlockMatcher: ObjectMatcher<\n ExtractValue<typeof defaultImageObjectDefinition>\n> = ({context, value, isInline}) => {\n const defaultMatcher = buildObjectMatcher(defaultImageObjectDefinition)\n const imageObject = defaultMatcher({context, value, isInline})\n\n if (!imageObject) {\n return undefined\n }\n\n if (!('src' in imageObject)) {\n return undefined\n }\n\n return imageObject\n}\n\nconst defaultOptions = {\n schema: defaultSchema,\n keyGenerator: defaultKeyGenerator,\n html: {\n inline: 'skip',\n },\n block: {\n normal: buildStyleMatcher(normalStyleDefinition),\n blockquote: buildStyleMatcher(blockquoteStyleDefinition),\n h1: buildStyleMatcher(h1StyleDefinition),\n h2: buildStyleMatcher(h2StyleDefinition),\n h3: buildStyleMatcher(h3StyleDefinition),\n h4: buildStyleMatcher(h4StyleDefinition),\n h5: buildStyleMatcher(h5StyleDefinition),\n h6: buildStyleMatcher(h6StyleDefinition),\n },\n listItem: {\n number: buildListItemMatcher(defaultOrderedListItemDefinition),\n bullet: buildListItemMatcher(defaultUnorderedListItemDefinition),\n },\n marks: {\n strong: buildDecoratorMatcher(defaultStrongDecoratorDefinition),\n em: buildDecoratorMatcher(defaultEmDecoratorDefinition),\n code: buildDecoratorMatcher(defaultCodeDecoratorDefinition),\n strikeThrough: buildDecoratorMatcher(\n defaultStrikeThroughDecoratorDefinition,\n ),\n link: buildAnnotationMatcher(defaultLinkObjectDefinition),\n },\n types: {\n code: codeBlockMatcher,\n horizontalRule: buildObjectMatcher(defaultHorizontalRuleObjectDefinition),\n html: buildObjectMatcher(defaultHtmlObjectDefinition),\n image: imageBlockMatcher,\n },\n} as const satisfies Options\n\n/**\n * Flattens a table structure by lifting all blocks from all cells.\n */\nfunction flattenTable(\n table: {\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n headerRows: number\n },\n portableText: Array<PortableTextBlock>,\n): void {\n // Flatten the table by lifting all blocks from all cells\n for (const row of table.rows) {\n for (const cell of row.cells) {\n for (const block of cell.value) {\n portableText.push(block)\n }\n }\n }\n}\n\n/**\n * Converts a markdown string to an array of Portable Text blocks.\n *\n * @public\n */\nexport function markdownToPortableText(\n markdown: string,\n options?: Options,\n): Array<PortableTextBlock> {\n const consolidatedOptions = {\n schema: options?.schema ?? defaultSchema,\n keyGenerator: options?.keyGenerator ?? defaultKeyGenerator,\n html: {\n inline: options?.html?.inline ?? 'skip',\n },\n marks: {\n ...defaultOptions.marks,\n ...options?.marks,\n },\n block: {\n ...defaultOptions.block,\n ...options?.block,\n },\n listItem: {\n ...defaultOptions.listItem,\n ...options?.listItem,\n },\n types: {\n ...defaultOptions.types,\n ...options?.types,\n },\n }\n\n const md = markdownit({\n html: true,\n linkify: true,\n typographer: false,\n }).enable(['strikethrough', 'table'])\n\n const tokens = md.parse(markdown, {})\n\n const portableText: Array<PortableTextBlock> = []\n\n // State\n let currentBlock: PortableTextTextBlock | null = null\n const currentListStack: Array<string | null> = []\n const markDefRefs: Array<string> = [] // mark keys: 'strong', 'em', 'code', or link keys\n let currentMarkDefs: Array<PortableTextObject> = []\n let currentBlockquoteStyle: string | null = null // Track blockquote style when inside blockquote\n let inListItem = false // Track if we're inside a list item\n\n // Table state\n let currentTable: {\n rows: Array<{\n _key: string\n _type: 'row'\n cells: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }>\n }>\n headerRows: number\n } | null = null\n let currentTableRow: Array<{\n _type: 'cell'\n _key: string\n value: Array<PortableTextBlock>\n }> | null = null\n let inTableHead = false\n\n const startBlock = (style: string) => {\n flushBlock()\n currentBlock = {\n _type: 'block' as const,\n style,\n children: [],\n _key: consolidatedOptions.keyGenerator(),\n markDefs: [],\n }\n currentMarkDefs = []\n }\n\n const flushBlock = () => {\n if (!currentBlock) {\n return\n }\n\n // Text blocks must have at least one child span\n if (currentBlock.children.length === 0) {\n currentBlock.children.push({\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: '',\n marks: [],\n })\n }\n\n // Assign accumulated markDefs to the block\n currentBlock.markDefs = currentMarkDefs\n\n portableText.push(currentBlock)\n\n currentBlock = null\n currentMarkDefs = []\n }\n\n const addSpan = (text: string) => {\n if (text.length === 0) {\n return\n }\n\n if (!currentBlock) {\n throw new Error('Expected current block')\n }\n\n const lastChild = currentBlock.children.at(-1)\n\n if (\n isSpan({schema: consolidatedOptions.schema}, lastChild) &&\n lastChild.marks?.every((mark) => markDefRefs.includes(mark)) &&\n markDefRefs.every((mark) => lastChild.marks?.includes(mark))\n ) {\n // Merge with previous span if marks match\n lastChild.text += text\n } else {\n currentBlock.children.push({\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: text,\n marks: [...markDefRefs],\n })\n }\n }\n\n // Helpers for lists\n const listLevel = () => currentListStack.length\n const ensureListBlock = (listItem: string) => {\n if (!currentBlock) {\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n }\n\n if (!currentBlock) {\n throw new Error('Expected current block')\n }\n\n if (\n currentBlock.listItem !== listItem ||\n currentBlock.level !== listLevel()\n ) {\n currentBlock.listItem = listItem\n currentBlock.level = listLevel()\n }\n }\n\n // Walk tokens\n for (const token of tokens) {\n switch (token.type) {\n // Paragraphs\n case 'paragraph_open': {\n // Skip creating a new block if we're inside a list item (the list item is the block)\n if (inListItem) {\n break\n }\n\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n break\n }\n\n startBlock(style)\n break\n }\n case 'paragraph_close':\n // Skip flushing if we're inside a list item (list_item_close will flush)\n if (inListItem) {\n break\n }\n flushBlock()\n break\n\n // Headings\n case 'heading_open': {\n const level = Number(token?.tag?.slice(1))\n\n // Map level to the appropriate heading matcher\n const headingMatchers = {\n 1: consolidatedOptions.block.h1,\n 2: consolidatedOptions.block.h2,\n 3: consolidatedOptions.block.h3,\n 4: consolidatedOptions.block.h4,\n 5: consolidatedOptions.block.h5,\n 6: consolidatedOptions.block.h6,\n } as const\n\n const headingMatcher =\n headingMatchers[level as keyof typeof headingMatchers]\n\n const style =\n headingMatcher?.({\n context: {schema: consolidatedOptions.schema},\n }) ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No heading style found, using \"normal\"')\n startBlock('normal')\n break\n }\n\n startBlock(style)\n break\n }\n case 'heading_close':\n flushBlock()\n break\n\n // Blockquote\n case 'blockquote_open': {\n // Set the blockquote style for paragraphs inside the blockquote\n const style =\n consolidatedOptions.block.blockquote({\n context: {schema: consolidatedOptions.schema},\n }) ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n currentBlockquoteStyle = style ?? 'normal'\n break\n }\n case 'blockquote_close': {\n currentBlockquoteStyle = null\n break\n }\n // Lists\n case 'bullet_list_open': {\n const listItem = consolidatedOptions.listItem.bullet({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!listItem) {\n // No list definition in schema, push null to indicate we should skip list properties\n currentListStack.push(null)\n break\n }\n\n currentListStack.push(listItem)\n break\n }\n case 'ordered_list_open': {\n const listItem = consolidatedOptions.listItem.number({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!listItem) {\n // No list definition in schema, push null to indicate we should skip list properties\n currentListStack.push(null)\n break\n }\n\n currentListStack.push(listItem)\n break\n }\n case 'bullet_list_close':\n case 'ordered_list_close':\n currentListStack.pop()\n break\n case 'list_item_open': {\n const listType = currentListStack.at(-1)\n\n if (listType === undefined) {\n throw new Error('Expected an open list')\n }\n\n // Flush any previous list item block before starting a new one\n // This is needed for proper separation of list items\n if (currentBlock) {\n flushBlock()\n }\n\n // If listType is null, it means there's no list definition in the schema\n // Just create a normal block without list properties\n if (listType === null) {\n // Use blockquote style if inside a blockquote, otherwise use normal style\n const style =\n currentBlockquoteStyle ??\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n inListItem = true\n break\n }\n\n ensureListBlock(listType)\n inListItem = true\n break\n }\n case 'list_item_close':\n inListItem = false\n flushBlock()\n break\n\n // Code fences / blocks\n case 'fence': {\n flushBlock()\n\n const language = token.info.trim() || undefined\n // Remove trailing newline from code content\n const code = token.content.replace(/\\n$/, '')\n\n const codeObject = consolidatedOptions.types.code({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {language, code},\n isInline: false,\n })\n\n if (!codeObject) {\n // For fallback to text block, check if it's multi-line\n const hasMultipleLines = code.includes('\\n')\n\n if (hasMultipleLines) {\n // Multi-line code without definition should still be a code object\n portableText.push({\n _type: 'code',\n _key: consolidatedOptions.keyGenerator(),\n code,\n })\n } else {\n // Single-line code becomes a text block\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(code)\n }\n\n break\n }\n\n portableText.push(codeObject)\n\n break\n }\n\n // Horizontal rule\n case 'hr': {\n flushBlock()\n\n const hrObject = consolidatedOptions.types.horizontalRule({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {},\n isInline: false,\n })\n\n if (!hrObject) {\n // If there's no break definition in the schema, parse as text\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan('---')\n flushBlock()\n break\n }\n\n portableText.push(hrObject)\n\n break\n }\n\n // HTML block\n case 'html_block': {\n flushBlock()\n\n const htmlContent = token.content.trim()\n\n if (!htmlContent) {\n break\n }\n\n const htmlObject = consolidatedOptions.types.html({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {html: htmlContent},\n isInline: false,\n })\n\n if (!htmlObject) {\n // If there's no HTML block definition in the schema, parse as text\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(htmlContent)\n flushBlock()\n break\n }\n\n portableText.push(htmlObject)\n\n break\n }\n\n case 'code_block': {\n flushBlock()\n\n // Remove trailing newline from code content\n const code = token.content.replace(/\\n$/, '')\n\n const codeObject = consolidatedOptions.types.code({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {language: undefined, code},\n isInline: false,\n })\n\n if (!codeObject) {\n // For fallback to text block, check if it's multi-line\n const hasMultipleLines = code.includes('\\n')\n\n if (hasMultipleLines) {\n // Multi-line code without definition should still be a code object\n portableText.push({\n _type: 'code',\n _key: consolidatedOptions.keyGenerator(),\n code,\n })\n } else {\n // Single-line code becomes a text block\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n\n addSpan(code)\n }\n } else {\n portableText.push(codeObject)\n }\n\n break\n }\n\n // Tables\n case 'table_open':\n flushBlock()\n currentTable = {rows: [], headerRows: 0}\n break\n\n case 'table_close': {\n if (!currentTable) {\n break\n }\n\n // Only create table object if table type is defined\n if (consolidatedOptions.types.table) {\n const tableObject = consolidatedOptions.types.table({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {\n rows: currentTable.rows,\n headerRows:\n currentTable.headerRows > 0\n ? currentTable.headerRows\n : undefined,\n },\n isInline: false,\n })\n\n if (tableObject) {\n portableText.push(tableObject)\n } else {\n // If table object couldn't be created, flatten the table\n flattenTable(currentTable, portableText)\n }\n } else {\n // If there's no table definition in the schema, flatten the table\n flattenTable(currentTable, portableText)\n }\n\n currentTable = null\n break\n }\n\n case 'thead_open':\n inTableHead = true\n break\n\n case 'thead_close':\n inTableHead = false\n break\n\n case 'tbody_open':\n case 'tbody_close':\n // Just markers, no action needed\n break\n\n case 'tr_open':\n currentTableRow = []\n break\n\n case 'tr_close':\n if (currentTable && currentTableRow) {\n currentTable.rows.push({\n _key: consolidatedOptions.keyGenerator(),\n _type: 'row',\n cells: currentTableRow,\n })\n if (inTableHead) {\n currentTable.headerRows++\n }\n }\n currentTableRow = null\n break\n\n case 'th_open':\n case 'td_open': {\n // Start a new block for the table cell\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n break\n }\n\n case 'th_close':\n case 'td_close': {\n // Flush the current block into the cell\n flushBlock()\n\n // Get all blocks that were added since this cell started\n // We need to extract them from portableText array\n const cellBlocks: Array<PortableTextBlock> = []\n\n // Check if we have blocks to extract (added after table_open)\n if (portableText.length > 0) {\n const lastBlock = portableText.at(-1)\n if (lastBlock && lastBlock._type === 'block') {\n cellBlocks.push(portableText.pop()!)\n }\n }\n\n // If no blocks were created (empty cell), create an empty block\n if (cellBlocks.length === 0) {\n cellBlocks.push({\n _type: 'block' as const,\n style:\n consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n }) || 'normal',\n children: [\n {\n _type: consolidatedOptions.schema.span.name,\n _key: consolidatedOptions.keyGenerator(),\n text: '',\n marks: [],\n },\n ],\n _key: consolidatedOptions.keyGenerator(),\n markDefs: [],\n })\n }\n\n // Check if the cell contains a single block with a single image child\n // If so, extract the image as a block-level image\n const firstBlock = cellBlocks[0]\n if (\n cellBlocks.length === 1 &&\n firstBlock &&\n firstBlock._type === 'block' &&\n 'children' in firstBlock &&\n Array.isArray(firstBlock.children) &&\n firstBlock.children.length === 1\n ) {\n const onlyChild = firstBlock.children[0]\n // Check if it's an image object (not a span)\n if (\n typeof onlyChild === 'object' &&\n onlyChild !== null &&\n '_type' in onlyChild &&\n onlyChild._type !== consolidatedOptions.schema.span.name &&\n onlyChild._type === 'image'\n ) {\n // Replace the block with just the image\n cellBlocks[0] = onlyChild as PortableTextBlock\n }\n }\n\n if (currentTableRow !== null) {\n currentTableRow.push({\n _type: 'cell',\n _key: consolidatedOptions.keyGenerator(),\n value: cellBlocks,\n })\n }\n break\n }\n\n // Inline container\n case 'inline': {\n // Check if we're in a table cell\n const inTableCell = currentTableRow !== null\n\n // Check if this is a standalone image (paragraph with only an image)\n if (\n token.children?.length === 1 &&\n token.children[0]?.type === 'image'\n ) {\n const imageToken = token.children[0]\n if (!imageToken) {\n break\n }\n\n const src =\n imageToken.attrs?.find(([name]) => name === 'src')?.at(1) || ''\n const alt = unescapeAltText(imageToken.content || '')\n const title =\n imageToken.attrs?.find(([name]) => name === 'title')?.at(1) ||\n undefined\n\n const blockImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title},\n isInline: false,\n })\n\n if (blockImageObject) {\n if (inTableCell) {\n // In table cells, we can't push to portableText directly\n // The block image will be handled in th_close/td_close extraction logic\n // For now, add it as a child of the current block\n if (currentBlock && 'children' in currentBlock) {\n ;(currentBlock as PortableTextTextBlock).children.push(\n blockImageObject as PortableTextObject,\n )\n }\n } else {\n // Discard the empty paragraph block that was created by paragraph_open\n currentBlock = null\n currentMarkDefs = []\n portableText.push(blockImageObject)\n }\n break\n }\n\n addSpan(`![${alt}](${src})`)\n break\n }\n\n // Walk its children for text/marks/links\n for (const childToken of token.children ?? []) {\n switch (childToken.type) {\n case 'text':\n addSpan(childToken.content)\n break\n case 'softbreak':\n case 'hardbreak':\n addSpan('\\n')\n break\n case 'code_inline': {\n const decorator = consolidatedOptions.marks.code({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n // No code decorator defined, just add the content without marks\n addSpan(childToken.content)\n break\n }\n\n markDefRefs.push(decorator)\n addSpan(childToken.content)\n\n // code_inline is self-contained, so we need to pop the decorator\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'strong_open': {\n const decorator = consolidatedOptions.marks.strong({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n break\n }\n case 'strong_close': {\n const decorator = consolidatedOptions.marks.strong({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'em_open': {\n const decorator = consolidatedOptions.marks.em({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n\n break\n }\n case 'em_close': {\n const decorator = consolidatedOptions.marks.em({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 's_open': {\n const decorator = consolidatedOptions.marks.strikeThrough({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n markDefRefs.push(decorator)\n\n break\n }\n case 's_close': {\n const decorator = consolidatedOptions.marks.strikeThrough({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!decorator) {\n break\n }\n\n const index = markDefRefs.lastIndexOf(decorator)\n\n if (index !== -1) {\n markDefRefs.splice(index, 1)\n }\n\n break\n }\n case 'link_open': {\n const href = childToken.attrs\n ?.find(([name]) => name === 'href')\n ?.at(1)\n\n if (!href) {\n break\n }\n\n const title = childToken.attrs\n ?.find(([name]) => name === 'title')\n ?.at(1)\n\n const linkObject = consolidatedOptions.marks.link({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {href, title},\n })\n\n if (!linkObject) {\n break\n }\n\n currentMarkDefs.push(linkObject)\n markDefRefs.push(linkObject._key)\n break\n }\n case 'link_close': {\n // remove the last link key\n const markDefKeys = new Set(currentMarkDefs.map((d) => d._key))\n let lastLinkIndex: number | undefined\n\n for (const markDefRef of markDefRefs.reverse()) {\n if (markDefKeys.has(markDefRef)) {\n lastLinkIndex = markDefRefs.indexOf(markDefRef)\n break\n }\n }\n\n if (lastLinkIndex !== undefined) {\n const realIndex = markDefRefs.length - 1 - lastLinkIndex\n markDefRefs.splice(realIndex, 1)\n }\n break\n }\n case 'image': {\n const src =\n childToken.attrs?.find(([name]) => name === 'src')?.at(1) || ''\n const alt = unescapeAltText(childToken.content || '')\n\n // Try to create an inline image first\n const inlineImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title: undefined},\n isInline: true,\n })\n\n if (inlineImageObject) {\n // Inline image is supported - add it to current block\n if (!currentBlock) {\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (!style) {\n console.warn('No default style found, using \"normal\"')\n startBlock('normal')\n } else {\n startBlock(style)\n }\n }\n\n // At this point currentBlock should exist\n if (!currentBlock) {\n throw new Error('Expected current block after startBlock')\n }\n\n // Add the image as an inline object (TypeScript assertion needed for type narrowing)\n ;(currentBlock as PortableTextTextBlock).children.push(\n inlineImageObject as PortableTextObject,\n )\n break\n }\n\n // Inline image not supported - try block image as fallback\n const blockImageObject = consolidatedOptions.types.image({\n context: {\n schema: consolidatedOptions.schema,\n keyGenerator: consolidatedOptions.keyGenerator,\n },\n value: {src, alt, title: undefined},\n isInline: false,\n })\n\n if (!blockImageObject) {\n // Neither inline nor block image supported\n addSpan(`![${alt}](${src})`)\n break\n }\n\n // Block image supported - flush current block and add as block-level\n // Skip if we're in a table cell (images in cells are handled differently)\n if (inTableCell) {\n // In table cells, add the image to current block (will be extracted later)\n if (currentBlock && 'children' in currentBlock) {\n ;(currentBlock as PortableTextTextBlock).children.push(\n blockImageObject as PortableTextObject,\n )\n }\n break\n }\n\n // Not in table - flush current block, add image as block, start new block\n flushBlock()\n portableText.push(blockImageObject)\n\n // Start a new block for any remaining content\n const style = consolidatedOptions.block.normal({\n context: {schema: consolidatedOptions.schema},\n })\n\n if (style) {\n startBlock(style)\n }\n\n break\n }\n case 'html_inline': {\n // Handle inline HTML based on configuration\n if (consolidatedOptions.html.inline === 'text') {\n addSpan(childToken.content)\n }\n // 'skip' - do nothing, ignore the HTML\n break\n }\n default:\n // Ignore other inline token types by default\n break\n }\n }\n break\n }\n\n default:\n break\n }\n }\n\n flushBlock()\n\n return portableText\n}\n"],"names":["levelIndexMap","filteredValue","style"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@portabletext/markdown",
3
- "version": "1.0.4",
3
+ "version": "1.0.6",
4
4
  "description": "Convert Portable Text to and from Markdown",
5
5
  "keywords": [
6
6
  "portable-text",
@@ -32,14 +32,14 @@
32
32
  "dist"
33
33
  ],
34
34
  "dependencies": {
35
- "@portabletext/toolkit": "^4.0.0",
35
+ "@portabletext/toolkit": "^5.0.0",
36
36
  "markdown-it": "^14.1.0",
37
37
  "@portabletext/schema": "^2.0.1"
38
38
  },
39
39
  "devDependencies": {
40
- "@portabletext/types": "^3.0.0",
41
- "@sanity/pkg-utils": "^10.1.1",
42
- "@sanity/tsconfig": "^1.0.0",
40
+ "@portabletext/types": "^4.0.0",
41
+ "@sanity/pkg-utils": "^10.1.2",
42
+ "@sanity/tsconfig": "^2.0.0",
43
43
  "@types/markdown-it": "^14.1.2",
44
44
  "typescript": "5.9.3",
45
45
  "vitest": "^4.0.9",