@agimon-ai/po-native-components 0.0.0-alpha.21 → 0.0.0-alpha.23

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (36) hide show
  1. package/dist/components/CodeBlock.d.mts.map +1 -1
  2. package/dist/components/CodeBlock.mjs +4 -33
  3. package/dist/components/CodeBlock.mjs.map +1 -1
  4. package/dist/components/CopyButton.d.mts +13 -0
  5. package/dist/components/CopyButton.d.mts.map +1 -0
  6. package/dist/components/CopyButton.mjs +43 -0
  7. package/dist/components/CopyButton.mjs.map +1 -0
  8. package/dist/components/HashlineLines.d.mts +13 -0
  9. package/dist/components/HashlineLines.d.mts.map +1 -0
  10. package/dist/components/HashlineLines.mjs +137 -0
  11. package/dist/components/HashlineLines.mjs.map +1 -0
  12. package/dist/components/Markdown.d.mts +8 -1
  13. package/dist/components/Markdown.d.mts.map +1 -1
  14. package/dist/components/Markdown.mjs +198 -17
  15. package/dist/components/Markdown.mjs.map +1 -1
  16. package/dist/components/SyntaxLine.d.mts +19 -0
  17. package/dist/components/SyntaxLine.d.mts.map +1 -0
  18. package/dist/components/SyntaxLine.mjs +132 -0
  19. package/dist/components/SyntaxLine.mjs.map +1 -0
  20. package/dist/components/ToolPathLink.d.mts +10 -0
  21. package/dist/components/ToolPathLink.d.mts.map +1 -0
  22. package/dist/components/ToolPathLink.mjs +40 -0
  23. package/dist/components/ToolPathLink.mjs.map +1 -0
  24. package/dist/icons/iconGlyphs.d.mts +16 -0
  25. package/dist/icons/iconGlyphs.d.mts.map +1 -1
  26. package/dist/icons/iconGlyphs.mjs +16 -0
  27. package/dist/icons/iconGlyphs.mjs.map +1 -1
  28. package/dist/icons/icons.d.mts +16 -0
  29. package/dist/icons/icons.d.mts.map +1 -1
  30. package/dist/icons/icons.mjs +5 -1
  31. package/dist/icons/icons.mjs.map +1 -1
  32. package/dist/index.d.mts +8 -4
  33. package/dist/index.mjs +7 -3
  34. package/dist/lib/markdown.mjs +101 -5
  35. package/dist/lib/markdown.mjs.map +1 -1
  36. package/package.json +4 -4
@@ -5,11 +5,51 @@ const RULE = /^ {0,3}([-*_])(?:[ \t]*\1){2,}[ \t]*$/;
5
5
  const BULLET_ITEM = /^ {0,3}[-*+][ \t]+(.*)$/;
6
6
  const ORDERED_ITEM = /^ {0,3}(\d{1,9})[.)][ \t]+(.*)$/;
7
7
  const INDENTED = /^[ \t]+\S/;
