terminal-pilot 0.0.37 → 0.0.38

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 (204) hide show
  1. package/dist/cli.js +152 -2
  2. package/dist/cli.js.map +3 -3
  3. package/dist/commands/close-session.js +1 -1
  4. package/dist/commands/close-session.js.map +2 -2
  5. package/dist/commands/create-session.js +1 -1
  6. package/dist/commands/create-session.js.map +2 -2
  7. package/dist/commands/daemon-runtime.js +1 -1
  8. package/dist/commands/daemon-runtime.js.map +2 -2
  9. package/dist/commands/fill.js +1 -1
  10. package/dist/commands/fill.js.map +2 -2
  11. package/dist/commands/get-session.js +1 -1
  12. package/dist/commands/get-session.js.map +2 -2
  13. package/dist/commands/index.js +145 -1
  14. package/dist/commands/index.js.map +3 -3
  15. package/dist/commands/install.js +145 -1
  16. package/dist/commands/install.js.map +3 -3
  17. package/dist/commands/installer.js +145 -1
  18. package/dist/commands/installer.js.map +3 -3
  19. package/dist/commands/list-sessions.js +1 -1
  20. package/dist/commands/list-sessions.js.map +2 -2
  21. package/dist/commands/press-key.js +1 -1
  22. package/dist/commands/press-key.js.map +2 -2
  23. package/dist/commands/read-history.js +1 -1
  24. package/dist/commands/read-history.js.map +2 -2
  25. package/dist/commands/read-screen.js +1 -1
  26. package/dist/commands/read-screen.js.map +2 -2
  27. package/dist/commands/resize.js +1 -1
  28. package/dist/commands/resize.js.map +2 -2
  29. package/dist/commands/runtime.js +1 -1
  30. package/dist/commands/runtime.js.map +2 -2
  31. package/dist/commands/screenshot.js +1 -1
  32. package/dist/commands/screenshot.js.map +2 -2
  33. package/dist/commands/send-signal.js +1 -1
  34. package/dist/commands/send-signal.js.map +2 -2
  35. package/dist/commands/type.js +1 -1
  36. package/dist/commands/type.js.map +2 -2
  37. package/dist/commands/uninstall.js +145 -1
  38. package/dist/commands/uninstall.js.map +3 -3
  39. package/dist/commands/wait-for-exit.js +1 -1
  40. package/dist/commands/wait-for-exit.js.map +2 -2
  41. package/dist/commands/wait-for.js +1 -1
  42. package/dist/commands/wait-for.js.map +2 -2
  43. package/dist/testing/cli-repl.js +152 -2
  44. package/dist/testing/cli-repl.js.map +3 -3
  45. package/dist/testing/qa-cli.js +152 -2
  46. package/dist/testing/qa-cli.js.map +3 -3
  47. package/node_modules/toolcraft-design/README.md +187 -5
  48. package/node_modules/toolcraft-design/dist/brand.d.ts +2 -0
  49. package/node_modules/toolcraft-design/dist/brand.js +1 -0
  50. package/node_modules/toolcraft-design/dist/brands.d.ts +2 -0
  51. package/node_modules/toolcraft-design/dist/brands.js +1 -0
  52. package/node_modules/toolcraft-design/dist/cancel.d.ts +1 -0
  53. package/node_modules/toolcraft-design/dist/cancel.js +1 -0
  54. package/node_modules/toolcraft-design/dist/color.d.ts +2 -0
  55. package/node_modules/toolcraft-design/dist/color.js +1 -0
  56. package/node_modules/toolcraft-design/dist/configure-theme.d.ts +1 -0
  57. package/node_modules/toolcraft-design/dist/configure-theme.js +1 -0
  58. package/node_modules/toolcraft-design/dist/confirm-or-cancel.d.ts +2 -0
  59. package/node_modules/toolcraft-design/dist/confirm-or-cancel.js +1 -0
  60. package/node_modules/toolcraft-design/dist/confirm.d.ts +2 -0
  61. package/node_modules/toolcraft-design/dist/confirm.js +1 -0
  62. package/node_modules/toolcraft-design/dist/create-dashboard.d.ts +2 -0
  63. package/node_modules/toolcraft-design/dist/create-dashboard.js +1 -0
  64. package/node_modules/toolcraft-design/dist/create-logger.d.ts +2 -0
  65. package/node_modules/toolcraft-design/dist/create-logger.js +1 -0
  66. package/node_modules/toolcraft-design/dist/dark.d.ts +2 -0
  67. package/node_modules/toolcraft-design/dist/dark.js +1 -0
  68. package/node_modules/toolcraft-design/dist/format-columns.d.ts +2 -0
  69. package/node_modules/toolcraft-design/dist/format-columns.js +1 -0
  70. package/node_modules/toolcraft-design/dist/format-command-list.d.ts +2 -0
  71. package/node_modules/toolcraft-design/dist/format-command-list.js +1 -0
  72. package/node_modules/toolcraft-design/dist/format-command-not-found-panel.d.ts +1 -0
  73. package/node_modules/toolcraft-design/dist/format-command-not-found-panel.js +1 -0
  74. package/node_modules/toolcraft-design/dist/format-command-not-found.d.ts +1 -0
  75. package/node_modules/toolcraft-design/dist/format-command-not-found.js +1 -0
  76. package/node_modules/toolcraft-design/dist/format-command.d.ts +1 -0
  77. package/node_modules/toolcraft-design/dist/format-command.js +1 -0
  78. package/node_modules/toolcraft-design/dist/format-option-list.d.ts +2 -0
  79. package/node_modules/toolcraft-design/dist/format-option-list.js +1 -0
  80. package/node_modules/toolcraft-design/dist/format-option.d.ts +1 -0
  81. package/node_modules/toolcraft-design/dist/format-option.js +1 -0
  82. package/node_modules/toolcraft-design/dist/format-usage.d.ts +1 -0
  83. package/node_modules/toolcraft-design/dist/format-usage.js +1 -0
  84. package/node_modules/toolcraft-design/dist/get-template-partial-names.d.ts +1 -0
  85. package/node_modules/toolcraft-design/dist/get-template-partial-names.js +1 -0
  86. package/node_modules/toolcraft-design/dist/get-theme-config.d.ts +1 -0
  87. package/node_modules/toolcraft-design/dist/get-theme-config.js +1 -0
  88. package/node_modules/toolcraft-design/dist/get-theme.d.ts +2 -0
  89. package/node_modules/toolcraft-design/dist/get-theme.js +1 -0
  90. package/node_modules/toolcraft-design/dist/help-formatter-plain.d.ts +2 -0
  91. package/node_modules/toolcraft-design/dist/help-formatter-plain.js +2 -0
  92. package/node_modules/toolcraft-design/dist/help-formatter.d.ts +2 -0
  93. package/node_modules/toolcraft-design/dist/help-formatter.js +1 -0
  94. package/node_modules/toolcraft-design/dist/index.d.ts +2 -2
  95. package/node_modules/toolcraft-design/dist/index.js +1 -1
  96. package/node_modules/toolcraft-design/dist/intro-plain.d.ts +1 -0
  97. package/node_modules/toolcraft-design/dist/intro-plain.js +1 -0
  98. package/node_modules/toolcraft-design/dist/intro.d.ts +1 -0
  99. package/node_modules/toolcraft-design/dist/intro.js +1 -0
  100. package/node_modules/toolcraft-design/dist/is-cancel.d.ts +1 -0
  101. package/node_modules/toolcraft-design/dist/is-cancel.js +1 -0
  102. package/node_modules/toolcraft-design/dist/light.d.ts +2 -0
  103. package/node_modules/toolcraft-design/dist/light.js +1 -0
  104. package/node_modules/toolcraft-design/dist/log.d.ts +1 -0
  105. package/node_modules/toolcraft-design/dist/log.js +1 -0
  106. package/node_modules/toolcraft-design/dist/logger.d.ts +2 -0
  107. package/node_modules/toolcraft-design/dist/logger.js +1 -0
  108. package/node_modules/toolcraft-design/dist/multiselect.d.ts +2 -0
  109. package/node_modules/toolcraft-design/dist/multiselect.js +1 -0
  110. package/node_modules/toolcraft-design/dist/note.d.ts +1 -0
  111. package/node_modules/toolcraft-design/dist/note.js +1 -0
  112. package/node_modules/toolcraft-design/dist/open-external.d.ts +1 -0
  113. package/node_modules/toolcraft-design/dist/open-external.js +1 -0
  114. package/node_modules/toolcraft-design/dist/outro.d.ts +1 -0
  115. package/node_modules/toolcraft-design/dist/outro.js +1 -0
  116. package/node_modules/toolcraft-design/dist/parse.d.ts +2 -0
  117. package/node_modules/toolcraft-design/dist/parse.js +1 -0
  118. package/node_modules/toolcraft-design/dist/password.d.ts +2 -0
  119. package/node_modules/toolcraft-design/dist/password.js +1 -0
  120. package/node_modules/toolcraft-design/dist/prompt-cancelled-error.d.ts +1 -0
  121. package/node_modules/toolcraft-design/dist/prompt-cancelled-error.js +1 -0
  122. package/node_modules/toolcraft-design/dist/prompt-text.d.ts +2 -0
  123. package/node_modules/toolcraft-design/dist/prompt-text.js +1 -0
  124. package/node_modules/toolcraft-design/dist/prompt-theme.d.ts +1 -0
  125. package/node_modules/toolcraft-design/dist/prompt-theme.js +1 -0
  126. package/node_modules/toolcraft-design/dist/render-catalog.d.ts +2 -0
  127. package/node_modules/toolcraft-design/dist/render-catalog.js +1 -0
  128. package/node_modules/toolcraft-design/dist/render-detail-card.d.ts +2 -0
  129. package/node_modules/toolcraft-design/dist/render-detail-card.js +1 -0
  130. package/node_modules/toolcraft-design/dist/render-html.d.ts +2 -0
  131. package/node_modules/toolcraft-design/dist/render-html.js +1 -0
  132. package/node_modules/toolcraft-design/dist/render-inspector-card.d.ts +2 -0
  133. package/node_modules/toolcraft-design/dist/render-inspector-card.js +1 -0
  134. package/node_modules/toolcraft-design/dist/render-markdown-html.d.ts +2 -0
  135. package/node_modules/toolcraft-design/dist/render-markdown-html.js +1 -0
  136. package/node_modules/toolcraft-design/dist/render-markdown.d.ts +2 -0
  137. package/node_modules/toolcraft-design/dist/render-markdown.js +1 -0
  138. package/node_modules/toolcraft-design/dist/render-menu.d.ts +2 -0
  139. package/node_modules/toolcraft-design/dist/render-menu.js +1 -0
  140. package/node_modules/toolcraft-design/dist/render-resource-browser.d.ts +2 -0
  141. package/node_modules/toolcraft-design/dist/render-resource-browser.js +1 -0
  142. package/node_modules/toolcraft-design/dist/render-spinner-frame.d.ts +2 -0
  143. package/node_modules/toolcraft-design/dist/render-spinner-frame.js +1 -0
  144. package/node_modules/toolcraft-design/dist/render-spinner-stopped.d.ts +2 -0
  145. package/node_modules/toolcraft-design/dist/render-spinner-stopped.js +1 -0
  146. package/node_modules/toolcraft-design/dist/render-table.d.ts +2 -0
  147. package/node_modules/toolcraft-design/dist/render-table.js +1 -0
  148. package/node_modules/toolcraft-design/dist/render-template.d.ts +2 -0
  149. package/node_modules/toolcraft-design/dist/render-template.js +1 -0
  150. package/node_modules/toolcraft-design/dist/render.d.ts +2 -0
  151. package/node_modules/toolcraft-design/dist/render.js +1 -0
  152. package/node_modules/toolcraft-design/dist/reset-output-format-cache.d.ts +1 -0
  153. package/node_modules/toolcraft-design/dist/reset-output-format-cache.js +1 -0
  154. package/node_modules/toolcraft-design/dist/reset-theme-cache.d.ts +1 -0
  155. package/node_modules/toolcraft-design/dist/reset-theme-cache.js +1 -0
  156. package/node_modules/toolcraft-design/dist/reset-theme.d.ts +1 -0
  157. package/node_modules/toolcraft-design/dist/reset-theme.js +1 -0
  158. package/node_modules/toolcraft-design/dist/resolve-output-format.d.ts +2 -0
  159. package/node_modules/toolcraft-design/dist/resolve-output-format.js +1 -0
  160. package/node_modules/toolcraft-design/dist/resolve-template-partials.d.ts +1 -0
  161. package/node_modules/toolcraft-design/dist/resolve-template-partials.js +1 -0
  162. package/node_modules/toolcraft-design/dist/resolve-theme-name.d.ts +2 -0
  163. package/node_modules/toolcraft-design/dist/resolve-theme-name.js +1 -0
  164. package/node_modules/toolcraft-design/dist/run-explorer.d.ts +2 -0
  165. package/node_modules/toolcraft-design/dist/run-explorer.js +1 -0
  166. package/node_modules/toolcraft-design/dist/run-two-pane-explorer.d.ts +2 -0
  167. package/node_modules/toolcraft-design/dist/run-two-pane-explorer.js +1 -0
  168. package/node_modules/toolcraft-design/dist/select.d.ts +2 -0
  169. package/node_modules/toolcraft-design/dist/select.js +1 -0
  170. package/node_modules/toolcraft-design/dist/should-use-interactive-dashboard.d.ts +1 -0
  171. package/node_modules/toolcraft-design/dist/should-use-interactive-dashboard.js +1 -0
  172. package/node_modules/toolcraft-design/dist/single-detail.d.ts +2 -0
  173. package/node_modules/toolcraft-design/dist/single-detail.js +1 -0
  174. package/node_modules/toolcraft-design/dist/spacing.d.ts +1 -0
  175. package/node_modules/toolcraft-design/dist/spacing.js +1 -0
  176. package/node_modules/toolcraft-design/dist/spinner-frames.d.ts +1 -0
  177. package/node_modules/toolcraft-design/dist/spinner-frames.js +1 -0
  178. package/node_modules/toolcraft-design/dist/spinner.d.ts +2 -0
  179. package/node_modules/toolcraft-design/dist/spinner.js +1 -0
  180. package/node_modules/toolcraft-design/dist/strip-ansi.d.ts +1 -0
  181. package/node_modules/toolcraft-design/dist/strip-ansi.js +1 -0
  182. package/node_modules/toolcraft-design/dist/symbols.d.ts +1 -0
  183. package/node_modules/toolcraft-design/dist/symbols.js +1 -0
  184. package/node_modules/toolcraft-design/dist/terminal-markdown/ast.d.ts +6 -0
  185. package/node_modules/toolcraft-design/dist/terminal-markdown/html-renderer.d.ts +7 -0
  186. package/node_modules/toolcraft-design/dist/terminal-markdown/html-renderer.js +366 -0
  187. package/node_modules/toolcraft-design/dist/terminal-markdown/index.d.ts +5 -1
  188. package/node_modules/toolcraft-design/dist/terminal-markdown/index.js +6 -0
  189. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/code-highlight.d.ts +4 -0
  190. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/code-highlight.js +1357 -0
  191. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.d.ts +1 -0
  192. package/node_modules/toolcraft-design/dist/terminal-markdown/renderer.js +63 -1
  193. package/node_modules/toolcraft-design/dist/text.d.ts +1 -0
  194. package/node_modules/toolcraft-design/dist/text.js +1 -0
  195. package/node_modules/toolcraft-design/dist/typography.d.ts +1 -0
  196. package/node_modules/toolcraft-design/dist/typography.js +1 -0
  197. package/node_modules/toolcraft-design/dist/widths.d.ts +1 -0
  198. package/node_modules/toolcraft-design/dist/widths.js +1 -0
  199. package/node_modules/toolcraft-design/dist/with-output-format.d.ts +2 -0
  200. package/node_modules/toolcraft-design/dist/with-output-format.js +1 -0
  201. package/node_modules/toolcraft-design/dist/with-spinner.d.ts +2 -0
  202. package/node_modules/toolcraft-design/dist/with-spinner.js +1 -0
  203. package/node_modules/toolcraft-design/package.json +4 -0
  204. package/package.json +1 -1
