@difizen/libro-codemirror 0.0.2-alpha.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/LICENSE +21 -0
- package/README.md +0 -0
- package/es/auto-complete/closebrackets.d.ts +12 -0
- package/es/auto-complete/closebrackets.d.ts.map +1 -0
- package/es/auto-complete/closebrackets.js +408 -0
- package/es/auto-complete/completion.d.ts +57 -0
- package/es/auto-complete/completion.d.ts.map +1 -0
- package/es/auto-complete/completion.js +265 -0
- package/es/auto-complete/config.d.ts +22 -0
- package/es/auto-complete/config.d.ts.map +1 -0
- package/es/auto-complete/config.js +44 -0
- package/es/auto-complete/filter.d.ts +13 -0
- package/es/auto-complete/filter.d.ts.map +1 -0
- package/es/auto-complete/filter.js +191 -0
- package/es/auto-complete/index.d.ts +17 -0
- package/es/auto-complete/index.d.ts.map +1 -0
- package/es/auto-complete/index.js +107 -0
- package/es/auto-complete/snippet.d.ts +14 -0
- package/es/auto-complete/snippet.d.ts.map +1 -0
- package/es/auto-complete/snippet.js +447 -0
- package/es/auto-complete/state.d.ts +63 -0
- package/es/auto-complete/state.d.ts.map +1 -0
- package/es/auto-complete/state.js +452 -0
- package/es/auto-complete/theme.d.ts +6 -0
- package/es/auto-complete/theme.d.ts.map +1 -0
- package/es/auto-complete/theme.js +151 -0
- package/es/auto-complete/tooltip.d.ts +5 -0
- package/es/auto-complete/tooltip.d.ts.map +1 -0
- package/es/auto-complete/tooltip.js +365 -0
- package/es/auto-complete/view.d.ts +43 -0
- package/es/auto-complete/view.d.ts.map +1 -0
- package/es/auto-complete/view.js +372 -0
- package/es/auto-complete/word.d.ts +3 -0
- package/es/auto-complete/word.d.ts.map +1 -0
- package/es/auto-complete/word.js +119 -0
- package/es/completion.d.ts +6 -0
- package/es/completion.d.ts.map +1 -0
- package/es/completion.js +84 -0
- package/es/config.d.ts +184 -0
- package/es/config.d.ts.map +1 -0
- package/es/config.js +473 -0
- package/es/editor.d.ts +361 -0
- package/es/editor.d.ts.map +1 -0
- package/es/editor.js +1126 -0
- package/es/factory.d.ts +3 -0
- package/es/factory.d.ts.map +1 -0
- package/es/factory.js +12 -0
- package/es/hyperlink.d.ts +15 -0
- package/es/hyperlink.d.ts.map +1 -0
- package/es/hyperlink.js +120 -0
- package/es/indent.d.ts +8 -0
- package/es/indent.d.ts.map +1 -0
- package/es/indent.js +58 -0
- package/es/indentation-markers/config.d.ts +17 -0
- package/es/indentation-markers/config.d.ts.map +1 -0
- package/es/indentation-markers/config.js +10 -0
- package/es/indentation-markers/index.d.ts +3 -0
- package/es/indentation-markers/index.d.ts.map +1 -0
- package/es/indentation-markers/index.js +160 -0
- package/es/indentation-markers/map.d.ts +77 -0
- package/es/indentation-markers/map.d.ts.map +1 -0
- package/es/indentation-markers/map.js +265 -0
- package/es/indentation-markers/utils.d.ts +27 -0
- package/es/indentation-markers/utils.d.ts.map +1 -0
- package/es/indentation-markers/utils.js +91 -0
- package/es/index.d.ts +11 -0
- package/es/index.d.ts.map +1 -0
- package/es/index.js +10 -0
- package/es/libro-icon.d.ts +3 -0
- package/es/libro-icon.d.ts.map +1 -0
- package/es/libro-icon.js +2 -0
- package/es/mimetype.d.ts +22 -0
- package/es/mimetype.d.ts.map +1 -0
- package/es/mimetype.js +59 -0
- package/es/mode.d.ts +86 -0
- package/es/mode.d.ts.map +1 -0
- package/es/mode.js +284 -0
- package/es/monitor.d.ts +32 -0
- package/es/monitor.d.ts.map +1 -0
- package/es/monitor.js +129 -0
- package/es/python-lang.d.ts +3 -0
- package/es/python-lang.d.ts.map +1 -0
- package/es/python-lang.js +7 -0
- package/es/style/base.css +131 -0
- package/es/style/theme.css +12 -0
- package/es/style/variables.css +403 -0
- package/es/theme.d.ts +35 -0
- package/es/theme.d.ts.map +1 -0
- package/es/theme.js +225 -0
- package/es/tooltip.d.ts +10 -0
- package/es/tooltip.d.ts.map +1 -0
- package/es/tooltip.js +170 -0
- package/package.json +74 -0
- package/src/auto-complete/README.md +71 -0
- package/src/auto-complete/closebrackets.ts +423 -0
- package/src/auto-complete/completion.ts +345 -0
- package/src/auto-complete/config.ts +101 -0
- package/src/auto-complete/filter.ts +215 -0
- package/src/auto-complete/index.ts +112 -0
- package/src/auto-complete/snippet.ts +394 -0
- package/src/auto-complete/state.ts +472 -0
- package/src/auto-complete/theme.ts +126 -0
- package/src/auto-complete/tooltip.ts +386 -0
- package/src/auto-complete/view.ts +343 -0
- package/src/auto-complete/word.ts +118 -0
- package/src/completion.ts +61 -0
- package/src/config.ts +689 -0
- package/src/editor.ts +1078 -0
- package/src/factory.ts +10 -0
- package/src/hyperlink.ts +95 -0
- package/src/indent.ts +69 -0
- package/src/indentation-markers/config.ts +31 -0
- package/src/indentation-markers/index.ts +192 -0
- package/src/indentation-markers/map.ts +273 -0
- package/src/indentation-markers/utils.ts +84 -0
- package/src/index.ts +11 -0
- package/src/libro-icon.ts +4 -0
- package/src/mimetype.ts +49 -0
- package/src/mode.ts +269 -0
- package/src/monitor.ts +105 -0
- package/src/python-lang.ts +7 -0
- package/src/style/base.css +129 -0
- package/src/style/theme.css +12 -0
- package/src/style/variables.css +405 -0
- package/src/theme.ts +231 -0
- package/src/tooltip.ts +145 -0
|
@@ -0,0 +1,265 @@
|
|
|
1
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
3
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
4
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
5
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
6
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
7
|
+
function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
|
|
8
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
9
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
10
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
11
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
12
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
13
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
14
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
15
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
16
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
17
|
+
/* eslint-disable @typescript-eslint/no-parameter-properties */
|
|
18
|
+
/* eslint-disable @typescript-eslint/parameter-properties */
|
|
19
|
+
import { syntaxTree } from '@codemirror/language';
|
|
20
|
+
import { Annotation, EditorSelection } from '@codemirror/state';
|
|
21
|
+
|
|
22
|
+
/// Objects type used to represent individual completions.
|
|
23
|
+
|
|
24
|
+
/// An instance of this is passed to completion source functions.
|
|
25
|
+
export var CompletionContext = /*#__PURE__*/function () {
|
|
26
|
+
/// Create a new completion context. (Mostly useful for testing
|
|
27
|
+
/// completion sources—in the editor, the extension will create
|
|
28
|
+
/// these for you.)
|
|
29
|
+
function CompletionContext(
|
|
30
|
+
/// The editor state that the completion happens in.
|
|
31
|
+
state,
|
|
32
|
+
/// The position at which the completion is happening.
|
|
33
|
+
pos,
|
|
34
|
+
/// Indicates whether completion was activated explicitly, or
|
|
35
|
+
/// implicitly by typing. The usual way to respond to this is to
|
|
36
|
+
/// only return completions when either there is part of a
|
|
37
|
+
/// completable entity before the cursor, or `explicit` is true.
|
|
38
|
+
explicit) {
|
|
39
|
+
_classCallCheck(this, CompletionContext);
|
|
40
|
+
this.state = state;
|
|
41
|
+
this.pos = pos;
|
|
42
|
+
this.explicit = explicit;
|
|
43
|
+
/// @internal
|
|
44
|
+
this.abortListeners = [];
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/// Get the extent, content, and (if there is a token) type of the
|
|
48
|
+
/// token before `this.pos`.
|
|
49
|
+
_createClass(CompletionContext, [{
|
|
50
|
+
key: "tokenBefore",
|
|
51
|
+
value: function tokenBefore(types) {
|
|
52
|
+
var token = syntaxTree(this.state).resolveInner(this.pos, -1);
|
|
53
|
+
while (token && types.indexOf(token.name) < 0) {
|
|
54
|
+
token = token.parent;
|
|
55
|
+
}
|
|
56
|
+
return token ? {
|
|
57
|
+
from: token.from,
|
|
58
|
+
to: this.pos,
|
|
59
|
+
text: this.state.sliceDoc(token.from, this.pos),
|
|
60
|
+
type: token.type
|
|
61
|
+
} : null;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/// Get the match of the given expression directly before the
|
|
65
|
+
/// cursor.
|
|
66
|
+
}, {
|
|
67
|
+
key: "matchBefore",
|
|
68
|
+
value: function matchBefore(expr) {
|
|
69
|
+
var line = this.state.doc.lineAt(this.pos);
|
|
70
|
+
var start = Math.max(line.from, this.pos - 250);
|
|
71
|
+
var str = line.text.slice(start - line.from, this.pos - line.from);
|
|
72
|
+
var found = str.search(ensureAnchor(expr, false));
|
|
73
|
+
return found < 0 ? null : {
|
|
74
|
+
from: start + found,
|
|
75
|
+
to: this.pos,
|
|
76
|
+
text: str.slice(found)
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/// Yields true when the query has been aborted. Can be useful in
|
|
81
|
+
/// asynchronous queries to avoid doing work that will be ignored.
|
|
82
|
+
}, {
|
|
83
|
+
key: "aborted",
|
|
84
|
+
get: function get() {
|
|
85
|
+
return this.abortListeners === null;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/// Allows you to register abort handlers, which will be called when
|
|
89
|
+
/// the query is
|
|
90
|
+
/// [aborted](#autocomplete.CompletionContext.aborted).
|
|
91
|
+
}, {
|
|
92
|
+
key: "addEventListener",
|
|
93
|
+
value: function addEventListener(type, listener) {
|
|
94
|
+
if (type === 'abort' && this.abortListeners) {
|
|
95
|
+
this.abortListeners.push(listener);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}]);
|
|
99
|
+
return CompletionContext;
|
|
100
|
+
}();
|
|
101
|
+
function toSet(chars) {
|
|
102
|
+
var flat = Object.keys(chars).join('');
|
|
103
|
+
var words = /\w/.test(flat);
|
|
104
|
+
if (words) {
|
|
105
|
+
flat = flat.replace(/\w/g, '');
|
|
106
|
+
}
|
|
107
|
+
return "[".concat(words ? '\\w' : '').concat(flat.replace(/[^\w\s]/g, '\\$&'), "]");
|
|
108
|
+
}
|
|
109
|
+
function prefixMatch(options) {
|
|
110
|
+
var first = Object.create(null),
|
|
111
|
+
rest = Object.create(null);
|
|
112
|
+
var _iterator = _createForOfIteratorHelper(options),
|
|
113
|
+
_step;
|
|
114
|
+
try {
|
|
115
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
116
|
+
var label = _step.value.label;
|
|
117
|
+
first[label[0]] = true;
|
|
118
|
+
for (var i = 1; i < label.length; i++) {
|
|
119
|
+
rest[label[i]] = true;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
} catch (err) {
|
|
123
|
+
_iterator.e(err);
|
|
124
|
+
} finally {
|
|
125
|
+
_iterator.f();
|
|
126
|
+
}
|
|
127
|
+
var source = toSet(first) + toSet(rest) + '*$';
|
|
128
|
+
return [new RegExp('^' + source), new RegExp(source)];
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/// Given a a fixed array of options, return an autocompleter that
|
|
132
|
+
/// completes them.
|
|
133
|
+
export function completeFromList(list) {
|
|
134
|
+
var options = list.map(function (o) {
|
|
135
|
+
return typeof o === 'string' ? {
|
|
136
|
+
label: o
|
|
137
|
+
} : o;
|
|
138
|
+
});
|
|
139
|
+
var _ref = options.every(function (o) {
|
|
140
|
+
return /^\w+$/.test(o.label);
|
|
141
|
+
}) ? [/\w*$/, /\w+$/] : prefixMatch(options),
|
|
142
|
+
_ref2 = _slicedToArray(_ref, 2),
|
|
143
|
+
validFor = _ref2[0],
|
|
144
|
+
match = _ref2[1];
|
|
145
|
+
return function (context) {
|
|
146
|
+
var token = context.matchBefore(match);
|
|
147
|
+
return token || context.explicit ? {
|
|
148
|
+
from: token ? token.from : context.pos,
|
|
149
|
+
options: options,
|
|
150
|
+
validFor: validFor
|
|
151
|
+
} : null;
|
|
152
|
+
};
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/// Wrap the given completion source so that it will only fire when the
|
|
156
|
+
/// cursor is in a syntax node with one of the given names.
|
|
157
|
+
export function ifIn(nodes, source) {
|
|
158
|
+
return function (context) {
|
|
159
|
+
for (var _pos = syntaxTree(context.state).resolveInner(context.pos, -1); _pos; _pos = _pos.parent) {
|
|
160
|
+
if (nodes.indexOf(_pos.name) > -1) {
|
|
161
|
+
return source(context);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return null;
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/// Wrap the given completion source so that it will not fire when the
|
|
169
|
+
/// cursor is in a syntax node with one of the given names.
|
|
170
|
+
export function ifNotIn(nodes, source) {
|
|
171
|
+
return function (context) {
|
|
172
|
+
for (var _pos2 = syntaxTree(context.state).resolveInner(context.pos, -1); _pos2; _pos2 = _pos2.parent) {
|
|
173
|
+
if (nodes.indexOf(_pos2.name) > -1) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
return source(context);
|
|
178
|
+
};
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
/// The function signature for a completion source. Such a function
|
|
182
|
+
/// may return its [result](#autocomplete.CompletionResult)
|
|
183
|
+
/// synchronously or as a promise. Returning null indicates no
|
|
184
|
+
/// completions are available.
|
|
185
|
+
/// Interface for objects returned by completion sources.
|
|
186
|
+
export var Option = /*#__PURE__*/_createClass(function Option(completion, source, match) {
|
|
187
|
+
_classCallCheck(this, Option);
|
|
188
|
+
this.completion = completion;
|
|
189
|
+
this.source = source;
|
|
190
|
+
this.match = match;
|
|
191
|
+
});
|
|
192
|
+
export function cur(state) {
|
|
193
|
+
return state.selection.main.head;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
// Make sure the given regexp has a $ at its end and, if `start` is
|
|
197
|
+
// true, a ^ at its start.
|
|
198
|
+
export function ensureAnchor(expr, start) {
|
|
199
|
+
var _expr$flags;
|
|
200
|
+
var source = expr.source;
|
|
201
|
+
var addStart = start && source[0] !== '^',
|
|
202
|
+
addEnd = source[source.length - 1] !== '$';
|
|
203
|
+
if (!addStart && !addEnd) {
|
|
204
|
+
return expr;
|
|
205
|
+
}
|
|
206
|
+
return new RegExp("".concat(addStart ? '^' : '', "(?:").concat(source, ")").concat(addEnd ? '$' : ''), (_expr$flags = expr.flags) !== null && _expr$flags !== void 0 ? _expr$flags : expr.ignoreCase ? 'i' : '');
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/// This annotation is added to transactions that are produced by
|
|
210
|
+
/// picking a completion.
|
|
211
|
+
export var pickedCompletion = Annotation.define();
|
|
212
|
+
|
|
213
|
+
/// Helper function that returns a transaction spec which inserts a
|
|
214
|
+
/// completion's text in the main selection range, and any other
|
|
215
|
+
/// selection range that has the same text in front of it.
|
|
216
|
+
export function insertCompletionText(state, text, from, to) {
|
|
217
|
+
return _objectSpread(_objectSpread({}, state.changeByRange(function (range) {
|
|
218
|
+
if (range === state.selection.main) {
|
|
219
|
+
return {
|
|
220
|
+
changes: {
|
|
221
|
+
from: from,
|
|
222
|
+
to: to,
|
|
223
|
+
insert: text
|
|
224
|
+
},
|
|
225
|
+
range: EditorSelection.cursor(from + text.length)
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
var len = to - from;
|
|
229
|
+
if (!range.empty || len && state.sliceDoc(range.from - len, range.from) !== state.sliceDoc(from, to)) {
|
|
230
|
+
return {
|
|
231
|
+
range: range
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
return {
|
|
235
|
+
changes: {
|
|
236
|
+
from: range.from - len,
|
|
237
|
+
to: range.from,
|
|
238
|
+
insert: text
|
|
239
|
+
},
|
|
240
|
+
range: EditorSelection.cursor(range.from - len + text.length)
|
|
241
|
+
};
|
|
242
|
+
})), {}, {
|
|
243
|
+
userEvent: 'input.complete'
|
|
244
|
+
});
|
|
245
|
+
}
|
|
246
|
+
export function applyCompletion(view, option) {
|
|
247
|
+
var apply = option.completion.apply || option.completion.label;
|
|
248
|
+
var result = option.source;
|
|
249
|
+
if (typeof apply === 'string') {
|
|
250
|
+
view.dispatch(insertCompletionText(view.state, apply, result.from, result.to));
|
|
251
|
+
} else {
|
|
252
|
+
apply(view, option.completion, result.from, result.to);
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
var SourceCache = new WeakMap();
|
|
256
|
+
export function asSource(source) {
|
|
257
|
+
if (!Array.isArray(source)) {
|
|
258
|
+
return source;
|
|
259
|
+
}
|
|
260
|
+
var known = SourceCache.get(source);
|
|
261
|
+
if (!known) {
|
|
262
|
+
SourceCache.set(source, known = completeFromList(source));
|
|
263
|
+
}
|
|
264
|
+
return known;
|
|
265
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { EditorState } from '@codemirror/state';
|
|
2
|
+
import { Facet } from '@codemirror/state';
|
|
3
|
+
import type { Completion, CompletionSource } from './completion.js';
|
|
4
|
+
export interface CompletionConfig {
|
|
5
|
+
activateOnTyping?: boolean;
|
|
6
|
+
selectOnOpen?: boolean;
|
|
7
|
+
override?: readonly CompletionSource[] | null;
|
|
8
|
+
closeOnBlur?: boolean;
|
|
9
|
+
maxRenderedOptions?: number;
|
|
10
|
+
defaultKeymap?: boolean;
|
|
11
|
+
aboveCursor?: boolean;
|
|
12
|
+
optionClass?: (completion: Completion) => string;
|
|
13
|
+
icons?: boolean;
|
|
14
|
+
addToOptions?: {
|
|
15
|
+
render: (completion: Completion, state: EditorState) => Node | null;
|
|
16
|
+
position: number;
|
|
17
|
+
}[];
|
|
18
|
+
compareCompletions?: (a: Completion, b: Completion) => number;
|
|
19
|
+
interactionDelay?: number;
|
|
20
|
+
}
|
|
21
|
+
export declare const completionConfig: Facet<CompletionConfig, Required<CompletionConfig>>;
|
|
22
|
+
//# sourceMappingURL=config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../src/auto-complete/config.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,KAAK,EAAiB,MAAM,mBAAmB,CAAC;AAEzD,OAAO,KAAK,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAEpE,MAAM,WAAW,gBAAgB;IAG/B,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAO3B,YAAY,CAAC,EAAE,OAAO,CAAC;IAMvB,QAAQ,CAAC,EAAE,SAAS,gBAAgB,EAAE,GAAG,IAAI,CAAC;IAG9C,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,kBAAkB,CAAC,EAAE,MAAM,CAAC;IAM5B,aAAa,CAAC,EAAE,OAAO,CAAC;IAIxB,WAAW,CAAC,EAAE,OAAO,CAAC;IAGtB,WAAW,CAAC,EAAE,CAAC,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC;IAIjD,KAAK,CAAC,EAAE,OAAO,CAAC;IAQhB,YAAY,CAAC,EAAE;QACb,MAAM,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,IAAI,CAAC;QACpE,QAAQ,EAAE,MAAM,CAAC;KAClB,EAAE,CAAC;IAIJ,kBAAkB,CAAC,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC,EAAE,UAAU,KAAK,MAAM,CAAC;IAK9D,gBAAgB,CAAC,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,gBAAgB,qDA8B3B,CAAC"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import { Facet, combineConfig } from '@codemirror/state';
|
|
2
|
+
export var completionConfig = Facet.define({
|
|
3
|
+
combine: function combine(configs) {
|
|
4
|
+
return combineConfig(configs, {
|
|
5
|
+
activateOnTyping: true,
|
|
6
|
+
selectOnOpen: true,
|
|
7
|
+
override: null,
|
|
8
|
+
closeOnBlur: true,
|
|
9
|
+
maxRenderedOptions: 100,
|
|
10
|
+
defaultKeymap: true,
|
|
11
|
+
optionClass: function optionClass() {
|
|
12
|
+
return '';
|
|
13
|
+
},
|
|
14
|
+
aboveCursor: false,
|
|
15
|
+
icons: true,
|
|
16
|
+
addToOptions: [],
|
|
17
|
+
compareCompletions: function compareCompletions(a, b) {
|
|
18
|
+
return a.label.localeCompare(b.label);
|
|
19
|
+
},
|
|
20
|
+
interactionDelay: 75
|
|
21
|
+
}, {
|
|
22
|
+
defaultKeymap: function defaultKeymap(a, b) {
|
|
23
|
+
return a && b;
|
|
24
|
+
},
|
|
25
|
+
closeOnBlur: function closeOnBlur(a, b) {
|
|
26
|
+
return a && b;
|
|
27
|
+
},
|
|
28
|
+
icons: function icons(a, b) {
|
|
29
|
+
return a && b;
|
|
30
|
+
},
|
|
31
|
+
optionClass: function optionClass(a, b) {
|
|
32
|
+
return function (c) {
|
|
33
|
+
return joinClass(a(c), b(c));
|
|
34
|
+
};
|
|
35
|
+
},
|
|
36
|
+
addToOptions: function addToOptions(a, b) {
|
|
37
|
+
return a.concat(b);
|
|
38
|
+
}
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
});
|
|
42
|
+
function joinClass(a, b) {
|
|
43
|
+
return a ? b ? a + ' ' + b : a : b;
|
|
44
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export declare class FuzzyMatcher {
|
|
2
|
+
readonly pattern: string;
|
|
3
|
+
chars: number[];
|
|
4
|
+
folded: number[];
|
|
5
|
+
astral: boolean;
|
|
6
|
+
any: number[];
|
|
7
|
+
precise: number[];
|
|
8
|
+
byWord: number[];
|
|
9
|
+
constructor(pattern: string);
|
|
10
|
+
match(word: string): number[] | null;
|
|
11
|
+
result(score: number, positions: number[], word: string): number[];
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=filter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"filter.d.ts","sourceRoot":"","sources":["../../src/auto-complete/filter.ts"],"names":[],"mappings":"AAuBA,qBAAa,YAAY;IAWX,QAAQ,CAAC,OAAO,EAAE,MAAM;IAVpC,KAAK,EAAE,MAAM,EAAE,CAAM;IACrB,MAAM,EAAE,MAAM,EAAE,CAAM;IACtB,MAAM,EAAE,OAAO,CAAC;IAIhB,GAAG,EAAE,MAAM,EAAE,CAAM;IACnB,OAAO,EAAE,MAAM,EAAE,CAAM;IACvB,MAAM,EAAE,MAAM,EAAE,CAAM;gBAED,OAAO,EAAE,MAAM;IAoBpC,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,GAAG,IAAI;IAkJpC,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,MAAM;CAcxD"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
2
|
+
function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e2) { throw _e2; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e3) { didErr = true; err = _e3; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
|
|
3
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
4
|
+
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
|
|
5
|
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
6
|
+
function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } }
|
|
7
|
+
function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; }
|
|
8
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
9
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
10
|
+
/* eslint-disable prefer-const */
|
|
11
|
+
/* eslint-disable @typescript-eslint/no-parameter-properties */
|
|
12
|
+
/* eslint-disable @typescript-eslint/parameter-properties */
|
|
13
|
+
import { codePointAt, codePointSize, fromCodePoint } from '@codemirror/state';
|
|
14
|
+
|
|
15
|
+
// Scores are counted from 0 (great match) down to negative numbers,
|
|
16
|
+
// assigning specific penalty values for specific shortcomings.
|
|
17
|
+
var Penalty = /*#__PURE__*/function (Penalty) {
|
|
18
|
+
Penalty[Penalty["Gap"] = -1100] = "Gap";
|
|
19
|
+
Penalty[Penalty["NotStart"] = -700] = "NotStart";
|
|
20
|
+
Penalty[Penalty["CaseFold"] = -200] = "CaseFold";
|
|
21
|
+
Penalty[Penalty["ByWord"] = -100] = "ByWord";
|
|
22
|
+
return Penalty;
|
|
23
|
+
}(Penalty || {}); // The match is by-word, meaning each char in the pattern matches the start of a word in the string
|
|
24
|
+
var Tp = /*#__PURE__*/function (Tp) {
|
|
25
|
+
Tp[Tp["NonWord"] = 0] = "NonWord";
|
|
26
|
+
Tp[Tp["Upper"] = 1] = "Upper";
|
|
27
|
+
Tp[Tp["Lower"] = 2] = "Lower";
|
|
28
|
+
return Tp;
|
|
29
|
+
}(Tp || {}); // A pattern matcher for fuzzy completion matching. Create an instance
|
|
30
|
+
// once for a pattern, and then use that to match any number of
|
|
31
|
+
// completions.
|
|
32
|
+
export var FuzzyMatcher = /*#__PURE__*/function () {
|
|
33
|
+
function FuzzyMatcher(pattern) {
|
|
34
|
+
_classCallCheck(this, FuzzyMatcher);
|
|
35
|
+
this.pattern = pattern;
|
|
36
|
+
this.chars = [];
|
|
37
|
+
this.folded = [];
|
|
38
|
+
// Buffers reused by calls to `match` to track matched character
|
|
39
|
+
// positions.
|
|
40
|
+
this.any = [];
|
|
41
|
+
this.precise = [];
|
|
42
|
+
this.byWord = [];
|
|
43
|
+
for (var p = 0; p < pattern.length;) {
|
|
44
|
+
var char = codePointAt(pattern, p),
|
|
45
|
+
size = codePointSize(char);
|
|
46
|
+
this.chars.push(char);
|
|
47
|
+
var part = pattern.slice(p, p + size),
|
|
48
|
+
upper = part.toUpperCase();
|
|
49
|
+
this.folded.push(codePointAt(upper === part ? part.toLowerCase() : upper, 0));
|
|
50
|
+
p += size;
|
|
51
|
+
}
|
|
52
|
+
this.astral = pattern.length !== this.chars.length;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Matches a given word (completion) against the pattern (input).
|
|
56
|
+
// Will return null for no match, and otherwise an array that starts
|
|
57
|
+
// with the match score, followed by any number of `from, to` pairs
|
|
58
|
+
// indicating the matched parts of `word`.
|
|
59
|
+
//
|
|
60
|
+
// The score is a number that is more negative the worse the match
|
|
61
|
+
// is. See `Penalty` above.
|
|
62
|
+
_createClass(FuzzyMatcher, [{
|
|
63
|
+
key: "match",
|
|
64
|
+
value: function match(word) {
|
|
65
|
+
if (this.pattern.length === 0) {
|
|
66
|
+
return [0];
|
|
67
|
+
}
|
|
68
|
+
if (word.length < this.pattern.length) {
|
|
69
|
+
return null;
|
|
70
|
+
}
|
|
71
|
+
var chars = this.chars,
|
|
72
|
+
folded = this.folded,
|
|
73
|
+
any = this.any,
|
|
74
|
+
precise = this.precise,
|
|
75
|
+
byWord = this.byWord;
|
|
76
|
+
// For single-character queries, only match when they occur right
|
|
77
|
+
// at the start
|
|
78
|
+
if (chars.length === 1) {
|
|
79
|
+
var first = codePointAt(word, 0);
|
|
80
|
+
return first === chars[0] ? [0, 0, codePointSize(first)] : first === folded[0] ? [Penalty.CaseFold, 0, codePointSize(first)] : null;
|
|
81
|
+
}
|
|
82
|
+
var direct = word.indexOf(this.pattern);
|
|
83
|
+
if (direct === 0) {
|
|
84
|
+
return [0, 0, this.pattern.length];
|
|
85
|
+
}
|
|
86
|
+
var len = chars.length,
|
|
87
|
+
anyTo = 0;
|
|
88
|
+
if (direct < 0) {
|
|
89
|
+
for (var i = 0, e = Math.min(word.length, 200); i < e && anyTo < len;) {
|
|
90
|
+
var next = codePointAt(word, i);
|
|
91
|
+
if (next === chars[anyTo] || next === folded[anyTo]) {
|
|
92
|
+
any[anyTo++] = i;
|
|
93
|
+
}
|
|
94
|
+
i += codePointSize(next);
|
|
95
|
+
}
|
|
96
|
+
// No match, exit immediately
|
|
97
|
+
if (anyTo < len) {
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
// This tracks the extent of the precise (non-folded, not
|
|
103
|
+
// necessarily adjacent) match
|
|
104
|
+
var preciseTo = 0;
|
|
105
|
+
// Tracks whether there is a match that hits only characters that
|
|
106
|
+
// appear to be starting words. `byWordFolded` is set to true when
|
|
107
|
+
// a case folded character is encountered in such a match
|
|
108
|
+
var byWordTo = 0,
|
|
109
|
+
byWordFolded = false;
|
|
110
|
+
// If we've found a partial adjacent match, these track its state
|
|
111
|
+
var adjacentTo = 0,
|
|
112
|
+
adjacentStart = -1,
|
|
113
|
+
adjacentEnd = -1;
|
|
114
|
+
var hasLower = /[a-z]/.test(word),
|
|
115
|
+
wordAdjacent = true;
|
|
116
|
+
// Go over the option's text, scanning for the various kinds of matches
|
|
117
|
+
for (var _i = 0, _e = Math.min(word.length, 200), prevType = Tp.NonWord; _i < _e && byWordTo < len;) {
|
|
118
|
+
var _next = codePointAt(word, _i);
|
|
119
|
+
if (direct < 0) {
|
|
120
|
+
if (preciseTo < len && _next === chars[preciseTo]) {
|
|
121
|
+
precise[preciseTo++] = _i;
|
|
122
|
+
}
|
|
123
|
+
if (adjacentTo < len) {
|
|
124
|
+
if (_next === chars[adjacentTo] || _next === folded[adjacentTo]) {
|
|
125
|
+
if (adjacentTo === 0) {
|
|
126
|
+
adjacentStart = _i;
|
|
127
|
+
}
|
|
128
|
+
adjacentEnd = _i + 1;
|
|
129
|
+
adjacentTo++;
|
|
130
|
+
} else {
|
|
131
|
+
adjacentTo = 0;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
var ch = void 0,
|
|
136
|
+
type = _next < 0xff ? _next >= 48 && _next <= 57 || _next >= 97 && _next <= 122 ? Tp.Lower : _next >= 65 && _next <= 90 ? Tp.Upper : Tp.NonWord : (ch = fromCodePoint(_next)) !== ch.toLowerCase() ? Tp.Upper : ch !== ch.toUpperCase() ? Tp.Lower : Tp.NonWord;
|
|
137
|
+
if (!_i || type === Tp.Upper && hasLower || prevType === Tp.NonWord && type !== Tp.NonWord) {
|
|
138
|
+
if (chars[byWordTo] === _next || folded[byWordTo] === _next && (byWordFolded = true)) {
|
|
139
|
+
byWord[byWordTo++] = _i;
|
|
140
|
+
} else if (byWord.length) {
|
|
141
|
+
wordAdjacent = false;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
prevType = type;
|
|
145
|
+
_i += codePointSize(_next);
|
|
146
|
+
}
|
|
147
|
+
if (byWordTo === len && byWord[0] === 0 && wordAdjacent) {
|
|
148
|
+
return this.result(Penalty.ByWord + (byWordFolded ? Penalty.CaseFold : 0), byWord, word);
|
|
149
|
+
}
|
|
150
|
+
if (adjacentTo === len && adjacentStart === 0) {
|
|
151
|
+
return [Penalty.CaseFold - word.length, 0, adjacentEnd];
|
|
152
|
+
}
|
|
153
|
+
if (direct > -1) {
|
|
154
|
+
return [Penalty.NotStart - word.length, direct, direct + this.pattern.length];
|
|
155
|
+
}
|
|
156
|
+
if (adjacentTo === len) {
|
|
157
|
+
return [Penalty.CaseFold + Penalty.NotStart - word.length, adjacentStart, adjacentEnd];
|
|
158
|
+
}
|
|
159
|
+
if (byWordTo === len) {
|
|
160
|
+
return this.result(Penalty.ByWord + (byWordFolded ? Penalty.CaseFold : 0) + Penalty.NotStart + (wordAdjacent ? 0 : Penalty.Gap), byWord, word);
|
|
161
|
+
}
|
|
162
|
+
return chars.length === 2 ? null : this.result((any[0] ? Penalty.NotStart : 0) + Penalty.CaseFold + Penalty.Gap, any, word);
|
|
163
|
+
}
|
|
164
|
+
}, {
|
|
165
|
+
key: "result",
|
|
166
|
+
value: function result(score, positions, word) {
|
|
167
|
+
var result = [score - word.length],
|
|
168
|
+
i = 1;
|
|
169
|
+
var _iterator = _createForOfIteratorHelper(positions),
|
|
170
|
+
_step;
|
|
171
|
+
try {
|
|
172
|
+
for (_iterator.s(); !(_step = _iterator.n()).done;) {
|
|
173
|
+
var pos = _step.value;
|
|
174
|
+
var to = pos + (this.astral ? codePointSize(codePointAt(word, pos)) : 1);
|
|
175
|
+
if (i > 1 && result[i - 1] === pos) {
|
|
176
|
+
result[i - 1] = to;
|
|
177
|
+
} else {
|
|
178
|
+
result[i++] = pos;
|
|
179
|
+
result[i++] = to;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
} catch (err) {
|
|
183
|
+
_iterator.e(err);
|
|
184
|
+
} finally {
|
|
185
|
+
_iterator.f();
|
|
186
|
+
}
|
|
187
|
+
return result;
|
|
188
|
+
}
|
|
189
|
+
}]);
|
|
190
|
+
return FuzzyMatcher;
|
|
191
|
+
}();
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Extension, EditorState, StateEffect } from '@codemirror/state';
|
|
2
|
+
import type { KeyBinding } from '@codemirror/view';
|
|
3
|
+
import type { Completion } from './completion.js';
|
|
4
|
+
import type { CompletionConfig } from './config.js';
|
|
5
|
+
export * from './snippet.js';
|
|
6
|
+
export * from './completion.js';
|
|
7
|
+
export * from './view.js';
|
|
8
|
+
export * from './word.js';
|
|
9
|
+
export * from './closebrackets.js';
|
|
10
|
+
export declare function autocompletion(config?: CompletionConfig): Extension;
|
|
11
|
+
export declare const completionKeymap: readonly KeyBinding[];
|
|
12
|
+
export declare function completionStatus(state: EditorState): null | 'active' | 'pending';
|
|
13
|
+
export declare function currentCompletions(state: EditorState): readonly Completion[];
|
|
14
|
+
export declare function selectedCompletion(state: EditorState): Completion | null;
|
|
15
|
+
export declare function selectedCompletionIndex(state: EditorState): number | null;
|
|
16
|
+
export declare function setSelectedCompletion(index: number): StateEffect<unknown>;
|
|
17
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/auto-complete/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAE7E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAKnD,OAAO,KAAK,EAAE,UAAU,EAAU,MAAM,iBAAiB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpD,cAAc,cAAc,CAAC;AAC7B,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,WAAW,CAAC;AAC1B,cAAc,oBAAoB,CAAC;AAGnC,wBAAgB,cAAc,CAAC,MAAM,GAAE,gBAAqB,GAAG,SAAS,CAQvE;AAWD,eAAO,MAAM,gBAAgB,EAAE,SAAS,UAAU,EAQjD,CAAC;AAYF,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,WAAW,GAAG,IAAI,GAAG,QAAQ,GAAG,SAAS,CAOhF;AAMD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,SAAS,UAAU,EAAE,CAa5E;AAGD,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,WAAW,GAAG,UAAU,GAAG,IAAI,CAGxE;AAID,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,WAAW,GAAG,MAAM,GAAG,IAAI,CAGzE;AAID,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAAC,OAAO,CAAC,CAEzE"}
|