8
+ const QUOTE = /^ {0,3}> ?(.*)$/;
9
+ const TABLE_DIVIDER = /^ {0,3}\|?[ \t]*:?-+:?[ \t]*(?:\|[ \t]*:?-+:?[ \t]*)*\|?[ \t]*$/;
10
+ const HTML_COMMENT = /^ {0,3}<!--/;
11
+ /** CommonMark's block-level tag names, plus the picture and image markup READMEs open with. */
12
+ const HTML_BLOCK = /^ {0,3}<\/?(?:address|article|aside|blockquote|center|details|div|dl|figcaption|figure|footer|form|h[1-6]|header|hr|li|main|nav|ol|p|picture|section|summary|table|tbody|td|tfoot|th|thead|tr|ul)(?=[\s/>]|$)/i;
13
+ /** Any other tag standing alone on its line, such as `<img ...>` or `<br>`. */
14
+ const HTML_TAG_LINE = /^ {0,3}<\/?[A-Za-z][A-Za-z0-9-]*(?:\s[^<>]*)?\/?>[ \t]*$/;
15
+ const HARD_BREAK = /(?: {2,}|\\)$/;
8
16
  const ESCAPABLE = /[!-/:-@[-`{-~]/;
9
17
  const WORD_CHAR = /[\p{L}\p{N}]/u;
10
18
  function isBlank(line) {
11
19
  return line.trim() === "";
12
20
  }
21
+ /** Joins a paragraph's lines: a space between them, or a line break after two spaces or a backslash. */
22
+ function joinLines(lines) {
23
+ let joined = "";
24
+ lines.forEach((line, index) => {
25
+ if (index === 0) joined = line;
26
+ else {
27
+ const hard = HARD_BREAK.test(joined);
28
+ joined = `${joined.replace(/(?: {2,}|\\|[ \t]+)$/u, "")}${hard ? "\n" : " "}${line.trimStart()}`;
29
+ }
30
+ });
31
+ return joined;
32
+ }
33
+ /** A table row's cells: outer pipes dropped, split on unescaped pipes, `\|` read as a pipe. */
34
+ function tableCells(line) {
35
+ let row = line.trim();
36
+ if (row.startsWith("|")) row = row.slice(1);
37
+ if (row.endsWith("|") && !row.endsWith("\\|")) row = row.slice(0, -1);
38
+ const cells = [];
39
+ let cell = "";
40
+ for (let index = 0; index < row.length; index += 1) {
41
+ const char = row[index];
42
+ if (char === "\\" && row[index + 1] === "|") {
43
+ cell += "|";
44
+ index += 1;
45
+ } else if (char === "|") {
46
+ cells.push(cell.trim());
47
+ cell = "";
48
+ } else cell += char;
49
+ }
50
+ cells.push(cell.trim());
51
+ return cells;
52
+ }
13
53
  /** Parses a Markdown document into blocks. */
14
54
  function parseMarkdown(source) {
15
55
  const lines = source.replace(/\r\n?/g, "\n").split("\n");
@@ -19,7 +59,7 @@ function parseMarkdown(source) {
19
59
  const flushParagraph = () => {
20
60
  if (paragraph.length > 0) blocks.push({
21
61
  type: "paragraph",
22
- children: parseInline(paragraph.join("\n"))
62
+ children: parseInline(joinLines(paragraph))
23
63
  });
24
64
  paragraph = [];
25
65
  };
@@ -28,7 +68,7 @@ function parseMarkdown(source) {
28
68
  type: "list",
29
69
  ordered: list.ordered,
30
70
  start: list.start,
31
- items: list.items.map(parseInline)
71
+ items: list.items.map((item) => parseInline(joinLines(item)))
32
72
  });
33
73
  list = void 0;
34
74
  };
@@ -61,6 +101,16 @@ function parseMarkdown(source) {
61
101
  flush();
62
102
  continue;
63
103
  }
104
+ if (paragraph.length === 0 && HTML_COMMENT.test(line)) {
105
+ flush();
106
+ while (index < lines.length && !lines[index].includes("-->")) index += 1;
107
+ continue;
108
+ }
109
+ if (paragraph.length === 0 && (HTML_BLOCK.test(line) || HTML_TAG_LINE.test(line))) {
110
+ flush();
111
+ while (index + 1 < lines.length && !isBlank(lines[index + 1])) index += 1;
112
+ continue;
113
+ }
64
114
  const heading = HEADING.exec(line);
65
115
  if (heading !== null) {
66
116
  flush();
@@ -77,6 +127,41 @@ function parseMarkdown(source) {
77
127
  blocks.push({ type: "rule" });
78
128
  continue;
79
129
  }
130
+ if (QUOTE.test(line)) {
131
+ flush();
132
+ const quoted = [];
133
+ while (index < lines.length && QUOTE.test(lines[index])) {
134
+ quoted.push(QUOTE.exec(lines[index])[1]);
135
+ index += 1;
136
+ }
137
+ index -= 1;
138
+ blocks.push({
139
+ type: "quote",
140
+ children: parseMarkdown(quoted.join("\n"))
141
+ });
142
+ continue;
143
+ }
144
+ const divider = lines[index + 1];
145
+ if (line.includes("|") && divider !== void 0 && divider.includes("|") && TABLE_DIVIDER.test(divider)) {
146
+ const header = tableCells(line);
147
+ if (header.length === tableCells(divider).length) {
148
+ flush();
149
+ index += 2;
150
+ const rows = [];
151
+ while (index < lines.length && !isBlank(lines[index]) && lines[index].includes("|")) {
152
+ const cells = tableCells(lines[index]);
153
+ rows.push(header.map((_, column) => parseInline(cells[column] ?? "")));
154
+ index += 1;
155
+ }
156
+ index -= 1;
157
+ blocks.push({
158
+ type: "table",
159
+ header: header.map((cell) => parseInline(cell)),
160
+ rows
161
+ });
162
+ continue;
163
+ }
164
+ }
80
165
  const bullet = BULLET_ITEM.exec(line);
81
166
  const ordered = bullet === null ? ORDERED_ITEM.exec(line) : null;
82
167
  if (bullet !== null || ordered !== null) {
@@ -90,12 +175,11 @@ function parseMarkdown(source) {
90
175
  items: []
91
176
  };
92
177
  }
93
- list.items.push(isOrdered ? ordered[2] : bullet[1]);
178
+ list.items.push([isOrdered ? ordered[2] : bullet[1]]);
94
179
  continue;
95
180
  }
96
181
  if (list !== void 0 && INDENTED.test(line)) {
97
- const last = list.items.length - 1;
98
- list.items[last] = `${list.items[last]}\n${line.trim()}`;
182
+ list.items.at(-1).push(line.trim());
99
183
  continue;
100
184
  }
101
185
  flushList();
@@ -142,6 +226,18 @@ function parseInline(source) {
142
226
  index += run.length;
143
227
  continue;
144
228
  }
229
+ if (char === "!" && source[index + 1] === "[") {
230
+ const image = readLink(source, index + 1);
231
+ if (image !== void 0) {
232
+ pushNode({
233
+ type: "image",
234
+ src: image.href,
235
+ alt: image.label
236
+ });
237
+ index = image.end;
238
+ continue;
239
+ }
240
+ }
145
241
  if (char === "[") {
146
242
  const link = readLink(source, index);
147
243
  if (link !== void 0) {
@@ -1 +1 @@
1
- {"version":3,"file":"markdown.mjs","names":[],"sources":["../../src/lib/markdown.ts"],"sourcesContent":["/*\n * A small Markdown parser for native message text: the subset an assistant\n * reply uses, parsed to plain data so the renderer and the tests share one\n * shape. Kept free of React Native so a unit test can run it in Node.\n *\n * Blocks: ATX headings, paragraphs, bullet and numbered lists, fenced code\n * (an unclosed fence runs to the end, so a streaming reply shows its code\n * before the closing fence arrives) and thematic breaks.\n * Inline: code spans, bold, italic, links and backslash escapes.\n *\n * ponytail: no tables, images, blockquotes, nested lists or setext headings\n * yet; their source falls through as paragraph text, so nothing is lost.\n */\n\nexport type MarkdownInline =\n | { type: 'text'; text: string }\n | { type: 'code'; text: string }\n | { type: 'strong'; children: MarkdownInline[] }\n | { type: 'em'; children: MarkdownInline[] }\n | { type: 'link'; href: string; children: MarkdownInline[] };\n\nexport type MarkdownHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type MarkdownBlock =\n | { type: 'heading'; level: MarkdownHeadingLevel; children: MarkdownInline[] }\n | { type: 'paragraph'; children: MarkdownInline[] }\n | { type: 'list'; ordered: boolean; start: number; items: MarkdownInline[][] }\n | { type: 'code'; language: string | undefined; text: string }\n | { type: 'rule' };\n\nconst FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})[ \\t]*([^\\s`]*)/;\nconst HEADING = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?(?:[ \\t]+#+)?[ \\t]*$/;\nconst RULE = /^ {0,3}([-*_])(?:[ \\t]*\\1){2,}[ \\t]*$/;\nconst BULLET_ITEM = /^ {0,3}[-*+][ \\t]+(.*)$/;\nconst ORDERED_ITEM = /^ {0,3}(\\d{1,9})[.)][ \\t]+(.*)$/;\nconst INDENTED = /^[ \\t]+\\S/;\nconst ESCAPABLE = /[!-/:-@[-`{-~]/;\nconst WORD_CHAR = /[\\p{L}\\p{N}]/u;\n\nfunction isBlank(line: string): boolean {\n return line.trim() === '';\n}\n\n/** Parses a Markdown document into blocks. */\nexport function parseMarkdown(source: string): MarkdownBlock[] {\n const lines = source.replace(/\\r\\n?/g, '\\n').split('\\n');\n const blocks: MarkdownBlock[] = [];\n let paragraph: string[] = [];\n let list: { ordered: boolean; start: number; items: string[] } | undefined;\n\n const flushParagraph = () => {\n if (paragraph.length > 0) blocks.push({ type: 'paragraph', children: parseInline(paragraph.join('\\n')) });\n paragraph = [];\n };\n const flushList = () => {\n if (list !== undefined)\n blocks.push({ type: 'list', ordered: list.ordered, start: list.start, items: list.items.map(parseInline) });\n list = undefined;\n };\n const flush = () => {\n flushParagraph();\n flushList();\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!;\n\n const fence = FENCE_OPEN.exec(line);\n if (fence !== null) {\n flush();\n const marker = fence[1]!;\n const close = new RegExp(`^ {0,3}${marker[0] === '`' ? '`' : '~'}{${marker.length},}[ \\\\t]*$`);\n const body: string[] = [];\n index += 1;\n while (index < lines.length && !close.test(lines[index]!)) {\n body.push(lines[index]!);\n index += 1;\n }\n const language = fence[2] === undefined || fence[2] === '' ? undefined : fence[2];\n blocks.push({ type: 'code', language, text: body.join('\\n') });\n continue;\n }\n\n if (isBlank(line)) {\n flush();\n continue;\n }\n\n const heading = HEADING.exec(line);\n if (heading !== null) {\n flush();\n const level = heading[1]!.length as MarkdownHeadingLevel;\n blocks.push({ type: 'heading', level, children: parseInline(heading[2] ?? '') });\n continue;\n }\n\n if (RULE.test(line)) {\n flush();\n blocks.push({ type: 'rule' });\n continue;\n }\n\n const bullet = BULLET_ITEM.exec(line);\n const ordered = bullet === null ? ORDERED_ITEM.exec(line) : null;\n if (bullet !== null || ordered !== null) {\n flushParagraph();\n const isOrdered = ordered !== null;\n if (list === undefined || list.ordered !== isOrdered) {\n flushList();\n list = { ordered: isOrdered, start: isOrdered ? Number(ordered[1]) : 1, items: [] };\n }\n list.items.push(isOrdered ? ordered[2]! : bullet![1]!);\n continue;\n }\n\n if (list !== undefined && INDENTED.test(line)) {\n const last = list.items.length - 1;\n list.items[last] = `${list.items[last]!}\\n${line.trim()}`;\n continue;\n }\n\n flushList();\n paragraph.push(line);\n }\n flush();\n return blocks;\n}\n\n/** Parses one run of inline Markdown. */\nexport function parseInline(source: string): MarkdownInline[] {\n const nodes: MarkdownInline[] = [];\n let text = '';\n const pushText = (value: string) => {\n text += value;\n };\n const pushNode = (node: MarkdownInline) => {\n if (text !== '') nodes.push({ type: 'text', text });\n text = '';\n nodes.push(node);\n };\n\n let index = 0;\n while (index < source.length) {\n const char = source[index]!;\n\n if (char === '\\\\' && index + 1 < source.length && ESCAPABLE.test(source[index + 1]!)) {\n pushText(source[index + 1]!);\n index += 2;\n continue;\n }\n\n if (char === '`') {\n const span = readCodeSpan(source, index);\n if (span !== undefined) {\n pushNode({ type: 'code', text: span.text });\n index = span.end;\n continue;\n }\n const run = /^`+/.exec(source.slice(index))![0];\n pushText(run);\n index += run.length;\n continue;\n }\n\n if (char === '[') {\n const link = readLink(source, index);\n if (link !== undefined) {\n pushNode({ type: 'link', href: link.href, children: parseInline(link.label) });\n index = link.end;\n continue;\n }\n }\n\n if ((char === '*' || char === '_') && source[index + 1] === char) {\n const strong = readDelimited(source, index, char.repeat(2));\n if (strong !== undefined) {\n pushNode({ type: 'strong', children: parseInline(strong.inner) });\n index = strong.end;\n continue;\n }\n pushText(char.repeat(2));\n index += 2;\n continue;\n }\n\n if (char === '*' || char === '_') {\n const em = readDelimited(source, index, char);\n if (em !== undefined) {\n pushNode({ type: 'em', children: parseInline(em.inner) });\n index = em.end;\n continue;\n }\n }\n\n pushText(char);\n index += 1;\n }\n if (text !== '') nodes.push({ type: 'text', text });\n return nodes;\n}\n\n/** A code span opened by the backtick run at `start`, closed by a run of the same length. */\nfunction readCodeSpan(source: string, start: number): { text: string; end: number } | undefined {\n const run = /^`+/.exec(source.slice(start))![0];\n let search = start + run.length;\n while (search < source.length) {\n const found = source.indexOf(run, search);\n if (found === -1) return undefined;\n const after = found + run.length;\n // A longer run is not the closer; skip past all of it.\n if (source[after] === '`' || source[found - 1] === '`') {\n search = after;\n while (source[search] === '`') search += 1;\n continue;\n }\n let text = source.slice(start + run.length, found).replace(/\\n/g, ' ');\n if (text.length > 2 && text.startsWith(' ') && text.endsWith(' ') && text.trim() !== '') text = text.slice(1, -1);\n return { text, end: after };\n }\n return undefined;\n}\n\n/** `[label](href)` starting at the bracket; brackets in the label may nest. */\nfunction readLink(source: string, start: number): { label: string; href: string; end: number } | undefined {\n let depth = 0;\n let close = -1;\n for (let index = start; index < source.length; index += 1) {\n const char = source[index];\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n if (char === '[') depth += 1;\n if (char === ']') {\n depth -= 1;\n if (depth === 0) {\n close = index;\n break;\n }\n }\n }\n if (close === -1 || source[close + 1] !== '(') return undefined;\n const target = /^\\(\\s*<?([^\\s()<>]*)>?(?:\\s+\"[^\"]*\")?\\s*\\)/.exec(source.slice(close + 1));\n if (target === null) return undefined;\n return { label: source.slice(start + 1, close), href: target[1]!, end: close + 1 + target[0].length };\n}\n\n/**\n * Emphasis opened by `delimiter` at `start`: the inner text may not begin or\n * end with a space, and an underscore only counts at a word boundary, so\n * `snake_case_name` stays text.\n */\nfunction readDelimited(source: string, start: number, delimiter: string): { inner: string; end: number } | undefined {\n const underscore = delimiter[0] === '_';\n if (underscore && start > 0 && WORD_CHAR.test(source[start - 1]!)) return undefined;\n const open = start + delimiter.length;\n if (open >= source.length || /\\s/.test(source[open]!)) return undefined;\n let search = open;\n while (search < source.length) {\n const found = source.indexOf(delimiter, search);\n if (found === -1) return undefined;\n const end = found + delimiter.length;\n const single = delimiter.length === 1;\n // A single delimiter skips over a double one (`*a **b** c*`), which belongs to nested bold.\n if (single && source[end] === delimiter) {\n search = end + 1;\n continue;\n }\n const inner = source.slice(open, found);\n const boundaryOk = !underscore || end >= source.length || !WORD_CHAR.test(source[end]!);\n if (inner !== '' && !/\\s/.test(inner[inner.length - 1]!) && boundaryOk) return { inner, end };\n search = found + 1;\n }\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"markdown.mjs","names":[],"sources":["../../src/lib/markdown.ts"],"sourcesContent":["/*\n * A small Markdown parser for native message text: the subset an assistant\n * reply uses, parsed to plain data so the renderer and the tests share one\n * shape. Kept free of React Native so a unit test can run it in Node.\n *\n * Blocks: ATX headings, paragraphs, bullet and numbered lists, fenced code\n * (an unclosed fence runs to the end, so a streaming reply shows its code\n * before the closing fence arrives), thematic breaks, blockquotes and GFM\n * tables. HTML blocks are dropped, as the web renderer drops raw HTML.\n * Inline: code spans, bold, italic, links, images and backslash escapes.\n * A line break inside a paragraph is a space unless the line ends in two\n * spaces or a backslash, as CommonMark reads it.\n *\n * ponytail: no nested lists, setext headings or lazy quote continuation yet;\n * their source falls through as paragraph text, so nothing is lost.\n */\n\nexport type MarkdownInline =\n | { type: 'text'; text: string }\n | { type: 'code'; text: string }\n | { type: 'strong'; children: MarkdownInline[] }\n | { type: 'em'; children: MarkdownInline[] }\n | { type: 'link'; href: string; children: MarkdownInline[] }\n | { type: 'image'; src: string; alt: string };\n\nexport type MarkdownHeadingLevel = 1 | 2 | 3 | 4 | 5 | 6;\n\nexport type MarkdownBlock =\n | { type: 'heading'; level: MarkdownHeadingLevel; children: MarkdownInline[] }\n | { type: 'paragraph'; children: MarkdownInline[] }\n | { type: 'list'; ordered: boolean; start: number; items: MarkdownInline[][] }\n | { type: 'code'; language: string | undefined; text: string }\n | { type: 'rule' }\n | { type: 'quote'; children: MarkdownBlock[] }\n | { type: 'table'; header: MarkdownInline[][]; rows: MarkdownInline[][][] };\n\nconst FENCE_OPEN = /^ {0,3}(`{3,}|~{3,})[ \\t]*([^\\s`]*)/;\nconst HEADING = /^ {0,3}(#{1,6})(?:[ \\t]+(.*?))?(?:[ \\t]+#+)?[ \\t]*$/;\nconst RULE = /^ {0,3}([-*_])(?:[ \\t]*\\1){2,}[ \\t]*$/;\nconst BULLET_ITEM = /^ {0,3}[-*+][ \\t]+(.*)$/;\nconst ORDERED_ITEM = /^ {0,3}(\\d{1,9})[.)][ \\t]+(.*)$/;\nconst INDENTED = /^[ \\t]+\\S/;\nconst QUOTE = /^ {0,3}> ?(.*)$/;\nconst TABLE_DIVIDER = /^ {0,3}\\|?[ \\t]*:?-+:?[ \\t]*(?:\\|[ \\t]*:?-+:?[ \\t]*)*\\|?[ \\t]*$/;\nconst HTML_COMMENT = /^ {0,3}<!--/;\n/** CommonMark's block-level tag names, plus the picture and image markup READMEs open with. */\nconst HTML_BLOCK =\n /^ {0,3}<\\/?(?:address|article|aside|blockquote|center|details|div|dl|figcaption|figure|footer|form|h[1-6]|header|hr|li|main|nav|ol|p|picture|section|summary|table|tbody|td|tfoot|th|thead|tr|ul)(?=[\\s/>]|$)/i;\n/** Any other tag standing alone on its line, such as `<img ...>` or `<br>`. */\nconst HTML_TAG_LINE = /^ {0,3}<\\/?[A-Za-z][A-Za-z0-9-]*(?:\\s[^<>]*)?\\/?>[ \\t]*$/;\nconst HARD_BREAK = /(?: {2,}|\\\\)$/;\nconst ESCAPABLE = /[!-/:-@[-`{-~]/;\nconst WORD_CHAR = /[\\p{L}\\p{N}]/u;\n\nfunction isBlank(line: string): boolean {\n return line.trim() === '';\n}\n\n/** Joins a paragraph's lines: a space between them, or a line break after two spaces or a backslash. */\nfunction joinLines(lines: readonly string[]): string {\n let joined = '';\n lines.forEach((line, index) => {\n if (index === 0) joined = line;\n else {\n const hard = HARD_BREAK.test(joined);\n joined = `${joined.replace(/(?: {2,}|\\\\|[ \\t]+)$/u, '')}${hard ? '\\n' : ' '}${line.trimStart()}`;\n }\n });\n return joined;\n}\n\n/** A table row's cells: outer pipes dropped, split on unescaped pipes, `\\|` read as a pipe. */\nfunction tableCells(line: string): string[] {\n let row = line.trim();\n if (row.startsWith('|')) row = row.slice(1);\n if (row.endsWith('|') && !row.endsWith('\\\\|')) row = row.slice(0, -1);\n const cells: string[] = [];\n let cell = '';\n for (let index = 0; index < row.length; index += 1) {\n const char = row[index]!;\n if (char === '\\\\' && row[index + 1] === '|') {\n cell += '|';\n index += 1;\n } else if (char === '|') {\n cells.push(cell.trim());\n cell = '';\n } else cell += char;\n }\n cells.push(cell.trim());\n return cells;\n}\n\n/** Parses a Markdown document into blocks. */\nexport function parseMarkdown(source: string): MarkdownBlock[] {\n const lines = source.replace(/\\r\\n?/g, '\\n').split('\\n');\n const blocks: MarkdownBlock[] = [];\n let paragraph: string[] = [];\n let list: { ordered: boolean; start: number; items: string[][] } | undefined;\n\n const flushParagraph = () => {\n if (paragraph.length > 0) blocks.push({ type: 'paragraph', children: parseInline(joinLines(paragraph)) });\n paragraph = [];\n };\n const flushList = () => {\n if (list !== undefined)\n blocks.push({\n type: 'list',\n ordered: list.ordered,\n start: list.start,\n items: list.items.map((item) => parseInline(joinLines(item))),\n });\n list = undefined;\n };\n const flush = () => {\n flushParagraph();\n flushList();\n };\n\n for (let index = 0; index < lines.length; index += 1) {\n const line = lines[index]!;\n\n const fence = FENCE_OPEN.exec(line);\n if (fence !== null) {\n flush();\n const marker = fence[1]!;\n const close = new RegExp(`^ {0,3}${marker[0] === '`' ? '`' : '~'}{${marker.length},}[ \\\\t]*$`);\n const body: string[] = [];\n index += 1;\n while (index < lines.length && !close.test(lines[index]!)) {\n body.push(lines[index]!);\n index += 1;\n }\n const language = fence[2] === undefined || fence[2] === '' ? undefined : fence[2];\n blocks.push({ type: 'code', language, text: body.join('\\n') });\n continue;\n }\n\n if (isBlank(line)) {\n flush();\n continue;\n }\n\n // Raw HTML is left out, as on the web; a paragraph keeps any tag that appears inside it.\n if (paragraph.length === 0 && HTML_COMMENT.test(line)) {\n flush();\n while (index < lines.length && !lines[index]!.includes('-->')) index += 1;\n continue;\n }\n if (paragraph.length === 0 && (HTML_BLOCK.test(line) || HTML_TAG_LINE.test(line))) {\n flush();\n while (index + 1 < lines.length && !isBlank(lines[index + 1]!)) index += 1;\n continue;\n }\n const heading = HEADING.exec(line);\n if (heading !== null) {\n flush();\n const level = heading[1]!.length as MarkdownHeadingLevel;\n blocks.push({ type: 'heading', level, children: parseInline(heading[2] ?? '') });\n continue;\n }\n\n if (RULE.test(line)) {\n flush();\n blocks.push({ type: 'rule' });\n continue;\n }\n\n if (QUOTE.test(line)) {\n flush();\n const quoted: string[] = [];\n while (index < lines.length && QUOTE.test(lines[index]!)) {\n quoted.push(QUOTE.exec(lines[index]!)![1]!);\n index += 1;\n }\n index -= 1;\n blocks.push({ type: 'quote', children: parseMarkdown(quoted.join('\\n')) });\n continue;\n }\n\n const divider = lines[index + 1];\n if (line.includes('|') && divider !== undefined && divider.includes('|') && TABLE_DIVIDER.test(divider)) {\n const header = tableCells(line);\n if (header.length === tableCells(divider).length) {\n flush();\n index += 2;\n const rows: MarkdownInline[][][] = [];\n while (index < lines.length && !isBlank(lines[index]!) && lines[index]!.includes('|')) {\n const cells = tableCells(lines[index]!);\n rows.push(header.map((_, column) => parseInline(cells[column] ?? '')));\n index += 1;\n }\n index -= 1;\n blocks.push({ type: 'table', header: header.map((cell) => parseInline(cell)), rows });\n continue;\n }\n }\n const bullet = BULLET_ITEM.exec(line);\n const ordered = bullet === null ? ORDERED_ITEM.exec(line) : null;\n if (bullet !== null || ordered !== null) {\n flushParagraph();\n const isOrdered = ordered !== null;\n if (list === undefined || list.ordered !== isOrdered) {\n flushList();\n list = { ordered: isOrdered, start: isOrdered ? Number(ordered[1]) : 1, items: [] };\n }\n list.items.push([isOrdered ? ordered[2]! : bullet![1]!]);\n continue;\n }\n\n if (list !== undefined && INDENTED.test(line)) {\n list.items.at(-1)!.push(line.trim());\n continue;\n }\n\n flushList();\n paragraph.push(line);\n }\n flush();\n return blocks;\n}\n\n/** Parses one run of inline Markdown. */\nexport function parseInline(source: string): MarkdownInline[] {\n const nodes: MarkdownInline[] = [];\n let text = '';\n const pushText = (value: string) => {\n text += value;\n };\n const pushNode = (node: MarkdownInline) => {\n if (text !== '') nodes.push({ type: 'text', text });\n text = '';\n nodes.push(node);\n };\n\n let index = 0;\n while (index < source.length) {\n const char = source[index]!;\n\n if (char === '\\\\' && index + 1 < source.length && ESCAPABLE.test(source[index + 1]!)) {\n pushText(source[index + 1]!);\n index += 2;\n continue;\n }\n\n if (char === '`') {\n const span = readCodeSpan(source, index);\n if (span !== undefined) {\n pushNode({ type: 'code', text: span.text });\n index = span.end;\n continue;\n }\n const run = /^`+/.exec(source.slice(index))![0];\n pushText(run);\n index += run.length;\n continue;\n }\n\n if (char === '!' && source[index + 1] === '[') {\n const image = readLink(source, index + 1);\n if (image !== undefined) {\n pushNode({ type: 'image', src: image.href, alt: image.label });\n index = image.end;\n continue;\n }\n }\n\n if (char === '[') {\n const link = readLink(source, index);\n if (link !== undefined) {\n pushNode({ type: 'link', href: link.href, children: parseInline(link.label) });\n index = link.end;\n continue;\n }\n }\n\n if ((char === '*' || char === '_') && source[index + 1] === char) {\n const strong = readDelimited(source, index, char.repeat(2));\n if (strong !== undefined) {\n pushNode({ type: 'strong', children: parseInline(strong.inner) });\n index = strong.end;\n continue;\n }\n pushText(char.repeat(2));\n index += 2;\n continue;\n }\n\n if (char === '*' || char === '_') {\n const em = readDelimited(source, index, char);\n if (em !== undefined) {\n pushNode({ type: 'em', children: parseInline(em.inner) });\n index = em.end;\n continue;\n }\n }\n\n pushText(char);\n index += 1;\n }\n if (text !== '') nodes.push({ type: 'text', text });\n return nodes;\n}\n\n/** A code span opened by the backtick run at `start`, closed by a run of the same length. */\nfunction readCodeSpan(source: string, start: number): { text: string; end: number } | undefined {\n const run = /^`+/.exec(source.slice(start))![0];\n let search = start + run.length;\n while (search < source.length) {\n const found = source.indexOf(run, search);\n if (found === -1) return undefined;\n const after = found + run.length;\n // A longer run is not the closer; skip past all of it.\n if (source[after] === '`' || source[found - 1] === '`') {\n search = after;\n while (source[search] === '`') search += 1;\n continue;\n }\n let text = source.slice(start + run.length, found).replace(/\\n/g, ' ');\n if (text.length > 2 && text.startsWith(' ') && text.endsWith(' ') && text.trim() !== '') text = text.slice(1, -1);\n return { text, end: after };\n }\n return undefined;\n}\n\n/** `[label](href)` starting at the bracket; brackets in the label may nest. */\nfunction readLink(source: string, start: number): { label: string; href: string; end: number } | undefined {\n let depth = 0;\n let close = -1;\n for (let index = start; index < source.length; index += 1) {\n const char = source[index];\n if (char === '\\\\') {\n index += 1;\n continue;\n }\n if (char === '[') depth += 1;\n if (char === ']') {\n depth -= 1;\n if (depth === 0) {\n close = index;\n break;\n }\n }\n }\n if (close === -1 || source[close + 1] !== '(') return undefined;\n const target = /^\\(\\s*<?([^\\s()<>]*)>?(?:\\s+\"[^\"]*\")?\\s*\\)/.exec(source.slice(close + 1));\n if (target === null) return undefined;\n return { label: source.slice(start + 1, close), href: target[1]!, end: close + 1 + target[0].length };\n}\n\n/**\n * Emphasis opened by `delimiter` at `start`: the inner text may not begin or\n * end with a space, and an underscore only counts at a word boundary, so\n * `snake_case_name` stays text.\n */\nfunction readDelimited(source: string, start: number, delimiter: string): { inner: string; end: number } | undefined {\n const underscore = delimiter[0] === '_';\n if (underscore && start > 0 && WORD_CHAR.test(source[start - 1]!)) return undefined;\n const open = start + delimiter.length;\n if (open >= source.length || /\\s/.test(source[open]!)) return undefined;\n let search = open;\n while (search < source.length) {\n const found = source.indexOf(delimiter, search);\n if (found === -1) return undefined;\n const end = found + delimiter.length;\n const single = delimiter.length === 1;\n // A single delimiter skips over a double one (`*a **b** c*`), which belongs to nested bold.\n if (single && source[end] === delimiter) {\n search = end + 1;\n continue;\n }\n const inner = source.slice(open, found);\n const boundaryOk = !underscore || end >= source.length || !WORD_CHAR.test(source[end]!);\n if (inner !== '' && !/\\s/.test(inner[inner.length - 1]!) && boundaryOk) return { inner, end };\n search = found + 1;\n }\n return undefined;\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@agimon-ai/po-native-components",
3
- "version": "0.0.0-alpha.21",
3
+ "version": "0.0.0-alpha.23",
4
4
  "description": "Shared React Native components for Po and its native plugins: the web component library's look and API on native parts, tuned to the Po palette.",
5
5
  "keywords": [
6
6
  "ai",
@@ -45,11 +45,11 @@
45
45
  "access": "public"
46
46
  },
47
47
  "dependencies": {
48
- "@agimon-ai/po-web-components": "0.0.0-alpha.21"
48
+ "@agimon-ai/po-web-components": "0.0.0-alpha.23"
49
49
  },
50
50
  "devDependencies": {
51
- "@agimon-ai/po-build": "0.0.0-alpha.21",
52
- "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.21",
51
+ "@agimon-ai/po-build": "0.0.0-alpha.23",
52
+ "@agimon-ai/vibe-lint-plugin-po-web": "0.0.0-alpha.23",
53
53
  "@babel/core": "7.29.7",
54
54
  "@expo/vector-icons": "15.1.1",
55
55
  "@gorhom/bottom-sheet": "5.2.14",