@wendongfly/myhi 1.0.2 → 1.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/dist/index.js +1 -1
  2. package/dist/lib/xterm/LICENSE +21 -0
  3. package/dist/lib/xterm/README.md +225 -0
  4. package/dist/lib/xterm/css/xterm.css +190 -0
  5. package/dist/lib/xterm/lib/xterm.js +2 -0
  6. package/dist/lib/xterm/lib/xterm.js.map +1 -0
  7. package/dist/lib/xterm/package.json +90 -0
  8. package/dist/lib/xterm/src/browser/AccessibilityManager.ts +301 -0
  9. package/dist/lib/xterm/src/browser/Clipboard.ts +99 -0
  10. package/dist/lib/xterm/src/browser/ColorContrastCache.ts +39 -0
  11. package/dist/lib/xterm/src/browser/ColorManager.ts +268 -0
  12. package/dist/lib/xterm/src/browser/Dom.ts +10 -0
  13. package/dist/lib/xterm/src/browser/Lifecycle.ts +30 -0
  14. package/dist/lib/xterm/src/browser/Linkifier.ts +356 -0
  15. package/dist/lib/xterm/src/browser/Linkifier2.ts +397 -0
  16. package/dist/lib/xterm/src/browser/LocalizableStrings.ts +10 -0
  17. package/dist/lib/xterm/src/browser/MouseZoneManager.ts +236 -0
  18. package/dist/lib/xterm/src/browser/RenderDebouncer.ts +82 -0
  19. package/dist/lib/xterm/src/browser/ScreenDprMonitor.ts +69 -0
  20. package/dist/lib/xterm/src/browser/Terminal.ts +1447 -0
  21. package/dist/lib/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
  22. package/dist/lib/xterm/src/browser/Types.d.ts +317 -0
  23. package/dist/lib/xterm/src/browser/Viewport.ts +276 -0
  24. package/dist/lib/xterm/src/browser/decorations/BufferDecorationRenderer.ts +131 -0
  25. package/dist/lib/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
  26. package/dist/lib/xterm/src/browser/decorations/OverviewRulerRenderer.ts +228 -0
  27. package/dist/lib/xterm/src/browser/input/CompositionHelper.ts +237 -0
  28. package/dist/lib/xterm/src/browser/input/Mouse.ts +64 -0
  29. package/dist/lib/xterm/src/browser/input/MoveToCell.ts +249 -0
  30. package/dist/lib/xterm/src/browser/public/Terminal.ts +298 -0
  31. package/dist/lib/xterm/src/browser/renderer/BaseRenderLayer.ts +582 -0
  32. package/dist/lib/xterm/src/browser/renderer/CursorRenderLayer.ts +378 -0
  33. package/dist/lib/xterm/src/browser/renderer/CustomGlyphs.ts +632 -0
  34. package/dist/lib/xterm/src/browser/renderer/GridCache.ts +33 -0
  35. package/dist/lib/xterm/src/browser/renderer/LinkRenderLayer.ts +84 -0
  36. package/dist/lib/xterm/src/browser/renderer/Renderer.ts +219 -0
  37. package/dist/lib/xterm/src/browser/renderer/RendererUtils.ts +26 -0
  38. package/dist/lib/xterm/src/browser/renderer/SelectionRenderLayer.ts +131 -0
  39. package/dist/lib/xterm/src/browser/renderer/TextRenderLayer.ts +344 -0
  40. package/dist/lib/xterm/src/browser/renderer/Types.d.ts +109 -0
  41. package/dist/lib/xterm/src/browser/renderer/atlas/BaseCharAtlas.ts +58 -0
  42. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasCache.ts +95 -0
  43. package/dist/lib/xterm/src/browser/renderer/atlas/CharAtlasUtils.ts +54 -0
  44. package/dist/lib/xterm/src/browser/renderer/atlas/Constants.ts +15 -0
  45. package/dist/lib/xterm/src/browser/renderer/atlas/DynamicCharAtlas.ts +404 -0
  46. package/dist/lib/xterm/src/browser/renderer/atlas/LRUMap.ts +136 -0
  47. package/dist/lib/xterm/src/browser/renderer/atlas/Types.d.ts +29 -0
  48. package/dist/lib/xterm/src/browser/renderer/dom/DomRenderer.ts +403 -0
  49. package/dist/lib/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +344 -0
  50. package/dist/lib/xterm/src/browser/selection/SelectionModel.ts +144 -0
  51. package/dist/lib/xterm/src/browser/selection/Types.d.ts +15 -0
  52. package/dist/lib/xterm/src/browser/services/CharSizeService.ts +87 -0
  53. package/dist/lib/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
  54. package/dist/lib/xterm/src/browser/services/CoreBrowserService.ts +20 -0
  55. package/dist/lib/xterm/src/browser/services/MouseService.ts +36 -0
  56. package/dist/lib/xterm/src/browser/services/RenderService.ts +237 -0
  57. package/dist/lib/xterm/src/browser/services/SelectionService.ts +1027 -0
  58. package/dist/lib/xterm/src/browser/services/Services.ts +123 -0
  59. package/dist/lib/xterm/src/browser/services/SoundService.ts +63 -0
  60. package/dist/lib/xterm/src/common/CircularList.ts +239 -0
  61. package/dist/lib/xterm/src/common/Clone.ts +23 -0
  62. package/dist/lib/xterm/src/common/Color.ts +285 -0
  63. package/dist/lib/xterm/src/common/CoreTerminal.ts +300 -0
  64. package/dist/lib/xterm/src/common/EventEmitter.ts +69 -0
  65. package/dist/lib/xterm/src/common/InputHandler.ts +3230 -0
  66. package/dist/lib/xterm/src/common/Lifecycle.ts +68 -0
  67. package/dist/lib/xterm/src/common/Platform.ts +31 -0
  68. package/dist/lib/xterm/src/common/SortedList.ts +88 -0
  69. package/dist/lib/xterm/src/common/TypedArrayUtils.ts +50 -0
  70. package/dist/lib/xterm/src/common/Types.d.ts +489 -0
  71. package/dist/lib/xterm/src/common/WindowsMode.ts +27 -0
  72. package/dist/lib/xterm/src/common/buffer/AttributeData.ts +148 -0
  73. package/dist/lib/xterm/src/common/buffer/Buffer.ts +711 -0
  74. package/dist/lib/xterm/src/common/buffer/BufferLine.ts +441 -0
  75. package/dist/lib/xterm/src/common/buffer/BufferRange.ts +13 -0
  76. package/dist/lib/xterm/src/common/buffer/BufferReflow.ts +220 -0
  77. package/dist/lib/xterm/src/common/buffer/BufferSet.ts +131 -0
  78. package/dist/lib/xterm/src/common/buffer/CellData.ts +94 -0
  79. package/dist/lib/xterm/src/common/buffer/Constants.ts +139 -0
  80. package/dist/lib/xterm/src/common/buffer/Marker.ts +37 -0
  81. package/dist/lib/xterm/src/common/buffer/Types.d.ts +64 -0
  82. package/dist/lib/xterm/src/common/data/Charsets.ts +256 -0
  83. package/dist/lib/xterm/src/common/data/EscapeSequences.ts +153 -0
  84. package/dist/lib/xterm/src/common/input/Keyboard.ts +398 -0
  85. package/dist/lib/xterm/src/common/input/TextDecoder.ts +346 -0
  86. package/dist/lib/xterm/src/common/input/UnicodeV6.ts +133 -0
  87. package/dist/lib/xterm/src/common/input/WriteBuffer.ts +229 -0
  88. package/dist/lib/xterm/src/common/input/XParseColor.ts +80 -0
  89. package/dist/lib/xterm/src/common/parser/Constants.ts +58 -0
  90. package/dist/lib/xterm/src/common/parser/DcsParser.ts +192 -0
  91. package/dist/lib/xterm/src/common/parser/EscapeSequenceParser.ts +796 -0
  92. package/dist/lib/xterm/src/common/parser/OscParser.ts +238 -0
  93. package/dist/lib/xterm/src/common/parser/Params.ts +229 -0
  94. package/dist/lib/xterm/src/common/parser/Types.d.ts +274 -0
  95. package/dist/lib/xterm/src/common/public/AddonManager.ts +56 -0
  96. package/dist/lib/xterm/src/common/public/BufferApiView.ts +35 -0
  97. package/dist/lib/xterm/src/common/public/BufferLineApiView.ts +29 -0
  98. package/dist/lib/xterm/src/common/public/BufferNamespaceApi.ts +33 -0
  99. package/dist/lib/xterm/src/common/public/ParserApi.ts +37 -0
  100. package/dist/lib/xterm/src/common/public/UnicodeApi.ts +27 -0
  101. package/dist/lib/xterm/src/common/services/BufferService.ts +185 -0
  102. package/dist/lib/xterm/src/common/services/CharsetService.ts +34 -0
  103. package/dist/lib/xterm/src/common/services/CoreMouseService.ts +309 -0
  104. package/dist/lib/xterm/src/common/services/CoreService.ts +92 -0
  105. package/dist/lib/xterm/src/common/services/DecorationService.ts +139 -0
  106. package/dist/lib/xterm/src/common/services/DirtyRowService.ts +53 -0
  107. package/dist/lib/xterm/src/common/services/InstantiationService.ts +83 -0
  108. package/dist/lib/xterm/src/common/services/LogService.ts +88 -0
  109. package/dist/lib/xterm/src/common/services/OptionsService.ts +178 -0
  110. package/dist/lib/xterm/src/common/services/ServiceRegistry.ts +49 -0
  111. package/dist/lib/xterm/src/common/services/Services.ts +323 -0
  112. package/dist/lib/xterm/src/common/services/UnicodeService.ts +82 -0
  113. package/dist/lib/xterm/src/headless/Terminal.ts +170 -0
  114. package/dist/lib/xterm/src/headless/Types.d.ts +31 -0
  115. package/dist/lib/xterm/src/headless/public/Terminal.ts +216 -0
  116. package/dist/lib/xterm/typings/xterm.d.ts +1872 -0
  117. package/dist/lib/xterm-fit/LICENSE +19 -0
  118. package/dist/lib/xterm-fit/README.md +24 -0
  119. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js +2 -0
  120. package/dist/lib/xterm-fit/lib/xterm-addon-fit.js.map +1 -0
  121. package/dist/lib/xterm-fit/out/FitAddon.js +58 -0
  122. package/dist/lib/xterm-fit/out/FitAddon.js.map +1 -0
  123. package/dist/lib/xterm-fit/out-test/FitAddon.api.js.map +1 -0
  124. package/dist/lib/xterm-fit/package.json +21 -0
  125. package/dist/lib/xterm-fit/src/FitAddon.ts +86 -0
  126. package/dist/lib/xterm-fit/typings/xterm-addon-fit.d.ts +55 -0
  127. package/dist/lib/xterm-links/LICENSE +19 -0
  128. package/dist/lib/xterm-links/README.md +21 -0
  129. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js +2 -0
  130. package/dist/lib/xterm-links/lib/xterm-addon-web-links.js.map +1 -0
  131. package/dist/lib/xterm-links/package.json +26 -0
  132. package/dist/lib/xterm-links/src/WebLinkProvider.ts +145 -0
  133. package/dist/lib/xterm-links/src/WebLinksAddon.ts +77 -0
  134. package/dist/lib/xterm-links/typings/xterm-addon-web-links.d.ts +58 -0
  135. package/package.json +1 -1
