@react-x11/components 0.1.0 → 0.2.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 +979 -21
- package/dist/ansi/cast.d.ts +48 -0
- package/dist/ansi/cast.d.ts.map +1 -0
- package/dist/ansi/cast.js +135 -0
- package/dist/ansi/cast.js.map +1 -0
- package/dist/ansi/index.d.ts +10 -0
- package/dist/ansi/index.d.ts.map +1 -0
- package/dist/ansi/index.js +27 -0
- package/dist/ansi/index.js.map +1 -0
- package/dist/ansi/palette.d.ts +79 -0
- package/dist/ansi/palette.d.ts.map +1 -0
- package/dist/ansi/palette.js +155 -0
- package/dist/ansi/palette.js.map +1 -0
- package/dist/ansi/parse.d.ts +114 -0
- package/dist/ansi/parse.d.ts.map +1 -0
- package/dist/ansi/parse.js +687 -0
- package/dist/ansi/parse.js.map +1 -0
- package/dist/ansi/sgr.d.ts +87 -0
- package/dist/ansi/sgr.d.ts.map +1 -0
- package/dist/ansi/sgr.js +302 -0
- package/dist/ansi/sgr.js.map +1 -0
- package/dist/ansi/utf8.d.ts +15 -0
- package/dist/ansi/utf8.d.ts.map +1 -0
- package/dist/ansi/utf8.js +82 -0
- package/dist/ansi/utf8.js.map +1 -0
- package/dist/calendar/Calendar.d.ts +136 -0
- package/dist/calendar/Calendar.d.ts.map +1 -0
- package/dist/calendar/Calendar.js +460 -0
- package/dist/calendar/Calendar.js.map +1 -0
- package/dist/calendar/DatePicker.d.ts +52 -0
- package/dist/calendar/DatePicker.d.ts.map +1 -0
- package/dist/calendar/DatePicker.js +257 -0
- package/dist/calendar/DatePicker.js.map +1 -0
- package/dist/calendar/dates.d.ts +90 -0
- package/dist/calendar/dates.d.ts.map +1 -0
- package/dist/calendar/dates.js +236 -0
- package/dist/calendar/dates.js.map +1 -0
- package/dist/calendar/index.d.ts +8 -0
- package/dist/calendar/index.d.ts.map +1 -0
- package/dist/calendar/index.js +15 -0
- package/dist/calendar/index.js.map +1 -0
- package/dist/charts/components.d.ts +141 -0
- package/dist/charts/components.d.ts.map +1 -0
- package/dist/charts/components.js +580 -0
- package/dist/charts/components.js.map +1 -0
- package/dist/charts/data.d.ts +198 -0
- package/dist/charts/data.d.ts.map +1 -0
- package/dist/charts/data.js +616 -0
- package/dist/charts/data.js.map +1 -0
- package/dist/charts/hx.d.ts +21 -0
- package/dist/charts/hx.d.ts.map +1 -0
- package/dist/charts/hx.js +15 -0
- package/dist/charts/hx.js.map +1 -0
- package/dist/charts/index.d.ts +27 -0
- package/dist/charts/index.d.ts.map +1 -0
- package/dist/charts/index.js +38 -0
- package/dist/charts/index.js.map +1 -0
- package/dist/charts/node.d.ts +96 -0
- package/dist/charts/node.d.ts.map +1 -0
- package/dist/charts/node.js +720 -0
- package/dist/charts/node.js.map +1 -0
- package/dist/charts/render.d.ts +153 -0
- package/dist/charts/render.d.ts.map +1 -0
- package/dist/charts/render.js +762 -0
- package/dist/charts/render.js.map +1 -0
- package/dist/charts/scale.d.ts +42 -0
- package/dist/charts/scale.d.ts.map +1 -0
- package/dist/charts/scale.js +173 -0
- package/dist/charts/scale.js.map +1 -0
- package/dist/charts/spec.d.ts +91 -0
- package/dist/charts/spec.d.ts.map +1 -0
- package/dist/charts/spec.js +33 -0
- package/dist/charts/spec.js.map +1 -0
- package/dist/charts/timers.d.ts +6 -0
- package/dist/charts/timers.d.ts.map +1 -0
- package/dist/charts/timers.js +14 -0
- package/dist/charts/timers.js.map +1 -0
- package/dist/code/hx.d.ts +24 -0
- package/dist/code/hx.d.ts.map +1 -0
- package/dist/code/hx.js +25 -0
- package/dist/code/hx.js.map +1 -0
- package/dist/code/index.d.ts +45 -0
- package/dist/code/index.d.ts.map +1 -0
- package/dist/code/index.js +93 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code-editor/completion.d.ts +26 -0
- package/dist/code-editor/completion.d.ts.map +1 -0
- package/dist/code-editor/completion.js +129 -0
- package/dist/code-editor/completion.js.map +1 -0
- package/dist/code-editor/doc.d.ts +35 -0
- package/dist/code-editor/doc.d.ts.map +1 -0
- package/dist/code-editor/doc.js +162 -0
- package/dist/code-editor/doc.js.map +1 -0
- package/dist/code-editor/hx.d.ts +13 -0
- package/dist/code-editor/hx.d.ts.map +1 -0
- package/dist/code-editor/hx.js +10 -0
- package/dist/code-editor/hx.js.map +1 -0
- package/dist/code-editor/index.d.ts +88 -0
- package/dist/code-editor/index.d.ts.map +1 -0
- package/dist/code-editor/index.js +401 -0
- package/dist/code-editor/index.js.map +1 -0
- package/dist/code-editor/node.d.ts +343 -0
- package/dist/code-editor/node.d.ts.map +1 -0
- package/dist/code-editor/node.js +1521 -0
- package/dist/code-editor/node.js.map +1 -0
- package/dist/code-language/hljs.d.ts +47 -0
- package/dist/code-language/hljs.d.ts.map +1 -0
- package/dist/code-language/hljs.js +211 -0
- package/dist/code-language/hljs.js.map +1 -0
- package/dist/code-language/index.d.ts +22 -0
- package/dist/code-language/index.d.ts.map +1 -0
- package/dist/code-language/index.js +20 -0
- package/dist/code-language/index.js.map +1 -0
- package/dist/code-language/languages/glsl.d.ts +4 -0
- package/dist/code-language/languages/glsl.d.ts.map +1 -0
- package/dist/code-language/languages/glsl.js +99 -0
- package/dist/code-language/languages/glsl.js.map +1 -0
- package/dist/code-language/languages/javascript.d.ts +10 -0
- package/dist/code-language/languages/javascript.d.ts.map +1 -0
- package/dist/code-language/languages/javascript.js +360 -0
- package/dist/code-language/languages/javascript.js.map +1 -0
- package/dist/code-language/languages/json.d.ts +4 -0
- package/dist/code-language/languages/json.d.ts.map +1 -0
- package/dist/code-language/languages/json.js +68 -0
- package/dist/code-language/languages/json.js.map +1 -0
- package/dist/code-language/languages/shell.d.ts +4 -0
- package/dist/code-language/languages/shell.d.ts.map +1 -0
- package/dist/code-language/languages/shell.js +189 -0
- package/dist/code-language/languages/shell.js.map +1 -0
- package/dist/code-language/languages/sql.d.ts +11 -0
- package/dist/code-language/languages/sql.d.ts.map +1 -0
- package/dist/code-language/languages/sql.js +133 -0
- package/dist/code-language/languages/sql.js.map +1 -0
- package/dist/code-language/lezer.d.ts +24 -0
- package/dist/code-language/lezer.d.ts.map +1 -0
- package/dist/code-language/lezer.js +148 -0
- package/dist/code-language/lezer.js.map +1 -0
- package/dist/code-language/registry.d.ts +19 -0
- package/dist/code-language/registry.d.ts.map +1 -0
- package/dist/code-language/registry.js +56 -0
- package/dist/code-language/registry.js.map +1 -0
- package/dist/code-language/runs.d.ts +35 -0
- package/dist/code-language/runs.d.ts.map +1 -0
- package/dist/code-language/runs.js +88 -0
- package/dist/code-language/runs.js.map +1 -0
- package/dist/code-language/stream.d.ts +70 -0
- package/dist/code-language/stream.d.ts.map +1 -0
- package/dist/code-language/stream.js +243 -0
- package/dist/code-language/stream.js.map +1 -0
- package/dist/code-language/textmate.d.ts +27 -0
- package/dist/code-language/textmate.d.ts.map +1 -0
- package/dist/code-language/textmate.js +86 -0
- package/dist/code-language/textmate.js.map +1 -0
- package/dist/code-language/theme.d.ts +26 -0
- package/dist/code-language/theme.d.ts.map +1 -0
- package/dist/code-language/theme.js +108 -0
- package/dist/code-language/theme.js.map +1 -0
- package/dist/code-language/timers.d.ts +7 -0
- package/dist/code-language/timers.d.ts.map +1 -0
- package/dist/code-language/timers.js +22 -0
- package/dist/code-language/timers.js.map +1 -0
- package/dist/code-language/types.d.ts +173 -0
- package/dist/code-language/types.d.ts.map +1 -0
- package/dist/code-language/types.js +41 -0
- package/dist/code-language/types.js.map +1 -0
- package/dist/codeblock/index.d.ts +69 -0
- package/dist/codeblock/index.d.ts.map +1 -0
- package/dist/codeblock/index.js +85 -0
- package/dist/codeblock/index.js.map +1 -0
- package/dist/color-picker/ColorField.d.ts +39 -0
- package/dist/color-picker/ColorField.d.ts.map +1 -0
- package/dist/color-picker/ColorField.js +239 -0
- package/dist/color-picker/ColorField.js.map +1 -0
- package/dist/color-picker/ColorPicker.d.ts +109 -0
- package/dist/color-picker/ColorPicker.d.ts.map +1 -0
- package/dist/color-picker/ColorPicker.js +757 -0
- package/dist/color-picker/ColorPicker.js.map +1 -0
- package/dist/color-picker/color.d.ts +105 -0
- package/dist/color-picker/color.d.ts.map +1 -0
- package/dist/color-picker/color.js +313 -0
- package/dist/color-picker/color.js.map +1 -0
- package/dist/color-picker/index.d.ts +8 -0
- package/dist/color-picker/index.d.ts.map +1 -0
- package/dist/color-picker/index.js +19 -0
- package/dist/color-picker/index.js.map +1 -0
- package/dist/desktop-calendar/eds.d.ts +102 -0
- package/dist/desktop-calendar/eds.d.ts.map +1 -0
- package/dist/desktop-calendar/eds.js +356 -0
- package/dist/desktop-calendar/eds.js.map +1 -0
- package/dist/desktop-calendar/ical.d.ts +63 -0
- package/dist/desktop-calendar/ical.d.ts.map +1 -0
- package/dist/desktop-calendar/ical.js +57 -0
- package/dist/desktop-calendar/ical.js.map +1 -0
- package/dist/desktop-calendar/index.d.ts +72 -0
- package/dist/desktop-calendar/index.d.ts.map +1 -0
- package/dist/desktop-calendar/index.js +213 -0
- package/dist/desktop-calendar/index.js.map +1 -0
- package/dist/embed/client.d.ts +121 -0
- package/dist/embed/client.d.ts.map +1 -0
- package/dist/embed/client.js +203 -0
- package/dist/embed/client.js.map +1 -0
- package/dist/embed/host.d.ts +96 -0
- package/dist/embed/host.d.ts.map +1 -0
- package/dist/embed/host.js +266 -0
- package/dist/embed/host.js.map +1 -0
- package/dist/embed/index.d.ts +5 -0
- package/dist/embed/index.d.ts.map +1 -0
- package/dist/embed/index.js +13 -0
- package/dist/embed/index.js.map +1 -0
- package/dist/embed/timers.d.ts +6 -0
- package/dist/embed/timers.d.ts.map +1 -0
- package/dist/embed/timers.js +16 -0
- package/dist/embed/timers.js.map +1 -0
- package/dist/flow/draw.d.ts +45 -0
- package/dist/flow/draw.d.ts.map +1 -0
- package/dist/flow/draw.js +295 -0
- package/dist/flow/draw.js.map +1 -0
- package/dist/flow/index.d.ts +64 -0
- package/dist/flow/index.d.ts.map +1 -0
- package/dist/flow/index.js +306 -0
- package/dist/flow/index.js.map +1 -0
- package/dist/flow/model.d.ts +158 -0
- package/dist/flow/model.d.ts.map +1 -0
- package/dist/flow/model.js +566 -0
- package/dist/flow/model.js.map +1 -0
- package/dist/flow/node.d.ts +429 -0
- package/dist/flow/node.d.ts.map +1 -0
- package/dist/flow/node.js +3025 -0
- package/dist/flow/node.js.map +1 -0
- package/dist/flow/paths.d.ts +43 -0
- package/dist/flow/paths.d.ts.map +1 -0
- package/dist/flow/paths.js +327 -0
- package/dist/flow/paths.js.map +1 -0
- package/dist/flow/types.d.ts +561 -0
- package/dist/flow/types.d.ts.map +1 -0
- package/dist/flow/types.js +2 -0
- package/dist/flow/types.js.map +1 -0
- package/dist/formula/hx.d.ts +24 -0
- package/dist/formula/hx.d.ts.map +1 -0
- package/dist/formula/hx.js +25 -0
- package/dist/formula/hx.js.map +1 -0
- package/dist/formula/index.d.ts +74 -0
- package/dist/formula/index.d.ts.map +1 -0
- package/dist/formula/index.js +155 -0
- package/dist/formula/index.js.map +1 -0
- package/dist/formula/katex.d.ts +78 -0
- package/dist/formula/katex.d.ts.map +1 -0
- package/dist/formula/katex.js +130 -0
- package/dist/formula/katex.js.map +1 -0
- package/dist/formula/layout.d.ts +103 -0
- package/dist/formula/layout.d.ts.map +1 -0
- package/dist/formula/layout.js +716 -0
- package/dist/formula/layout.js.map +1 -0
- package/dist/formula/node.d.ts +50 -0
- package/dist/formula/node.d.ts.map +1 -0
- package/dist/formula/node.js +351 -0
- package/dist/formula/node.js.map +1 -0
- package/dist/html/controls.d.ts +48 -0
- package/dist/html/controls.d.ts.map +1 -0
- package/dist/html/controls.js +195 -0
- package/dist/html/controls.js.map +1 -0
- package/dist/html/css/cascade.d.ts +51 -0
- package/dist/html/css/cascade.d.ts.map +1 -0
- package/dist/html/css/cascade.js +552 -0
- package/dist/html/css/cascade.js.map +1 -0
- package/dist/html/css/parse.d.ts +74 -0
- package/dist/html/css/parse.d.ts.map +1 -0
- package/dist/html/css/parse.js +464 -0
- package/dist/html/css/parse.js.map +1 -0
- package/dist/html/css/style.d.ts +142 -0
- package/dist/html/css/style.d.ts.map +1 -0
- package/dist/html/css/style.js +1145 -0
- package/dist/html/css/style.js.map +1 -0
- package/dist/html/css/ua.d.ts +5 -0
- package/dist/html/css/ua.d.ts.map +1 -0
- package/dist/html/css/ua.js +171 -0
- package/dist/html/css/ua.js.map +1 -0
- package/dist/html/css/values.d.ts +78 -0
- package/dist/html/css/values.d.ts.map +1 -0
- package/dist/html/css/values.js +330 -0
- package/dist/html/css/values.js.map +1 -0
- package/dist/html/dom.d.ts +112 -0
- package/dist/html/dom.d.ts.map +1 -0
- package/dist/html/dom.js +374 -0
- package/dist/html/dom.js.map +1 -0
- package/dist/html/hx.d.ts +24 -0
- package/dist/html/hx.d.ts.map +1 -0
- package/dist/html/hx.js +29 -0
- package/dist/html/hx.js.map +1 -0
- package/dist/html/index.d.ts +137 -0
- package/dist/html/index.d.ts.map +1 -0
- package/dist/html/index.js +339 -0
- package/dist/html/index.js.map +1 -0
- package/dist/html/layout/block.d.ts +58 -0
- package/dist/html/layout/block.d.ts.map +1 -0
- package/dist/html/layout/block.js +724 -0
- package/dist/html/layout/block.js.map +1 -0
- package/dist/html/layout/boxes.d.ts +261 -0
- package/dist/html/layout/boxes.d.ts.map +1 -0
- package/dist/html/layout/boxes.js +725 -0
- package/dist/html/layout/boxes.js.map +1 -0
- package/dist/html/layout/flex.d.ts +16 -0
- package/dist/html/layout/flex.d.ts.map +1 -0
- package/dist/html/layout/flex.js +242 -0
- package/dist/html/layout/flex.js.map +1 -0
- package/dist/html/layout/floats.d.ts +50 -0
- package/dist/html/layout/floats.d.ts.map +1 -0
- package/dist/html/layout/floats.js +110 -0
- package/dist/html/layout/floats.js.map +1 -0
- package/dist/html/layout/inline.d.ts +44 -0
- package/dist/html/layout/inline.d.ts.map +1 -0
- package/dist/html/layout/inline.js +700 -0
- package/dist/html/layout/inline.js.map +1 -0
- package/dist/html/layout/table.d.ts +5 -0
- package/dist/html/layout/table.d.ts.map +1 -0
- package/dist/html/layout/table.js +340 -0
- package/dist/html/layout/table.js.map +1 -0
- package/dist/html/node.d.ts +149 -0
- package/dist/html/node.d.ts.map +1 -0
- package/dist/html/node.js +861 -0
- package/dist/html/node.js.map +1 -0
- package/dist/html/paint.d.ts +48 -0
- package/dist/html/paint.d.ts.map +1 -0
- package/dist/html/paint.js +495 -0
- package/dist/html/paint.js.map +1 -0
- package/dist/html/resources.d.ts +48 -0
- package/dist/html/resources.d.ts.map +1 -0
- package/dist/html/resources.js +156 -0
- package/dist/html/resources.js.map +1 -0
- package/dist/index.d.ts +48 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +92 -0
- package/dist/index.js.map +1 -0
- package/dist/internal/heights.d.ts +81 -0
- package/dist/internal/heights.d.ts.map +1 -0
- package/dist/internal/heights.js +193 -0
- package/dist/internal/heights.js.map +1 -0
- package/dist/internal/hx.d.ts +24 -0
- package/dist/internal/hx.d.ts.map +1 -0
- package/dist/internal/hx.js +27 -0
- package/dist/internal/hx.js.map +1 -0
- package/dist/internal/text.d.ts +6 -0
- package/dist/internal/text.d.ts.map +1 -0
- package/dist/internal/text.js +44 -0
- package/dist/internal/text.js.map +1 -0
- package/dist/internal/timers.d.ts +8 -0
- package/dist/internal/timers.d.ts.map +1 -0
- package/dist/internal/timers.js +22 -0
- package/dist/internal/timers.js.map +1 -0
- package/dist/internal/widget.d.ts +40 -0
- package/dist/internal/widget.d.ts.map +1 -0
- package/dist/internal/widget.js +44 -0
- package/dist/internal/widget.js.map +1 -0
- package/dist/markdown/ast.d.ts +126 -0
- package/dist/markdown/ast.d.ts.map +1 -0
- package/dist/markdown/ast.js +8 -0
- package/dist/markdown/ast.js.map +1 -0
- package/dist/markdown/hx.d.ts +24 -0
- package/dist/markdown/hx.d.ts.map +1 -0
- package/dist/markdown/hx.js +25 -0
- package/dist/markdown/hx.js.map +1 -0
- package/dist/markdown/index.d.ts +90 -0
- package/dist/markdown/index.d.ts.map +1 -0
- package/dist/markdown/index.js +413 -0
- package/dist/markdown/index.js.map +1 -0
- package/dist/markdown/parse.d.ts +8 -0
- package/dist/markdown/parse.d.ts.map +1 -0
- package/dist/markdown/parse.js +911 -0
- package/dist/markdown/parse.js.map +1 -0
- package/dist/markdown/spans.d.ts +20 -0
- package/dist/markdown/spans.d.ts.map +1 -0
- package/dist/markdown/spans.js +96 -0
- package/dist/markdown/spans.js.map +1 -0
- package/dist/media-player/backends.d.ts +64 -0
- package/dist/media-player/backends.d.ts.map +1 -0
- package/dist/media-player/backends.js +110 -0
- package/dist/media-player/backends.js.map +1 -0
- package/dist/media-player/control.d.ts +40 -0
- package/dist/media-player/control.d.ts.map +1 -0
- package/dist/media-player/control.js +44 -0
- package/dist/media-player/control.js.map +1 -0
- package/dist/media-player/hx.d.ts +24 -0
- package/dist/media-player/hx.d.ts.map +1 -0
- package/dist/media-player/hx.js +25 -0
- package/dist/media-player/hx.js.map +1 -0
- package/dist/media-player/index.d.ts +107 -0
- package/dist/media-player/index.d.ts.map +1 -0
- package/dist/media-player/index.js +219 -0
- package/dist/media-player/index.js.map +1 -0
- package/dist/media-player/mpv.d.ts +4 -0
- package/dist/media-player/mpv.d.ts.map +1 -0
- package/dist/media-player/mpv.js +120 -0
- package/dist/media-player/mpv.js.map +1 -0
- package/dist/media-player/vlc.d.ts +8 -0
- package/dist/media-player/vlc.d.ts.map +1 -0
- package/dist/media-player/vlc.js +83 -0
- package/dist/media-player/vlc.js.map +1 -0
- package/dist/richtext/index.d.ts +19 -0
- package/dist/richtext/index.d.ts.map +1 -0
- package/dist/richtext/index.js +4 -0
- package/dist/richtext/index.js.map +1 -0
- package/dist/richtext/links.d.ts +12 -0
- package/dist/richtext/links.d.ts.map +1 -0
- package/dist/richtext/links.js +64 -0
- package/dist/richtext/links.js.map +1 -0
- package/dist/richtext/menu.d.ts +11 -0
- package/dist/richtext/menu.d.ts.map +1 -0
- package/dist/richtext/menu.js +43 -0
- package/dist/richtext/menu.js.map +1 -0
- package/dist/richtext/node.d.ts +151 -0
- package/dist/richtext/node.d.ts.map +1 -0
- package/dist/richtext/node.js +255 -0
- package/dist/richtext/node.js.map +1 -0
- package/dist/richtext/runs.d.ts +92 -0
- package/dist/richtext/runs.d.ts.map +1 -0
- package/dist/richtext/runs.js +158 -0
- package/dist/richtext/runs.js.map +1 -0
- package/dist/table/hx.d.ts +24 -0
- package/dist/table/hx.d.ts.map +1 -0
- package/dist/table/hx.js +25 -0
- package/dist/table/hx.js.map +1 -0
- package/dist/table/index.d.ts +169 -0
- package/dist/table/index.d.ts.map +1 -0
- package/dist/table/index.js +844 -0
- package/dist/table/index.js.map +1 -0
- package/dist/table/rows.d.ts +136 -0
- package/dist/table/rows.d.ts.map +1 -0
- package/dist/table/rows.js +146 -0
- package/dist/table/rows.js.map +1 -0
- package/dist/terminal/backends.d.ts +105 -0
- package/dist/terminal/backends.d.ts.map +1 -0
- package/dist/terminal/backends.js +185 -0
- package/dist/terminal/backends.js.map +1 -0
- package/dist/terminal/hx.d.ts +24 -0
- package/dist/terminal/hx.d.ts.map +1 -0
- package/dist/terminal/hx.js +25 -0
- package/dist/terminal/hx.js.map +1 -0
- package/dist/terminal/index.d.ts +160 -0
- package/dist/terminal/index.d.ts.map +1 -0
- package/dist/terminal/index.js +344 -0
- package/dist/terminal/index.js.map +1 -0
- package/dist/terminal/title.d.ts +24 -0
- package/dist/terminal/title.d.ts.map +1 -0
- package/dist/terminal/title.js +129 -0
- package/dist/terminal/title.js.map +1 -0
- package/dist/terminal/vt/colors.d.ts +63 -0
- package/dist/terminal/vt/colors.d.ts.map +1 -0
- package/dist/terminal/vt/colors.js +203 -0
- package/dist/terminal/vt/colors.js.map +1 -0
- package/dist/terminal/vt/diff.d.ts +117 -0
- package/dist/terminal/vt/diff.d.ts.map +1 -0
- package/dist/terminal/vt/diff.js +358 -0
- package/dist/terminal/vt/diff.js.map +1 -0
- package/dist/terminal/vt/fonts.d.ts +92 -0
- package/dist/terminal/vt/fonts.d.ts.map +1 -0
- package/dist/terminal/vt/fonts.js +178 -0
- package/dist/terminal/vt/fonts.js.map +1 -0
- package/dist/terminal/vt/index.d.ts +78 -0
- package/dist/terminal/vt/index.d.ts.map +1 -0
- package/dist/terminal/vt/index.js +312 -0
- package/dist/terminal/vt/index.js.map +1 -0
- package/dist/terminal/vt/keys.d.ts +74 -0
- package/dist/terminal/vt/keys.d.ts.map +1 -0
- package/dist/terminal/vt/keys.js +309 -0
- package/dist/terminal/vt/keys.js.map +1 -0
- package/dist/terminal/vt/mouse.d.ts +44 -0
- package/dist/terminal/vt/mouse.d.ts.map +1 -0
- package/dist/terminal/vt/mouse.js +106 -0
- package/dist/terminal/vt/mouse.js.map +1 -0
- package/dist/terminal/vt/node.d.ts +246 -0
- package/dist/terminal/vt/node.d.ts.map +1 -0
- package/dist/terminal/vt/node.js +1068 -0
- package/dist/terminal/vt/node.js.map +1 -0
- package/dist/terminal/vt/pty.d.ts +81 -0
- package/dist/terminal/vt/pty.d.ts.map +1 -0
- package/dist/terminal/vt/pty.js +201 -0
- package/dist/terminal/vt/pty.js.map +1 -0
- package/dist/terminal/vt/renderer.d.ts +179 -0
- package/dist/terminal/vt/renderer.d.ts.map +1 -0
- package/dist/terminal/vt/renderer.js +357 -0
- package/dist/terminal/vt/renderer.js.map +1 -0
- package/dist/terminal/vt/timers.d.ts +6 -0
- package/dist/terminal/vt/timers.d.ts.map +1 -0
- package/dist/terminal/vt/timers.js +16 -0
- package/dist/terminal/vt/timers.js.map +1 -0
- package/dist/terminal/vt/xterm.d.ts +142 -0
- package/dist/terminal/vt/xterm.d.ts.map +1 -0
- package/dist/terminal/vt/xterm.js +32 -0
- package/dist/terminal/vt/xterm.js.map +1 -0
- package/dist/terminal-output/hx.d.ts +24 -0
- package/dist/terminal-output/hx.d.ts.map +1 -0
- package/dist/terminal-output/hx.js +25 -0
- package/dist/terminal-output/hx.js.map +1 -0
- package/dist/terminal-output/index.d.ts +92 -0
- package/dist/terminal-output/index.d.ts.map +1 -0
- package/dist/terminal-output/index.js +179 -0
- package/dist/terminal-output/index.js.map +1 -0
- package/dist/terminal-output/runs.d.ts +27 -0
- package/dist/terminal-output/runs.d.ts.map +1 -0
- package/dist/terminal-output/runs.js +66 -0
- package/dist/terminal-output/runs.js.map +1 -0
- package/dist/three/canvas.d.ts +46 -0
- package/dist/three/canvas.d.ts.map +1 -0
- package/dist/three/canvas.js +305 -0
- package/dist/three/canvas.js.map +1 -0
- package/dist/three/events.d.ts +64 -0
- package/dist/three/events.d.ts.map +1 -0
- package/dist/three/events.js +146 -0
- package/dist/three/events.js.map +1 -0
- package/dist/three/geometries.d.ts +89 -0
- package/dist/three/geometries.d.ts.map +1 -0
- package/dist/three/geometries.js +345 -0
- package/dist/three/geometries.js.map +1 -0
- package/dist/three/globals.d.ts +7 -0
- package/dist/three/globals.d.ts.map +1 -0
- package/dist/three/globals.js +20 -0
- package/dist/three/globals.js.map +1 -0
- package/dist/three/hx.d.ts +9 -0
- package/dist/three/hx.d.ts.map +1 -0
- package/dist/three/hx.js +10 -0
- package/dist/three/hx.js.map +1 -0
- package/dist/three/index.d.ts +22 -0
- package/dist/three/index.d.ts.map +1 -0
- package/dist/three/index.js +24 -0
- package/dist/three/index.js.map +1 -0
- package/dist/three/jsx-dev-runtime.d.ts +19 -0
- package/dist/three/jsx-dev-runtime.d.ts.map +1 -0
- package/dist/three/jsx-dev-runtime.js +2 -0
- package/dist/three/jsx-dev-runtime.js.map +1 -0
- package/dist/three/jsx-runtime.d.ts +19 -0
- package/dist/three/jsx-runtime.d.ts.map +1 -0
- package/dist/three/jsx-runtime.js +2 -0
- package/dist/three/jsx-runtime.js.map +1 -0
- package/dist/three/jsx.d.ts +198 -0
- package/dist/three/jsx.d.ts.map +1 -0
- package/dist/three/jsx.js +2 -0
- package/dist/three/jsx.js.map +1 -0
- package/dist/three/materials.d.ts +125 -0
- package/dist/three/materials.d.ts.map +1 -0
- package/dist/three/materials.js +229 -0
- package/dist/three/materials.js.map +1 -0
- package/dist/three/math.d.ts +146 -0
- package/dist/three/math.d.ts.map +1 -0
- package/dist/three/math.js +464 -0
- package/dist/three/math.js.map +1 -0
- package/dist/three/objects.d.ts +185 -0
- package/dist/three/objects.d.ts.map +1 -0
- package/dist/three/objects.js +309 -0
- package/dist/three/objects.js.map +1 -0
- package/dist/three/passes.d.ts +54 -0
- package/dist/three/passes.d.ts.map +1 -0
- package/dist/three/passes.js +78 -0
- package/dist/three/passes.js.map +1 -0
- package/dist/three/postprocess.d.ts +85 -0
- package/dist/three/postprocess.d.ts.map +1 -0
- package/dist/three/postprocess.js +503 -0
- package/dist/three/postprocess.js.map +1 -0
- package/dist/three/raycast.d.ts +24 -0
- package/dist/three/raycast.d.ts.map +1 -0
- package/dist/three/raycast.js +138 -0
- package/dist/three/raycast.js.map +1 -0
- package/dist/three/reconciler.d.ts +48 -0
- package/dist/three/reconciler.d.ts.map +1 -0
- package/dist/three/reconciler.js +416 -0
- package/dist/three/reconciler.js.map +1 -0
- package/dist/three/renderer-direct.d.ts +102 -0
- package/dist/three/renderer-direct.d.ts.map +1 -0
- package/dist/three/renderer-direct.js +782 -0
- package/dist/three/renderer-direct.js.map +1 -0
- package/dist/three/renderer-indirect.d.ts +68 -0
- package/dist/three/renderer-indirect.d.ts.map +1 -0
- package/dist/three/renderer-indirect.js +438 -0
- package/dist/three/renderer-indirect.js.map +1 -0
- package/dist/three/store.d.ts +81 -0
- package/dist/three/store.d.ts.map +1 -0
- package/dist/three/store.js +110 -0
- package/dist/three/store.js.map +1 -0
- package/dist/timeline/hx.d.ts +18 -0
- package/dist/timeline/hx.d.ts.map +1 -0
- package/dist/timeline/hx.js +10 -0
- package/dist/timeline/hx.js.map +1 -0
- package/dist/timeline/index.d.ts +152 -0
- package/dist/timeline/index.d.ts.map +1 -0
- package/dist/timeline/index.js +383 -0
- package/dist/timeline/index.js.map +1 -0
- package/dist/tray-host/hx.d.ts +24 -0
- package/dist/tray-host/hx.d.ts.map +1 -0
- package/dist/tray-host/hx.js +25 -0
- package/dist/tray-host/hx.js.map +1 -0
- package/dist/tray-host/index.d.ts +110 -0
- package/dist/tray-host/index.d.ts.map +1 -0
- package/dist/tray-host/index.js +191 -0
- package/dist/tray-host/index.js.map +1 -0
- package/dist/tray-host/manager.d.ts +137 -0
- package/dist/tray-host/manager.d.ts.map +1 -0
- package/dist/tray-host/manager.js +462 -0
- package/dist/tray-host/manager.js.map +1 -0
- package/dist/tray-host/notify.d.ts +22 -0
- package/dist/tray-host/notify.d.ts.map +1 -0
- package/dist/tray-host/notify.js +74 -0
- package/dist/tray-host/notify.js.map +1 -0
- package/dist/tray-host/protocol.d.ts +106 -0
- package/dist/tray-host/protocol.d.ts.map +1 -0
- package/dist/tray-host/protocol.js +191 -0
- package/dist/tray-host/protocol.js.map +1 -0
- package/dist/tree/hx.d.ts +24 -0
- package/dist/tree/hx.d.ts.map +1 -0
- package/dist/tree/hx.js +25 -0
- package/dist/tree/hx.js.map +1 -0
- package/dist/tree/index.d.ts +221 -0
- package/dist/tree/index.d.ts.map +1 -0
- package/dist/tree/index.js +716 -0
- package/dist/tree/index.js.map +1 -0
- package/dist/tree/internal.d.ts +18 -0
- package/dist/tree/internal.d.ts.map +1 -0
- package/dist/tree/internal.js +66 -0
- package/dist/tree/internal.js.map +1 -0
- package/dist/tree/rows.d.ts +177 -0
- package/dist/tree/rows.d.ts.map +1 -0
- package/dist/tree/rows.js +179 -0
- package/dist/tree/rows.js.map +1 -0
- package/package.json +166 -12
- package/src/ansi/cast.ts +159 -0
- package/src/ansi/index.ts +53 -0
- package/src/ansi/palette.ts +226 -0
- package/src/ansi/parse.ts +780 -0
- package/src/ansi/sgr.ts +380 -0
- package/src/ansi/utf8.ts +84 -0
- package/src/calendar/Calendar.ts +744 -0
- package/src/calendar/DatePicker.ts +368 -0
- package/src/calendar/dates.ts +307 -0
- package/src/calendar/index.ts +51 -0
- package/src/charts/components.ts +864 -0
- package/src/charts/data.ts +776 -0
- package/src/charts/hx.ts +39 -0
- package/src/charts/index.ts +99 -0
- package/src/charts/node.ts +932 -0
- package/src/charts/render.ts +982 -0
- package/src/charts/scale.ts +214 -0
- package/src/charts/spec.ts +122 -0
- package/src/charts/timers.ts +24 -0
- package/src/code/hx.ts +51 -0
- package/src/code/index.ts +174 -0
- package/src/code-editor/completion.ts +161 -0
- package/src/code-editor/doc.ts +198 -0
- package/src/code-editor/hx.ts +26 -0
- package/src/code-editor/index.ts +615 -0
- package/src/code-editor/node.ts +1926 -0
- package/src/code-language/hljs.ts +302 -0
- package/src/code-language/index.ts +51 -0
- package/src/code-language/languages/glsl.ts +120 -0
- package/src/code-language/languages/javascript.ts +419 -0
- package/src/code-language/languages/json.ts +72 -0
- package/src/code-language/languages/shell.ts +221 -0
- package/src/code-language/languages/sql.ts +165 -0
- package/src/code-language/lezer.ts +190 -0
- package/src/code-language/registry.ts +66 -0
- package/src/code-language/runs.ts +128 -0
- package/src/code-language/stream.ts +306 -0
- package/src/code-language/textmate.ts +134 -0
- package/src/code-language/theme.ts +124 -0
- package/src/code-language/timers.ts +36 -0
- package/src/code-language/types.ts +252 -0
- package/src/codeblock/index.ts +146 -0
- package/src/color-picker/ColorField.ts +333 -0
- package/src/color-picker/ColorPicker.ts +1069 -0
- package/src/color-picker/color.ts +399 -0
- package/src/color-picker/index.ts +50 -0
- package/src/desktop-calendar/eds.ts +484 -0
- package/src/desktop-calendar/ical.ts +119 -0
- package/src/desktop-calendar/index.ts +287 -0
- package/src/embed/client.ts +311 -0
- package/src/embed/host.ts +432 -0
- package/src/embed/index.ts +33 -0
- package/src/embed/timers.ts +32 -0
- package/src/flow/draw.ts +418 -0
- package/src/flow/index.ts +473 -0
- package/src/flow/model.ts +687 -0
- package/src/flow/node.ts +3694 -0
- package/src/flow/paths.ts +403 -0
- package/src/flow/types.ts +634 -0
- package/src/formula/hx.ts +51 -0
- package/src/formula/index.ts +243 -0
- package/src/formula/katex.ts +209 -0
- package/src/formula/layout.ts +876 -0
- package/src/formula/node.ts +467 -0
- package/src/html/controls.ts +244 -0
- package/src/html/css/cascade.ts +606 -0
- package/src/html/css/parse.ts +500 -0
- package/src/html/css/style.ts +1371 -0
- package/src/html/css/ua.ts +174 -0
- package/src/html/css/values.ts +358 -0
- package/src/html/dom.ts +410 -0
- package/src/html/hx.ts +55 -0
- package/src/html/index.ts +545 -0
- package/src/html/layout/block.ts +876 -0
- package/src/html/layout/boxes.ts +981 -0
- package/src/html/layout/flex.ts +297 -0
- package/src/html/layout/floats.ts +125 -0
- package/src/html/layout/inline.ts +870 -0
- package/src/html/layout/table.ts +380 -0
- package/src/html/node.ts +967 -0
- package/src/html/paint.ts +605 -0
- package/src/html/resources.ts +214 -0
- package/src/index.ts +638 -0
- package/src/internal/heights.ts +211 -0
- package/src/internal/hx.ts +53 -0
- package/src/internal/text.ts +44 -0
- package/src/internal/timers.ts +44 -0
- package/src/internal/widget.ts +92 -0
- package/src/markdown/ast.ts +163 -0
- package/src/markdown/hx.ts +51 -0
- package/src/markdown/index.ts +686 -0
- package/src/markdown/parse.ts +1037 -0
- package/src/markdown/spans.ts +143 -0
- package/src/media-player/backends.ts +155 -0
- package/src/media-player/control.ts +70 -0
- package/src/media-player/hx.ts +51 -0
- package/src/media-player/index.ts +378 -0
- package/src/media-player/mpv.ts +146 -0
- package/src/media-player/vlc.ts +97 -0
- package/src/richtext/index.ts +42 -0
- package/src/richtext/links.ts +78 -0
- package/src/richtext/menu.ts +49 -0
- package/src/richtext/node.ts +406 -0
- package/src/richtext/runs.ts +253 -0
- package/src/table/hx.ts +51 -0
- package/src/table/index.ts +1219 -0
- package/src/table/rows.ts +275 -0
- package/src/terminal/backends.ts +242 -0
- package/src/terminal/hx.ts +51 -0
- package/src/terminal/index.ts +574 -0
- package/src/terminal/title.ts +172 -0
- package/src/terminal/vt/colors.ts +247 -0
- package/src/terminal/vt/diff.ts +467 -0
- package/src/terminal/vt/fonts.ts +233 -0
- package/src/terminal/vt/index.ts +443 -0
- package/src/terminal/vt/keys.ts +369 -0
- package/src/terminal/vt/mouse.ts +144 -0
- package/src/terminal/vt/node.ts +1242 -0
- package/src/terminal/vt/pty.ts +334 -0
- package/src/terminal/vt/renderer.ts +555 -0
- package/src/terminal/vt/timers.ts +31 -0
- package/src/terminal/vt/xterm.ts +193 -0
- package/src/terminal-output/hx.ts +51 -0
- package/src/terminal-output/index.ts +340 -0
- package/src/terminal-output/runs.ts +79 -0
- package/src/three/canvas.ts +451 -0
- package/src/three/events.ts +197 -0
- package/src/three/geometries.ts +429 -0
- package/src/three/globals.ts +34 -0
- package/src/three/hx.ts +22 -0
- package/src/three/index.ts +98 -0
- package/src/three/jsx-dev-runtime.ts +27 -0
- package/src/three/jsx-runtime.ts +38 -0
- package/src/three/jsx.ts +275 -0
- package/src/three/materials.ts +270 -0
- package/src/three/math.ts +585 -0
- package/src/three/objects.ts +397 -0
- package/src/three/passes.ts +90 -0
- package/src/three/postprocess.ts +677 -0
- package/src/three/raycast.ts +189 -0
- package/src/three/react-reconciler.d.ts +50 -0
- package/src/three/reconciler.ts +624 -0
- package/src/three/renderer-direct.ts +1055 -0
- package/src/three/renderer-indirect.ts +570 -0
- package/src/three/store.ts +207 -0
- package/src/timeline/hx.ts +31 -0
- package/src/timeline/index.ts +603 -0
- package/src/tray-host/hx.ts +51 -0
- package/src/tray-host/index.ts +331 -0
- package/src/tray-host/manager.ts +639 -0
- package/src/tray-host/notify.ts +102 -0
- package/src/tray-host/protocol.ts +235 -0
- package/src/tree/hx.ts +51 -0
- package/src/tree/index.ts +1087 -0
- package/src/tree/internal.ts +87 -0
- package/src/tree/rows.ts +334 -0
- package/src/index.d.ts +0 -2
- package/src/index.js +0 -9
- package/src/sparkline/index.d.ts +0 -29
- package/src/sparkline/index.js +0 -50
- package/src/sparkline/node.js +0 -72
|
@@ -0,0 +1,780 @@
|
|
|
1
|
+
// The escape-sequence state machine, and the flow reducer over it.
|
|
2
|
+
//
|
|
3
|
+
// Pure: bytes in, plain arrays out. No X, no node, no React, no
|
|
4
|
+
// `@xterm/headless` — so the whole model is asserted against byte strings in
|
|
5
|
+
// `test/ansi.test.ts`, the posture `../terminal/vt/diff.ts` takes for the
|
|
6
|
+
// live renderer.
|
|
7
|
+
//
|
|
8
|
+
// ### Why a line buffer rather than a grid
|
|
9
|
+
//
|
|
10
|
+
// A log is a *document*: it has lines, not rows, and no column count of its
|
|
11
|
+
// own. So the reducer keeps exactly one row — the line being written — and
|
|
12
|
+
// flushes it to spans when a newline arrives. `\r` rewinds the write head
|
|
13
|
+
// inside that row, `\e[K` truncates it, `\e[nC` moves along it: every
|
|
14
|
+
// sequence a line-oriented program actually emits is exact in this model,
|
|
15
|
+
// while none of them needs a `cols` the capture never had.
|
|
16
|
+
//
|
|
17
|
+
// The sequences that only mean something on a real screen — `CUP`, `ED`,
|
|
18
|
+
// `IL`, a scroll region, the alternate screen — set `needsScreen` and are
|
|
19
|
+
// counted in `dropped`. What this cannot represent, it says so about; see
|
|
20
|
+
// the PRD for why silence would be the worse failure.
|
|
21
|
+
//
|
|
22
|
+
// ### Why a state machine rather than a regular expression
|
|
23
|
+
//
|
|
24
|
+
// A parser that does not understand a sequence's *structure* prints its
|
|
25
|
+
// payload as text the moment it meets one it has no pattern for — the
|
|
26
|
+
// classic garbage-on-screen bug. Everything below is recognised and consumed
|
|
27
|
+
// even when it is then discarded.
|
|
28
|
+
import { PLAIN, Style, param, ABSENT } from './sgr.js';
|
|
29
|
+
import type { AnsiAttrs } from './sgr.js';
|
|
30
|
+
import { Utf8Decoder } from './utf8.js';
|
|
31
|
+
|
|
32
|
+
/** One run of characters sharing every attribute. */
|
|
33
|
+
export type AnsiSpan = AnsiAttrs & { readonly text: string };
|
|
34
|
+
|
|
35
|
+
/** One line of the capture. `text` is the spans concatenated. */
|
|
36
|
+
export interface AnsiLine {
|
|
37
|
+
readonly spans: readonly AnsiSpan[];
|
|
38
|
+
readonly text: string;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/** What a capture reduces to. A plain immutable value — snapshot it, keep it,
|
|
42
|
+
* hand it to React. */
|
|
43
|
+
export interface AnsiDocument {
|
|
44
|
+
readonly lines: readonly AnsiLine[];
|
|
45
|
+
/** The last title the capture set, through OSC 0 or OSC 2. */
|
|
46
|
+
readonly title?: string;
|
|
47
|
+
/** The stream addressed the cursor absolutely, scrolled a region, or
|
|
48
|
+
* entered the alternate screen: these bytes wanted a grid. */
|
|
49
|
+
readonly needsScreen: boolean;
|
|
50
|
+
/** What could not be honoured, by name, with counts. */
|
|
51
|
+
readonly dropped: Readonly<Record<string, number>>;
|
|
52
|
+
/** Lines evicted by `maxLines`, oldest first. */
|
|
53
|
+
readonly truncated: number;
|
|
54
|
+
/** The resume point. Pass the document back as `from` to continue. */
|
|
55
|
+
readonly state: AnsiState;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export type AnsiInput = string | Uint8Array | readonly (string | Uint8Array)[];
|
|
59
|
+
|
|
60
|
+
export interface ParseAnsiOptions {
|
|
61
|
+
/** Continue a previous parse rather than starting one. A partial escape
|
|
62
|
+
* sequence or a half-arrived UTF-8 character at the boundary is held, not
|
|
63
|
+
* mangled — the same rule `<Markdown>` follows for an unterminated tail. */
|
|
64
|
+
from?: AnsiDocument | AnsiState;
|
|
65
|
+
/** Default 8, the terminal's. */
|
|
66
|
+
tabWidth?: number;
|
|
67
|
+
/** Keep only the last N lines, dropping from the front. Unbounded by
|
|
68
|
+
* default: the app read the file, so the app decided how big it is. */
|
|
69
|
+
maxLines?: number;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* A capture, reduced.
|
|
74
|
+
*
|
|
75
|
+
* ```ts
|
|
76
|
+
* const doc = parseAnsi(await readFile('build.log'));
|
|
77
|
+
* doc.lines.map((line) => line.text);
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export function parseAnsi(
|
|
81
|
+
data: AnsiInput,
|
|
82
|
+
options: ParseAnsiOptions = {},
|
|
83
|
+
): AnsiDocument {
|
|
84
|
+
const state =
|
|
85
|
+
options.from instanceof AnsiState
|
|
86
|
+
? options.from
|
|
87
|
+
: options.from
|
|
88
|
+
? options.from.state
|
|
89
|
+
: new AnsiState(options);
|
|
90
|
+
state.write(data);
|
|
91
|
+
return state.snapshot();
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/** The capture's text with every escape sequence resolved away. What a
|
|
95
|
+
* round-trip test compares against, and what a plain-text export wants. */
|
|
96
|
+
export function stripAnsi(data: AnsiInput, options?: ParseAnsiOptions): string {
|
|
97
|
+
return parseAnsi(data, options)
|
|
98
|
+
.lines.map((line) => line.text)
|
|
99
|
+
.join('\n');
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// --- the machine ------------------------------------------------------------
|
|
103
|
+
|
|
104
|
+
const GROUND = 0;
|
|
105
|
+
const ESC = 1;
|
|
106
|
+
const CSI = 2;
|
|
107
|
+
const OSC = 3;
|
|
108
|
+
/** DCS, SOS, PM, APC — a string terminated by ST, and never anything we draw. */
|
|
109
|
+
const STR = 4;
|
|
110
|
+
/** `ESC ( B` and friends: one more byte to swallow. */
|
|
111
|
+
const CHARSET = 5;
|
|
112
|
+
|
|
113
|
+
/** A column an escape sequence may ask for. `\e[999999999C` is a corrupt
|
|
114
|
+
* capture rather than a request, and allocating for it is how a renderer
|
|
115
|
+
* turns one bad byte into an out-of-memory. */
|
|
116
|
+
const MAX_COLUMN = 100_000;
|
|
117
|
+
/** An OSC or DCS payload bigger than this is a program misbehaving — the same
|
|
118
|
+
* call `<vtterm>` makes about an oversized OSC 52. */
|
|
119
|
+
const MAX_STRING = 64 * 1024;
|
|
120
|
+
|
|
121
|
+
/** Marks join the cell before them rather than taking one of their own, so a
|
|
122
|
+
* combining accent does not shift every column after it. */
|
|
123
|
+
const MARK = /\p{M}/u;
|
|
124
|
+
const ZWJ = 0x200d;
|
|
125
|
+
|
|
126
|
+
function joinsPrevious(cp: number, ch: string): boolean {
|
|
127
|
+
return cp === ZWJ || (cp >= 0x300 && MARK.test(ch));
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/** Would a blank cell in these attributes leave a mark on the screen? */
|
|
131
|
+
function paintsBlank(attrs: AnsiAttrs | undefined): boolean {
|
|
132
|
+
if (!attrs || attrs === PLAIN) return false;
|
|
133
|
+
return Boolean(
|
|
134
|
+
attrs.bg ??
|
|
135
|
+
attrs.inverse ??
|
|
136
|
+
attrs.underline ??
|
|
137
|
+
attrs.strike ??
|
|
138
|
+
attrs.overline,
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
/**
|
|
143
|
+
* One row of cells, as spans.
|
|
144
|
+
*
|
|
145
|
+
* Trailing blanks in attributes that paint nothing are dropped: they are
|
|
146
|
+
* invisible on the screen and they would ride along in every copied line. A
|
|
147
|
+
* trailing run that *does* paint — a status bar's background — is kept,
|
|
148
|
+
* because that one is on the screen.
|
|
149
|
+
*/
|
|
150
|
+
function flushLine(
|
|
151
|
+
chars: readonly string[],
|
|
152
|
+
attrs: readonly (AnsiAttrs | undefined)[],
|
|
153
|
+
): AnsiLine {
|
|
154
|
+
let end = chars.length;
|
|
155
|
+
while (
|
|
156
|
+
end > 0 &&
|
|
157
|
+
(chars[end - 1] ?? ' ') === ' ' &&
|
|
158
|
+
!paintsBlank(attrs[end - 1])
|
|
159
|
+
) {
|
|
160
|
+
end--;
|
|
161
|
+
}
|
|
162
|
+
const spans: AnsiSpan[] = [];
|
|
163
|
+
let text = '';
|
|
164
|
+
let i = 0;
|
|
165
|
+
while (i < end) {
|
|
166
|
+
// Cells written between two SGR sequences share one frozen record, so
|
|
167
|
+
// this is an identity compare rather than twelve field compares.
|
|
168
|
+
const attr = attrs[i] ?? PLAIN;
|
|
169
|
+
let j = i + 1;
|
|
170
|
+
while (j < end && (attrs[j] ?? PLAIN) === attr) j++;
|
|
171
|
+
let run = '';
|
|
172
|
+
for (let k = i; k < j; k++) run += chars[k] ?? ' ';
|
|
173
|
+
spans.push({ ...attr, text: run });
|
|
174
|
+
text += run;
|
|
175
|
+
i = j;
|
|
176
|
+
}
|
|
177
|
+
return { spans, text };
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* The reducer's state: the escape machine, the current attributes, the line
|
|
182
|
+
* being written, and the lines already finished.
|
|
183
|
+
*
|
|
184
|
+
* Held across calls so an append costs the appended bytes. Completed lines
|
|
185
|
+
* are never mutated, so an older `AnsiDocument` snapshot stays valid after
|
|
186
|
+
* the next `write()`.
|
|
187
|
+
*/
|
|
188
|
+
export class AnsiState {
|
|
189
|
+
private readonly _tabWidth: number;
|
|
190
|
+
private readonly _maxLines: number;
|
|
191
|
+
|
|
192
|
+
private _style = new Style();
|
|
193
|
+
private _decoder = new Utf8Decoder();
|
|
194
|
+
|
|
195
|
+
private _lines: AnsiLine[] = [];
|
|
196
|
+
private _truncated = 0;
|
|
197
|
+
|
|
198
|
+
private _chars: string[] = [];
|
|
199
|
+
private _attrs: (AnsiAttrs | undefined)[] = [];
|
|
200
|
+
private _col = 0;
|
|
201
|
+
private _lastPrinted = '';
|
|
202
|
+
private _joinNext = false;
|
|
203
|
+
|
|
204
|
+
private _title: string | undefined;
|
|
205
|
+
private _needsScreen = false;
|
|
206
|
+
private _dropped: Record<string, number> = {};
|
|
207
|
+
|
|
208
|
+
private _phase = GROUND;
|
|
209
|
+
private _params: number[][] = [];
|
|
210
|
+
private _group: number[] = [];
|
|
211
|
+
private _digits = '';
|
|
212
|
+
private _prefix = '';
|
|
213
|
+
private _string = '';
|
|
214
|
+
private _stringEsc = false;
|
|
215
|
+
|
|
216
|
+
constructor(options: { tabWidth?: number; maxLines?: number } = {}) {
|
|
217
|
+
this._tabWidth = Math.max(1, options.tabWidth ?? 8);
|
|
218
|
+
this._maxLines = Math.max(1, options.maxLines ?? Infinity);
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
/** Feed the next chunk. Bytes are preferred — see `./utf8.ts`. */
|
|
222
|
+
write(data: AnsiInput): void {
|
|
223
|
+
if (typeof data === 'string') {
|
|
224
|
+
this._feed(data);
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
if (data instanceof Uint8Array) {
|
|
228
|
+
this._feed(this._decoder.decode(data));
|
|
229
|
+
return;
|
|
230
|
+
}
|
|
231
|
+
for (const part of data) this.write(part);
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
/** The document as it stands. Cheap: only the line still being written is
|
|
235
|
+
* rebuilt, and the finished ones are shared by reference. */
|
|
236
|
+
snapshot(): AnsiDocument {
|
|
237
|
+
const live = flushLine(this._chars, this._attrs);
|
|
238
|
+
// A capture with no trailing newline still has a last line, and a log
|
|
239
|
+
// being tailed shows its tail. An empty one is not a line at all.
|
|
240
|
+
const hasLive = live.spans.length > 0;
|
|
241
|
+
// The line still being written counts against `maxLines`, because "keep
|
|
242
|
+
// the last hundred lines" means the hundred a reader sees. Eviction in
|
|
243
|
+
// `_pushLine` is what bounds the memory; this is what bounds the answer,
|
|
244
|
+
// and only the two differ by the one live line.
|
|
245
|
+
const room = hasLive ? this._maxLines - 1 : this._maxLines;
|
|
246
|
+
const skipped = Math.max(0, this._lines.length - room);
|
|
247
|
+
const lines =
|
|
248
|
+
skipped > 0 ? this._lines.slice(skipped) : this._lines.slice();
|
|
249
|
+
if (hasLive) lines.push(live);
|
|
250
|
+
return {
|
|
251
|
+
lines,
|
|
252
|
+
...(this._title === undefined ? null : { title: this._title }),
|
|
253
|
+
needsScreen: this._needsScreen,
|
|
254
|
+
dropped: { ...this._dropped },
|
|
255
|
+
truncated: this._truncated + skipped,
|
|
256
|
+
state: this,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
// --- the escape machine ---------------------------------------------------
|
|
261
|
+
|
|
262
|
+
private _feed(text: string): void {
|
|
263
|
+
const n = text.length;
|
|
264
|
+
let i = 0;
|
|
265
|
+
while (i < n) {
|
|
266
|
+
if (this._phase === GROUND) {
|
|
267
|
+
// The fast path: everything up to the next control character is text,
|
|
268
|
+
// and a build log is almost all text.
|
|
269
|
+
let j = i;
|
|
270
|
+
while (j < n) {
|
|
271
|
+
const c = text.charCodeAt(j);
|
|
272
|
+
if (c < 0x20 || c === 0x7f) break;
|
|
273
|
+
j++;
|
|
274
|
+
}
|
|
275
|
+
if (j > i) {
|
|
276
|
+
this._print(text.slice(i, j));
|
|
277
|
+
i = j;
|
|
278
|
+
continue;
|
|
279
|
+
}
|
|
280
|
+
this._control(text.charCodeAt(i));
|
|
281
|
+
i++;
|
|
282
|
+
continue;
|
|
283
|
+
}
|
|
284
|
+
this._step(text.charCodeAt(i), text[i]!);
|
|
285
|
+
i++;
|
|
286
|
+
}
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
private _control(c: number): void {
|
|
290
|
+
switch (c) {
|
|
291
|
+
case 0x08:
|
|
292
|
+
this._col = Math.max(0, this._col - 1);
|
|
293
|
+
break;
|
|
294
|
+
case 0x09:
|
|
295
|
+
this._col = Math.min(
|
|
296
|
+
MAX_COLUMN,
|
|
297
|
+
(Math.floor(this._col / this._tabWidth) + 1) * this._tabWidth,
|
|
298
|
+
);
|
|
299
|
+
break;
|
|
300
|
+
case 0x0a:
|
|
301
|
+
case 0x0b:
|
|
302
|
+
case 0x0c:
|
|
303
|
+
this._newline();
|
|
304
|
+
break;
|
|
305
|
+
case 0x0d:
|
|
306
|
+
this._col = 0;
|
|
307
|
+
break;
|
|
308
|
+
case 0x1b:
|
|
309
|
+
this._phase = ESC;
|
|
310
|
+
break;
|
|
311
|
+
default:
|
|
312
|
+
// BEL, SO/SI, DEL and the rest: consumed, and none of them changes
|
|
313
|
+
// anything this model holds.
|
|
314
|
+
break;
|
|
315
|
+
}
|
|
316
|
+
}
|
|
317
|
+
|
|
318
|
+
private _step(code: number, ch: string): void {
|
|
319
|
+
switch (this._phase) {
|
|
320
|
+
case ESC:
|
|
321
|
+
this._escape(ch);
|
|
322
|
+
break;
|
|
323
|
+
case CSI:
|
|
324
|
+
this._csi(code, ch);
|
|
325
|
+
break;
|
|
326
|
+
case OSC:
|
|
327
|
+
case STR:
|
|
328
|
+
this._stringByte(code, ch);
|
|
329
|
+
break;
|
|
330
|
+
case CHARSET:
|
|
331
|
+
// `ESC ( B` and its family: the designation byte, swallowed. Nothing
|
|
332
|
+
// here switches character sets — a capture is already Unicode by the
|
|
333
|
+
// time it reaches this parser.
|
|
334
|
+
this._phase = GROUND;
|
|
335
|
+
break;
|
|
336
|
+
default:
|
|
337
|
+
this._phase = GROUND;
|
|
338
|
+
break;
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
private _escape(ch: string): void {
|
|
343
|
+
switch (ch) {
|
|
344
|
+
case '[':
|
|
345
|
+
this._phase = CSI;
|
|
346
|
+
this._params = [];
|
|
347
|
+
this._group = [];
|
|
348
|
+
this._digits = '';
|
|
349
|
+
this._prefix = '';
|
|
350
|
+
return;
|
|
351
|
+
case ']':
|
|
352
|
+
this._phase = OSC;
|
|
353
|
+
this._string = '';
|
|
354
|
+
this._stringEsc = false;
|
|
355
|
+
return;
|
|
356
|
+
case 'P': // DCS — sixel arrives here
|
|
357
|
+
case 'X': // SOS
|
|
358
|
+
case '^': // PM
|
|
359
|
+
case '_': // APC
|
|
360
|
+
this._phase = STR;
|
|
361
|
+
this._string = '';
|
|
362
|
+
this._stringEsc = false;
|
|
363
|
+
return;
|
|
364
|
+
case '(':
|
|
365
|
+
case ')':
|
|
366
|
+
case '*':
|
|
367
|
+
case '+':
|
|
368
|
+
case '-':
|
|
369
|
+
case '.':
|
|
370
|
+
case '/':
|
|
371
|
+
case '#':
|
|
372
|
+
case '%':
|
|
373
|
+
case ' ':
|
|
374
|
+
this._phase = CHARSET;
|
|
375
|
+
return;
|
|
376
|
+
default:
|
|
377
|
+
break;
|
|
378
|
+
}
|
|
379
|
+
this._phase = GROUND;
|
|
380
|
+
switch (ch) {
|
|
381
|
+
case 'D': // IND — down one line
|
|
382
|
+
this._newline();
|
|
383
|
+
break;
|
|
384
|
+
case 'E': // NEL — down one line, column zero
|
|
385
|
+
this._newline();
|
|
386
|
+
break;
|
|
387
|
+
case 'M': // RI — *up* one line, which only a screen has
|
|
388
|
+
this._screen('RI');
|
|
389
|
+
break;
|
|
390
|
+
case '7':
|
|
391
|
+
case '8':
|
|
392
|
+
// DECSC/DECRC. Counted rather than flagged: a saved cursor restored
|
|
393
|
+
// inside one line is ordinary in progress renderers, and calling
|
|
394
|
+
// every capture that uses it "needs a screen" would cry wolf.
|
|
395
|
+
this._drop(ch === '7' ? 'DECSC' : 'DECRC');
|
|
396
|
+
break;
|
|
397
|
+
case 'c':
|
|
398
|
+
this._drop('RIS');
|
|
399
|
+
break;
|
|
400
|
+
case '\\': // ST with nothing open
|
|
401
|
+
case '=':
|
|
402
|
+
case '>':
|
|
403
|
+
break;
|
|
404
|
+
default:
|
|
405
|
+
this._drop('esc');
|
|
406
|
+
break;
|
|
407
|
+
}
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
private _csi(code: number, ch: string): void {
|
|
411
|
+
if (code >= 0x30 && code <= 0x39) {
|
|
412
|
+
this._digits += ch;
|
|
413
|
+
return;
|
|
414
|
+
}
|
|
415
|
+
if (code === 0x3a) {
|
|
416
|
+
this._group.push(this._value());
|
|
417
|
+
return;
|
|
418
|
+
}
|
|
419
|
+
if (code === 0x3b) {
|
|
420
|
+
this._group.push(this._value());
|
|
421
|
+
this._params.push(this._group);
|
|
422
|
+
this._group = [];
|
|
423
|
+
return;
|
|
424
|
+
}
|
|
425
|
+
if (code >= 0x3c && code <= 0x3f) {
|
|
426
|
+
// `?`, `<`, `=`, `>`: the private marker, and only legal before any
|
|
427
|
+
// parameter — a stray one later is the capture's problem, not ours.
|
|
428
|
+
this._prefix += ch;
|
|
429
|
+
return;
|
|
430
|
+
}
|
|
431
|
+
if (code >= 0x20 && code <= 0x2f) {
|
|
432
|
+
// An intermediate byte. Nothing dispatched below takes one, so the only
|
|
433
|
+
// thing it changes is that the final is not what it would otherwise be.
|
|
434
|
+
this._prefix += ch;
|
|
435
|
+
return;
|
|
436
|
+
}
|
|
437
|
+
if (code >= 0x40 && code <= 0x7e) {
|
|
438
|
+
this._group.push(this._value());
|
|
439
|
+
this._params.push(this._group);
|
|
440
|
+
this._group = [];
|
|
441
|
+
this._phase = GROUND;
|
|
442
|
+
this._dispatch(ch);
|
|
443
|
+
return;
|
|
444
|
+
}
|
|
445
|
+
if (code === 0x18 || code === 0x1a) {
|
|
446
|
+
// CAN/SUB abort the sequence, which is the one way a program says
|
|
447
|
+
// "ignore what I just started".
|
|
448
|
+
this._phase = GROUND;
|
|
449
|
+
return;
|
|
450
|
+
}
|
|
451
|
+
// A C0 inside a CSI is executed and the sequence continues, which is what
|
|
452
|
+
// makes `\e[1;\n31m` behave the way a terminal behaves.
|
|
453
|
+
if (code < 0x20) this._control(code);
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
private _value(): number {
|
|
457
|
+
if (!this._digits) return ABSENT;
|
|
458
|
+
const n = Number.parseInt(this._digits, 10);
|
|
459
|
+
this._digits = '';
|
|
460
|
+
return Number.isFinite(n) ? n : ABSENT;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
private _dispatch(final: string): void {
|
|
464
|
+
const params = this._params;
|
|
465
|
+
const at = (i: number, dflt: number): number => param(params, i, dflt);
|
|
466
|
+
const positive = (i: number): number =>
|
|
467
|
+
Math.max(1, Math.min(MAX_COLUMN, at(i, 1)));
|
|
468
|
+
|
|
469
|
+
if (this._prefix) {
|
|
470
|
+
this._private(final, at(0, 0));
|
|
471
|
+
return;
|
|
472
|
+
}
|
|
473
|
+
|
|
474
|
+
switch (final) {
|
|
475
|
+
case 'm':
|
|
476
|
+
this._style.apply(params);
|
|
477
|
+
return;
|
|
478
|
+
case 'K':
|
|
479
|
+
this._eraseLine(at(0, 0));
|
|
480
|
+
return;
|
|
481
|
+
case 'C': // CUF
|
|
482
|
+
case 'a': // HPR
|
|
483
|
+
this._col = Math.min(MAX_COLUMN, this._col + positive(0));
|
|
484
|
+
return;
|
|
485
|
+
case 'D': // CUB
|
|
486
|
+
this._col = Math.max(0, this._col - positive(0));
|
|
487
|
+
return;
|
|
488
|
+
case 'G': // CHA
|
|
489
|
+
case '`': // HPA
|
|
490
|
+
// Column-absolute *within a line* is the one addressing sequence a
|
|
491
|
+
// flow model answers exactly, so it is honoured rather than flagged.
|
|
492
|
+
this._col = Math.max(0, Math.min(MAX_COLUMN, at(0, 1) - 1));
|
|
493
|
+
return;
|
|
494
|
+
case 'E': // CNL — down n lines, column zero. In a document, n newlines.
|
|
495
|
+
for (let i = 0; i < positive(0); i++) this._newline();
|
|
496
|
+
return;
|
|
497
|
+
case 'Z': // CBT
|
|
498
|
+
this._col = Math.max(
|
|
499
|
+
0,
|
|
500
|
+
(Math.ceil(this._col / this._tabWidth) - positive(0)) *
|
|
501
|
+
this._tabWidth,
|
|
502
|
+
);
|
|
503
|
+
return;
|
|
504
|
+
case 'X': // ECH
|
|
505
|
+
this._eraseChars(positive(0));
|
|
506
|
+
return;
|
|
507
|
+
case 'P': // DCH
|
|
508
|
+
this._deleteChars(positive(0));
|
|
509
|
+
return;
|
|
510
|
+
case '@': // ICH
|
|
511
|
+
this._insertBlanks(positive(0));
|
|
512
|
+
return;
|
|
513
|
+
case 'b': // REP
|
|
514
|
+
if (this._lastPrinted) {
|
|
515
|
+
const attrs = this._style.attrs();
|
|
516
|
+
for (let i = 0; i < positive(0); i++)
|
|
517
|
+
this._put(this._lastPrinted, attrs);
|
|
518
|
+
}
|
|
519
|
+
return;
|
|
520
|
+
case 'H':
|
|
521
|
+
case 'f':
|
|
522
|
+
this._screen('CUP');
|
|
523
|
+
return;
|
|
524
|
+
case 'A':
|
|
525
|
+
this._screen('CUU');
|
|
526
|
+
return;
|
|
527
|
+
case 'B':
|
|
528
|
+
this._screen('CUD');
|
|
529
|
+
return;
|
|
530
|
+
case 'F':
|
|
531
|
+
this._screen('CPL');
|
|
532
|
+
return;
|
|
533
|
+
case 'd':
|
|
534
|
+
this._screen('VPA');
|
|
535
|
+
return;
|
|
536
|
+
case 'J':
|
|
537
|
+
this._screen('ED');
|
|
538
|
+
return;
|
|
539
|
+
case 'L':
|
|
540
|
+
this._screen('IL');
|
|
541
|
+
return;
|
|
542
|
+
case 'M':
|
|
543
|
+
this._screen('DL');
|
|
544
|
+
return;
|
|
545
|
+
case 'S':
|
|
546
|
+
this._screen('SU');
|
|
547
|
+
return;
|
|
548
|
+
case 'T':
|
|
549
|
+
this._screen('SD');
|
|
550
|
+
return;
|
|
551
|
+
case 'r':
|
|
552
|
+
this._screen('DECSTBM');
|
|
553
|
+
return;
|
|
554
|
+
case 'n':
|
|
555
|
+
case 'c':
|
|
556
|
+
// A query. Nothing can answer it: a capture is not a conversation.
|
|
557
|
+
this._drop('query');
|
|
558
|
+
return;
|
|
559
|
+
case 'h':
|
|
560
|
+
case 'l':
|
|
561
|
+
this._drop('mode');
|
|
562
|
+
return;
|
|
563
|
+
case 's':
|
|
564
|
+
case 'u':
|
|
565
|
+
this._drop(final === 's' ? 'SCOSC' : 'SCORC');
|
|
566
|
+
return;
|
|
567
|
+
case 't':
|
|
568
|
+
this._drop('window-op');
|
|
569
|
+
return;
|
|
570
|
+
default:
|
|
571
|
+
this._drop('csi');
|
|
572
|
+
return;
|
|
573
|
+
}
|
|
574
|
+
}
|
|
575
|
+
|
|
576
|
+
private _private(final: string, first: number): void {
|
|
577
|
+
if (final !== 'h' && final !== 'l') {
|
|
578
|
+
this._drop('csi-private');
|
|
579
|
+
return;
|
|
580
|
+
}
|
|
581
|
+
// 1049/1047/47 are the alternate screen, and a program that took it drew
|
|
582
|
+
// a screen by definition.
|
|
583
|
+
if (first === 1049 || first === 1047 || first === 47) {
|
|
584
|
+
this._screen('alt-screen');
|
|
585
|
+
return;
|
|
586
|
+
}
|
|
587
|
+
// Cursor visibility, bracketed paste, mouse tracking, focus reporting:
|
|
588
|
+
// all real, none of them visible in a static render.
|
|
589
|
+
this._drop('dec-mode');
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
// --- OSC and the string sequences -----------------------------------------
|
|
593
|
+
|
|
594
|
+
private _stringByte(code: number, ch: string): void {
|
|
595
|
+
if (this._stringEsc) {
|
|
596
|
+
this._stringEsc = false;
|
|
597
|
+
if (ch === '\\') {
|
|
598
|
+
this._endString();
|
|
599
|
+
return;
|
|
600
|
+
}
|
|
601
|
+
// An ESC that was not ST aborts the string, exactly as it does in a
|
|
602
|
+
// terminal — otherwise one dropped byte swallows the rest of the log.
|
|
603
|
+
this._phase = GROUND;
|
|
604
|
+
this._escape(ch);
|
|
605
|
+
return;
|
|
606
|
+
}
|
|
607
|
+
if (code === 0x1b) {
|
|
608
|
+
this._stringEsc = true;
|
|
609
|
+
return;
|
|
610
|
+
}
|
|
611
|
+
if (code === 0x07) {
|
|
612
|
+
this._endString();
|
|
613
|
+
return;
|
|
614
|
+
}
|
|
615
|
+
if (code < 0x20) {
|
|
616
|
+
// A C0 other than BEL/ESC ends an OSC in xterm. Ending is the safe
|
|
617
|
+
// reading: the alternative is swallowing the rest of the capture.
|
|
618
|
+
this._endString();
|
|
619
|
+
this._control(code);
|
|
620
|
+
return;
|
|
621
|
+
}
|
|
622
|
+
if (this._string.length < MAX_STRING) this._string += ch;
|
|
623
|
+
}
|
|
624
|
+
|
|
625
|
+
private _endString(): void {
|
|
626
|
+
const phase = this._phase;
|
|
627
|
+
const payload = this._string;
|
|
628
|
+
this._string = '';
|
|
629
|
+
this._phase = GROUND;
|
|
630
|
+
if (phase === STR) {
|
|
631
|
+
// DCS and friends. Sixel lives here, and a sixel is an image this
|
|
632
|
+
// component does not decode — recognised, consumed, counted.
|
|
633
|
+
this._drop(/^[\d;]*q/.test(payload) ? 'sixel' : 'dcs');
|
|
634
|
+
return;
|
|
635
|
+
}
|
|
636
|
+
const split = payload.indexOf(';');
|
|
637
|
+
const id = split < 0 ? payload : payload.slice(0, split);
|
|
638
|
+
const rest = split < 0 ? '' : payload.slice(split + 1);
|
|
639
|
+
switch (id) {
|
|
640
|
+
case '0':
|
|
641
|
+
case '2':
|
|
642
|
+
this._title = rest;
|
|
643
|
+
return;
|
|
644
|
+
case '1':
|
|
645
|
+
// The icon name. Real, and nothing here has an icon.
|
|
646
|
+
return;
|
|
647
|
+
case '8': {
|
|
648
|
+
// `OSC 8 ; params ; URI ST`, and an empty URI closes.
|
|
649
|
+
const uriAt = rest.indexOf(';');
|
|
650
|
+
const uri = uriAt < 0 ? '' : rest.slice(uriAt + 1);
|
|
651
|
+
this._style.setHref(uri || undefined);
|
|
652
|
+
return;
|
|
653
|
+
}
|
|
654
|
+
case '52':
|
|
655
|
+
// A recorded clipboard write. Recording one is not performing one.
|
|
656
|
+
this._drop('osc-52');
|
|
657
|
+
return;
|
|
658
|
+
case '4':
|
|
659
|
+
case '10':
|
|
660
|
+
case '11':
|
|
661
|
+
case '12':
|
|
662
|
+
case '104':
|
|
663
|
+
case '110':
|
|
664
|
+
case '111':
|
|
665
|
+
case '112':
|
|
666
|
+
this._drop('osc-palette');
|
|
667
|
+
return;
|
|
668
|
+
default:
|
|
669
|
+
this._drop('osc');
|
|
670
|
+
return;
|
|
671
|
+
}
|
|
672
|
+
}
|
|
673
|
+
|
|
674
|
+
// --- the line buffer ------------------------------------------------------
|
|
675
|
+
|
|
676
|
+
private _print(text: string): void {
|
|
677
|
+
const attrs = this._style.attrs();
|
|
678
|
+
for (const ch of text) {
|
|
679
|
+
const cp = ch.codePointAt(0)!;
|
|
680
|
+
const joins = this._joinNext || joinsPrevious(cp, ch);
|
|
681
|
+
this._joinNext = cp === ZWJ;
|
|
682
|
+
if (joins && this._col > 0) {
|
|
683
|
+
const at = this._col - 1;
|
|
684
|
+
this._chars[at] = (this._chars[at] ?? ' ') + ch;
|
|
685
|
+
this._lastPrinted = this._chars[at]!;
|
|
686
|
+
continue;
|
|
687
|
+
}
|
|
688
|
+
this._put(ch, attrs);
|
|
689
|
+
}
|
|
690
|
+
}
|
|
691
|
+
|
|
692
|
+
private _put(ch: string, attrs: AnsiAttrs): void {
|
|
693
|
+
const col = this._col;
|
|
694
|
+
if (col >= MAX_COLUMN) return;
|
|
695
|
+
// A gap opened by CUF or HPA is blank on the screen, so it is blank here.
|
|
696
|
+
for (let i = this._chars.length; i < col; i++) {
|
|
697
|
+
this._chars[i] = ' ';
|
|
698
|
+
this._attrs[i] = PLAIN;
|
|
699
|
+
}
|
|
700
|
+
this._chars[col] = ch;
|
|
701
|
+
this._attrs[col] = attrs;
|
|
702
|
+
this._col = col + 1;
|
|
703
|
+
this._lastPrinted = ch;
|
|
704
|
+
}
|
|
705
|
+
|
|
706
|
+
private _newline(): void {
|
|
707
|
+
this._pushLine(flushLine(this._chars, this._attrs));
|
|
708
|
+
this._chars = [];
|
|
709
|
+
this._attrs = [];
|
|
710
|
+
this._col = 0;
|
|
711
|
+
this._joinNext = false;
|
|
712
|
+
}
|
|
713
|
+
|
|
714
|
+
private _pushLine(line: AnsiLine): void {
|
|
715
|
+
this._lines.push(line);
|
|
716
|
+
if (this._lines.length > this._maxLines) {
|
|
717
|
+
const excess = this._lines.length - this._maxLines;
|
|
718
|
+
this._lines.splice(0, excess);
|
|
719
|
+
this._truncated += excess;
|
|
720
|
+
}
|
|
721
|
+
}
|
|
722
|
+
|
|
723
|
+
private _eraseLine(mode: number): void {
|
|
724
|
+
if (mode === 1) {
|
|
725
|
+
const attrs = this._style.attrs();
|
|
726
|
+
const end = Math.min(
|
|
727
|
+
this._col + 1,
|
|
728
|
+
Math.max(this._chars.length, this._col + 1),
|
|
729
|
+
);
|
|
730
|
+
for (let i = 0; i < end; i++) {
|
|
731
|
+
this._chars[i] = ' ';
|
|
732
|
+
this._attrs[i] = attrs;
|
|
733
|
+
}
|
|
734
|
+
return;
|
|
735
|
+
}
|
|
736
|
+
// 0 truncates from the head, 2 clears the row. In a document both are the
|
|
737
|
+
// same statement — there is nothing past the head but what a `\r` rewind
|
|
738
|
+
// left, and erasing it is exactly what the sequence is for.
|
|
739
|
+
const from = mode === 2 ? 0 : this._col;
|
|
740
|
+
this._chars.length = Math.min(this._chars.length, from);
|
|
741
|
+
this._attrs.length = Math.min(this._attrs.length, from);
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
private _eraseChars(n: number): void {
|
|
745
|
+
const attrs = this._style.attrs();
|
|
746
|
+
const end = Math.min(this._chars.length, this._col + n);
|
|
747
|
+
for (let i = this._col; i < end; i++) {
|
|
748
|
+
this._chars[i] = ' ';
|
|
749
|
+
this._attrs[i] = attrs;
|
|
750
|
+
}
|
|
751
|
+
}
|
|
752
|
+
|
|
753
|
+
private _deleteChars(n: number): void {
|
|
754
|
+
if (this._col >= this._chars.length) return;
|
|
755
|
+
this._chars.splice(this._col, n);
|
|
756
|
+
this._attrs.splice(this._col, n);
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
private _insertBlanks(n: number): void {
|
|
760
|
+
if (this._col > this._chars.length) return;
|
|
761
|
+
const attrs = this._style.attrs();
|
|
762
|
+
const blanks = new Array<string>(n).fill(' ');
|
|
763
|
+
this._chars.splice(this._col, 0, ...blanks);
|
|
764
|
+
this._attrs.splice(this._col, 0, ...new Array<AnsiAttrs>(n).fill(attrs));
|
|
765
|
+
}
|
|
766
|
+
|
|
767
|
+
// --- what could not be honoured -------------------------------------------
|
|
768
|
+
|
|
769
|
+
private _drop(name: string): void {
|
|
770
|
+
this._dropped[name] = (this._dropped[name] ?? 0) + 1;
|
|
771
|
+
}
|
|
772
|
+
|
|
773
|
+
/** Dropped, and it is the kind of sequence that means the capture wanted a
|
|
774
|
+
* real screen. Both, always: `needsScreen` says which renderer to use and
|
|
775
|
+
* `dropped` says what it cost to use the other one. */
|
|
776
|
+
private _screen(name: string): void {
|
|
777
|
+
this._needsScreen = true;
|
|
778
|
+
this._drop(name);
|
|
779
|
+
}
|
|
780
|
+
}
|