@@ -0,0 +1 @@
1
+ export { render } from "./terminal-markdown/index.js";
@@ -0,0 +1 @@
1
+ export { resetOutputFormatCache } from "./internal/output-format.js";
@@ -0,0 +1 @@
1
+ export { resetOutputFormatCache } from "./internal/output-format.js";
@@ -0,0 +1 @@
1
+ export { resetThemeCache } from "./internal/theme-detect.js";
@@ -0,0 +1 @@
1
+ export { resetThemeCache } from "./internal/theme-detect.js";
@@ -0,0 +1 @@
1
+ export { resetTheme } from "./internal/theme-state.js";
@@ -0,0 +1 @@
1
+ export { resetTheme } from "./internal/theme-state.js";
@@ -0,0 +1,2 @@
1
+ export { resolveOutputFormat } from "./internal/output-format.js";
2
+ export type { OutputFormat } from "./internal/output-format.js";
@@ -0,0 +1 @@
1
+ export { resolveOutputFormat } from "./internal/output-format.js";
@@ -0,0 +1 @@
1
+ export { resolveTemplatePartials } from "./components/template.js";
@@ -0,0 +1 @@
1
+ export { resolveTemplatePartials } from "./components/template.js";
@@ -0,0 +1,2 @@
1
+ export { resolveThemeName } from "./internal/theme-detect.js";
2
+ export type { ThemeEnv } from "./internal/theme-detect.js";
@@ -0,0 +1 @@
1
+ export { resolveThemeName } from "./internal/theme-detect.js";
@@ -0,0 +1,2 @@
1
+ export { runExplorer } from "./explorer/index.js";
2
+ export type { ExplorerConfig } from "./explorer/index.js";
@@ -0,0 +1 @@
1
+ export { runExplorer } from "./explorer/index.js";
@@ -0,0 +1,2 @@
1
+ export { runTwoPaneExplorer } from "./explorer/index.js";
2
+ export type { TwoPaneExplorerConfig } from "./explorer/index.js";
@@ -0,0 +1 @@
1
+ export { runTwoPaneExplorer } from "./explorer/index.js";
@@ -0,0 +1,2 @@
1
+ export { select } from "./prompts/index.js";
2
+ export type { SelectOptions } from "./prompts/index.js";
@@ -0,0 +1 @@
1
+ export { select } from "./prompts/index.js";
@@ -0,0 +1 @@
1
+ export { shouldUseInteractiveDashboard } from "./dashboard/index.js";
@@ -0,0 +1 @@
1
+ export { shouldUseInteractiveDashboard } from "./dashboard/index.js";
@@ -0,0 +1,2 @@
1
+ export { singleDetail } from "./explorer/index.js";
2
+ export type { Detail, DetailCtx, DetailItem, Row } from "./explorer/index.js";
@@ -0,0 +1 @@
1
+ export { singleDetail } from "./explorer/index.js";
@@ -0,0 +1 @@
1
+ export { spacing } from "./tokens/spacing.js";
@@ -0,0 +1 @@
1
+ export { spacing } from "./tokens/spacing.js";
@@ -0,0 +1 @@
1
+ export { SPINNER_FRAMES } from "./static/index.js";
@@ -0,0 +1 @@
1
+ export { SPINNER_FRAMES } from "./static/index.js";
@@ -0,0 +1,2 @@
1
+ export { spinner } from "./prompts/index.js";
2
+ export type { SpinnerOptions } from "./prompts/index.js";
@@ -0,0 +1 @@
1
+ export { spinner } from "./prompts/index.js";
@@ -0,0 +1 @@
1
+ export { stripAnsi } from "./internal/strip-ansi.js";
@@ -0,0 +1 @@
1
+ export { stripAnsi } from "./internal/strip-ansi.js";
@@ -0,0 +1 @@
1
+ export { symbols } from "./components/symbols.js";
@@ -0,0 +1 @@
1
+ export { symbols } from "./components/symbols.js";
@@ -2,6 +2,11 @@ export type MdRange = {
2
2
  start: number;
3
3
  end: number;
4
4
  };
