@promptctl/rich-js 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +418 -0
- package/dist/core/box.d.ts +91 -0
- package/dist/core/box.d.ts.map +1 -0
- package/dist/core/box.js +534 -0
- package/dist/core/box.js.map +1 -0
- package/dist/core/cells.d.ts +24 -0
- package/dist/core/cells.d.ts.map +1 -0
- package/dist/core/cells.js +114 -0
- package/dist/core/cells.js.map +1 -0
- package/dist/core/color.d.ts +158 -0
- package/dist/core/color.d.ts.map +1 -0
- package/dist/core/color.js +825 -0
- package/dist/core/color.js.map +1 -0
- package/dist/core/console.d.ts +100 -0
- package/dist/core/console.d.ts.map +1 -0
- package/dist/core/console.js +353 -0
- package/dist/core/console.js.map +1 -0
- package/dist/core/emoji.d.ts +25 -0
- package/dist/core/emoji.d.ts.map +1 -0
- package/dist/core/emoji.js +392 -0
- package/dist/core/emoji.js.map +1 -0
- package/dist/core/highlighter.d.ts +33 -0
- package/dist/core/highlighter.d.ts.map +1 -0
- package/dist/core/highlighter.js +103 -0
- package/dist/core/highlighter.js.map +1 -0
- package/dist/core/markup.d.ts +69 -0
- package/dist/core/markup.d.ts.map +1 -0
- package/dist/core/markup.js +401 -0
- package/dist/core/markup.js.map +1 -0
- package/dist/core/measure.d.ts +17 -0
- package/dist/core/measure.d.ts.map +1 -0
- package/dist/core/measure.js +50 -0
- package/dist/core/measure.js.map +1 -0
- package/dist/core/protocol.d.ts +32 -0
- package/dist/core/protocol.d.ts.map +1 -0
- package/dist/core/protocol.js +17 -0
- package/dist/core/protocol.js.map +1 -0
- package/dist/core/render.d.ts +51 -0
- package/dist/core/render.d.ts.map +1 -0
- package/dist/core/render.js +69 -0
- package/dist/core/render.js.map +1 -0
- package/dist/core/segment.d.ts +104 -0
- package/dist/core/segment.d.ts.map +1 -0
- package/dist/core/segment.js +364 -0
- package/dist/core/segment.js.map +1 -0
- package/dist/core/spinnerData.d.ts +11 -0
- package/dist/core/spinnerData.d.ts.map +1 -0
- package/dist/core/spinnerData.js +116 -0
- package/dist/core/spinnerData.js.map +1 -0
- package/dist/core/strip.d.ts +159 -0
- package/dist/core/strip.d.ts.map +1 -0
- package/dist/core/strip.js +237 -0
- package/dist/core/strip.js.map +1 -0
- package/dist/core/style.d.ts +115 -0
- package/dist/core/style.d.ts.map +1 -0
- package/dist/core/style.js +662 -0
- package/dist/core/style.js.map +1 -0
- package/dist/core/text.d.ts +91 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +610 -0
- package/dist/core/text.js.map +1 -0
- package/dist/index.d.ts +99 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +72 -0
- package/dist/index.js.map +1 -0
- package/dist/renderables/align.d.ts +17 -0
- package/dist/renderables/align.d.ts.map +1 -0
- package/dist/renderables/align.js +47 -0
- package/dist/renderables/align.js.map +1 -0
- package/dist/renderables/columns.d.ts +28 -0
- package/dist/renderables/columns.d.ts.map +1 -0
- package/dist/renderables/columns.js +92 -0
- package/dist/renderables/columns.js.map +1 -0
- package/dist/renderables/constrain.d.ts +16 -0
- package/dist/renderables/constrain.d.ts.map +1 -0
- package/dist/renderables/constrain.js +38 -0
- package/dist/renderables/constrain.js.map +1 -0
- package/dist/renderables/flexStrip.d.ts +42 -0
- package/dist/renderables/flexStrip.d.ts.map +1 -0
- package/dist/renderables/flexStrip.js +201 -0
- package/dist/renderables/flexStrip.js.map +1 -0
- package/dist/renderables/group.d.ts +12 -0
- package/dist/renderables/group.d.ts.map +1 -0
- package/dist/renderables/group.js +16 -0
- package/dist/renderables/group.js.map +1 -0
- package/dist/renderables/json.d.ts +23 -0
- package/dist/renderables/json.d.ts.map +1 -0
- package/dist/renderables/json.js +49 -0
- package/dist/renderables/json.js.map +1 -0
- package/dist/renderables/layout.d.ts +37 -0
- package/dist/renderables/layout.d.ts.map +1 -0
- package/dist/renderables/layout.js +151 -0
- package/dist/renderables/layout.js.map +1 -0
- package/dist/renderables/live.d.ts +48 -0
- package/dist/renderables/live.d.ts.map +1 -0
- package/dist/renderables/live.js +131 -0
- package/dist/renderables/live.js.map +1 -0
- package/dist/renderables/markdown.d.ts +25 -0
- package/dist/renderables/markdown.d.ts.map +1 -0
- package/dist/renderables/markdown.js +190 -0
- package/dist/renderables/markdown.js.map +1 -0
- package/dist/renderables/padding.d.ts +26 -0
- package/dist/renderables/padding.d.ts.map +1 -0
- package/dist/renderables/padding.js +92 -0
- package/dist/renderables/padding.js.map +1 -0
- package/dist/renderables/panel.d.ts +42 -0
- package/dist/renderables/panel.d.ts.map +1 -0
- package/dist/renderables/panel.js +202 -0
- package/dist/renderables/panel.js.map +1 -0
- package/dist/renderables/pretty.d.ts +29 -0
- package/dist/renderables/pretty.d.ts.map +1 -0
- package/dist/renderables/pretty.js +141 -0
- package/dist/renderables/pretty.js.map +1 -0
- package/dist/renderables/progress.d.ts +91 -0
- package/dist/renderables/progress.d.ts.map +1 -0
- package/dist/renderables/progress.js +234 -0
- package/dist/renderables/progress.js.map +1 -0
- package/dist/renderables/progressBar.d.ts +32 -0
- package/dist/renderables/progressBar.d.ts.map +1 -0
- package/dist/renderables/progressBar.js +59 -0
- package/dist/renderables/progressBar.js.map +1 -0
- package/dist/renderables/prompt.d.ts +25 -0
- package/dist/renderables/prompt.d.ts.map +1 -0
- package/dist/renderables/prompt.js +109 -0
- package/dist/renderables/prompt.js.map +1 -0
- package/dist/renderables/rule.d.ts +25 -0
- package/dist/renderables/rule.d.ts.map +1 -0
- package/dist/renderables/rule.js +96 -0
- package/dist/renderables/rule.js.map +1 -0
- package/dist/renderables/spinner.d.ts +30 -0
- package/dist/renderables/spinner.d.ts.map +1 -0
- package/dist/renderables/spinner.js +70 -0
- package/dist/renderables/spinner.js.map +1 -0
- package/dist/renderables/status.d.ts +24 -0
- package/dist/renderables/status.d.ts.map +1 -0
- package/dist/renderables/status.js +67 -0
- package/dist/renderables/status.js.map +1 -0
- package/dist/renderables/syntax.d.ts +36 -0
- package/dist/renderables/syntax.d.ts.map +1 -0
- package/dist/renderables/syntax.js +115 -0
- package/dist/renderables/syntax.js.map +1 -0
- package/dist/renderables/table.d.ts +109 -0
- package/dist/renderables/table.d.ts.map +1 -0
- package/dist/renderables/table.js +434 -0
- package/dist/renderables/table.js.map +1 -0
- package/dist/renderables/traceback.d.ts +26 -0
- package/dist/renderables/traceback.d.ts.map +1 -0
- package/dist/renderables/traceback.js +108 -0
- package/dist/renderables/traceback.js.map +1 -0
- package/dist/renderables/tree.d.ts +30 -0
- package/dist/renderables/tree.d.ts.map +1 -0
- package/dist/renderables/tree.js +107 -0
- package/dist/renderables/tree.js.map +1 -0
- package/dist/template-bindings/index.d.ts +61 -0
- package/dist/template-bindings/index.d.ts.map +1 -0
- package/dist/template-bindings/index.js +70 -0
- package/dist/template-bindings/index.js.map +1 -0
- package/dist/template-bindings/style-funcs.d.ts +30 -0
- package/dist/template-bindings/style-funcs.d.ts.map +1 -0
- package/dist/template-bindings/style-funcs.js +172 -0
- package/dist/template-bindings/style-funcs.js.map +1 -0
- package/dist/themes/buildPalette.d.ts +31 -0
- package/dist/themes/buildPalette.d.ts.map +1 -0
- package/dist/themes/buildPalette.js +43 -0
- package/dist/themes/buildPalette.js.map +1 -0
- package/dist/themes/colorMath.d.ts +23 -0
- package/dist/themes/colorMath.d.ts.map +1 -0
- package/dist/themes/colorMath.js +99 -0
- package/dist/themes/colorMath.js.map +1 -0
- package/dist/themes/data/atom-one-dark.d.ts +4 -0
- package/dist/themes/data/atom-one-dark.d.ts.map +1 -0
- package/dist/themes/data/atom-one-dark.js +159 -0
- package/dist/themes/data/atom-one-dark.js.map +1 -0
- package/dist/themes/data/atom-one-light.d.ts +4 -0
- package/dist/themes/data/atom-one-light.d.ts.map +1 -0
- package/dist/themes/data/atom-one-light.js +159 -0
- package/dist/themes/data/atom-one-light.js.map +1 -0
- package/dist/themes/data/catppuccin-latte.d.ts +4 -0
- package/dist/themes/data/catppuccin-latte.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-latte.js +159 -0
- package/dist/themes/data/catppuccin-latte.js.map +1 -0
- package/dist/themes/data/catppuccin-mocha.d.ts +4 -0
- package/dist/themes/data/catppuccin-mocha.d.ts.map +1 -0
- package/dist/themes/data/catppuccin-mocha.js +159 -0
- package/dist/themes/data/catppuccin-mocha.js.map +1 -0
- package/dist/themes/data/dracula.d.ts +4 -0
- package/dist/themes/data/dracula.d.ts.map +1 -0
- package/dist/themes/data/dracula.js +159 -0
- package/dist/themes/data/dracula.js.map +1 -0
- package/dist/themes/data/flexoki.d.ts +4 -0
- package/dist/themes/data/flexoki.d.ts.map +1 -0
- package/dist/themes/data/flexoki.js +159 -0
- package/dist/themes/data/flexoki.js.map +1 -0
- package/dist/themes/data/gruvbox.d.ts +4 -0
- package/dist/themes/data/gruvbox.d.ts.map +1 -0
- package/dist/themes/data/gruvbox.js +159 -0
- package/dist/themes/data/gruvbox.js.map +1 -0
- package/dist/themes/data/index.d.ts +29 -0
- package/dist/themes/data/index.d.ts.map +1 -0
- package/dist/themes/data/index.js +48 -0
- package/dist/themes/data/index.js.map +1 -0
- package/dist/themes/data/monokai.d.ts +4 -0
- package/dist/themes/data/monokai.d.ts.map +1 -0
- package/dist/themes/data/monokai.js +159 -0
- package/dist/themes/data/monokai.js.map +1 -0
- package/dist/themes/data/nord.d.ts +4 -0
- package/dist/themes/data/nord.d.ts.map +1 -0
- package/dist/themes/data/nord.js +159 -0
- package/dist/themes/data/nord.js.map +1 -0
- package/dist/themes/data/rose-pine-dawn.d.ts +4 -0
- package/dist/themes/data/rose-pine-dawn.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-dawn.js +159 -0
- package/dist/themes/data/rose-pine-dawn.js.map +1 -0
- package/dist/themes/data/rose-pine-moon.d.ts +4 -0
- package/dist/themes/data/rose-pine-moon.d.ts.map +1 -0
- package/dist/themes/data/rose-pine-moon.js +159 -0
- package/dist/themes/data/rose-pine-moon.js.map +1 -0
- package/dist/themes/data/rose-pine.d.ts +4 -0
- package/dist/themes/data/rose-pine.d.ts.map +1 -0
- package/dist/themes/data/rose-pine.js +159 -0
- package/dist/themes/data/rose-pine.js.map +1 -0
- package/dist/themes/data/solarized-dark.d.ts +4 -0
- package/dist/themes/data/solarized-dark.d.ts.map +1 -0
- package/dist/themes/data/solarized-dark.js +159 -0
- package/dist/themes/data/solarized-dark.js.map +1 -0
- package/dist/themes/data/solarized-light.d.ts +4 -0
- package/dist/themes/data/solarized-light.d.ts.map +1 -0
- package/dist/themes/data/solarized-light.js +159 -0
- package/dist/themes/data/solarized-light.js.map +1 -0
- package/dist/themes/data/textual-ansi.d.ts +4 -0
- package/dist/themes/data/textual-ansi.d.ts.map +1 -0
- package/dist/themes/data/textual-ansi.js +159 -0
- package/dist/themes/data/textual-ansi.js.map +1 -0
- package/dist/themes/data/textual-dark.d.ts +4 -0
- package/dist/themes/data/textual-dark.d.ts.map +1 -0
- package/dist/themes/data/textual-dark.js +159 -0
- package/dist/themes/data/textual-dark.js.map +1 -0
- package/dist/themes/data/textual-light.d.ts +4 -0
- package/dist/themes/data/textual-light.d.ts.map +1 -0
- package/dist/themes/data/textual-light.js +159 -0
- package/dist/themes/data/textual-light.js.map +1 -0
- package/dist/themes/data/tokyo-night.d.ts +4 -0
- package/dist/themes/data/tokyo-night.d.ts.map +1 -0
- package/dist/themes/data/tokyo-night.js +159 -0
- package/dist/themes/data/tokyo-night.js.map +1 -0
- package/dist/themes/data/types.d.ts +15 -0
- package/dist/themes/data/types.d.ts.map +1 -0
- package/dist/themes/data/types.js +2 -0
- package/dist/themes/data/types.js.map +1 -0
- package/dist/themes/palette.d.ts +20 -0
- package/dist/themes/palette.d.ts.map +1 -0
- package/dist/themes/palette.js +27 -0
- package/dist/themes/palette.js.map +1 -0
- package/dist/themes/paletteResolver.d.ts +35 -0
- package/dist/themes/paletteResolver.d.ts.map +1 -0
- package/dist/themes/paletteResolver.js +88 -0
- package/dist/themes/paletteResolver.js.map +1 -0
- package/dist/themes/registry.d.ts +17 -0
- package/dist/themes/registry.d.ts.map +1 -0
- package/dist/themes/registry.js +33 -0
- package/dist/themes/registry.js.map +1 -0
- package/dist/themes/terminalThemes.d.ts +46 -0
- package/dist/themes/terminalThemes.d.ts.map +1 -0
- package/dist/themes/terminalThemes.js +268 -0
- package/dist/themes/terminalThemes.js.map +1 -0
- package/dist/widgets/button.d.ts +47 -0
- package/dist/widgets/button.d.ts.map +1 -0
- package/dist/widgets/button.js +183 -0
- package/dist/widgets/button.js.map +1 -0
- package/dist/widgets/checkbox.d.ts +43 -0
- package/dist/widgets/checkbox.d.ts.map +1 -0
- package/dist/widgets/checkbox.js +144 -0
- package/dist/widgets/checkbox.js.map +1 -0
- package/dist/widgets/dropdown.d.ts +67 -0
- package/dist/widgets/dropdown.d.ts.map +1 -0
- package/dist/widgets/dropdown.js +373 -0
- package/dist/widgets/dropdown.js.map +1 -0
- package/dist/widgets/event-router.d.ts +73 -0
- package/dist/widgets/event-router.d.ts.map +1 -0
- package/dist/widgets/event-router.js +479 -0
- package/dist/widgets/event-router.js.map +1 -0
- package/dist/widgets/focus-manager.d.ts +26 -0
- package/dist/widgets/focus-manager.d.ts.map +1 -0
- package/dist/widgets/focus-manager.js +179 -0
- package/dist/widgets/focus-manager.js.map +1 -0
- package/dist/widgets/index.d.ts +23 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +13 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/screen.d.ts +90 -0
- package/dist/widgets/screen.d.ts.map +1 -0
- package/dist/widgets/screen.js +440 -0
- package/dist/widgets/screen.js.map +1 -0
- package/dist/widgets/slider.d.ts +55 -0
- package/dist/widgets/slider.d.ts.map +1 -0
- package/dist/widgets/slider.js +248 -0
- package/dist/widgets/slider.js.map +1 -0
- package/dist/widgets/static-item.d.ts +41 -0
- package/dist/widgets/static-item.d.ts.map +1 -0
- package/dist/widgets/static-item.js +62 -0
- package/dist/widgets/static-item.js.map +1 -0
- package/dist/widgets/text-input.d.ts +50 -0
- package/dist/widgets/text-input.d.ts.map +1 -0
- package/dist/widgets/text-input.js +242 -0
- package/dist/widgets/text-input.js.map +1 -0
- package/dist/widgets/toggle.d.ts +46 -0
- package/dist/widgets/toggle.d.ts.map +1 -0
- package/dist/widgets/toggle.js +169 -0
- package/dist/widgets/toggle.js.map +1 -0
- package/dist/widgets/types.d.ts +92 -0
- package/dist/widgets/types.d.ts.map +1 -0
- package/dist/widgets/types.js +13 -0
- package/dist/widgets/types.js.map +1 -0
- package/dist/widgets/widget-base.d.ts +41 -0
- package/dist/widgets/widget-base.d.ts.map +1 -0
- package/dist/widgets/widget-base.js +159 -0
- package/dist/widgets/widget-base.js.map +1 -0
- package/package.json +76 -0
|
@@ -0,0 +1,401 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markup — BBCode-inspired markup parser for inline styling.
|
|
3
|
+
* Parses `[bold red]text[/bold red]` into RichText with styled spans.
|
|
4
|
+
*
|
|
5
|
+
* Plugin tags ([LAW:locality-or-seam]): a `MarkupRegistry` lets consumers
|
|
6
|
+
* register tag handlers without forking the parser. When the parser sees
|
|
7
|
+
* `[name attrs...]inner[/name]` and `name` is registered, it parses attrs,
|
|
8
|
+
* recursively renders the inner markup as a child Renderable, and calls the
|
|
9
|
+
* handler — splicing the handler's returned Renderable into the output. The
|
|
10
|
+
* built-in style dialect and the plugin dialect are routed by the registry,
|
|
11
|
+
* which is the single trust boundary between them.
|
|
12
|
+
*/
|
|
13
|
+
import { Style, StyleSyntaxError } from "./style.js";
|
|
14
|
+
import { RichText, Span } from "./text.js";
|
|
15
|
+
import { emojiReplace } from "./emoji.js";
|
|
16
|
+
// --- Tag ---
|
|
17
|
+
export class Tag {
|
|
18
|
+
name;
|
|
19
|
+
parameters;
|
|
20
|
+
constructor(name, parameters) {
|
|
21
|
+
this.name = name;
|
|
22
|
+
this.parameters = parameters;
|
|
23
|
+
}
|
|
24
|
+
toString() {
|
|
25
|
+
return this.parameters !== undefined
|
|
26
|
+
? `${this.name} ${this.parameters}`
|
|
27
|
+
: this.name;
|
|
28
|
+
}
|
|
29
|
+
get markup() {
|
|
30
|
+
return this.parameters !== undefined
|
|
31
|
+
? `[${this.name}=${this.parameters}]`
|
|
32
|
+
: `[${this.name}]`;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
// --- MarkupError ---
|
|
36
|
+
export class MarkupError extends Error {
|
|
37
|
+
constructor(message) {
|
|
38
|
+
super(message);
|
|
39
|
+
this.name = "MarkupError";
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
// --- escape ---
|
|
43
|
+
/**
|
|
44
|
+
* Escapes markup characters so they render as literal text.
|
|
45
|
+
*/
|
|
46
|
+
export function escape(text) {
|
|
47
|
+
return text.replace(/\[/g, "\\[");
|
|
48
|
+
}
|
|
49
|
+
// --- render ---
|
|
50
|
+
// Fast path: if no `[` in text, skip parsing entirely
|
|
51
|
+
const HAS_TAG_RE = /\[/;
|
|
52
|
+
// Match tags: [style], [/style], [/], [name=params]
|
|
53
|
+
// Also handles escaped brackets: \[
|
|
54
|
+
const TAG_RE = /(?:\\\[)|(\[(?:\/?)(?:[a-zA-Z#][a-zA-Z0-9_.# -]*(?:=[^\]]*)?|\/)\])/g;
|
|
55
|
+
function parseTags(markup) {
|
|
56
|
+
const tags = [];
|
|
57
|
+
const re = new RegExp(TAG_RE.source, TAG_RE.flags);
|
|
58
|
+
let match;
|
|
59
|
+
while ((match = re.exec(markup)) !== null) {
|
|
60
|
+
// Escaped bracket
|
|
61
|
+
if (match[0] === "\\[")
|
|
62
|
+
continue;
|
|
63
|
+
const captured = match[1];
|
|
64
|
+
if (!captured)
|
|
65
|
+
continue;
|
|
66
|
+
const inner = captured.slice(1, -1); // Remove [ ]
|
|
67
|
+
const isImplicitClose = inner === "/";
|
|
68
|
+
const isClosing = inner.startsWith("/") && !isImplicitClose;
|
|
69
|
+
const stylePart = isClosing ? inner.slice(1) : inner;
|
|
70
|
+
// Check for parameters (name=value)
|
|
71
|
+
const eqIdx = stylePart.indexOf("=");
|
|
72
|
+
const styleName = eqIdx >= 0 ? stylePart.slice(0, eqIdx).trim() : stylePart.trim();
|
|
73
|
+
const parameters = eqIdx >= 0 ? stylePart.slice(eqIdx + 1) : undefined;
|
|
74
|
+
tags.push({
|
|
75
|
+
fullMatch: captured,
|
|
76
|
+
isClosing,
|
|
77
|
+
isImplicitClose,
|
|
78
|
+
styleName,
|
|
79
|
+
parameters,
|
|
80
|
+
start: match.index,
|
|
81
|
+
end: match.index + match[0].length,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
return tags;
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Parses markup text and returns a RichText with appropriate spans.
|
|
88
|
+
*/
|
|
89
|
+
export function render(markup, baseStyle, options) {
|
|
90
|
+
// Fast path: no brackets at all
|
|
91
|
+
if (!HAS_TAG_RE.test(markup)) {
|
|
92
|
+
let text = markup;
|
|
93
|
+
if (options?.emoji !== false) {
|
|
94
|
+
text = emojiReplace(text);
|
|
95
|
+
}
|
|
96
|
+
const result = new RichText(text);
|
|
97
|
+
if (baseStyle)
|
|
98
|
+
result.stylize(baseStyle);
|
|
99
|
+
return result;
|
|
100
|
+
}
|
|
101
|
+
const tags = parseTags(markup);
|
|
102
|
+
const doEmoji = options?.emoji !== false;
|
|
103
|
+
// Build plain text and track spans
|
|
104
|
+
let plainText = "";
|
|
105
|
+
const spans = [];
|
|
106
|
+
const openStack = [];
|
|
107
|
+
let lastEnd = 0;
|
|
108
|
+
for (const tag of tags) {
|
|
109
|
+
// Add text before this tag
|
|
110
|
+
const textBefore = markup.slice(lastEnd, tag.start);
|
|
111
|
+
const processed = unescapeBrackets(doEmoji ? emojiReplace(textBefore) : textBefore);
|
|
112
|
+
plainText += processed;
|
|
113
|
+
if (tag.isImplicitClose) {
|
|
114
|
+
// [/] — close the most recent open tag
|
|
115
|
+
if (openStack.length === 0) {
|
|
116
|
+
throw new MarkupError("Closing tag [/] has nothing to close");
|
|
117
|
+
}
|
|
118
|
+
const opened = openStack.pop();
|
|
119
|
+
const styleStr = opened.parameters !== undefined
|
|
120
|
+
? `${opened.styleName} ${opened.parameters}`
|
|
121
|
+
: opened.styleName;
|
|
122
|
+
spans.push(new Span(opened.textStart, plainText.length, styleStr));
|
|
123
|
+
}
|
|
124
|
+
else if (tag.isClosing) {
|
|
125
|
+
// [/style] — find and close matching open tag
|
|
126
|
+
const idx = findLastOpen(openStack, tag.styleName);
|
|
127
|
+
if (idx === -1) {
|
|
128
|
+
throw new MarkupError(`Closing tag [/${tag.styleName}] doesn't match any open tag`);
|
|
129
|
+
}
|
|
130
|
+
const opened = openStack[idx];
|
|
131
|
+
const styleStr = opened.parameters !== undefined
|
|
132
|
+
? `${opened.styleName} ${opened.parameters}`
|
|
133
|
+
: opened.styleName;
|
|
134
|
+
spans.push(new Span(opened.textStart, plainText.length, styleStr));
|
|
135
|
+
openStack.splice(idx, 1);
|
|
136
|
+
}
|
|
137
|
+
else {
|
|
138
|
+
// Opening tag
|
|
139
|
+
openStack.push({
|
|
140
|
+
styleName: tag.styleName,
|
|
141
|
+
parameters: tag.parameters,
|
|
142
|
+
textStart: plainText.length,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
lastEnd = tag.end;
|
|
146
|
+
}
|
|
147
|
+
// Add remaining text after last tag
|
|
148
|
+
const trailing = markup.slice(lastEnd);
|
|
149
|
+
const processedTrailing = unescapeBrackets(doEmoji ? emojiReplace(trailing) : trailing);
|
|
150
|
+
plainText += processedTrailing;
|
|
151
|
+
// Auto-close any remaining open tags
|
|
152
|
+
for (const opened of openStack) {
|
|
153
|
+
const styleStr = opened.parameters !== undefined
|
|
154
|
+
? `${opened.styleName} ${opened.parameters}`
|
|
155
|
+
: opened.styleName;
|
|
156
|
+
spans.push(new Span(opened.textStart, plainText.length, styleStr));
|
|
157
|
+
}
|
|
158
|
+
const result = new RichText(plainText);
|
|
159
|
+
if (baseStyle)
|
|
160
|
+
result.stylize(baseStyle);
|
|
161
|
+
// Apply link parameters as link styles
|
|
162
|
+
for (const span of spans) {
|
|
163
|
+
const style = typeof span.style === "string" ? span.style : span.style.toString();
|
|
164
|
+
// Check if this is a link tag (name=url pattern was parsed)
|
|
165
|
+
const linkMatch = /^link\s+(.+)$/.exec(style);
|
|
166
|
+
if (linkMatch) {
|
|
167
|
+
result.stylize(new Style({ link: linkMatch[1] }), span.start, span.end);
|
|
168
|
+
}
|
|
169
|
+
else {
|
|
170
|
+
result.stylize(style, span.start, span.end);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
return result;
|
|
174
|
+
}
|
|
175
|
+
function findLastOpen(stack, name) {
|
|
176
|
+
// Handle "on" in style names for closing: [/red on blue] should match [red on blue]
|
|
177
|
+
const normalized = name.trim();
|
|
178
|
+
for (let i = stack.length - 1; i >= 0; i--) {
|
|
179
|
+
const entry = stack[i];
|
|
180
|
+
const entryFull = entry.parameters !== undefined
|
|
181
|
+
? `${entry.styleName} ${entry.parameters}`
|
|
182
|
+
: entry.styleName;
|
|
183
|
+
if (entryFull === normalized || entry.styleName === normalized)
|
|
184
|
+
return i;
|
|
185
|
+
}
|
|
186
|
+
return -1;
|
|
187
|
+
}
|
|
188
|
+
function unescapeBrackets(text) {
|
|
189
|
+
return text.replace(/\\\[/g, "[");
|
|
190
|
+
}
|
|
191
|
+
export class MarkupRegistry {
|
|
192
|
+
_handlers = new Map();
|
|
193
|
+
register(name, handler) {
|
|
194
|
+
if (isReservedTagName(name)) {
|
|
195
|
+
throw new MarkupError(`Cannot register markup tag "${name}": name is reserved by a built-in style.`);
|
|
196
|
+
}
|
|
197
|
+
this._handlers.set(name, handler);
|
|
198
|
+
}
|
|
199
|
+
unregister(name) {
|
|
200
|
+
this._handlers.delete(name);
|
|
201
|
+
}
|
|
202
|
+
has(name) {
|
|
203
|
+
return this._handlers.has(name);
|
|
204
|
+
}
|
|
205
|
+
get(name) {
|
|
206
|
+
return this._handlers.get(name);
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
// [LAW:one-source-of-truth] Reserved-name detection delegates to Style.parse —
|
|
210
|
+
// if a name is a valid built-in style, it cannot be hijacked by a plugin.
|
|
211
|
+
// There is no second list of "reserved names" to drift out of sync.
|
|
212
|
+
function isReservedTagName(name) {
|
|
213
|
+
try {
|
|
214
|
+
Style.parse(name);
|
|
215
|
+
return true;
|
|
216
|
+
}
|
|
217
|
+
catch (err) {
|
|
218
|
+
if (err instanceof StyleSyntaxError)
|
|
219
|
+
return false;
|
|
220
|
+
throw err;
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
export const globalMarkupRegistry = new MarkupRegistry();
|
|
224
|
+
export function registerMarkupTag(name, handler) {
|
|
225
|
+
globalMarkupRegistry.register(name, handler);
|
|
226
|
+
}
|
|
227
|
+
export function unregisterMarkupTag(name) {
|
|
228
|
+
globalMarkupRegistry.unregister(name);
|
|
229
|
+
}
|
|
230
|
+
// --- Plugin-aware tag parsing ---
|
|
231
|
+
function isAlpha(c) {
|
|
232
|
+
const cc = c.charCodeAt(0);
|
|
233
|
+
return (cc >= 65 && cc <= 90) || (cc >= 97 && cc <= 122);
|
|
234
|
+
}
|
|
235
|
+
function isIdentChar(c) {
|
|
236
|
+
if (isAlpha(c))
|
|
237
|
+
return true;
|
|
238
|
+
const cc = c.charCodeAt(0);
|
|
239
|
+
return (cc >= 48 && cc <= 57) || c === "_" || c === "-";
|
|
240
|
+
}
|
|
241
|
+
function isSpace(c) {
|
|
242
|
+
return c === " " || c === "\t";
|
|
243
|
+
}
|
|
244
|
+
function pluginNameOf(inner) {
|
|
245
|
+
if (inner.length === 0 || !isAlpha(inner[0]))
|
|
246
|
+
return null;
|
|
247
|
+
let i = 1;
|
|
248
|
+
while (i < inner.length && isIdentChar(inner[i]))
|
|
249
|
+
i++;
|
|
250
|
+
return inner.slice(0, i);
|
|
251
|
+
}
|
|
252
|
+
function parsePluginAttrs(after) {
|
|
253
|
+
// Hand-written tokenizer. Walks `key=value` pairs separated by whitespace;
|
|
254
|
+
// values may be bare, single-quoted, or double-quoted. Matches the syntax
|
|
255
|
+
// the regex it replaces accepted.
|
|
256
|
+
const attrs = {};
|
|
257
|
+
let i = 0;
|
|
258
|
+
while (i < after.length) {
|
|
259
|
+
while (i < after.length && isSpace(after[i]))
|
|
260
|
+
i++;
|
|
261
|
+
if (i >= after.length)
|
|
262
|
+
break;
|
|
263
|
+
if (!isAlpha(after[i])) {
|
|
264
|
+
// Skip a stray non-name character to avoid infinite loops on malformed
|
|
265
|
+
// input — the legacy regex would simply fail to match here.
|
|
266
|
+
i++;
|
|
267
|
+
continue;
|
|
268
|
+
}
|
|
269
|
+
const nameStart = i;
|
|
270
|
+
while (i < after.length && isIdentChar(after[i]))
|
|
271
|
+
i++;
|
|
272
|
+
const name = after.slice(nameStart, i);
|
|
273
|
+
while (i < after.length && isSpace(after[i]))
|
|
274
|
+
i++;
|
|
275
|
+
if (after[i] !== "=")
|
|
276
|
+
continue;
|
|
277
|
+
i++;
|
|
278
|
+
while (i < after.length && isSpace(after[i]))
|
|
279
|
+
i++;
|
|
280
|
+
let value = "";
|
|
281
|
+
const quote = after[i];
|
|
282
|
+
if (quote === '"' || quote === "'") {
|
|
283
|
+
i++;
|
|
284
|
+
const valStart = i;
|
|
285
|
+
while (i < after.length && after[i] !== quote)
|
|
286
|
+
i++;
|
|
287
|
+
value = after.slice(valStart, i);
|
|
288
|
+
if (i < after.length)
|
|
289
|
+
i++;
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const valStart = i;
|
|
293
|
+
while (i < after.length && !isSpace(after[i]) && after[i] !== "]")
|
|
294
|
+
i++;
|
|
295
|
+
value = after.slice(valStart, i);
|
|
296
|
+
}
|
|
297
|
+
attrs[name] = value;
|
|
298
|
+
}
|
|
299
|
+
return attrs;
|
|
300
|
+
}
|
|
301
|
+
/**
|
|
302
|
+
* Plugin-aware markup render. Always returns a `RichText`. Built-in style
|
|
303
|
+
* tags become spans; registered plugin tags are resolved by their handler,
|
|
304
|
+
* whose returned `RichText` is appended (text + spans) into the output. The
|
|
305
|
+
* recursion is over markup *slices* — between top-level plugin tag pairs and
|
|
306
|
+
* inside each pair — and every recursion node returns a `RichText`, so the
|
|
307
|
+
* append path is uniform.
|
|
308
|
+
*/
|
|
309
|
+
export function renderMarkup(markup, options) {
|
|
310
|
+
const registry = options?.registry ?? globalMarkupRegistry;
|
|
311
|
+
const baseStyle = options?.baseStyle;
|
|
312
|
+
const doEmoji = options?.emoji !== false;
|
|
313
|
+
// Fast path: no `[` at all → no possible tags.
|
|
314
|
+
if (!HAS_TAG_RE.test(markup)) {
|
|
315
|
+
return render(markup, baseStyle, { emoji: doEmoji });
|
|
316
|
+
}
|
|
317
|
+
const tags = parseTags(markup);
|
|
318
|
+
// Pair each opening plugin tag with its matching closer up-front, so the
|
|
319
|
+
// splice walk can just iterate top-level pairs in source order with no
|
|
320
|
+
// nested-state book-keeping.
|
|
321
|
+
const { annotated, topLevel: tagPairs } = pairPluginTags(tags, registry);
|
|
322
|
+
if (tagPairs.size === 0) {
|
|
323
|
+
return render(markup, baseStyle, { emoji: doEmoji });
|
|
324
|
+
}
|
|
325
|
+
// [LAW:one-type-per-behavior] Always assemble a single RichText. Fragments
|
|
326
|
+
// between plugin pairs are parsed by the built-in `render`, plugin pairs
|
|
327
|
+
// hand their inner slice (recursively) to a handler; both produce RichText,
|
|
328
|
+
// both get appended into one accumulator.
|
|
329
|
+
const out = new RichText("");
|
|
330
|
+
let cursor = 0;
|
|
331
|
+
for (const [openIdx, closeIdx] of tagPairs) {
|
|
332
|
+
const open = annotated[openIdx];
|
|
333
|
+
const close = annotated[closeIdx];
|
|
334
|
+
if (open.start > cursor) {
|
|
335
|
+
out.append(render(markup.slice(cursor, open.start), baseStyle, { emoji: doEmoji }));
|
|
336
|
+
}
|
|
337
|
+
const innerRaw = markup.slice(open.end, close.start);
|
|
338
|
+
const innerRichText = renderMarkup(innerRaw, options);
|
|
339
|
+
const handler = registry.get(open.pluginName);
|
|
340
|
+
out.append(handler({ attrs: open.attrs, children: innerRichText, raw: innerRaw }));
|
|
341
|
+
cursor = close.end;
|
|
342
|
+
}
|
|
343
|
+
if (cursor < markup.length) {
|
|
344
|
+
out.append(render(markup.slice(cursor), baseStyle, { emoji: doEmoji }));
|
|
345
|
+
}
|
|
346
|
+
if (baseStyle)
|
|
347
|
+
out.stylize(baseStyle);
|
|
348
|
+
return out;
|
|
349
|
+
}
|
|
350
|
+
function pairPluginTags(tags, registry) {
|
|
351
|
+
// Annotate tags with plugin info, then pair openers with closers. Only
|
|
352
|
+
// top-level pairs are returned; inner pairs will be re-discovered by the
|
|
353
|
+
// recursive `renderMarkup` call on the inner slice.
|
|
354
|
+
const annotated = tags.map((t) => annotatePluginTag(t, registry));
|
|
355
|
+
const stack = [];
|
|
356
|
+
const pairs = new Map();
|
|
357
|
+
for (let i = 0; i < annotated.length; i++) {
|
|
358
|
+
const t = annotated[i];
|
|
359
|
+
if (!t.pluginName)
|
|
360
|
+
continue;
|
|
361
|
+
if (t.isImplicitClose)
|
|
362
|
+
continue;
|
|
363
|
+
if (t.isClosing) {
|
|
364
|
+
// Find matching open in stack.
|
|
365
|
+
for (let j = stack.length - 1; j >= 0; j--) {
|
|
366
|
+
const openIdx = stack[j];
|
|
367
|
+
if (annotated[openIdx].pluginName === t.pluginName) {
|
|
368
|
+
pairs.set(openIdx, i);
|
|
369
|
+
stack.splice(j, 1);
|
|
370
|
+
break;
|
|
371
|
+
}
|
|
372
|
+
}
|
|
373
|
+
}
|
|
374
|
+
else {
|
|
375
|
+
stack.push(i);
|
|
376
|
+
}
|
|
377
|
+
}
|
|
378
|
+
// Filter pairs to top-level only.
|
|
379
|
+
const topLevel = new Map();
|
|
380
|
+
let outerEnd = -1;
|
|
381
|
+
const sortedOpens = [...pairs.keys()].sort((a, b) => a - b);
|
|
382
|
+
for (const openIdx of sortedOpens) {
|
|
383
|
+
if (annotated[openIdx].start < outerEnd)
|
|
384
|
+
continue;
|
|
385
|
+
topLevel.set(openIdx, pairs.get(openIdx));
|
|
386
|
+
outerEnd = annotated[pairs.get(openIdx)].end;
|
|
387
|
+
}
|
|
388
|
+
return { annotated, topLevel };
|
|
389
|
+
}
|
|
390
|
+
function annotatePluginTag(tag, registry) {
|
|
391
|
+
// The legacy parser splits at the first `=`, so tag.styleName for
|
|
392
|
+
// `[click verb=foo]` is "click verb". Re-extract the leading identifier.
|
|
393
|
+
const inner = tag.fullMatch.slice(1, -1).replace(/^\//, "");
|
|
394
|
+
const name = pluginNameOf(inner);
|
|
395
|
+
if (!name || !registry.has(name))
|
|
396
|
+
return tag;
|
|
397
|
+
const after = inner.slice(name.length);
|
|
398
|
+
const attrs = tag.isClosing ? {} : parsePluginAttrs(after);
|
|
399
|
+
return { ...tag, pluginName: name, attrs };
|
|
400
|
+
}
|
|
401
|
+
//# sourceMappingURL=markup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markup.js","sourceRoot":"","sources":["../../src/core/markup.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measurement — min/max cell width calculation for renderables.
|
|
3
|
+
*/
|
|
4
|
+
import type { Measurable, RenderOptions } from "./protocol.js";
|
|
5
|
+
export declare class Measurement {
|
|
6
|
+
readonly minimum: number;
|
|
7
|
+
readonly maximum: number;
|
|
8
|
+
constructor(minimum: number, maximum: number);
|
|
9
|
+
get span(): number;
|
|
10
|
+
normalize(): Measurement;
|
|
11
|
+
withMaximum(width: number): Measurement;
|
|
12
|
+
withMinimum(width: number): Measurement;
|
|
13
|
+
clamp(minWidth: number, maxWidth: number): Measurement;
|
|
14
|
+
static get(options: RenderOptions, measurable: Measurable): Measurement;
|
|
15
|
+
}
|
|
16
|
+
export declare function measureRenderables(options: RenderOptions, measurables: Measurable[]): Measurement;
|
|
17
|
+
//# sourceMappingURL=measure.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.d.ts","sourceRoot":"","sources":["../../src/core/measure.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE/D,qBAAa,WAAW;IACtB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;gBAEb,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAK5C,IAAI,IAAI,IAAI,MAAM,CAEjB;IAED,SAAS,IAAI,WAAW;IAMxB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAOvC,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW;IAMvC,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,WAAW;IAQtD,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,aAAa,EAAE,UAAU,EAAE,UAAU,GAAG,WAAW;CAKxE;AAED,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,aAAa,EACtB,WAAW,EAAE,UAAU,EAAE,GACxB,WAAW,CAUb"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measurement — min/max cell width calculation for renderables.
|
|
3
|
+
*/
|
|
4
|
+
export class Measurement {
|
|
5
|
+
minimum;
|
|
6
|
+
maximum;
|
|
7
|
+
constructor(minimum, maximum) {
|
|
8
|
+
this.minimum = minimum;
|
|
9
|
+
this.maximum = maximum;
|
|
10
|
+
}
|
|
11
|
+
get span() {
|
|
12
|
+
return this.maximum - this.minimum;
|
|
13
|
+
}
|
|
14
|
+
normalize() {
|
|
15
|
+
const min = Math.max(0, Math.min(this.minimum, this.maximum));
|
|
16
|
+
const max = Math.max(0, this.maximum);
|
|
17
|
+
return new Measurement(min, max);
|
|
18
|
+
}
|
|
19
|
+
withMaximum(width) {
|
|
20
|
+
return new Measurement(Math.min(this.minimum, width), Math.min(this.maximum, width));
|
|
21
|
+
}
|
|
22
|
+
withMinimum(width) {
|
|
23
|
+
const min = Math.max(this.minimum, width);
|
|
24
|
+
const max = Math.max(this.maximum, min);
|
|
25
|
+
return new Measurement(min, max);
|
|
26
|
+
}
|
|
27
|
+
clamp(minWidth, maxWidth) {
|
|
28
|
+
return new Measurement(Math.min(Math.max(this.minimum, minWidth), maxWidth), Math.min(Math.max(this.maximum, minWidth), maxWidth));
|
|
29
|
+
}
|
|
30
|
+
// [LAW:single-enforcer] Single entry point for measuring a Measurable
|
|
31
|
+
static get(options, measurable) {
|
|
32
|
+
if (options.maxWidth < 1)
|
|
33
|
+
return new Measurement(0, 0);
|
|
34
|
+
const { minimum, maximum } = measurable.measure(options);
|
|
35
|
+
return new Measurement(minimum, Math.min(maximum, options.maxWidth));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
export function measureRenderables(options, measurables) {
|
|
39
|
+
if (measurables.length === 0)
|
|
40
|
+
return new Measurement(0, 0);
|
|
41
|
+
let minOfAll = 0;
|
|
42
|
+
let maxOfAll = 0;
|
|
43
|
+
for (const m of measurables) {
|
|
44
|
+
const measurement = Measurement.get(options, m);
|
|
45
|
+
minOfAll = Math.max(minOfAll, measurement.minimum);
|
|
46
|
+
maxOfAll = Math.max(maxOfAll, measurement.maximum);
|
|
47
|
+
}
|
|
48
|
+
return new Measurement(minOfAll, maxOfAll);
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=measure.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"measure.js","sourceRoot":"","sources":["../../src/core/measure.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rendering protocol interfaces — Renderable, Measurable, RenderOptions.
|
|
3
|
+
* [LAW:one-source-of-truth] These interfaces are the single authority for the rendering contract.
|
|
4
|
+
*/
|
|
5
|
+
import type { Segment } from "./segment.js";
|
|
6
|
+
export interface RenderOptions {
|
|
7
|
+
maxWidth: number;
|
|
8
|
+
minWidth?: number;
|
|
9
|
+
height?: number;
|
|
10
|
+
maxHeight?: number;
|
|
11
|
+
isTerminal?: boolean;
|
|
12
|
+
encoding?: string;
|
|
13
|
+
legacyWindows?: boolean;
|
|
14
|
+
asciiOnly?: boolean;
|
|
15
|
+
justify?: "left" | "center" | "right" | "full";
|
|
16
|
+
overflow?: "fold" | "crop" | "ellipsis";
|
|
17
|
+
noWrap?: boolean;
|
|
18
|
+
highlight?: unknown;
|
|
19
|
+
markup?: unknown;
|
|
20
|
+
}
|
|
21
|
+
export interface Renderable {
|
|
22
|
+
render(options: RenderOptions): Iterable<Segment>;
|
|
23
|
+
}
|
|
24
|
+
export interface Measurable {
|
|
25
|
+
measure(options: RenderOptions): {
|
|
26
|
+
minimum: number;
|
|
27
|
+
maximum: number;
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
export declare function isRenderable(obj: unknown): obj is Renderable;
|
|
31
|
+
export declare function isMeasurable(obj: unknown): obj is Measurable;
|
|
32
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../../src/core/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAE5C,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;IAC/C,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;IACxC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;CACnD;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,OAAO,EAAE,aAAa,GAAG;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;CACvE;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAO5D;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,UAAU,CAO5D"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rendering protocol interfaces — Renderable, Measurable, RenderOptions.
|
|
3
|
+
* [LAW:one-source-of-truth] These interfaces are the single authority for the rendering contract.
|
|
4
|
+
*/
|
|
5
|
+
export function isRenderable(obj) {
|
|
6
|
+
return (typeof obj === "object" &&
|
|
7
|
+
obj !== null &&
|
|
8
|
+
"render" in obj &&
|
|
9
|
+
typeof obj.render === "function");
|
|
10
|
+
}
|
|
11
|
+
export function isMeasurable(obj) {
|
|
12
|
+
return (typeof obj === "object" &&
|
|
13
|
+
obj !== null &&
|
|
14
|
+
"measure" in obj &&
|
|
15
|
+
typeof obj.measure === "function");
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../../src/core/protocol.ts"],"names":[],"mappings":"AAAA;;;GAGG;AA4BH,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,QAAQ,IAAI,GAAG;QACf,OAAQ,GAAkB,CAAC,MAAM,KAAK,UAAU,CACjD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAY;IACvC,OAAO,CACL,OAAO,GAAG,KAAK,QAAQ;QACvB,GAAG,KAAK,IAAI;QACZ,SAAS,IAAI,GAAG;QAChB,OAAQ,GAAkB,CAAC,OAAO,KAAK,UAAU,CAClD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `renderToString` — stateless one-shot emission of a `Renderable` to a string
|
|
3
|
+
* of ANSI-encoded text. Pure function: same inputs produce byte-identical
|
|
4
|
+
* output. Does not write to `process.stdout` and does not require a `Console`
|
|
5
|
+
* instance.
|
|
6
|
+
*
|
|
7
|
+
* Note on `colorSystem: "auto"`: the `"auto"` spec resolves via
|
|
8
|
+
* `detectColorSystem`, which reads `process.env` and `process.stdout?.isTTY`
|
|
9
|
+
* by default. Callers that want a fully deterministic render must either pass
|
|
10
|
+
* an explicit `ColorDepth` enum / non-`"auto"` spec, or supply `env` and
|
|
11
|
+
* `isTTY` in the options so detection does not consult ambient process state.
|
|
12
|
+
*
|
|
13
|
+
* [LAW:single-enforcer] The Segment-to-ANSI conversion lives in `segmentsToString`
|
|
14
|
+
* and is the single way segments become wire bytes. `Console._renderSegment`
|
|
15
|
+
* delegates here, so terminal output and string export agree by construction.
|
|
16
|
+
*
|
|
17
|
+
* [LAW:dataflow-not-control-flow] The same loop runs every render: walk the
|
|
18
|
+
* generator, drop control segments, encode each remaining segment with the
|
|
19
|
+
* configured color system. `colorSystem === null` is data — it makes
|
|
20
|
+
* `Style.render` skip codes — not a separate code path.
|
|
21
|
+
*/
|
|
22
|
+
import { ColorDepth } from "./color.js";
|
|
23
|
+
import type { Segment } from "./segment.js";
|
|
24
|
+
import type { Renderable } from "./protocol.js";
|
|
25
|
+
export interface RenderToStringOptions {
|
|
26
|
+
/** Cell width to render into. Default 80. */
|
|
27
|
+
width?: number;
|
|
28
|
+
/**
|
|
29
|
+
* Color encoding to emit. Accepts a string spec (`"auto"`, `"truecolor"`,
|
|
30
|
+
* `"256"`, `"ansi"`, `"none"`), a `ColorDepth` enum value, or `null` to
|
|
31
|
+
* strip all color codes. Default truecolor.
|
|
32
|
+
*/
|
|
33
|
+
colorSystem?: string | ColorDepth | null;
|
|
34
|
+
/**
|
|
35
|
+
* Environment to consult when `colorSystem` is `"auto"`. Defaults to
|
|
36
|
+
* `process.env`. Pass an explicit value to keep rendering deterministic.
|
|
37
|
+
*/
|
|
38
|
+
env?: NodeJS.ProcessEnv;
|
|
39
|
+
/**
|
|
40
|
+
* Whether output is going to a TTY when `colorSystem` is `"auto"`. Defaults
|
|
41
|
+
* to `process.stdout?.isTTY`. Pass an explicit value to keep rendering
|
|
42
|
+
* deterministic.
|
|
43
|
+
*/
|
|
44
|
+
isTTY?: boolean;
|
|
45
|
+
/** When true, forces `colorSystem` to `null` regardless of the explicit value. */
|
|
46
|
+
noColor?: boolean;
|
|
47
|
+
}
|
|
48
|
+
export declare function segmentToString(segment: Segment, colorSystem: ColorDepth | null): string;
|
|
49
|
+
export declare function segmentsToString(segments: Iterable<Segment>, colorSystem: ColorDepth | null): string;
|
|
50
|
+
export declare function renderToString(renderable: Renderable, options?: RenderToStringOptions): string;
|
|
51
|
+
//# sourceMappingURL=render.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../src/core/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;GAoBG;AAEH,OAAO,EAAE,UAAU,EAAsB,MAAM,YAAY,CAAC;AAE5D,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,KAAK,EAAE,UAAU,EAAiB,MAAM,eAAe,CAAC;AAE/D,MAAM,WAAW,qBAAqB;IACpC,6CAA6C;IAC7C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf;;;;OAIG;IACH,WAAW,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CAAC;IACzC;;;OAGG;IACH,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB;;;;OAIG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,kFAAkF;IAClF,OAAO,CAAC,EAAE,OAAO,CAAC;CACnB;AAID,wBAAgB,eAAe,CAC7B,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,UAAU,GAAG,IAAI,GAC7B,MAAM,CAIR;AAED,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,QAAQ,CAAC,OAAO,CAAC,EAC3B,WAAW,EAAE,UAAU,GAAG,IAAI,GAC7B,MAAM,CAIR;AAED,wBAAgB,cAAc,CAC5B,UAAU,EAAE,UAAU,EACtB,OAAO,CAAC,EAAE,qBAAqB,GAC9B,MAAM,CA8BR"}
|