groove-dev 0.16.0 → 0.16.2
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/node_modules/@groove-dev/daemon/src/api.js +122 -1
- package/node_modules/@groove-dev/daemon/src/index.js +25 -7
- package/node_modules/@groove-dev/daemon/src/mimetypes.js +43 -0
- package/node_modules/@groove-dev/daemon/src/terminal-pty.js +129 -0
- package/node_modules/@groove-dev/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
- package/node_modules/@groove-dev/gui/dist/assets/index-DeXW9EFU.js +153 -0
- package/node_modules/@groove-dev/gui/dist/index.html +2 -2
- package/node_modules/@groove-dev/gui/package.json +3 -0
- package/node_modules/@groove-dev/gui/src/components/EditorTabs.jsx +1 -1
- package/node_modules/@groove-dev/gui/src/components/FileTree.jsx +308 -23
- package/node_modules/@groove-dev/gui/src/components/MediaViewer.jsx +104 -0
- package/node_modules/@groove-dev/gui/src/components/Terminal.jsx +154 -0
- package/node_modules/@groove-dev/gui/src/stores/groove.js +131 -2
- package/node_modules/@groove-dev/gui/src/views/FileEditor.jsx +104 -36
- package/node_modules/@xterm/addon-fit/LICENSE +19 -0
- package/node_modules/@xterm/addon-fit/README.md +24 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.js +2 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.js.map +1 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs +18 -0
- package/node_modules/@xterm/addon-fit/lib/addon-fit.mjs.map +7 -0
- package/node_modules/@xterm/addon-fit/package.json +26 -0
- package/node_modules/@xterm/addon-fit/src/FitAddon.ts +92 -0
- package/node_modules/@xterm/addon-fit/typings/addon-fit.d.ts +55 -0
- package/node_modules/@xterm/addon-web-links/LICENSE +19 -0
- package/node_modules/@xterm/addon-web-links/README.md +21 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js +2 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.js.map +1 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs +18 -0
- package/node_modules/@xterm/addon-web-links/lib/addon-web-links.mjs.map +7 -0
- package/node_modules/@xterm/addon-web-links/package.json +26 -0
- package/node_modules/@xterm/addon-web-links/src/WebLinkProvider.ts +199 -0
- package/node_modules/@xterm/addon-web-links/src/WebLinksAddon.ts +58 -0
- package/node_modules/@xterm/addon-web-links/typings/addon-web-links.d.ts +57 -0
- package/node_modules/@xterm/xterm/LICENSE +21 -0
- package/node_modules/@xterm/xterm/README.md +243 -0
- package/node_modules/@xterm/xterm/css/xterm.css +285 -0
- package/node_modules/@xterm/xterm/lib/xterm.js +2 -0
- package/node_modules/@xterm/xterm/lib/xterm.js.map +1 -0
- package/node_modules/@xterm/xterm/lib/xterm.mjs +53 -0
- package/node_modules/@xterm/xterm/lib/xterm.mjs.map +7 -0
- package/node_modules/@xterm/xterm/package.json +111 -0
- package/node_modules/@xterm/xterm/src/browser/AccessibilityManager.ts +435 -0
- package/node_modules/@xterm/xterm/src/browser/Clipboard.ts +93 -0
- package/node_modules/@xterm/xterm/src/browser/ColorContrastCache.ts +34 -0
- package/node_modules/@xterm/xterm/src/browser/CoreBrowserTerminal.ts +1339 -0
- package/node_modules/@xterm/xterm/src/browser/Linkifier.ts +403 -0
- package/node_modules/@xterm/xterm/src/browser/LocalizableStrings.ts +23 -0
- package/node_modules/@xterm/xterm/src/browser/OscLinkProvider.ts +129 -0
- package/node_modules/@xterm/xterm/src/browser/RenderDebouncer.ts +84 -0
- package/node_modules/@xterm/xterm/src/browser/TimeBasedDebouncer.ts +86 -0
- package/node_modules/@xterm/xterm/src/browser/Types.ts +226 -0
- package/node_modules/@xterm/xterm/src/browser/Viewport.ts +192 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/BufferDecorationRenderer.ts +139 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/ColorZoneStore.ts +117 -0
- package/node_modules/@xterm/xterm/src/browser/decorations/OverviewRulerRenderer.ts +214 -0
- package/node_modules/@xterm/xterm/src/browser/input/CompositionHelper.ts +248 -0
- package/node_modules/@xterm/xterm/src/browser/input/Mouse.ts +54 -0
- package/node_modules/@xterm/xterm/src/browser/input/MoveToCell.ts +251 -0
- package/node_modules/@xterm/xterm/src/browser/public/Terminal.ts +275 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRenderer.ts +542 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/DomRendererRowFactory.ts +546 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/dom/WidthCache.ts +167 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/Constants.ts +6 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/RendererUtils.ts +95 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/SelectionRenderModel.ts +93 -0
- package/node_modules/@xterm/xterm/src/browser/renderer/shared/Types.ts +84 -0
- package/node_modules/@xterm/xterm/src/browser/selection/SelectionModel.ts +144 -0
- package/node_modules/@xterm/xterm/src/browser/selection/Types.ts +15 -0
- package/node_modules/@xterm/xterm/src/browser/services/CharSizeService.ts +127 -0
- package/node_modules/@xterm/xterm/src/browser/services/CharacterJoinerService.ts +339 -0
- package/node_modules/@xterm/xterm/src/browser/services/CoreBrowserService.ts +137 -0
- package/node_modules/@xterm/xterm/src/browser/services/LinkProviderService.ts +28 -0
- package/node_modules/@xterm/xterm/src/browser/services/MouseService.ts +46 -0
- package/node_modules/@xterm/xterm/src/browser/services/RenderService.ts +376 -0
- package/node_modules/@xterm/xterm/src/browser/services/SelectionService.ts +1039 -0
- package/node_modules/@xterm/xterm/src/browser/services/Services.ts +158 -0
- package/node_modules/@xterm/xterm/src/browser/services/ThemeService.ts +198 -0
- package/node_modules/@xterm/xterm/src/browser/shared/Constants.ts +8 -0
- package/node_modules/@xterm/xterm/src/common/CircularList.ts +241 -0
- package/node_modules/@xterm/xterm/src/common/Clone.ts +23 -0
- package/node_modules/@xterm/xterm/src/common/Color.ts +376 -0
- package/node_modules/@xterm/xterm/src/common/CoreTerminal.ts +283 -0
- package/node_modules/@xterm/xterm/src/common/InputHandler.ts +3495 -0
- package/node_modules/@xterm/xterm/src/common/MultiKeyMap.ts +42 -0
- package/node_modules/@xterm/xterm/src/common/Platform.ts +44 -0
- package/node_modules/@xterm/xterm/src/common/SortedList.ts +194 -0
- package/node_modules/@xterm/xterm/src/common/TaskQueue.ts +166 -0
- package/node_modules/@xterm/xterm/src/common/TypedArrayUtils.ts +17 -0
- package/node_modules/@xterm/xterm/src/common/Types.ts +552 -0
- package/node_modules/@xterm/xterm/src/common/WindowsMode.ts +27 -0
- package/node_modules/@xterm/xterm/src/common/buffer/AttributeData.ts +211 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Buffer.ts +662 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferLine.ts +551 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferRange.ts +13 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferReflow.ts +226 -0
- package/node_modules/@xterm/xterm/src/common/buffer/BufferSet.ts +134 -0
- package/node_modules/@xterm/xterm/src/common/buffer/CellData.ts +94 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Constants.ts +157 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Marker.ts +43 -0
- package/node_modules/@xterm/xterm/src/common/buffer/Types.ts +52 -0
- package/node_modules/@xterm/xterm/src/common/data/Charsets.ts +256 -0
- package/node_modules/@xterm/xterm/src/common/data/EscapeSequences.ts +153 -0
- package/node_modules/@xterm/xterm/src/common/input/Keyboard.ts +373 -0
- package/node_modules/@xterm/xterm/src/common/input/TextDecoder.ts +346 -0
- package/node_modules/@xterm/xterm/src/common/input/UnicodeV6.ts +145 -0
- package/node_modules/@xterm/xterm/src/common/input/WriteBuffer.ts +247 -0
- package/node_modules/@xterm/xterm/src/common/input/XParseColor.ts +80 -0
- package/node_modules/@xterm/xterm/src/common/parser/Constants.ts +58 -0
- package/node_modules/@xterm/xterm/src/common/parser/DcsParser.ts +192 -0
- package/node_modules/@xterm/xterm/src/common/parser/EscapeSequenceParser.ts +792 -0
- package/node_modules/@xterm/xterm/src/common/parser/OscParser.ts +238 -0
- package/node_modules/@xterm/xterm/src/common/parser/Params.ts +229 -0
- package/node_modules/@xterm/xterm/src/common/parser/Types.ts +275 -0
- package/node_modules/@xterm/xterm/src/common/public/AddonManager.ts +53 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferApiView.ts +35 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferLineApiView.ts +29 -0
- package/node_modules/@xterm/xterm/src/common/public/BufferNamespaceApi.ts +36 -0
- package/node_modules/@xterm/xterm/src/common/public/ParserApi.ts +37 -0
- package/node_modules/@xterm/xterm/src/common/public/UnicodeApi.ts +27 -0
- package/node_modules/@xterm/xterm/src/common/services/BufferService.ts +154 -0
- package/node_modules/@xterm/xterm/src/common/services/CharsetService.ts +34 -0
- package/node_modules/@xterm/xterm/src/common/services/CoreMouseService.ts +365 -0
- package/node_modules/@xterm/xterm/src/common/services/CoreService.ts +92 -0
- package/node_modules/@xterm/xterm/src/common/services/DecorationService.ts +140 -0
- package/node_modules/@xterm/xterm/src/common/services/InstantiationService.ts +85 -0
- package/node_modules/@xterm/xterm/src/common/services/LogService.ts +124 -0
- package/node_modules/@xterm/xterm/src/common/services/OptionsService.ts +212 -0
- package/node_modules/@xterm/xterm/src/common/services/OscLinkService.ts +115 -0
- package/node_modules/@xterm/xterm/src/common/services/ServiceRegistry.ts +49 -0
- package/node_modules/@xterm/xterm/src/common/services/Services.ts +396 -0
- package/node_modules/@xterm/xterm/src/common/services/UnicodeService.ts +111 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/browser.ts +141 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/canIUse.ts +49 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/dom.ts +2369 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/fastDomNode.ts +316 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/globalPointerMoveMonitor.ts +112 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/iframe.ts +135 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/keyboardEvent.ts +213 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/mouseEvent.ts +229 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/touch.ts +372 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/abstractScrollbar.ts +303 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/horizontalScrollbar.ts +114 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElement.ts +720 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollableElementOptions.ts +165 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarArrow.ts +114 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarState.ts +243 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/scrollbarVisibilityController.ts +118 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/scrollbar/verticalScrollbar.ts +116 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/ui/widget.ts +57 -0
- package/node_modules/@xterm/xterm/src/vs/base/browser/window.ts +14 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/arrays.ts +887 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/arraysFind.ts +202 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/assert.ts +71 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/async.ts +1992 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/cancellation.ts +148 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/charCode.ts +450 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/collections.ts +140 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/decorators.ts +130 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/equals.ts +146 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/errors.ts +303 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/event.ts +1778 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/functional.ts +32 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/hash.ts +316 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/iterator.ts +159 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/keyCodes.ts +526 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/keybindings.ts +284 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/lazy.ts +47 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/lifecycle.ts +801 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/linkedList.ts +142 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/map.ts +202 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/numbers.ts +98 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observable.ts +76 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/api.ts +31 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/autorun.ts +281 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/base.ts +489 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/debugName.ts +145 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/derived.ts +428 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/lazyObservableValue.ts +146 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/logging.ts +328 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/promise.ts +209 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/observableInternal/utils.ts +610 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/platform.ts +281 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/scrollable.ts +522 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/sequence.ts +34 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/stopwatch.ts +43 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/strings.ts +557 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/symbols.ts +9 -0
- package/node_modules/@xterm/xterm/src/vs/base/common/uint.ts +59 -0
- package/node_modules/@xterm/xterm/src/vs/patches/nls.ts +90 -0
- package/node_modules/@xterm/xterm/src/vs/typings/base-common.d.ts +20 -0
- package/node_modules/@xterm/xterm/src/vs/typings/require.d.ts +42 -0
- package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-nls.d.ts +36 -0
- package/node_modules/@xterm/xterm/src/vs/typings/vscode-globals-product.d.ts +33 -0
- package/node_modules/@xterm/xterm/typings/xterm.d.ts +1957 -0
- package/package.json +1 -1
- package/packages/daemon/src/api.js +122 -1
- package/packages/daemon/src/index.js +25 -7
- package/packages/daemon/src/mimetypes.js +43 -0
- package/packages/daemon/src/terminal-pty.js +129 -0
- package/packages/gui/dist/assets/{index-Gfb8Zxy9.css → index-BhjOFLBc.css} +32 -1
- package/packages/gui/dist/assets/index-DeXW9EFU.js +153 -0
- package/packages/gui/dist/index.html +2 -2
- package/packages/gui/package.json +3 -0
- package/packages/gui/src/components/EditorTabs.jsx +1 -1
- package/packages/gui/src/components/FileTree.jsx +308 -23
- package/packages/gui/src/components/MediaViewer.jsx +104 -0
- package/packages/gui/src/components/Terminal.jsx +154 -0
- package/packages/gui/src/stores/groove.js +131 -2
- package/packages/gui/src/views/FileEditor.jsx +104 -36
- package/node_modules/@groove-dev/gui/dist/assets/index-Dxg9hdf3.js +0 -103
- package/packages/gui/dist/assets/index-Dxg9hdf3.js +0 -103
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2014 The xterm.js authors. All rights reserved.
|
|
3
|
+
* Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)
|
|
4
|
+
* @license MIT
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { IKeyboardEvent, IKeyboardResult, KeyboardResultType } from 'common/Types';
|
|
8
|
+
import { C0 } from 'common/data/EscapeSequences';
|
|
9
|
+
|
|
10
|
+
// reg + shift key mappings for digits and special chars
|
|
11
|
+
const KEYCODE_KEY_MAPPINGS: { [key: number]: [string, string]} = {
|
|
12
|
+
// digits 0-9
|
|
13
|
+
48: ['0', ')'],
|
|
14
|
+
49: ['1', '!'],
|
|
15
|
+
50: ['2', '@'],
|
|
16
|
+
51: ['3', '#'],
|
|
17
|
+
52: ['4', '$'],
|
|
18
|
+
53: ['5', '%'],
|
|
19
|
+
54: ['6', '^'],
|
|
20
|
+
55: ['7', '&'],
|
|
21
|
+
56: ['8', '*'],
|
|
22
|
+
57: ['9', '('],
|
|
23
|
+
|
|
24
|
+
// special chars
|
|
25
|
+
186: [';', ':'],
|
|
26
|
+
187: ['=', '+'],
|
|
27
|
+
188: [',', '<'],
|
|
28
|
+
189: ['-', '_'],
|
|
29
|
+
190: ['.', '>'],
|
|
30
|
+
191: ['/', '?'],
|
|
31
|
+
192: ['`', '~'],
|
|
32
|
+
219: ['[', '{'],
|
|
33
|
+
220: ['\\', '|'],
|
|
34
|
+
221: [']', '}'],
|
|
35
|
+
222: ['\'', '"']
|
|
36
|
+
};
|
|
37
|
+
|
|
38
|
+
export function evaluateKeyboardEvent(
|
|
39
|
+
ev: IKeyboardEvent,
|
|
40
|
+
applicationCursorMode: boolean,
|
|
41
|
+
isMac: boolean,
|
|
42
|
+
macOptionIsMeta: boolean
|
|
43
|
+
): IKeyboardResult {
|
|
44
|
+
const result: IKeyboardResult = {
|
|
45
|
+
type: KeyboardResultType.SEND_KEY,
|
|
46
|
+
// Whether to cancel event propagation (NOTE: this may not be needed since the event is
|
|
47
|
+
// canceled at the end of keyDown
|
|
48
|
+
cancel: false,
|
|
49
|
+
// The new key even to emit
|
|
50
|
+
key: undefined
|
|
51
|
+
};
|
|
52
|
+
const modifiers = (ev.shiftKey ? 1 : 0) | (ev.altKey ? 2 : 0) | (ev.ctrlKey ? 4 : 0) | (ev.metaKey ? 8 : 0);
|
|
53
|
+
switch (ev.keyCode) {
|
|
54
|
+
case 0:
|
|
55
|
+
if (ev.key === 'UIKeyInputUpArrow') {
|
|
56
|
+
if (applicationCursorMode) {
|
|
57
|
+
result.key = C0.ESC + 'OA';
|
|
58
|
+
} else {
|
|
59
|
+
result.key = C0.ESC + '[A';
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else if (ev.key === 'UIKeyInputLeftArrow') {
|
|
63
|
+
if (applicationCursorMode) {
|
|
64
|
+
result.key = C0.ESC + 'OD';
|
|
65
|
+
} else {
|
|
66
|
+
result.key = C0.ESC + '[D';
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
else if (ev.key === 'UIKeyInputRightArrow') {
|
|
70
|
+
if (applicationCursorMode) {
|
|
71
|
+
result.key = C0.ESC + 'OC';
|
|
72
|
+
} else {
|
|
73
|
+
result.key = C0.ESC + '[C';
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
else if (ev.key === 'UIKeyInputDownArrow') {
|
|
77
|
+
if (applicationCursorMode) {
|
|
78
|
+
result.key = C0.ESC + 'OB';
|
|
79
|
+
} else {
|
|
80
|
+
result.key = C0.ESC + '[B';
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
case 8:
|
|
85
|
+
// backspace
|
|
86
|
+
result.key = ev.ctrlKey ? '\b' : C0.DEL; // ^H or ^?
|
|
87
|
+
if (ev.altKey) {
|
|
88
|
+
result.key = C0.ESC + result.key;
|
|
89
|
+
}
|
|
90
|
+
break;
|
|
91
|
+
case 9:
|
|
92
|
+
// tab
|
|
93
|
+
if (ev.shiftKey) {
|
|
94
|
+
result.key = C0.ESC + '[Z';
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
result.key = C0.HT;
|
|
98
|
+
result.cancel = true;
|
|
99
|
+
break;
|
|
100
|
+
case 13:
|
|
101
|
+
// return/enter
|
|
102
|
+
result.key = ev.altKey ? C0.ESC + C0.CR : C0.CR;
|
|
103
|
+
result.cancel = true;
|
|
104
|
+
break;
|
|
105
|
+
case 27:
|
|
106
|
+
// escape
|
|
107
|
+
result.key = C0.ESC;
|
|
108
|
+
if (ev.altKey) {
|
|
109
|
+
result.key = C0.ESC + C0.ESC;
|
|
110
|
+
}
|
|
111
|
+
result.cancel = true;
|
|
112
|
+
break;
|
|
113
|
+
case 37:
|
|
114
|
+
// left-arrow
|
|
115
|
+
if (ev.metaKey) {
|
|
116
|
+
break;
|
|
117
|
+
}
|
|
118
|
+
if (modifiers) {
|
|
119
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'D';
|
|
120
|
+
} else if (applicationCursorMode) {
|
|
121
|
+
result.key = C0.ESC + 'OD';
|
|
122
|
+
} else {
|
|
123
|
+
result.key = C0.ESC + '[D';
|
|
124
|
+
}
|
|
125
|
+
break;
|
|
126
|
+
case 39:
|
|
127
|
+
// right-arrow
|
|
128
|
+
if (ev.metaKey) {
|
|
129
|
+
break;
|
|
130
|
+
}
|
|
131
|
+
if (modifiers) {
|
|
132
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'C';
|
|
133
|
+
} else if (applicationCursorMode) {
|
|
134
|
+
result.key = C0.ESC + 'OC';
|
|
135
|
+
} else {
|
|
136
|
+
result.key = C0.ESC + '[C';
|
|
137
|
+
}
|
|
138
|
+
break;
|
|
139
|
+
case 38:
|
|
140
|
+
// up-arrow
|
|
141
|
+
if (ev.metaKey) {
|
|
142
|
+
break;
|
|
143
|
+
}
|
|
144
|
+
if (modifiers) {
|
|
145
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'A';
|
|
146
|
+
} else if (applicationCursorMode) {
|
|
147
|
+
result.key = C0.ESC + 'OA';
|
|
148
|
+
} else {
|
|
149
|
+
result.key = C0.ESC + '[A';
|
|
150
|
+
}
|
|
151
|
+
break;
|
|
152
|
+
case 40:
|
|
153
|
+
// down-arrow
|
|
154
|
+
if (ev.metaKey) {
|
|
155
|
+
break;
|
|
156
|
+
}
|
|
157
|
+
if (modifiers) {
|
|
158
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'B';
|
|
159
|
+
} else if (applicationCursorMode) {
|
|
160
|
+
result.key = C0.ESC + 'OB';
|
|
161
|
+
} else {
|
|
162
|
+
result.key = C0.ESC + '[B';
|
|
163
|
+
}
|
|
164
|
+
break;
|
|
165
|
+
case 45:
|
|
166
|
+
// insert
|
|
167
|
+
if (!ev.shiftKey && !ev.ctrlKey) {
|
|
168
|
+
// <Ctrl> or <Shift> + <Insert> are used to
|
|
169
|
+
// copy-paste on some systems.
|
|
170
|
+
result.key = C0.ESC + '[2~';
|
|
171
|
+
}
|
|
172
|
+
break;
|
|
173
|
+
case 46:
|
|
174
|
+
// delete
|
|
175
|
+
if (modifiers) {
|
|
176
|
+
result.key = C0.ESC + '[3;' + (modifiers + 1) + '~';
|
|
177
|
+
} else {
|
|
178
|
+
result.key = C0.ESC + '[3~';
|
|
179
|
+
}
|
|
180
|
+
break;
|
|
181
|
+
case 36:
|
|
182
|
+
// home
|
|
183
|
+
if (modifiers) {
|
|
184
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'H';
|
|
185
|
+
} else if (applicationCursorMode) {
|
|
186
|
+
result.key = C0.ESC + 'OH';
|
|
187
|
+
} else {
|
|
188
|
+
result.key = C0.ESC + '[H';
|
|
189
|
+
}
|
|
190
|
+
break;
|
|
191
|
+
case 35:
|
|
192
|
+
// end
|
|
193
|
+
if (modifiers) {
|
|
194
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'F';
|
|
195
|
+
} else if (applicationCursorMode) {
|
|
196
|
+
result.key = C0.ESC + 'OF';
|
|
197
|
+
} else {
|
|
198
|
+
result.key = C0.ESC + '[F';
|
|
199
|
+
}
|
|
200
|
+
break;
|
|
201
|
+
case 33:
|
|
202
|
+
// page up
|
|
203
|
+
if (ev.shiftKey) {
|
|
204
|
+
result.type = KeyboardResultType.PAGE_UP;
|
|
205
|
+
} else if (ev.ctrlKey) {
|
|
206
|
+
result.key = C0.ESC + '[5;' + (modifiers + 1) + '~';
|
|
207
|
+
} else {
|
|
208
|
+
result.key = C0.ESC + '[5~';
|
|
209
|
+
}
|
|
210
|
+
break;
|
|
211
|
+
case 34:
|
|
212
|
+
// page down
|
|
213
|
+
if (ev.shiftKey) {
|
|
214
|
+
result.type = KeyboardResultType.PAGE_DOWN;
|
|
215
|
+
} else if (ev.ctrlKey) {
|
|
216
|
+
result.key = C0.ESC + '[6;' + (modifiers + 1) + '~';
|
|
217
|
+
} else {
|
|
218
|
+
result.key = C0.ESC + '[6~';
|
|
219
|
+
}
|
|
220
|
+
break;
|
|
221
|
+
case 112:
|
|
222
|
+
// F1-F12
|
|
223
|
+
if (modifiers) {
|
|
224
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'P';
|
|
225
|
+
} else {
|
|
226
|
+
result.key = C0.ESC + 'OP';
|
|
227
|
+
}
|
|
228
|
+
break;
|
|
229
|
+
case 113:
|
|
230
|
+
if (modifiers) {
|
|
231
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'Q';
|
|
232
|
+
} else {
|
|
233
|
+
result.key = C0.ESC + 'OQ';
|
|
234
|
+
}
|
|
235
|
+
break;
|
|
236
|
+
case 114:
|
|
237
|
+
if (modifiers) {
|
|
238
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'R';
|
|
239
|
+
} else {
|
|
240
|
+
result.key = C0.ESC + 'OR';
|
|
241
|
+
}
|
|
242
|
+
break;
|
|
243
|
+
case 115:
|
|
244
|
+
if (modifiers) {
|
|
245
|
+
result.key = C0.ESC + '[1;' + (modifiers + 1) + 'S';
|
|
246
|
+
} else {
|
|
247
|
+
result.key = C0.ESC + 'OS';
|
|
248
|
+
}
|
|
249
|
+
break;
|
|
250
|
+
case 116:
|
|
251
|
+
if (modifiers) {
|
|
252
|
+
result.key = C0.ESC + '[15;' + (modifiers + 1) + '~';
|
|
253
|
+
} else {
|
|
254
|
+
result.key = C0.ESC + '[15~';
|
|
255
|
+
}
|
|
256
|
+
break;
|
|
257
|
+
case 117:
|
|
258
|
+
if (modifiers) {
|
|
259
|
+
result.key = C0.ESC + '[17;' + (modifiers + 1) + '~';
|
|
260
|
+
} else {
|
|
261
|
+
result.key = C0.ESC + '[17~';
|
|
262
|
+
}
|
|
263
|
+
break;
|
|
264
|
+
case 118:
|
|
265
|
+
if (modifiers) {
|
|
266
|
+
result.key = C0.ESC + '[18;' + (modifiers + 1) + '~';
|
|
267
|
+
} else {
|
|
268
|
+
result.key = C0.ESC + '[18~';
|
|
269
|
+
}
|
|
270
|
+
break;
|
|
271
|
+
case 119:
|
|
272
|
+
if (modifiers) {
|
|
273
|
+
result.key = C0.ESC + '[19;' + (modifiers + 1) + '~';
|
|
274
|
+
} else {
|
|
275
|
+
result.key = C0.ESC + '[19~';
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
case 120:
|
|
279
|
+
if (modifiers) {
|
|
280
|
+
result.key = C0.ESC + '[20;' + (modifiers + 1) + '~';
|
|
281
|
+
} else {
|
|
282
|
+
result.key = C0.ESC + '[20~';
|
|
283
|
+
}
|
|
284
|
+
break;
|
|
285
|
+
case 121:
|
|
286
|
+
if (modifiers) {
|
|
287
|
+
result.key = C0.ESC + '[21;' + (modifiers + 1) + '~';
|
|
288
|
+
} else {
|
|
289
|
+
result.key = C0.ESC + '[21~';
|
|
290
|
+
}
|
|
291
|
+
break;
|
|
292
|
+
case 122:
|
|
293
|
+
if (modifiers) {
|
|
294
|
+
result.key = C0.ESC + '[23;' + (modifiers + 1) + '~';
|
|
295
|
+
} else {
|
|
296
|
+
result.key = C0.ESC + '[23~';
|
|
297
|
+
}
|
|
298
|
+
break;
|
|
299
|
+
case 123:
|
|
300
|
+
if (modifiers) {
|
|
301
|
+
result.key = C0.ESC + '[24;' + (modifiers + 1) + '~';
|
|
302
|
+
} else {
|
|
303
|
+
result.key = C0.ESC + '[24~';
|
|
304
|
+
}
|
|
305
|
+
break;
|
|
306
|
+
default:
|
|
307
|
+
// a-z and space
|
|
308
|
+
if (ev.ctrlKey && !ev.shiftKey && !ev.altKey && !ev.metaKey) {
|
|
309
|
+
if (ev.keyCode >= 65 && ev.keyCode <= 90) {
|
|
310
|
+
result.key = String.fromCharCode(ev.keyCode - 64);
|
|
311
|
+
} else if (ev.keyCode === 32) {
|
|
312
|
+
result.key = C0.NUL;
|
|
313
|
+
} else if (ev.keyCode >= 51 && ev.keyCode <= 55) {
|
|
314
|
+
// escape, file sep, group sep, record sep, unit sep
|
|
315
|
+
result.key = String.fromCharCode(ev.keyCode - 51 + 27);
|
|
316
|
+
} else if (ev.keyCode === 56) {
|
|
317
|
+
result.key = C0.DEL;
|
|
318
|
+
} else if (ev.keyCode === 219) {
|
|
319
|
+
result.key = C0.ESC;
|
|
320
|
+
} else if (ev.keyCode === 220) {
|
|
321
|
+
result.key = C0.FS;
|
|
322
|
+
} else if (ev.keyCode === 221) {
|
|
323
|
+
result.key = C0.GS;
|
|
324
|
+
}
|
|
325
|
+
} else if ((!isMac || macOptionIsMeta) && ev.altKey && !ev.metaKey) {
|
|
326
|
+
// On macOS this is a third level shift when !macOptionIsMeta. Use <Esc> instead.
|
|
327
|
+
const keyMapping = KEYCODE_KEY_MAPPINGS[ev.keyCode];
|
|
328
|
+
const key = keyMapping?.[!ev.shiftKey ? 0 : 1];
|
|
329
|
+
if (key) {
|
|
330
|
+
result.key = C0.ESC + key;
|
|
331
|
+
} else if (ev.keyCode >= 65 && ev.keyCode <= 90) {
|
|
332
|
+
const keyCode = ev.ctrlKey ? ev.keyCode - 64 : ev.keyCode + 32;
|
|
333
|
+
let keyString = String.fromCharCode(keyCode);
|
|
334
|
+
if (ev.shiftKey) {
|
|
335
|
+
keyString = keyString.toUpperCase();
|
|
336
|
+
}
|
|
337
|
+
result.key = C0.ESC + keyString;
|
|
338
|
+
} else if (ev.keyCode === 32) {
|
|
339
|
+
result.key = C0.ESC + (ev.ctrlKey ? C0.NUL : ' ');
|
|
340
|
+
} else if (ev.key === 'Dead' && ev.code.startsWith('Key')) {
|
|
341
|
+
// Reference: https://github.com/xtermjs/xterm.js/issues/3725
|
|
342
|
+
// Alt will produce a "dead key" (initate composition) with some
|
|
343
|
+
// of the letters in US layout (e.g. N/E/U).
|
|
344
|
+
// It's safe to match against Key* since no other `code` values begin with "Key".
|
|
345
|
+
// https://developer.mozilla.org/en-US/docs/Web/API/KeyboardEvent/code/code_values#code_values_on_mac
|
|
346
|
+
let keyString = ev.code.slice(3, 4);
|
|
347
|
+
if (!ev.shiftKey) {
|
|
348
|
+
keyString = keyString.toLowerCase();
|
|
349
|
+
}
|
|
350
|
+
result.key = C0.ESC + keyString;
|
|
351
|
+
result.cancel = true;
|
|
352
|
+
}
|
|
353
|
+
} else if (isMac && !ev.altKey && !ev.ctrlKey && !ev.shiftKey && ev.metaKey) {
|
|
354
|
+
if (ev.keyCode === 65) { // cmd + a
|
|
355
|
+
result.type = KeyboardResultType.SELECT_ALL;
|
|
356
|
+
}
|
|
357
|
+
} else if (ev.key && !ev.ctrlKey && !ev.altKey && !ev.metaKey && ev.keyCode >= 48 && ev.key.length === 1) {
|
|
358
|
+
// Include only keys that that result in a _single_ character; don't include num lock,
|
|
359
|
+
// volume up, etc.
|
|
360
|
+
result.key = ev.key;
|
|
361
|
+
} else if (ev.key && ev.ctrlKey) {
|
|
362
|
+
if (ev.key === '_') { // ^_
|
|
363
|
+
result.key = C0.US;
|
|
364
|
+
}
|
|
365
|
+
if (ev.key === '@') { // ^ + shift + 2 = ^ + @
|
|
366
|
+
result.key = C0.NUL;
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
break;
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return result;
|
|
373
|
+
}
|
|
@@ -0,0 +1,346 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
|
3
|
+
* @license MIT
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Polyfill - Convert UTF32 codepoint into JS string.
|
|
8
|
+
* Note: The built-in String.fromCodePoint happens to be much slower
|
|
9
|
+
* due to additional sanity checks. We can avoid them since
|
|
10
|
+
* we always operate on legal UTF32 (granted by the input decoders)
|
|
11
|
+
* and use this faster version instead.
|
|
12
|
+
*/
|
|
13
|
+
export function stringFromCodePoint(codePoint: number): string {
|
|
14
|
+
if (codePoint > 0xFFFF) {
|
|
15
|
+
codePoint -= 0x10000;
|
|
16
|
+
return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);
|
|
17
|
+
}
|
|
18
|
+
return String.fromCharCode(codePoint);
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Convert UTF32 char codes into JS string.
|
|
23
|
+
* Basically the same as `stringFromCodePoint` but for multiple codepoints
|
|
24
|
+
* in a loop (which is a lot faster).
|
|
25
|
+
*/
|
|
26
|
+
export function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {
|
|
27
|
+
let result = '';
|
|
28
|
+
for (let i = start; i < end; ++i) {
|
|
29
|
+
let codepoint = data[i];
|
|
30
|
+
if (codepoint > 0xFFFF) {
|
|
31
|
+
// JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate
|
|
32
|
+
// pair conversion rules:
|
|
33
|
+
// - subtract 0x10000 from code point, leaving a 20 bit number
|
|
34
|
+
// - add high 10 bits to 0xD800 --> first surrogate
|
|
35
|
+
// - add low 10 bits to 0xDC00 --> second surrogate
|
|
36
|
+
codepoint -= 0x10000;
|
|
37
|
+
result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);
|
|
38
|
+
} else {
|
|
39
|
+
result += String.fromCharCode(codepoint);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return result;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.
|
|
47
|
+
* To keep the decoder in line with JS strings it handles single surrogates as UCS2.
|
|
48
|
+
*/
|
|
49
|
+
export class StringToUtf32 {
|
|
50
|
+
private _interim: number = 0;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* Clears interim and resets decoder to clean state.
|
|
54
|
+
*/
|
|
55
|
+
public clear(): void {
|
|
56
|
+
this._interim = 0;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Decode JS string to UTF32 codepoints.
|
|
61
|
+
* The methods assumes stream input and will store partly transmitted
|
|
62
|
+
* surrogate pairs and decode them with the next data chunk.
|
|
63
|
+
* Note: The method does no bound checks for target, therefore make sure
|
|
64
|
+
* the provided input data does not exceed the size of `target`.
|
|
65
|
+
* Returns the number of written codepoints in `target`.
|
|
66
|
+
*/
|
|
67
|
+
public decode(input: string, target: Uint32Array): number {
|
|
68
|
+
const length = input.length;
|
|
69
|
+
|
|
70
|
+
if (!length) {
|
|
71
|
+
return 0;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
let size = 0;
|
|
75
|
+
let startPos = 0;
|
|
76
|
+
|
|
77
|
+
// handle leftover surrogate high
|
|
78
|
+
if (this._interim) {
|
|
79
|
+
const second = input.charCodeAt(startPos++);
|
|
80
|
+
if (0xDC00 <= second && second <= 0xDFFF) {
|
|
81
|
+
target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
|
|
82
|
+
} else {
|
|
83
|
+
// illegal codepoint (USC2 handling)
|
|
84
|
+
target[size++] = this._interim;
|
|
85
|
+
target[size++] = second;
|
|
86
|
+
}
|
|
87
|
+
this._interim = 0;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
for (let i = startPos; i < length; ++i) {
|
|
91
|
+
const code = input.charCodeAt(i);
|
|
92
|
+
// surrogate pair first
|
|
93
|
+
if (0xD800 <= code && code <= 0xDBFF) {
|
|
94
|
+
if (++i >= length) {
|
|
95
|
+
this._interim = code;
|
|
96
|
+
return size;
|
|
97
|
+
}
|
|
98
|
+
const second = input.charCodeAt(i);
|
|
99
|
+
if (0xDC00 <= second && second <= 0xDFFF) {
|
|
100
|
+
target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;
|
|
101
|
+
} else {
|
|
102
|
+
// illegal codepoint (USC2 handling)
|
|
103
|
+
target[size++] = code;
|
|
104
|
+
target[size++] = second;
|
|
105
|
+
}
|
|
106
|
+
continue;
|
|
107
|
+
}
|
|
108
|
+
if (code === 0xFEFF) {
|
|
109
|
+
// BOM
|
|
110
|
+
continue;
|
|
111
|
+
}
|
|
112
|
+
target[size++] = code;
|
|
113
|
+
}
|
|
114
|
+
return size;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
/**
|
|
119
|
+
* Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.
|
|
120
|
+
*/
|
|
121
|
+
export class Utf8ToUtf32 {
|
|
122
|
+
public interim: Uint8Array = new Uint8Array(3);
|
|
123
|
+
|
|
124
|
+
/**
|
|
125
|
+
* Clears interim bytes and resets decoder to clean state.
|
|
126
|
+
*/
|
|
127
|
+
public clear(): void {
|
|
128
|
+
this.interim.fill(0);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.
|
|
133
|
+
* The methods assumes stream input and will store partly transmitted bytes
|
|
134
|
+
* and decode them with the next data chunk.
|
|
135
|
+
* Note: The method does no bound checks for target, therefore make sure
|
|
136
|
+
* the provided data chunk does not exceed the size of `target`.
|
|
137
|
+
* Returns the number of written codepoints in `target`.
|
|
138
|
+
*/
|
|
139
|
+
public decode(input: Uint8Array, target: Uint32Array): number {
|
|
140
|
+
const length = input.length;
|
|
141
|
+
|
|
142
|
+
if (!length) {
|
|
143
|
+
return 0;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
let size = 0;
|
|
147
|
+
let byte1: number;
|
|
148
|
+
let byte2: number;
|
|
149
|
+
let byte3: number;
|
|
150
|
+
let byte4: number;
|
|
151
|
+
let codepoint = 0;
|
|
152
|
+
let startPos = 0;
|
|
153
|
+
|
|
154
|
+
// handle leftover bytes
|
|
155
|
+
if (this.interim[0]) {
|
|
156
|
+
let discardInterim = false;
|
|
157
|
+
let cp = this.interim[0];
|
|
158
|
+
cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);
|
|
159
|
+
let pos = 0;
|
|
160
|
+
let tmp: number;
|
|
161
|
+
while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {
|
|
162
|
+
cp <<= 6;
|
|
163
|
+
cp |= tmp;
|
|
164
|
+
}
|
|
165
|
+
// missing bytes - read ahead from input
|
|
166
|
+
const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;
|
|
167
|
+
const missing = type - pos;
|
|
168
|
+
while (startPos < missing) {
|
|
169
|
+
if (startPos >= length) {
|
|
170
|
+
return 0;
|
|
171
|
+
}
|
|
172
|
+
tmp = input[startPos++];
|
|
173
|
+
if ((tmp & 0xC0) !== 0x80) {
|
|
174
|
+
// wrong continuation, discard interim bytes completely
|
|
175
|
+
startPos--;
|
|
176
|
+
discardInterim = true;
|
|
177
|
+
break;
|
|
178
|
+
} else {
|
|
179
|
+
// need to save so we can continue short inputs in next call
|
|
180
|
+
this.interim[pos++] = tmp;
|
|
181
|
+
cp <<= 6;
|
|
182
|
+
cp |= tmp & 0x3F;
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (!discardInterim) {
|
|
186
|
+
// final test is type dependent
|
|
187
|
+
if (type === 2) {
|
|
188
|
+
if (cp < 0x80) {
|
|
189
|
+
// wrong starter byte
|
|
190
|
+
startPos--;
|
|
191
|
+
} else {
|
|
192
|
+
target[size++] = cp;
|
|
193
|
+
}
|
|
194
|
+
} else if (type === 3) {
|
|
195
|
+
if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {
|
|
196
|
+
// illegal codepoint or BOM
|
|
197
|
+
} else {
|
|
198
|
+
target[size++] = cp;
|
|
199
|
+
}
|
|
200
|
+
} else {
|
|
201
|
+
if (cp < 0x010000 || cp > 0x10FFFF) {
|
|
202
|
+
// illegal codepoint
|
|
203
|
+
} else {
|
|
204
|
+
target[size++] = cp;
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
this.interim.fill(0);
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
// loop through input
|
|
212
|
+
const fourStop = length - 4;
|
|
213
|
+
let i = startPos;
|
|
214
|
+
while (i < length) {
|
|
215
|
+
/**
|
|
216
|
+
* ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.
|
|
217
|
+
* This is a compromise between speed gain for ASCII
|
|
218
|
+
* and penalty for non ASCII:
|
|
219
|
+
* For best ASCII performance the char should be stored directly into target,
|
|
220
|
+
* but even a single attempt to write to target and compare afterwards
|
|
221
|
+
* penalizes non ASCII really bad (-50%), thus we load the char into byteX first,
|
|
222
|
+
* which reduces ASCII performance by ~15%.
|
|
223
|
+
* This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible
|
|
224
|
+
* compared to the gains.
|
|
225
|
+
* Note that this optimization only takes place for 4 consecutive ASCII chars,
|
|
226
|
+
* for any shorter it bails out. Worst case - all 4 bytes being read but
|
|
227
|
+
* thrown away due to the last being a non ASCII char (-10% performance).
|
|
228
|
+
*/
|
|
229
|
+
while (i < fourStop
|
|
230
|
+
&& !((byte1 = input[i]) & 0x80)
|
|
231
|
+
&& !((byte2 = input[i + 1]) & 0x80)
|
|
232
|
+
&& !((byte3 = input[i + 2]) & 0x80)
|
|
233
|
+
&& !((byte4 = input[i + 3]) & 0x80))
|
|
234
|
+
{
|
|
235
|
+
target[size++] = byte1;
|
|
236
|
+
target[size++] = byte2;
|
|
237
|
+
target[size++] = byte3;
|
|
238
|
+
target[size++] = byte4;
|
|
239
|
+
i += 4;
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
// reread byte1
|
|
243
|
+
byte1 = input[i++];
|
|
244
|
+
|
|
245
|
+
// 1 byte
|
|
246
|
+
if (byte1 < 0x80) {
|
|
247
|
+
target[size++] = byte1;
|
|
248
|
+
|
|
249
|
+
// 2 bytes
|
|
250
|
+
} else if ((byte1 & 0xE0) === 0xC0) {
|
|
251
|
+
if (i >= length) {
|
|
252
|
+
this.interim[0] = byte1;
|
|
253
|
+
return size;
|
|
254
|
+
}
|
|
255
|
+
byte2 = input[i++];
|
|
256
|
+
if ((byte2 & 0xC0) !== 0x80) {
|
|
257
|
+
// wrong continuation
|
|
258
|
+
i--;
|
|
259
|
+
continue;
|
|
260
|
+
}
|
|
261
|
+
codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);
|
|
262
|
+
if (codepoint < 0x80) {
|
|
263
|
+
// wrong starter byte
|
|
264
|
+
i--;
|
|
265
|
+
continue;
|
|
266
|
+
}
|
|
267
|
+
target[size++] = codepoint;
|
|
268
|
+
|
|
269
|
+
// 3 bytes
|
|
270
|
+
} else if ((byte1 & 0xF0) === 0xE0) {
|
|
271
|
+
if (i >= length) {
|
|
272
|
+
this.interim[0] = byte1;
|
|
273
|
+
return size;
|
|
274
|
+
}
|
|
275
|
+
byte2 = input[i++];
|
|
276
|
+
if ((byte2 & 0xC0) !== 0x80) {
|
|
277
|
+
// wrong continuation
|
|
278
|
+
i--;
|
|
279
|
+
continue;
|
|
280
|
+
}
|
|
281
|
+
if (i >= length) {
|
|
282
|
+
this.interim[0] = byte1;
|
|
283
|
+
this.interim[1] = byte2;
|
|
284
|
+
return size;
|
|
285
|
+
}
|
|
286
|
+
byte3 = input[i++];
|
|
287
|
+
if ((byte3 & 0xC0) !== 0x80) {
|
|
288
|
+
// wrong continuation
|
|
289
|
+
i--;
|
|
290
|
+
continue;
|
|
291
|
+
}
|
|
292
|
+
codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);
|
|
293
|
+
if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {
|
|
294
|
+
// illegal codepoint or BOM, no i-- here
|
|
295
|
+
continue;
|
|
296
|
+
}
|
|
297
|
+
target[size++] = codepoint;
|
|
298
|
+
|
|
299
|
+
// 4 bytes
|
|
300
|
+
} else if ((byte1 & 0xF8) === 0xF0) {
|
|
301
|
+
if (i >= length) {
|
|
302
|
+
this.interim[0] = byte1;
|
|
303
|
+
return size;
|
|
304
|
+
}
|
|
305
|
+
byte2 = input[i++];
|
|
306
|
+
if ((byte2 & 0xC0) !== 0x80) {
|
|
307
|
+
// wrong continuation
|
|
308
|
+
i--;
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
if (i >= length) {
|
|
312
|
+
this.interim[0] = byte1;
|
|
313
|
+
this.interim[1] = byte2;
|
|
314
|
+
return size;
|
|
315
|
+
}
|
|
316
|
+
byte3 = input[i++];
|
|
317
|
+
if ((byte3 & 0xC0) !== 0x80) {
|
|
318
|
+
// wrong continuation
|
|
319
|
+
i--;
|
|
320
|
+
continue;
|
|
321
|
+
}
|
|
322
|
+
if (i >= length) {
|
|
323
|
+
this.interim[0] = byte1;
|
|
324
|
+
this.interim[1] = byte2;
|
|
325
|
+
this.interim[2] = byte3;
|
|
326
|
+
return size;
|
|
327
|
+
}
|
|
328
|
+
byte4 = input[i++];
|
|
329
|
+
if ((byte4 & 0xC0) !== 0x80) {
|
|
330
|
+
// wrong continuation
|
|
331
|
+
i--;
|
|
332
|
+
continue;
|
|
333
|
+
}
|
|
334
|
+
codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);
|
|
335
|
+
if (codepoint < 0x010000 || codepoint > 0x10FFFF) {
|
|
336
|
+
// illegal codepoint, no i-- here
|
|
337
|
+
continue;
|
|
338
|
+
}
|
|
339
|
+
target[size++] = codepoint;
|
|
340
|
+
} else {
|
|
341
|
+
// illegal byte, just skip
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
return size;
|
|
345
|
+
}
|
|
346
|
+
}
|