5
+ export type CodeTokenKind = "anchor" | "at-rule" | "attribute" | "boolean" | "color" | "command" | "comment" | "decorator" | "directive" | "flag" | "function" | "identifier" | "important" | "invalid" | "key" | "keyword" | "label" | "null" | "number" | "operator" | "parameter" | "plain" | "property" | "punctuation" | "regex" | "selector" | "string" | "tag" | "template" | "type" | "variable";
6
+ export type CodeToken = {
7
+ kind: CodeTokenKind;
8
+ value: string;
9
+ };
5
10
  type MdNodeWithRange = {
6
11
  range?: MdRange;
7
12
  };
@@ -23,6 +28,7 @@ export type MdNode = MdNodeWithRange & ({
23
28
  lang?: string;
24
29
  meta?: string;
25
30
  value: string;
31
+ tokens?: CodeToken[];
26
32
  } | {
27
33
  type: "list";
28
34
  ordered: boolean;
@@ -0,0 +1,7 @@
1
+ import type { MdNode } from "./ast.js";
2
+ export interface HtmlRenderOptions {
3
+ showFrontmatter?: boolean;
4
+ allowRawHtml?: boolean;
5
+ syntaxHighlight?: boolean;
6
+ }
7
+ export declare function renderHtml(ast: MdNode, options?: HtmlRenderOptions): string;
@@ -0,0 +1,366 @@
1
+ import { highlightCodeBlock } from "./parser/code-highlight.js";
2
+ export function renderHtml(ast, options = {}) {
3
+ const context = {
4
+ showFrontmatter: options.showFrontmatter ?? false,
5
+ allowRawHtml: options.allowRawHtml ?? false,
6
+ syntaxHighlight: options.syntaxHighlight ?? false,
7
+ footnotes: ast.type === "root" ? createFootnoteState(ast.children) : undefined
8
+ };
9
+ return renderNode(ast, context);
10
+ }
11
+ function renderNode(node, context) {
12
+ switch (node.type) {
13
+ case "root":
14
+ return renderRoot(node, context);
15
+ case "heading":
16
+ return renderHeading(node, context);
17
+ case "paragraph":
18
+ return renderParagraph(node, context);
19
+ case "blockquote":
20
+ return renderBlockquote(node, context);
21
+ case "alert":
22
+ return renderAlert(node, context);
23
+ case "code":
24
+ return renderCodeBlock(node, context);
25
+ case "list":
26
+ return renderList(node, context);
27
+ case "table":
28
+ return renderTable(node, context);
29
+ case "html":
30
+ return context.allowRawHtml ? node.value : escapeHtml(node.value);
31
+ case "thematicBreak":
32
+ return "<hr>";
33
+ case "frontmatter":
34
+ return context.showFrontmatter ? renderFrontmatter(node.data) : "";
35
+ case "footnoteDefinition":
36
+ return "";
37
+ case "text":
38
+ case "strong":
39
+ case "emphasis":
40
+ case "strikethrough":
41
+ case "inlineCode":
42
+ case "link":
43
+ case "image":
44
+ case "break":
45
+ case "footnoteReference":
46
+ return renderInline(node, context);
47
+ default:
48
+ return "children" in node ? renderChildren(node.children, context) : "";
49
+ }
50
+ }
51
+ function renderRoot(node, context) {
52
+ const blocks = node.children
53
+ .filter((child) => child.type !== "footnoteDefinition")
54
+ .map((child) => renderNode(child, context))
55
+ .filter((value) => value.length > 0);
56
+ const footnotes = renderReferencedFootnotes(context);
57
+ if (footnotes.length > 0) {
58
+ blocks.push(footnotes);
59
+ }
60
+ return blocks.join("\n");
61
+ }
62
+ function renderChildren(children, context) {
63
+ return children
64
+ .map((child) => renderNode(child, context))
65
+ .filter((value) => value.length > 0)
66
+ .join("\n");
67
+ }
68
+ function renderHeading(node, context) {
69
+ const content = renderInlineChildren(node.children, context);
70
+ return content.length === 0 ? "" : `<h${node.depth}>${content}</h${node.depth}>`;
71
+ }
72
+ function renderParagraph(node, context) {
73
+ const content = renderInlineChildren(node.children, context);
74
+ return content.length === 0 ? "" : `<p>${content}</p>`;
75
+ }
76
+ function renderBlockquote(node, context) {
77
+ const content = renderChildren(node.children, context);
78
+ return `<blockquote>${content}</blockquote>`;
79
+ }
80
+ function renderAlert(node, context) {
81
+ const content = renderChildren(node.children, context);
82
+ return `<blockquote data-alert="${escapeAttribute(node.kind)}">${content}</blockquote>`;
83
+ }
84
+ function renderCodeBlock(node, context) {
85
+ const classAttribute = node.lang === undefined || node.lang.length === 0
86
+ ? ""
87
+ : ` class="language-${escapeAttribute(node.lang)}"`;
88
+ const tokens = context.syntaxHighlight ? highlightCodeBlock(node) : undefined;
89
+ const content = tokens === undefined
90
+ ? escapeHtml(node.value)
91
+ : tokens
92
+ .map((token) => token.kind === "plain"
93
+ ? escapeHtml(token.value)
94
+ : `<span class="tc-token-${escapeAttribute(token.kind)}">${escapeHtml(token.value)}</span>`)
95
+ .join("");
96
+ return `<pre><code${classAttribute}>${content}</code></pre>`;
97
+ }
98
+ function renderList(node, context) {
99
+ const tag = node.ordered ? "ol" : "ul";
100
+ const startAttribute = node.ordered && node.start !== undefined && node.start !== 1
101
+ ? ` start="${escapeAttribute(String(node.start))}"`
102
+ : "";
103
+ const items = node.children
104
+ .map((child) => (child.type === "listItem" ? renderListItem(child, context) : renderNode(child, context)))
105
+ .filter((value) => value.length > 0)
106
+ .join("");
107
+ return items.length === 0 ? "" : `<${tag}${startAttribute}>${items}</${tag}>`;
108
+ }
109
+ function renderListItem(node, context) {
110
+ const renderedChildren = node.children
111
+ .map((child, index) => {
112
+ if (index === 0 && child.type === "paragraph") {
113
+ return renderInlineChildren(child.children, context);
114
+ }
115
+ return renderNode(child, context);
116
+ })
117
+ .filter((value) => value.length > 0);
118
+ const checkbox = renderTaskCheckbox(node);
119
+ return `<li>${checkbox}${renderedChildren.join("")}</li>`;
120
+ }
121
+ function renderTaskCheckbox(node) {
122
+ if (node.checked === true) {
123
+ return '<input type="checkbox" disabled checked> ';
124
+ }
125
+ if (node.checked === false) {
126
+ return '<input type="checkbox" disabled> ';
127
+ }
128
+ return "";
129
+ }
130
+ function renderTable(node, context) {
131
+ const rows = node.children.filter((child) => child.type === "tableRow");
132
+ const headerRow = rows[0];
133
+ if (headerRow === undefined) {
134
+ return "";
135
+ }
136
+ const header = `<thead>${renderTableRow(headerRow, node.align, "th", context)}</thead>`;
137
+ const bodyRows = rows
138
+ .slice(1)
139
+ .map((row) => renderTableRow(row, node.align, "td", context))
140
+ .join("");
141
+ const body = `<tbody>${bodyRows}</tbody>`;
142
+ return ["<table>", header, body, "</table>"].join("\n");
143
+ }
144
+ function renderTableRow(node, alignments, cellTag, context) {
145
+ const cells = node.children
146
+ .map((cell, index) => {
147
+ if (cell.type !== "tableCell") {
148
+ return "";
149
+ }
150
+ const style = renderTableAlignment(alignments[index] ?? null);
151
+ return `<${cellTag}${style}>${renderInlineChildren(cell.children, context)}</${cellTag}>`;
152
+ })
153
+ .join("");
154
+ return `<tr>${cells}</tr>`;
155
+ }
156
+ function renderTableAlignment(alignment) {
157
+ if (alignment === null) {
158
+ return "";
159
+ }
160
+ return ` style="text-align: ${alignment}"`;
161
+ }
162
+ function renderFrontmatter(data) {
163
+ const lines = Object.entries(data).map(([key, value]) => `${key}: ${formatFrontmatterValue(value)}`);
164
+ if (lines.length === 0) {
165
+ return "";
166
+ }
167
+ return `<pre><code class="language-yaml">${escapeHtml(lines.join("\n"))}</code></pre>`;
168
+ }
169
+ function formatFrontmatterValue(value) {
170
+ if (value === null) {
171
+ return "null";
172
+ }
173
+ if (typeof value === "string") {
174
+ return value;
175
+ }
176
+ if (typeof value === "number" || typeof value === "boolean") {
177
+ return String(value);
178
+ }
179
+ const ancestors = [];
180
+ return JSON.stringify(value, function (_key, nestedValue) {
181
+ if (typeof nestedValue !== "object" || nestedValue === null) {
182
+ return nestedValue;
183
+ }
184
+ while (ancestors.length > 0 && ancestors[ancestors.length - 1] !== this) {
185
+ ancestors.pop();
186
+ }
187
+ if (ancestors.includes(nestedValue)) {
188
+ return "[Circular]";
189
+ }
190
+ ancestors.push(nestedValue);
191
+ return nestedValue;
192
+ });
193
+ }
194
+ function renderInlineChildren(children, context) {
195
+ return children.map((child) => renderInline(child, context)).join("");
196
+ }
197
+ function renderInline(node, context) {
198
+ switch (node.type) {
199
+ case "text":
200
+ return escapeHtml(node.value);
201
+ case "strong":
202
+ return `<strong>${renderInlineChildren(node.children, context)}</strong>`;
203
+ case "emphasis":
204
+ return `<em>${renderInlineChildren(node.children, context)}</em>`;
205
+ case "strikethrough":
206
+ return `<del>${renderInlineChildren(node.children, context)}</del>`;
207
+ case "inlineCode":
208
+ return `<code>${escapeHtml(node.value)}</code>`;
209
+ case "link":
210
+ return renderLink(node, context);
211
+ case "image":
212
+ return renderImage(node);
213
+ case "break":
214
+ return "<br>";
215
+ case "footnoteReference":
216
+ return renderFootnoteReference(node, context);
217
+ case "html":
218
+ return context.allowRawHtml ? node.value : escapeHtml(node.value);
219
+ default:
220
+ return "children" in node ? renderInlineChildren(node.children, context) : renderNode(node, context);
221
+ }
222
+ }
223
+ function renderLink(node, context) {
224
+ const href = sanitizeUrl(node.url);
225
+ const attributes = [
226
+ href === null ? "" : ` href="${escapeAttribute(href)}"`,
227
+ node.title === undefined ? "" : ` title="${escapeAttribute(node.title)}"`
228
+ ].join("");
229
+ return `<a${attributes}>${renderInlineChildren(node.children, context)}</a>`;
230
+ }
231
+ function renderImage(node) {
232
+ const src = sanitizeUrl(node.url);
233
+ const attributes = [
234
+ src === null ? "" : ` src="${escapeAttribute(src)}"`,
235
+ ` alt="${escapeAttribute(node.alt)}"`,
236
+ node.title === undefined ? "" : ` title="${escapeAttribute(node.title)}"`
237
+ ].join("");
238
+ return `<img${attributes}>`;
239
+ }
240
+ function renderFootnoteReference(node, context) {
241
+ const footnotes = context.footnotes;
242
+ if (footnotes === undefined || !footnotes.definitions.has(node.label)) {
243
+ return "";
244
+ }
245
+ let number = footnotes.numbers.get(node.label);
246
+ if (number === undefined) {
247
+ footnotes.labelsInOrder.push(node.label);
248
+ number = footnotes.labelsInOrder.length;
249
+ footnotes.numbers.set(node.label, number);
250
+ }
251
+ const id = escapeAttribute(createFootnoteId(node.label));
252
+ return `<sup id="fnref-${id}"><a href="#fn-${id}">${number}</a></sup>`;
253
+ }
254
+ function renderReferencedFootnotes(context) {
255
+ const footnotes = context.footnotes;
256
+ if (footnotes === undefined || footnotes.labelsInOrder.length === 0) {
257
+ return "";
258
+ }
259
+ const items = footnotes.labelsInOrder
260
+ .map((label) => {
261
+ const definition = footnotes.definitions.get(label);
262
+ if (definition === undefined) {
263
+ return "";
264
+ }
265
+ const id = escapeAttribute(createFootnoteId(label));
266
+ const content = renderChildren(definition.children, context);
267
+ return `<li id="fn-${id}">${content} <a href="#fnref-${id}" aria-label="Back to content">Back</a></li>`;
268
+ })
269
+ .filter((value) => value.length > 0)
270
+ .join("");
271
+ return items.length === 0 ? "" : `<section class="footnotes"><ol>${items}</ol></section>`;
272
+ }
273
+ function createFootnoteState(children) {
274
+ const definitions = new Map();
275
+ for (const child of children) {
276
+ collectFootnoteDefinitions(child, definitions);
277
+ }
278
+ return {
279
+ definitions,
280
+ labelsInOrder: [],
281
+ numbers: new Map()
282
+ };
283
+ }
284
+ function collectFootnoteDefinitions(node, definitions) {
285
+ if (node.type === "footnoteDefinition") {
286
+ definitions.set(node.label, node);
287
+ return;
288
+ }
289
+ if ("children" in node) {
290
+ for (const child of node.children) {
291
+ collectFootnoteDefinitions(child, definitions);
292
+ }
293
+ }
294
+ }
295
+ function createFootnoteId(label) {
296
+ return encodeURIComponent(label);
297
+ }
298
+ function sanitizeUrl(url) {
299
+ const trimmed = url.trim();
300
+ if (trimmed.startsWith("//")) {
301
+ return null;
302
+ }
303
+ const scheme = readScheme(trimmed);
304
+ if (scheme === null) {
305
+ return trimmed;
306
+ }
307
+ switch (scheme.toLowerCase()) {
308
+ case "http":
309
+ case "https":
310
+ case "mailto":
311
+ case "tel":
312
+ return trimmed;
313
+ default:
314
+ return null;
315
+ }
316
+ }
317
+ function readScheme(url) {
318
+ let value = "";
319
+ for (let index = 0; index < url.length; index += 1) {
320
+ const char = url[index];
321
+ if (char === "/" || char === "?" || char === "#") {
322
+ return null;
323
+ }
324
+ if (char === ":") {
325
+ return value.length === 0 ? null : value;
326
+ }
327
+ if (!isSchemeChar(char, index)) {
328
+ return null;
329
+ }
330
+ value += char;
331
+ }
332
+ return null;
333
+ }
334
+ function isSchemeChar(char, index) {
335
+ const code = char.charCodeAt(0);
336
+ const isAlpha = (code >= 65 && code <= 90) || (code >= 97 && code <= 122);
337
+ if (index === 0) {
338
+ return isAlpha;
339
+ }
340
+ return isAlpha || (code >= 48 && code <= 57) || char === "+" || char === "-" || char === ".";
341
+ }
342
+ function escapeHtml(value) {
343
+ let output = "";
344
+ for (const char of value) {
345
+ switch (char) {
346
+ case "&":
347
+ output += "&amp;";
348
+ break;
349
+ case "<":
350
+ output += "&lt;";
351
+ break;
352
+ case ">":
353
+ output += "&gt;";
354
+ break;
355
+ case '"':
356
+ output += "&quot;";
357
+ break;
358
+ default:
359
+ output += char;
360
+ }
361
+ }
362
+ return output;
363
+ }
364
+ function escapeAttribute(value) {
365
+ return escapeHtml(value);
366
+ }
@@ -1,6 +1,10 @@
1
+ import { type HtmlRenderOptions } from "./html-renderer.js";
1
2
  import { type RenderOptions } from "./renderer.js";
2
- export type { MdNode } from "./ast.js";
3
+ export type { CodeToken, CodeTokenKind, MdNode } from "./ast.js";
4
+ export { renderHtml } from "./html-renderer.js";
5
+ export type { HtmlRenderOptions } from "./html-renderer.js";
3
6
  export { parse } from "./parser.js";
4
7
  export { render } from "./renderer.js";
5
8
  export type { RenderOptions } from "./renderer.js";
6
9
  export declare function renderMarkdown(markdown: string, options?: RenderOptions): string;
10
+ export declare function renderMarkdownHtml(markdown: string, options?: HtmlRenderOptions): string;
@@ -1,8 +1,14 @@
1
1
  import { parse } from "./parser.js";
2
+ import { renderHtml } from "./html-renderer.js";
2
3
  import { render } from "./renderer.js";
4
+ export { renderHtml } from "./html-renderer.js";
3
5
  export { parse } from "./parser.js";
4
6
  export { render } from "./renderer.js";
5
7
  export function renderMarkdown(markdown, options) {
6
8
  const { ast } = parse(markdown);
7
9
  return render(ast, options);
8
10
  }
11
+ export function renderMarkdownHtml(markdown, options) {
12
+ const { ast } = parse(markdown);
13
+ return renderHtml(ast, options);
14
+ }
@@ -0,0 +1,4 @@
1
+ import type { CodeToken, MdNode } from "../ast.js";
2
+ export declare function highlightCodeBlock(node: Pick<Extract<MdNode, {
3
+ type: "code";
4
+ }>, "lang" | "value" | "tokens">): CodeToken[] | undefined;