@@ -0,0 +1,796 @@
1
+ /**
2
+ * Copyright (c) 2018 The xterm.js authors. All rights reserved.
3
+ * @license MIT
4
+ */
5
+
6
+ import { IParsingState, IDcsHandler, IEscapeSequenceParser, IParams, IOscHandler, IHandlerCollection, CsiHandlerType, OscFallbackHandlerType, IOscParser, EscHandlerType, IDcsParser, DcsFallbackHandlerType, IFunctionIdentifier, ExecuteFallbackHandlerType, CsiFallbackHandlerType, EscFallbackHandlerType, PrintHandlerType, PrintFallbackHandlerType, ExecuteHandlerType, IParserStackState, ParserStackType, ResumableHandlersType } from 'common/parser/Types';
7
+ import { ParserState, ParserAction } from 'common/parser/Constants';
8
+ import { Disposable } from 'common/Lifecycle';
9
+ import { IDisposable } from 'common/Types';
10
+ import { fill } from 'common/TypedArrayUtils';
11
+ import { Params } from 'common/parser/Params';
12
+ import { OscParser } from 'common/parser/OscParser';
13
+ import { DcsParser } from 'common/parser/DcsParser';
14
+
15
+ /**
16
+ * Table values are generated like this:
17
+ * index: currentState << TableValue.INDEX_STATE_SHIFT | charCode
18
+ * value: action << TableValue.TRANSITION_ACTION_SHIFT | nextState
19
+ */
20
+ const enum TableAccess {
21
+ TRANSITION_ACTION_SHIFT = 4,
22
+ TRANSITION_STATE_MASK = 15,
23
+ INDEX_STATE_SHIFT = 8
24
+ }
25
+
26
+ /**
27
+ * Transition table for EscapeSequenceParser.
28
+ */
29
+ export class TransitionTable {
30
+ public table: Uint8Array;
31
+
32
+ constructor(length: number) {
33
+ this.table = new Uint8Array(length);
34
+ }
35
+
36
+ /**
37
+ * Set default transition.
38
+ * @param action default action
39
+ * @param next default next state
40
+ */
41
+ public setDefault(action: ParserAction, next: ParserState): void {
42
+ fill(this.table, action << TableAccess.TRANSITION_ACTION_SHIFT | next);
43
+ }
44
+
45
+ /**
46
+ * Add a transition to the transition table.
47
+ * @param code input character code
48
+ * @param state current parser state
49
+ * @param action parser action to be done
50
+ * @param next next parser state
51
+ */
52
+ public add(code: number, state: ParserState, action: ParserAction, next: ParserState): void {
53
+ this.table[state << TableAccess.INDEX_STATE_SHIFT | code] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;
54
+ }
55
+
56
+ /**
57
+ * Add transitions for multiple input character codes.
58
+ * @param codes input character code array
59
+ * @param state current parser state
60
+ * @param action parser action to be done
61
+ * @param next next parser state
62
+ */
63
+ public addMany(codes: number[], state: ParserState, action: ParserAction, next: ParserState): void {
64
+ for (let i = 0; i < codes.length; i++) {
65
+ this.table[state << TableAccess.INDEX_STATE_SHIFT | codes[i]] = action << TableAccess.TRANSITION_ACTION_SHIFT | next;
66
+ }
67
+ }
68
+ }
69
+
70
+
71
+ // Pseudo-character placeholder for printable non-ascii characters (unicode).
72
+ const NON_ASCII_PRINTABLE = 0xA0;
73
+
74
+
75
+ /**
76
+ * VT500 compatible transition table.
77
+ * Taken from https://vt100.net/emu/dec_ansi_parser.
78
+ */
79
+ export const VT500_TRANSITION_TABLE = (function (): TransitionTable {
80
+ const table: TransitionTable = new TransitionTable(4095);
81
+
82
+ // range macro for byte
83
+ const BYTE_VALUES = 256;
84
+ const blueprint = Array.apply(null, Array(BYTE_VALUES)).map((unused: any, i: number) => i);
85
+ const r = (start: number, end: number): number[] => blueprint.slice(start, end);
86
+
87
+ // Default definitions.
88
+ const PRINTABLES = r(0x20, 0x7f); // 0x20 (SP) included, 0x7F (DEL) excluded
89
+ const EXECUTABLES = r(0x00, 0x18);
90
+ EXECUTABLES.push(0x19);
91
+ EXECUTABLES.push.apply(EXECUTABLES, r(0x1c, 0x20));
92
+
93
+ const states: number[] = r(ParserState.GROUND, ParserState.DCS_PASSTHROUGH + 1);
94
+ let state: any;
95
+
96
+ // set default transition
97
+ table.setDefault(ParserAction.ERROR, ParserState.GROUND);
98
+ // printables
99
+ table.addMany(PRINTABLES, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);
100
+ // global anywhere rules
101
+ for (state in states) {
102
+ table.addMany([0x18, 0x1a, 0x99, 0x9a], state, ParserAction.EXECUTE, ParserState.GROUND);
103
+ table.addMany(r(0x80, 0x90), state, ParserAction.EXECUTE, ParserState.GROUND);
104
+ table.addMany(r(0x90, 0x98), state, ParserAction.EXECUTE, ParserState.GROUND);
105
+ table.add(0x9c, state, ParserAction.IGNORE, ParserState.GROUND); // ST as terminator
106
+ table.add(0x1b, state, ParserAction.CLEAR, ParserState.ESCAPE); // ESC
107
+ table.add(0x9d, state, ParserAction.OSC_START, ParserState.OSC_STRING); // OSC
108
+ table.addMany([0x98, 0x9e, 0x9f], state, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
109
+ table.add(0x9b, state, ParserAction.CLEAR, ParserState.CSI_ENTRY); // CSI
110
+ table.add(0x90, state, ParserAction.CLEAR, ParserState.DCS_ENTRY); // DCS
111
+ }
112
+ // rules for executables and 7f
113
+ table.addMany(EXECUTABLES, ParserState.GROUND, ParserAction.EXECUTE, ParserState.GROUND);
114
+ table.addMany(EXECUTABLES, ParserState.ESCAPE, ParserAction.EXECUTE, ParserState.ESCAPE);
115
+ table.add(0x7f, ParserState.ESCAPE, ParserAction.IGNORE, ParserState.ESCAPE);
116
+ table.addMany(EXECUTABLES, ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);
117
+ table.addMany(EXECUTABLES, ParserState.CSI_ENTRY, ParserAction.EXECUTE, ParserState.CSI_ENTRY);
118
+ table.add(0x7f, ParserState.CSI_ENTRY, ParserAction.IGNORE, ParserState.CSI_ENTRY);
119
+ table.addMany(EXECUTABLES, ParserState.CSI_PARAM, ParserAction.EXECUTE, ParserState.CSI_PARAM);
120
+ table.add(0x7f, ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_PARAM);
121
+ table.addMany(EXECUTABLES, ParserState.CSI_IGNORE, ParserAction.EXECUTE, ParserState.CSI_IGNORE);
122
+ table.addMany(EXECUTABLES, ParserState.CSI_INTERMEDIATE, ParserAction.EXECUTE, ParserState.CSI_INTERMEDIATE);
123
+ table.add(0x7f, ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_INTERMEDIATE);
124
+ table.addMany(EXECUTABLES, ParserState.ESCAPE_INTERMEDIATE, ParserAction.EXECUTE, ParserState.ESCAPE_INTERMEDIATE);
125
+ table.add(0x7f, ParserState.ESCAPE_INTERMEDIATE, ParserAction.IGNORE, ParserState.ESCAPE_INTERMEDIATE);
126
+ // osc
127
+ table.add(0x5d, ParserState.ESCAPE, ParserAction.OSC_START, ParserState.OSC_STRING);
128
+ table.addMany(PRINTABLES, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);
129
+ table.add(0x7f, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);
130
+ table.addMany([0x9c, 0x1b, 0x18, 0x1a, 0x07], ParserState.OSC_STRING, ParserAction.OSC_END, ParserState.GROUND);
131
+ table.addMany(r(0x1c, 0x20), ParserState.OSC_STRING, ParserAction.IGNORE, ParserState.OSC_STRING);
132
+ // sos/pm/apc does nothing
133
+ table.addMany([0x58, 0x5e, 0x5f], ParserState.ESCAPE, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
134
+ table.addMany(PRINTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
135
+ table.addMany(EXECUTABLES, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
136
+ table.add(0x9c, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.GROUND);
137
+ table.add(0x7f, ParserState.SOS_PM_APC_STRING, ParserAction.IGNORE, ParserState.SOS_PM_APC_STRING);
138
+ // csi entries
139
+ table.add(0x5b, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.CSI_ENTRY);
140
+ table.addMany(r(0x40, 0x7f), ParserState.CSI_ENTRY, ParserAction.CSI_DISPATCH, ParserState.GROUND);
141
+ table.addMany(r(0x30, 0x3c), ParserState.CSI_ENTRY, ParserAction.PARAM, ParserState.CSI_PARAM);
142
+ table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_PARAM);
143
+ table.addMany(r(0x30, 0x3c), ParserState.CSI_PARAM, ParserAction.PARAM, ParserState.CSI_PARAM);
144
+ table.addMany(r(0x40, 0x7f), ParserState.CSI_PARAM, ParserAction.CSI_DISPATCH, ParserState.GROUND);
145
+ table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.CSI_PARAM, ParserAction.IGNORE, ParserState.CSI_IGNORE);
146
+ table.addMany(r(0x20, 0x40), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);
147
+ table.add(0x7f, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);
148
+ table.addMany(r(0x40, 0x7f), ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.GROUND);
149
+ table.addMany(r(0x20, 0x30), ParserState.CSI_ENTRY, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);
150
+ table.addMany(r(0x20, 0x30), ParserState.CSI_INTERMEDIATE, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);
151
+ table.addMany(r(0x30, 0x40), ParserState.CSI_INTERMEDIATE, ParserAction.IGNORE, ParserState.CSI_IGNORE);
152
+ table.addMany(r(0x40, 0x7f), ParserState.CSI_INTERMEDIATE, ParserAction.CSI_DISPATCH, ParserState.GROUND);
153
+ table.addMany(r(0x20, 0x30), ParserState.CSI_PARAM, ParserAction.COLLECT, ParserState.CSI_INTERMEDIATE);
154
+ // esc_intermediate
155
+ table.addMany(r(0x20, 0x30), ParserState.ESCAPE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);
156
+ table.addMany(r(0x20, 0x30), ParserState.ESCAPE_INTERMEDIATE, ParserAction.COLLECT, ParserState.ESCAPE_INTERMEDIATE);
157
+ table.addMany(r(0x30, 0x7f), ParserState.ESCAPE_INTERMEDIATE, ParserAction.ESC_DISPATCH, ParserState.GROUND);
158
+ table.addMany(r(0x30, 0x50), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);
159
+ table.addMany(r(0x51, 0x58), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);
160
+ table.addMany([0x59, 0x5a, 0x5c], ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);
161
+ table.addMany(r(0x60, 0x7f), ParserState.ESCAPE, ParserAction.ESC_DISPATCH, ParserState.GROUND);
162
+ // dcs entry
163
+ table.add(0x50, ParserState.ESCAPE, ParserAction.CLEAR, ParserState.DCS_ENTRY);
164
+ table.addMany(EXECUTABLES, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);
165
+ table.add(0x7f, ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);
166
+ table.addMany(r(0x1c, 0x20), ParserState.DCS_ENTRY, ParserAction.IGNORE, ParserState.DCS_ENTRY);
167
+ table.addMany(r(0x20, 0x30), ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);
168
+ table.addMany(r(0x30, 0x3c), ParserState.DCS_ENTRY, ParserAction.PARAM, ParserState.DCS_PARAM);
169
+ table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_ENTRY, ParserAction.COLLECT, ParserState.DCS_PARAM);
170
+ table.addMany(EXECUTABLES, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
171
+ table.addMany(r(0x20, 0x80), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
172
+ table.addMany(r(0x1c, 0x20), ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
173
+ table.addMany(EXECUTABLES, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);
174
+ table.add(0x7f, ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);
175
+ table.addMany(r(0x1c, 0x20), ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_PARAM);
176
+ table.addMany(r(0x30, 0x3c), ParserState.DCS_PARAM, ParserAction.PARAM, ParserState.DCS_PARAM);
177
+ table.addMany([0x3c, 0x3d, 0x3e, 0x3f], ParserState.DCS_PARAM, ParserAction.IGNORE, ParserState.DCS_IGNORE);
178
+ table.addMany(r(0x20, 0x30), ParserState.DCS_PARAM, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);
179
+ table.addMany(EXECUTABLES, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);
180
+ table.add(0x7f, ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);
181
+ table.addMany(r(0x1c, 0x20), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_INTERMEDIATE);
182
+ table.addMany(r(0x20, 0x30), ParserState.DCS_INTERMEDIATE, ParserAction.COLLECT, ParserState.DCS_INTERMEDIATE);
183
+ table.addMany(r(0x30, 0x40), ParserState.DCS_INTERMEDIATE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
184
+ table.addMany(r(0x40, 0x7f), ParserState.DCS_INTERMEDIATE, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);
185
+ table.addMany(r(0x40, 0x7f), ParserState.DCS_PARAM, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);
186
+ table.addMany(r(0x40, 0x7f), ParserState.DCS_ENTRY, ParserAction.DCS_HOOK, ParserState.DCS_PASSTHROUGH);
187
+ table.addMany(EXECUTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);
188
+ table.addMany(PRINTABLES, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);
189
+ table.add(0x7f, ParserState.DCS_PASSTHROUGH, ParserAction.IGNORE, ParserState.DCS_PASSTHROUGH);
190
+ table.addMany([0x1b, 0x9c, 0x18, 0x1a], ParserState.DCS_PASSTHROUGH, ParserAction.DCS_UNHOOK, ParserState.GROUND);
191
+ // special handling of unicode chars
192
+ table.add(NON_ASCII_PRINTABLE, ParserState.GROUND, ParserAction.PRINT, ParserState.GROUND);
193
+ table.add(NON_ASCII_PRINTABLE, ParserState.OSC_STRING, ParserAction.OSC_PUT, ParserState.OSC_STRING);
194
+ table.add(NON_ASCII_PRINTABLE, ParserState.CSI_IGNORE, ParserAction.IGNORE, ParserState.CSI_IGNORE);
195
+ table.add(NON_ASCII_PRINTABLE, ParserState.DCS_IGNORE, ParserAction.IGNORE, ParserState.DCS_IGNORE);
196
+ table.add(NON_ASCII_PRINTABLE, ParserState.DCS_PASSTHROUGH, ParserAction.DCS_PUT, ParserState.DCS_PASSTHROUGH);
197
+ return table;
198
+ })();
199
+
200
+
201
+ /**
202
+ * EscapeSequenceParser.
203
+ * This class implements the ANSI/DEC compatible parser described by
204
+ * Paul Williams (https://vt100.net/emu/dec_ansi_parser).
205
+ *
206
+ * To implement custom ANSI compliant escape sequences it is not needed to
207
+ * alter this parser, instead consider registering a custom handler.
208
+ * For non ANSI compliant sequences change the transition table with
209
+ * the optional `transitions` constructor argument and
210
+ * reimplement the `parse` method.
211
+ *
212
+ * This parser is currently hardcoded to operate in ZDM (Zero Default Mode)
213
+ * as suggested by the original parser, thus empty parameters are set to 0.
214
+ * This this is not in line with the latest ECMA-48 specification
215
+ * (ZDM was part of the early specs and got completely removed later on).
216
+ *
217
+ * Other than the original parser from vt100.net this parser supports
218
+ * sub parameters in digital parameters separated by colons. Empty sub parameters
219
+ * are set to -1 (no ZDM for sub parameters).
220
+ *
221
+ * About prefix and intermediate bytes:
222
+ * This parser follows the assumptions of the vt100.net parser with these restrictions:
223
+ * - only one prefix byte is allowed as first parameter byte, byte range 0x3c .. 0x3f
224
+ * - max. two intermediates are respected, byte range 0x20 .. 0x2f
225
+ * Note that this is not in line with ECMA-48 which does not limit either of those.
226
+ * Furthermore ECMA-48 allows the prefix byte range at any param byte position. Currently
227
+ * there are no known sequences that follow the broader definition of the specification.
228
+ *
229
+ * TODO: implement error recovery hook via error handler return values
230
+ */
231
+ export class EscapeSequenceParser extends Disposable implements IEscapeSequenceParser {
232
+ public initialState: number;
233
+ public currentState: number;
234
+ public precedingCodepoint: number;
235
+
236
+ // buffers over several parse calls
237
+ protected _params: Params;
238
+ protected _collect: number;
239
+
240
+ // handler lookup containers
241
+ protected _printHandler: PrintHandlerType;
242
+ protected _executeHandlers: { [flag: number]: ExecuteHandlerType };
243
+ protected _csiHandlers: IHandlerCollection<CsiHandlerType>;
244
+ protected _escHandlers: IHandlerCollection<EscHandlerType>;
245
+ protected _oscParser: IOscParser;
246
+ protected _dcsParser: IDcsParser;
247
+ protected _errorHandler: (state: IParsingState) => IParsingState;
248
+
249
+ // fallback handlers
250
+ protected _printHandlerFb: PrintFallbackHandlerType;
251
+ protected _executeHandlerFb: ExecuteFallbackHandlerType;
252
+ protected _csiHandlerFb: CsiFallbackHandlerType;
253
+ protected _escHandlerFb: EscFallbackHandlerType;
254
+ protected _errorHandlerFb: (state: IParsingState) => IParsingState;
255
+
256
+ // parser stack save for async handler support
257
+ protected _parseStack: IParserStackState = {
258
+ state: ParserStackType.NONE,
259
+ handlers: [],
260
+ handlerPos: 0,
261
+ transition: 0,
262
+ chunkPos: 0
263
+ };
264
+
265
+ constructor(
266
+ protected readonly _transitions: TransitionTable = VT500_TRANSITION_TABLE
267
+ ) {
268
+ super();
269
+
270
+ this.initialState = ParserState.GROUND;
271
+ this.currentState = this.initialState;
272
+ this._params = new Params(); // defaults to 32 storable params/subparams
273
+ this._params.addParam(0); // ZDM
274
+ this._collect = 0;
275
+ this.precedingCodepoint = 0;
276
+
277
+ // set default fallback handlers and handler lookup containers
278
+ this._printHandlerFb = (data, start, end): void => { };
279
+ this._executeHandlerFb = (code: number): void => { };
280
+ this._csiHandlerFb = (ident: number, params: IParams): void => { };
281
+ this._escHandlerFb = (ident: number): void => { };
282
+ this._errorHandlerFb = (state: IParsingState): IParsingState => state;
283
+ this._printHandler = this._printHandlerFb;
284
+ this._executeHandlers = Object.create(null);
285
+ this._csiHandlers = Object.create(null);
286
+ this._escHandlers = Object.create(null);
287
+ this._oscParser = new OscParser();
288
+ this._dcsParser = new DcsParser();
289
+ this._errorHandler = this._errorHandlerFb;
290
+
291
+ // swallow 7bit ST (ESC+\)
292
+ this.registerEscHandler({ final: '\\' }, () => true);
293
+ }
294
+
295
+ protected _identifier(id: IFunctionIdentifier, finalRange: number[] = [0x40, 0x7e]): number {
296
+ let res = 0;
297
+ if (id.prefix) {
298
+ if (id.prefix.length > 1) {
299
+ throw new Error('only one byte as prefix supported');
300
+ }
301
+ res = id.prefix.charCodeAt(0);
302
+ if (res && 0x3c > res || res > 0x3f) {
303
+ throw new Error('prefix must be in range 0x3c .. 0x3f');
304
+ }
305
+ }
306
+ if (id.intermediates) {
307
+ if (id.intermediates.length > 2) {
308
+ throw new Error('only two bytes as intermediates are supported');
309
+ }
310
+ for (let i = 0; i < id.intermediates.length; ++i) {
311
+ const intermediate = id.intermediates.charCodeAt(i);
312
+ if (0x20 > intermediate || intermediate > 0x2f) {
313
+ throw new Error('intermediate must be in range 0x20 .. 0x2f');
314
+ }
315
+ res <<= 8;
316
+ res |= intermediate;
317
+ }
318
+ }
319
+ if (id.final.length !== 1) {
320
+ throw new Error('final must be a single byte');
321
+ }
322
+ const finalCode = id.final.charCodeAt(0);
323
+ if (finalRange[0] > finalCode || finalCode > finalRange[1]) {
324
+ throw new Error(`final must be in range ${finalRange[0]} .. ${finalRange[1]}`);
325
+ }
326
+ res <<= 8;
327
+ res |= finalCode;
328
+
329
+ return res;
330
+ }
331
+
332
+ public identToString(ident: number): string {
333
+ const res: string[] = [];
334
+ while (ident) {
335
+ res.push(String.fromCharCode(ident & 0xFF));
336
+ ident >>= 8;
337
+ }
338
+ return res.reverse().join('');
339
+ }
340
+
341
+ public dispose(): void {
342
+ this._csiHandlers = Object.create(null);
343
+ this._executeHandlers = Object.create(null);
344
+ this._escHandlers = Object.create(null);
345
+ this._oscParser.dispose();
346
+ this._dcsParser.dispose();
347
+ }
348
+
349
+ public setPrintHandler(handler: PrintHandlerType): void {
350
+ this._printHandler = handler;
351
+ }
352
+ public clearPrintHandler(): void {
353
+ this._printHandler = this._printHandlerFb;
354
+ }
355
+
356
+ public registerEscHandler(id: IFunctionIdentifier, handler: EscHandlerType): IDisposable {
357
+ const ident = this._identifier(id, [0x30, 0x7e]);
358
+ if (this._escHandlers[ident] === undefined) {
359
+ this._escHandlers[ident] = [];
360
+ }
361
+ const handlerList = this._escHandlers[ident];
362
+ handlerList.push(handler);
363
+ return {
364
+ dispose: () => {
365
+ const handlerIndex = handlerList.indexOf(handler);
366
+ if (handlerIndex !== -1) {
367
+ handlerList.splice(handlerIndex, 1);
368
+ }
369
+ }
370
+ };
371
+ }
372
+ public clearEscHandler(id: IFunctionIdentifier): void {
373
+ if (this._escHandlers[this._identifier(id, [0x30, 0x7e])]) delete this._escHandlers[this._identifier(id, [0x30, 0x7e])];
374
+ }
375
+ public setEscHandlerFallback(handler: EscFallbackHandlerType): void {
376
+ this._escHandlerFb = handler;
377
+ }
378
+
379
+ public setExecuteHandler(flag: string, handler: ExecuteHandlerType): void {
380
+ this._executeHandlers[flag.charCodeAt(0)] = handler;
381
+ }
382
+ public clearExecuteHandler(flag: string): void {
383
+ if (this._executeHandlers[flag.charCodeAt(0)]) delete this._executeHandlers[flag.charCodeAt(0)];
384
+ }
385
+ public setExecuteHandlerFallback(handler: ExecuteFallbackHandlerType): void {
386
+ this._executeHandlerFb = handler;
387
+ }
388
+
389
+ public registerCsiHandler(id: IFunctionIdentifier, handler: CsiHandlerType): IDisposable {
390
+ const ident = this._identifier(id);
391
+ if (this._csiHandlers[ident] === undefined) {
392
+ this._csiHandlers[ident] = [];
393
+ }
394
+ const handlerList = this._csiHandlers[ident];
395
+ handlerList.push(handler);
396
+ return {
397
+ dispose: () => {
398
+ const handlerIndex = handlerList.indexOf(handler);
399
+ if (handlerIndex !== -1) {
400
+ handlerList.splice(handlerIndex, 1);
401
+ }
402
+ }
403
+ };
404
+ }
405
+ public clearCsiHandler(id: IFunctionIdentifier): void {
406
+ if (this._csiHandlers[this._identifier(id)]) delete this._csiHandlers[this._identifier(id)];
407
+ }
408
+ public setCsiHandlerFallback(callback: (ident: number, params: IParams) => void): void {
409
+ this._csiHandlerFb = callback;
410
+ }
411
+
412
+ public registerDcsHandler(id: IFunctionIdentifier, handler: IDcsHandler): IDisposable {
413
+ return this._dcsParser.registerHandler(this._identifier(id), handler);
414
+ }
415
+ public clearDcsHandler(id: IFunctionIdentifier): void {
416
+ this._dcsParser.clearHandler(this._identifier(id));
417
+ }
418
+ public setDcsHandlerFallback(handler: DcsFallbackHandlerType): void {
419
+ this._dcsParser.setHandlerFallback(handler);
420
+ }
421
+
422
+ public registerOscHandler(ident: number, handler: IOscHandler): IDisposable {
423
+ return this._oscParser.registerHandler(ident, handler);
424
+ }
425
+ public clearOscHandler(ident: number): void {
426
+ this._oscParser.clearHandler(ident);
427
+ }
428
+ public setOscHandlerFallback(handler: OscFallbackHandlerType): void {
429
+ this._oscParser.setHandlerFallback(handler);
430
+ }
431
+
432
+ public setErrorHandler(callback: (state: IParsingState) => IParsingState): void {
433
+ this._errorHandler = callback;
434
+ }
435
+ public clearErrorHandler(): void {
436
+ this._errorHandler = this._errorHandlerFb;
437
+ }
438
+
439
+ /**
440
+ * Reset parser to initial values.
441
+ *
442
+ * This can also be used to lift the improper continuation error condition
443
+ * when dealing with async handlers. Use this only as a last resort to silence
444
+ * that error when the terminal has no pending data to be processed. Note that
445
+ * the interrupted async handler might continue its work in the future messing
446
+ * up the terminal state even further.
447
+ */
448
+ public reset(): void {
449
+ this.currentState = this.initialState;
450
+ this._oscParser.reset();
451
+ this._dcsParser.reset();
452
+ this._params.reset();
453
+ this._params.addParam(0); // ZDM
454
+ this._collect = 0;
455
+ this.precedingCodepoint = 0;
456
+ // abort pending continuation from async handler
457
+ // Here the RESET type indicates, that the next parse call will
458
+ // ignore any saved stack, instead continues sync with next codepoint from GROUND
459
+ if (this._parseStack.state !== ParserStackType.NONE) {
460
+ this._parseStack.state = ParserStackType.RESET;
461
+ this._parseStack.handlers = []; // also release handlers ref
462
+ }
463
+ }
464
+
465
+ /**
466
+ * Async parse support.
467
+ */
468
+ protected _preserveStack(
469
+ state: ParserStackType,
470
+ handlers: ResumableHandlersType,
471
+ handlerPos: number,
472
+ transition: number,
473
+ chunkPos: number
474
+ ): void {
475
+ this._parseStack.state = state;
476
+ this._parseStack.handlers = handlers;
477
+ this._parseStack.handlerPos = handlerPos;
478
+ this._parseStack.transition = transition;
479
+ this._parseStack.chunkPos = chunkPos;
480
+ }
481
+
482
+ /**
483
+ * Parse UTF32 codepoints in `data` up to `length`.
484
+ *
485
+ * Note: For several actions with high data load the parsing is optimized
486
+ * by using local read ahead loops with hardcoded conditions to
487
+ * avoid costly table lookups. Make sure that any change of table values
488
+ * will be reflected in the loop conditions as well and vice versa.
489
+ * Affected states/actions:
490
+ * - GROUND:PRINT
491
+ * - CSI_PARAM:PARAM
492
+ * - DCS_PARAM:PARAM
493
+ * - OSC_STRING:OSC_PUT
494
+ * - DCS_PASSTHROUGH:DCS_PUT
495
+ *
496
+ * Note on asynchronous handler support:
497
+ * Any handler returning a promise will be treated as asynchronous.
498
+ * To keep the in-band blocking working for async handlers, `parse` pauses execution,
499
+ * creates a stack save and returns the promise to the caller.
500
+ * For proper continuation of the paused state it is important
501
+ * to await the promise resolving. On resolve the parse must be repeated
502
+ * with the same chunk of data and the resolved value in `promiseResult`
503
+ * until no promise is returned.
504
+ *
505
+ * Important: With only sync handlers defined, parsing is completely synchronous as well.
506
+ * As soon as an async handler is involved, synchronous parsing is not possible anymore.
507
+ *
508
+ * Boilerplate for proper parsing of multiple chunks with async handlers:
509
+ *
510
+ * ```typescript
511
+ * async function parseMultipleChunks(chunks: Uint32Array[]): Promise<void> {
512
+ * for (const chunk of chunks) {
513
+ * let result: void | Promise<boolean>;
514
+ * let prev: boolean | undefined;
515
+ * while (result = parser.parse(chunk, chunk.length, prev)) {
516
+ * prev = await result;
517
+ * }
518
+ * }
519
+ * // finished parsing all chunks...
520
+ * }
521
+ * ```
522
+ */
523
+ public parse(data: Uint32Array, length: number, promiseResult?: boolean): void | Promise<boolean> {
524
+ let code = 0;
525
+ let transition = 0;
526
+ let start = 0;
527
+ let handlerResult: void | boolean | Promise<boolean>;
528
+
529
+ // resume from async handler
530
+ if (this._parseStack.state) {
531
+ // allow sync parser reset even in continuation mode
532
+ // Note: can be used to recover parser from improper continuation error below
533
+ if (this._parseStack.state === ParserStackType.RESET) {
534
+ this._parseStack.state = ParserStackType.NONE;
535
+ start = this._parseStack.chunkPos + 1; // continue with next codepoint in GROUND
536
+ } else {
537
+ if (promiseResult === undefined || this._parseStack.state === ParserStackType.FAIL) {
538
+ /**
539
+ * Reject further parsing on improper continuation after pausing.
540
+ * This is a really bad condition with screwed up execution order and prolly messed up
541
+ * terminal state, therefore we exit hard with an exception and reject any further parsing.
542
+ *
543
+ * Note: With `Terminal.write` usage this exception should never occur, as the top level
544
+ * calls are guaranteed to handle async conditions properly. If you ever encounter this
545
+ * exception in your terminal integration it indicates, that you injected data chunks to
546
+ * `InputHandler.parse` or `EscapeSequenceParser.parse` synchronously without waiting for
547
+ * continuation of a running async handler.
548
+ *
549
+ * It is possible to get rid of this error by calling `reset`. But dont rely on that,
550
+ * as the pending async handler still might mess up the terminal later. Instead fix the faulty
551
+ * async handling, so this error will not be thrown anymore.
552
+ */
553
+ this._parseStack.state = ParserStackType.FAIL;
554
+ throw new Error('improper continuation due to previous async handler, giving up parsing');
555
+ }
556
+
557
+ // we have to resume the old handler loop if:
558
+ // - return value of the promise was `false`
559
+ // - handlers are not exhausted yet
560
+ const handlers = this._parseStack.handlers;
561
+ let handlerPos = this._parseStack.handlerPos - 1;
562
+ switch (this._parseStack.state) {
563
+ case ParserStackType.CSI:
564
+ if (promiseResult === false && handlerPos > -1) {
565
+ for (; handlerPos >= 0; handlerPos--) {
566
+ handlerResult = (handlers as CsiHandlerType[])[handlerPos](this._params);
567
+ if (handlerResult === true) {
568
+ break;
569
+ } else if (handlerResult instanceof Promise) {
570
+ this._parseStack.handlerPos = handlerPos;
571
+ return handlerResult;
572
+ }
573
+ }
574
+ }
575
+ this._parseStack.handlers = [];
576
+ break;
577
+ case ParserStackType.ESC:
578
+ if (promiseResult === false && handlerPos > -1) {
579
+ for (; handlerPos >= 0; handlerPos--) {
580
+ handlerResult = (handlers as EscHandlerType[])[handlerPos]();
581
+ if (handlerResult === true) {
582
+ break;
583
+ } else if (handlerResult instanceof Promise) {
584
+ this._parseStack.handlerPos = handlerPos;
585
+ return handlerResult;
586
+ }
587
+ }
588
+ }
589
+ this._parseStack.handlers = [];
590
+ break;
591
+ case ParserStackType.DCS:
592
+ code = data[this._parseStack.chunkPos];
593
+ handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a, promiseResult);
594
+ if (handlerResult) {
595
+ return handlerResult;
596
+ }
597
+ if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;
598
+ this._params.reset();
599
+ this._params.addParam(0); // ZDM
600
+ this._collect = 0;
601
+ break;
602
+ case ParserStackType.OSC:
603
+ code = data[this._parseStack.chunkPos];
604
+ handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a, promiseResult);
605
+ if (handlerResult) {
606
+ return handlerResult;
607
+ }
608
+ if (code === 0x1b) this._parseStack.transition |= ParserState.ESCAPE;
609
+ this._params.reset();
610
+ this._params.addParam(0); // ZDM
611
+ this._collect = 0;
612
+ break;
613
+ }
614
+ // cleanup before continuing with the main sync loop
615
+ this._parseStack.state = ParserStackType.NONE;
616
+ start = this._parseStack.chunkPos + 1;
617
+ this.precedingCodepoint = 0;
618
+ this.currentState = this._parseStack.transition & TableAccess.TRANSITION_STATE_MASK;
619
+ }
620
+ }
621
+
622
+ // continue with main sync loop
623
+
624
+ // process input string
625
+ for (let i = start; i < length; ++i) {
626
+ code = data[i];
627
+
628
+ // normal transition & action lookup
629
+ transition = this._transitions.table[this.currentState << TableAccess.INDEX_STATE_SHIFT | (code < 0xa0 ? code : NON_ASCII_PRINTABLE)];
630
+ switch (transition >> TableAccess.TRANSITION_ACTION_SHIFT) {
631
+ case ParserAction.PRINT:
632
+ // read ahead with loop unrolling
633
+ // Note: 0x20 (SP) is included, 0x7F (DEL) is excluded
634
+ for (let j = i + 1; ; ++j) {
635
+ if (j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
636
+ this._printHandler(data, i, j);
637
+ i = j - 1;
638
+ break;
639
+ }
640
+ if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
641
+ this._printHandler(data, i, j);
642
+ i = j - 1;
643
+ break;
644
+ }
645
+ if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
646
+ this._printHandler(data, i, j);
647
+ i = j - 1;
648
+ break;
649
+ }
650
+ if (++j >= length || (code = data[j]) < 0x20 || (code > 0x7e && code < NON_ASCII_PRINTABLE)) {
651
+ this._printHandler(data, i, j);
652
+ i = j - 1;
653
+ break;
654
+ }
655
+ }
656
+ break;
657
+ case ParserAction.EXECUTE:
658
+ if (this._executeHandlers[code]) this._executeHandlers[code]();
659
+ else this._executeHandlerFb(code);
660
+ this.precedingCodepoint = 0;
661
+ break;
662
+ case ParserAction.IGNORE:
663
+ break;
664
+ case ParserAction.ERROR:
665
+ const inject: IParsingState = this._errorHandler(
666
+ {
667
+ position: i,
668
+ code,
669
+ currentState: this.currentState,
670
+ collect: this._collect,
671
+ params: this._params,
672
+ abort: false
673
+ });
674
+ if (inject.abort) return;
675
+ // inject values: currently not implemented
676
+ break;
677
+ case ParserAction.CSI_DISPATCH:
678
+ // Trigger CSI Handler
679
+ const handlers = this._csiHandlers[this._collect << 8 | code];
680
+ let j = handlers ? handlers.length - 1 : -1;
681
+ for (; j >= 0; j--) {
682
+ // true means success and to stop bubbling
683
+ // a promise indicates an async handler that needs to finish before progressing
684
+ handlerResult = handlers[j](this._params);
685
+ if (handlerResult === true) {
686
+ break;
687
+ } else if (handlerResult instanceof Promise) {
688
+ this._preserveStack(ParserStackType.CSI, handlers, j, transition, i);
689
+ return handlerResult;
690
+ }
691
+ }
692
+ if (j < 0) {
693
+ this._csiHandlerFb(this._collect << 8 | code, this._params);
694
+ }
695
+ this.precedingCodepoint = 0;
696
+ break;
697
+ case ParserAction.PARAM:
698
+ // inner loop: digits (0x30 - 0x39) and ; (0x3b) and : (0x3a)
699
+ do {
700
+ switch (code) {
701
+ case 0x3b:
702
+ this._params.addParam(0); // ZDM
703
+ break;
704
+ case 0x3a:
705
+ this._params.addSubParam(-1);
706
+ break;
707
+ default: // 0x30 - 0x39
708
+ this._params.addDigit(code - 48);
709
+ }
710
+ } while (++i < length && (code = data[i]) > 0x2f && code < 0x3c);
711
+ i--;
712
+ break;
713
+ case ParserAction.COLLECT:
714
+ this._collect <<= 8;
715
+ this._collect |= code;
716
+ break;
717
+ case ParserAction.ESC_DISPATCH:
718
+ const handlersEsc = this._escHandlers[this._collect << 8 | code];
719
+ let jj = handlersEsc ? handlersEsc.length - 1 : -1;
720
+ for (; jj >= 0; jj--) {
721
+ // true means success and to stop bubbling
722
+ // a promise indicates an async handler that needs to finish before progressing
723
+ handlerResult = handlersEsc[jj]();
724
+ if (handlerResult === true) {
725
+ break;
726
+ } else if (handlerResult instanceof Promise) {
727
+ this._preserveStack(ParserStackType.ESC, handlersEsc, jj, transition, i);
728
+ return handlerResult;
729
+ }
730
+ }
731
+ if (jj < 0) {
732
+ this._escHandlerFb(this._collect << 8 | code);
733
+ }
734
+ this.precedingCodepoint = 0;
735
+ break;
736
+ case ParserAction.CLEAR:
737
+ this._params.reset();
738
+ this._params.addParam(0); // ZDM
739
+ this._collect = 0;
740
+ break;
741
+ case ParserAction.DCS_HOOK:
742
+ this._dcsParser.hook(this._collect << 8 | code, this._params);
743
+ break;
744
+ case ParserAction.DCS_PUT:
745
+ // inner loop - exit DCS_PUT: 0x18, 0x1a, 0x1b, 0x7f, 0x80 - 0x9f
746
+ // unhook triggered by: 0x1b, 0x9c (success) and 0x18, 0x1a (abort)
747
+ for (let j = i + 1; ; ++j) {
748
+ if (j >= length || (code = data[j]) === 0x18 || code === 0x1a || code === 0x1b || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {
749
+ this._dcsParser.put(data, i, j);
750
+ i = j - 1;
751
+ break;
752
+ }
753
+ }
754
+ break;
755
+ case ParserAction.DCS_UNHOOK:
756
+ handlerResult = this._dcsParser.unhook(code !== 0x18 && code !== 0x1a);
757
+ if (handlerResult) {
758
+ this._preserveStack(ParserStackType.DCS, [], 0, transition, i);
759
+ return handlerResult;
760
+ }
761
+ if (code === 0x1b) transition |= ParserState.ESCAPE;
762
+ this._params.reset();
763
+ this._params.addParam(0); // ZDM
764
+ this._collect = 0;
765
+ this.precedingCodepoint = 0;
766
+ break;
767
+ case ParserAction.OSC_START:
768
+ this._oscParser.start();
769
+ break;
770
+ case ParserAction.OSC_PUT:
771
+ // inner loop: 0x20 (SP) included, 0x7F (DEL) included
772
+ for (let j = i + 1; ; j++) {
773
+ if (j >= length || (code = data[j]) < 0x20 || (code > 0x7f && code < NON_ASCII_PRINTABLE)) {
774
+ this._oscParser.put(data, i, j);
775
+ i = j - 1;
776
+ break;
777
+ }
778
+ }
779
+ break;
780
+ case ParserAction.OSC_END:
781
+ handlerResult = this._oscParser.end(code !== 0x18 && code !== 0x1a);
782
+ if (handlerResult) {
783
+ this._preserveStack(ParserStackType.OSC, [], 0, transition, i);
784
+ return handlerResult;
785
+ }
786
+ if (code === 0x1b) transition |= ParserState.ESCAPE;
787
+ this._params.reset();
788
+ this._params.addParam(0); // ZDM
789
+ this._collect = 0;
790
+ this.precedingCodepoint = 0;
791
+ break;
792
+ }
793
+ this.currentState = transition & TableAccess.TRANSITION_STATE_MASK;
794
+ }
795
+ }
796
+ }