@kerebron/extension-lsp 0.4.1
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 +23 -0
- package/README.md +82 -0
- package/esm/_dnt.polyfills.d.ts +101 -0
- package/esm/_dnt.polyfills.d.ts.map +1 -0
- package/esm/_dnt.polyfills.js +127 -0
- package/esm/_dnt.shims.d.ts +6 -0
- package/esm/_dnt.shims.d.ts.map +1 -0
- package/esm/_dnt.shims.js +61 -0
- package/esm/editor/src/CoreEditor.d.ts +40 -0
- package/esm/editor/src/CoreEditor.d.ts.map +1 -0
- package/esm/editor/src/CoreEditor.js +252 -0
- package/esm/editor/src/DummyEditorView.d.ts +60 -0
- package/esm/editor/src/DummyEditorView.d.ts.map +1 -0
- package/esm/editor/src/DummyEditorView.js +277 -0
- package/esm/editor/src/Extension.d.ts +31 -0
- package/esm/editor/src/Extension.d.ts.map +1 -0
- package/esm/editor/src/Extension.js +53 -0
- package/esm/editor/src/ExtensionManager.d.ts +32 -0
- package/esm/editor/src/ExtensionManager.d.ts.map +1 -0
- package/esm/editor/src/ExtensionManager.js +260 -0
- package/esm/editor/src/Mark.d.ts +23 -0
- package/esm/editor/src/Mark.d.ts.map +1 -0
- package/esm/editor/src/Mark.js +51 -0
- package/esm/editor/src/Node.d.ts +32 -0
- package/esm/editor/src/Node.d.ts.map +1 -0
- package/esm/editor/src/Node.js +60 -0
- package/esm/editor/src/commands/CommandManager.d.ts +23 -0
- package/esm/editor/src/commands/CommandManager.d.ts.map +1 -0
- package/esm/editor/src/commands/CommandManager.js +118 -0
- package/esm/editor/src/commands/baseCommandFactories.d.ts +3 -0
- package/esm/editor/src/commands/baseCommandFactories.d.ts.map +1 -0
- package/esm/editor/src/commands/baseCommandFactories.js +836 -0
- package/esm/editor/src/commands/createChainableState.d.ts +3 -0
- package/esm/editor/src/commands/createChainableState.d.ts.map +1 -0
- package/esm/editor/src/commands/createChainableState.js +29 -0
- package/esm/editor/src/commands/keyCommandFactories.d.ts +3 -0
- package/esm/editor/src/commands/keyCommandFactories.d.ts.map +1 -0
- package/esm/editor/src/commands/keyCommandFactories.js +10 -0
- package/esm/editor/src/commands/mod.d.ts +7 -0
- package/esm/editor/src/commands/mod.d.ts.map +1 -0
- package/esm/editor/src/commands/mod.js +76 -0
- package/esm/editor/src/commands/replaceCommandFactories.d.ts +3 -0
- package/esm/editor/src/commands/replaceCommandFactories.d.ts.map +1 -0
- package/esm/editor/src/commands/replaceCommandFactories.js +94 -0
- package/esm/editor/src/commands/types.d.ts +18 -0
- package/esm/editor/src/commands/types.d.ts.map +1 -0
- package/esm/editor/src/commands/types.js +1 -0
- package/esm/editor/src/mod.d.ts +9 -0
- package/esm/editor/src/mod.d.ts.map +1 -0
- package/esm/editor/src/mod.js +8 -0
- package/esm/editor/src/nodeToTreeString.d.ts +10 -0
- package/esm/editor/src/nodeToTreeString.d.ts.map +1 -0
- package/esm/editor/src/nodeToTreeString.js +74 -0
- package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts +6 -0
- package/esm/editor/src/plugins/TrackSelecionPlugin.d.ts.map +1 -0
- package/esm/editor/src/plugins/TrackSelecionPlugin.js +24 -0
- package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts +23 -0
- package/esm/editor/src/plugins/input-rules/InputRulesPlugin.d.ts.map +1 -0
- package/esm/editor/src/plugins/input-rules/InputRulesPlugin.js +163 -0
- package/esm/editor/src/plugins/keymap/keymap.d.ts +11 -0
- package/esm/editor/src/plugins/keymap/keymap.d.ts.map +1 -0
- package/esm/editor/src/plugins/keymap/keymap.js +125 -0
- package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts +4 -0
- package/esm/editor/src/plugins/keymap/w3c-keyname.d.ts.map +1 -0
- package/esm/editor/src/plugins/keymap/w3c-keyname.js +124 -0
- package/esm/editor/src/types.d.ts +52 -0
- package/esm/editor/src/types.d.ts.map +1 -0
- package/esm/editor/src/types.js +1 -0
- package/esm/editor/src/ui.d.ts +15 -0
- package/esm/editor/src/ui.d.ts.map +1 -0
- package/esm/editor/src/ui.js +16 -0
- package/esm/editor/src/utilities/SmartOutput.d.ts +41 -0
- package/esm/editor/src/utilities/SmartOutput.d.ts.map +1 -0
- package/esm/editor/src/utilities/SmartOutput.js +228 -0
- package/esm/editor/src/utilities/createNodeFromContent.d.ts +9 -0
- package/esm/editor/src/utilities/createNodeFromContent.d.ts.map +1 -0
- package/esm/editor/src/utilities/createNodeFromContent.js +32 -0
- package/esm/editor/src/utilities/getHtmlAttributes.d.ts +9 -0
- package/esm/editor/src/utilities/getHtmlAttributes.d.ts.map +1 -0
- package/esm/editor/src/utilities/getHtmlAttributes.js +47 -0
- package/esm/editor/src/utilities/getShadowRoot.d.ts +2 -0
- package/esm/editor/src/utilities/getShadowRoot.d.ts.map +1 -0
- package/esm/editor/src/utilities/getShadowRoot.js +16 -0
- package/esm/editor/src/utilities/mod.d.ts +6 -0
- package/esm/editor/src/utilities/mod.d.ts.map +1 -0
- package/esm/editor/src/utilities/mod.js +5 -0
- package/esm/editor/src/utilities/toRawTextResult.d.ts +3 -0
- package/esm/editor/src/utilities/toRawTextResult.d.ts.map +1 -0
- package/esm/editor/src/utilities/toRawTextResult.js +21 -0
- package/esm/extension-autocomplete/src/AutocompletePlugin.d.ts +8 -0
- package/esm/extension-autocomplete/src/AutocompletePlugin.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/AutocompletePlugin.js +232 -0
- package/esm/extension-autocomplete/src/DefaultRenderer.d.ts +17 -0
- package/esm/extension-autocomplete/src/DefaultRenderer.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/DefaultRenderer.js +137 -0
- package/esm/extension-autocomplete/src/ExtensionAutocomplete.d.ts +26 -0
- package/esm/extension-autocomplete/src/ExtensionAutocomplete.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/ExtensionAutocomplete.js +30 -0
- package/esm/extension-autocomplete/src/createDefaultMatcher.d.ts +11 -0
- package/esm/extension-autocomplete/src/createDefaultMatcher.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/createDefaultMatcher.js +58 -0
- package/esm/extension-autocomplete/src/createRegexMatcher.d.ts +4 -0
- package/esm/extension-autocomplete/src/createRegexMatcher.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/createRegexMatcher.js +50 -0
- package/esm/extension-autocomplete/src/mod.d.ts +3 -0
- package/esm/extension-autocomplete/src/mod.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/mod.js +2 -0
- package/esm/extension-autocomplete/src/types.d.ts +60 -0
- package/esm/extension-autocomplete/src/types.d.ts.map +1 -0
- package/esm/extension-autocomplete/src/types.js +1 -0
- package/esm/extension-basic-editor/src/ExtensionHtml.d.ts +15 -0
- package/esm/extension-basic-editor/src/ExtensionHtml.d.ts.map +1 -0
- package/esm/extension-basic-editor/src/ExtensionHtml.js +108 -0
- package/esm/extension-lsp/src/DiagnosticPlugin.d.ts +32 -0
- package/esm/extension-lsp/src/DiagnosticPlugin.d.ts.map +1 -0
- package/esm/extension-lsp/src/DiagnosticPlugin.js +131 -0
- package/esm/extension-lsp/src/ExtensionLsp.d.ts +25 -0
- package/esm/extension-lsp/src/ExtensionLsp.d.ts.map +1 -0
- package/esm/extension-lsp/src/ExtensionLsp.js +126 -0
- package/esm/extension-lsp/src/LSPClient.d.ts +56 -0
- package/esm/extension-lsp/src/LSPClient.d.ts.map +1 -0
- package/esm/extension-lsp/src/LSPClient.js +449 -0
- package/esm/extension-lsp/src/LspWebSocketTransport.d.ts +20 -0
- package/esm/extension-lsp/src/LspWebSocketTransport.d.ts.map +1 -0
- package/esm/extension-lsp/src/LspWebSocketTransport.js +137 -0
- package/esm/extension-lsp/src/computeIncrementalChanges.d.ts +8 -0
- package/esm/extension-lsp/src/computeIncrementalChanges.d.ts.map +1 -0
- package/esm/extension-lsp/src/computeIncrementalChanges.js +82 -0
- package/esm/extension-lsp/src/createLspAutocomplete.d.ts +23 -0
- package/esm/extension-lsp/src/createLspAutocomplete.d.ts.map +1 -0
- package/esm/extension-lsp/src/createLspAutocomplete.js +68 -0
- package/esm/extension-lsp/src/mod.d.ts +5 -0
- package/esm/extension-lsp/src/mod.d.ts.map +1 -0
- package/esm/extension-lsp/src/mod.js +4 -0
- package/esm/extension-lsp/src/types.d.ts +20 -0
- package/esm/extension-lsp/src/types.d.ts.map +1 -0
- package/esm/extension-lsp/src/types.js +1 -0
- package/esm/extension-lsp/src/workspace.d.ts +62 -0
- package/esm/extension-lsp/src/workspace.d.ts.map +1 -0
- package/esm/extension-lsp/src/workspace.js +168 -0
- package/esm/extension-markdown/src/DocumentMarkdownInlineTokenizer.d.ts +36 -0
- package/esm/extension-markdown/src/DocumentMarkdownInlineTokenizer.d.ts.map +1 -0
- package/esm/extension-markdown/src/DocumentMarkdownInlineTokenizer.js +240 -0
- package/esm/extension-markdown/src/DocumentMarkdownTokenizer.d.ts +26 -0
- package/esm/extension-markdown/src/DocumentMarkdownTokenizer.d.ts.map +1 -0
- package/esm/extension-markdown/src/DocumentMarkdownTokenizer.js +115 -0
- package/esm/extension-markdown/src/ExtensionMarkdown.d.ts +22 -0
- package/esm/extension-markdown/src/ExtensionMarkdown.d.ts.map +1 -0
- package/esm/extension-markdown/src/ExtensionMarkdown.js +48 -0
- package/esm/extension-markdown/src/MarkdownParser.d.ts +61 -0
- package/esm/extension-markdown/src/MarkdownParser.d.ts.map +1 -0
- package/esm/extension-markdown/src/MarkdownParser.js +249 -0
- package/esm/extension-markdown/src/MarkdownSerializer.d.ts +42 -0
- package/esm/extension-markdown/src/MarkdownSerializer.d.ts.map +1 -0
- package/esm/extension-markdown/src/MarkdownSerializer.js +325 -0
- package/esm/extension-markdown/src/PositionMapper.d.ts +15 -0
- package/esm/extension-markdown/src/PositionMapper.d.ts.map +1 -0
- package/esm/extension-markdown/src/PositionMapper.js +100 -0
- package/esm/extension-markdown/src/TokenSource.d.ts +11 -0
- package/esm/extension-markdown/src/TokenSource.d.ts.map +1 -0
- package/esm/extension-markdown/src/TokenSource.js +39 -0
- package/esm/extension-markdown/src/mdToPmConverter.d.ts +5 -0
- package/esm/extension-markdown/src/mdToPmConverter.d.ts.map +1 -0
- package/esm/extension-markdown/src/mdToPmConverter.js +111 -0
- package/esm/extension-markdown/src/pmToMdConverter.d.ts +16 -0
- package/esm/extension-markdown/src/pmToMdConverter.d.ts.map +1 -0
- package/esm/extension-markdown/src/pmToMdConverter.js +433 -0
- package/esm/extension-markdown/src/token_handlers/basic_token_handlers.d.ts +4 -0
- package/esm/extension-markdown/src/token_handlers/basic_token_handlers.d.ts.map +1 -0
- package/esm/extension-markdown/src/token_handlers/basic_token_handlers.js +151 -0
- package/esm/extension-markdown/src/token_handlers/footnote_token_handlers.d.ts +3 -0
- package/esm/extension-markdown/src/token_handlers/footnote_token_handlers.d.ts.map +1 -0
- package/esm/extension-markdown/src/token_handlers/footnote_token_handlers.js +34 -0
- package/esm/extension-markdown/src/token_handlers/inline_token_handlers.d.ts +6 -0
- package/esm/extension-markdown/src/token_handlers/inline_token_handlers.d.ts.map +1 -0
- package/esm/extension-markdown/src/token_handlers/inline_token_handlers.js +380 -0
- package/esm/extension-markdown/src/token_handlers/lists_token_handlers.d.ts +3 -0
- package/esm/extension-markdown/src/token_handlers/lists_token_handlers.d.ts.map +1 -0
- package/esm/extension-markdown/src/token_handlers/lists_token_handlers.js +323 -0
- package/esm/extension-markdown/src/token_handlers/table_token_handlers.d.ts +9 -0
- package/esm/extension-markdown/src/token_handlers/table_token_handlers.d.ts.map +1 -0
- package/esm/extension-markdown/src/token_handlers/table_token_handlers.js +308 -0
- package/esm/extension-markdown/src/treeSitterTokenizer.d.ts +5 -0
- package/esm/extension-markdown/src/treeSitterTokenizer.d.ts.map +1 -0
- package/esm/extension-markdown/src/treeSitterTokenizer.js +769 -0
- package/esm/extension-markdown/src/types.d.ts +28 -0
- package/esm/extension-markdown/src/types.d.ts.map +1 -0
- package/esm/extension-markdown/src/types.js +131 -0
- package/esm/extension-markdown/src/utils.d.ts +8 -0
- package/esm/extension-markdown/src/utils.d.ts.map +1 -0
- package/esm/extension-markdown/src/utils.js +86 -0
- package/esm/package.json +3 -0
- package/esm/tree-sitter-shim/src/main.d.ts +15 -0
- package/esm/tree-sitter-shim/src/main.d.ts.map +1 -0
- package/esm/tree-sitter-shim/src/main.js +25 -0
- package/esm/tree-sitter-shim/src/tree_sitter/node.d.ts +6 -0
- package/esm/tree-sitter-shim/src/tree_sitter/node.d.ts.map +1 -0
- package/esm/tree-sitter-shim/src/tree_sitter/node.js +1 -0
- package/esm/tree-sitter-shim/src/tree_sitter/parser.d.ts +7 -0
- package/esm/tree-sitter-shim/src/tree_sitter/parser.d.ts.map +1 -0
- package/esm/tree-sitter-shim/src/tree_sitter/parser.js +5 -0
- package/esm/tree-sitter-shim/src/tree_sitter/tree.d.ts +6 -0
- package/esm/tree-sitter-shim/src/tree_sitter/tree.d.ts.map +1 -0
- package/esm/tree-sitter-shim/src/tree_sitter/tree.js +1 -0
- package/esm/wasm/src/mod.d.ts +12 -0
- package/esm/wasm/src/mod.d.ts.map +1 -0
- package/esm/wasm/src/mod.js +48 -0
- package/esm/wasm/wasm.d.ts +138 -0
- package/esm/wasm/wasm.d.ts.map +1 -0
- package/esm/wasm/wasm.js +120 -0
- package/package.json +31 -0
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
// source: https://stackoverflow.com/a/6969486
|
|
2
|
+
export function escapeForRegEx(string) {
|
|
3
|
+
return string.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
|
|
4
|
+
}
|
|
5
|
+
export function createDefaultMatcher(config = {}) {
|
|
6
|
+
const char = config.char || '@';
|
|
7
|
+
const allowToIncludeChar = config.allowToIncludeChar || false;
|
|
8
|
+
const allowedPrefixes = config.allowedPrefixes || [' '];
|
|
9
|
+
const startOfLine = config.startOfLine || false;
|
|
10
|
+
return ($position) => {
|
|
11
|
+
const allowSpaces = config.allowSpaces && !allowToIncludeChar;
|
|
12
|
+
const escapedChar = escapeForRegEx(char);
|
|
13
|
+
const suffix = new RegExp(`\\s${escapedChar}$`);
|
|
14
|
+
const prefix = startOfLine ? '^' : '';
|
|
15
|
+
const finalEscapedChar = allowToIncludeChar ? '' : escapedChar;
|
|
16
|
+
const regexp = allowSpaces
|
|
17
|
+
? new RegExp(`${prefix}${escapedChar}.*?(?=\\s${finalEscapedChar}|$)`, 'gm')
|
|
18
|
+
: new RegExp(`${prefix}(?:^)?${escapedChar}[^\\s${finalEscapedChar}]*`, 'gm');
|
|
19
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
20
|
+
if (!text) {
|
|
21
|
+
return null;
|
|
22
|
+
}
|
|
23
|
+
const textFrom = $position.pos - text.length;
|
|
24
|
+
const match = Array.from(text.matchAll(regexp)).pop();
|
|
25
|
+
if (!match || match.input === undefined || match.index === undefined) {
|
|
26
|
+
return null;
|
|
27
|
+
}
|
|
28
|
+
// JavaScript doesn't have lookbehinds. This hacks a check that first character
|
|
29
|
+
// is a space or the start of the line
|
|
30
|
+
const matchPrefix = match.input.slice(Math.max(0, match.index - 1), match.index);
|
|
31
|
+
const matchPrefixIsAllowed = new RegExp(`^[${allowedPrefixes?.join('')}\0]?$`)
|
|
32
|
+
.test(matchPrefix);
|
|
33
|
+
if (allowedPrefixes !== null && !matchPrefixIsAllowed) {
|
|
34
|
+
return null;
|
|
35
|
+
}
|
|
36
|
+
// The absolute position of the match in the document
|
|
37
|
+
const from = textFrom + match.index;
|
|
38
|
+
let to = from + match[0].length;
|
|
39
|
+
// Edge case handling; if spaces are allowed and we're directly in between
|
|
40
|
+
// two triggers
|
|
41
|
+
if (allowSpaces && suffix.test(text.slice(to - 1, to + 1))) {
|
|
42
|
+
match[0] += ' ';
|
|
43
|
+
to += 1;
|
|
44
|
+
}
|
|
45
|
+
// If the $position is located within the matched substring, return that range
|
|
46
|
+
if (from < $position.pos && to >= $position.pos) {
|
|
47
|
+
return {
|
|
48
|
+
range: {
|
|
49
|
+
from,
|
|
50
|
+
to,
|
|
51
|
+
},
|
|
52
|
+
query: match[0],
|
|
53
|
+
text: match[0],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
return null;
|
|
57
|
+
};
|
|
58
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createRegexMatcher.d.ts","sourceRoot":"","sources":["../../../src/extension-autocomplete/src/createRegexMatcher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAmB,MAAM,YAAY,CAAC;AAElE,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,UASxD;AAqBD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EAAE,GAChB,mBAAmB,CAmCrB"}
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
export function ensureAnchor(expr, start) {
|
|
2
|
+
let { source } = expr;
|
|
3
|
+
let addStart = start && source[0] != '^', addEnd = source[source.length - 1] != '$';
|
|
4
|
+
if (!addStart && !addEnd)
|
|
5
|
+
return expr;
|
|
6
|
+
return new RegExp(`${addStart ? '^' : ''}(?:${source})${addEnd ? '$' : ''}`, expr.flags ?? (expr.ignoreCase ? 'i' : ''));
|
|
7
|
+
}
|
|
8
|
+
function matchBefore($position, expr) {
|
|
9
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
10
|
+
if (!text) {
|
|
11
|
+
return null;
|
|
12
|
+
}
|
|
13
|
+
const textFrom = $position.pos - text.length;
|
|
14
|
+
const start = Math.max(textFrom, $position.pos - 250);
|
|
15
|
+
const str = text.slice();
|
|
16
|
+
const found = str.search(ensureAnchor(expr, false));
|
|
17
|
+
return found < 0
|
|
18
|
+
? null
|
|
19
|
+
: { from: start + found, to: $position.pos, text: str.slice(found) };
|
|
20
|
+
}
|
|
21
|
+
export function createRegexMatcher(regexes) {
|
|
22
|
+
return ($position) => {
|
|
23
|
+
const text = $position.nodeBefore?.isText && $position.nodeBefore.text;
|
|
24
|
+
if (!text) {
|
|
25
|
+
return null;
|
|
26
|
+
}
|
|
27
|
+
const textFrom = $position.pos - text.length;
|
|
28
|
+
const matches = regexes.map((regex) => matchBefore($position, regex))
|
|
29
|
+
.filter((m) => !!m);
|
|
30
|
+
if (matches.length === 0) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
matches.sort((a, b) => b.text.length - a.text.length);
|
|
34
|
+
let from = matches[0].from;
|
|
35
|
+
let matchedText = matches[0].text;
|
|
36
|
+
let to = matches[0].to;
|
|
37
|
+
while (matchedText.match(/^\s/)) {
|
|
38
|
+
matchedText = matchedText.substring(1);
|
|
39
|
+
from++;
|
|
40
|
+
}
|
|
41
|
+
return {
|
|
42
|
+
range: {
|
|
43
|
+
from,
|
|
44
|
+
to,
|
|
45
|
+
},
|
|
46
|
+
query: matchedText,
|
|
47
|
+
text: matchedText,
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mod.d.ts","sourceRoot":"","sources":["../../../src/extension-autocomplete/src/mod.ts"],"names":[],"mappings":"AAAA,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import type { ResolvedPos } from 'prosemirror-model';
|
|
2
|
+
import type { TextRange } from '../../editor/src/mod.js';
|
|
3
|
+
import { EditorView } from 'prosemirror-view';
|
|
4
|
+
export type SuggestionMatch = {
|
|
5
|
+
range: TextRange;
|
|
6
|
+
query: string;
|
|
7
|
+
text: string;
|
|
8
|
+
} | null;
|
|
9
|
+
export type AutocompleteMatcher = (pos: ResolvedPos) => SuggestionMatch;
|
|
10
|
+
export interface SuggestionKeyDownProps {
|
|
11
|
+
view: EditorView;
|
|
12
|
+
event: KeyboardEvent;
|
|
13
|
+
range: TextRange;
|
|
14
|
+
}
|
|
15
|
+
export interface AutocompleteRenderer<I = any, TSelected = any> {
|
|
16
|
+
onBeforeStart?: (props: SuggestionProps<I, TSelected>) => void;
|
|
17
|
+
onStart?: (props: SuggestionProps<I, TSelected>) => void;
|
|
18
|
+
onBeforeUpdate?: (props: SuggestionProps<I, TSelected>) => void;
|
|
19
|
+
onUpdate?: (props: SuggestionProps<I, TSelected>) => void;
|
|
20
|
+
onExit?: (props: SuggestionProps<I, TSelected>) => void;
|
|
21
|
+
onKeyDown?: (props: SuggestionKeyDownProps) => boolean;
|
|
22
|
+
addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions): void;
|
|
23
|
+
removeEventListener(type: string, callback: EventListenerOrEventListenerObject | null, options?: EventListenerOptions | boolean): void;
|
|
24
|
+
}
|
|
25
|
+
export interface SuggestionProps<I = any, TSelected = any> {
|
|
26
|
+
/**
|
|
27
|
+
* The range of the suggestion.
|
|
28
|
+
*/
|
|
29
|
+
range: TextRange;
|
|
30
|
+
/**
|
|
31
|
+
* The current suggestion query.
|
|
32
|
+
*/
|
|
33
|
+
query: string;
|
|
34
|
+
/**
|
|
35
|
+
* The current suggestion text.
|
|
36
|
+
*/
|
|
37
|
+
text: string;
|
|
38
|
+
/**
|
|
39
|
+
* The suggestion items array.
|
|
40
|
+
*/
|
|
41
|
+
items: I[];
|
|
42
|
+
/**
|
|
43
|
+
* A function that is called when a suggestion is selected.
|
|
44
|
+
* @param props The props object.
|
|
45
|
+
* @returns void
|
|
46
|
+
*/
|
|
47
|
+
command: (props: TSelected) => void;
|
|
48
|
+
/**
|
|
49
|
+
* The decoration node HTML element
|
|
50
|
+
* @default null
|
|
51
|
+
*/
|
|
52
|
+
decorationNode: Element | null;
|
|
53
|
+
/**
|
|
54
|
+
* The function that returns the client rect
|
|
55
|
+
* @default null
|
|
56
|
+
* @example () => new DOMRect(0, 0, 0, 0)
|
|
57
|
+
*/
|
|
58
|
+
clientRect?: (() => DOMRect | null) | null;
|
|
59
|
+
}
|
|
60
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/extension-autocomplete/src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAE9C,MAAM,MAAM,eAAe,GAAG;IAC5B,KAAK,EAAE,SAAS,CAAC;IACjB,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;CACd,GAAG,IAAI,CAAC;AAET,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,eAAe,CAAC;AAExE,MAAM,WAAW,sBAAsB;IACrC,IAAI,EAAE,UAAU,CAAC;IACjB,KAAK,EAAE,aAAa,CAAC;IACrB,KAAK,EAAE,SAAS,CAAC;CAClB;AAED,MAAM,WAAW,oBAAoB,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG;IAC5D,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IAC/D,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IACzD,cAAc,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IAChE,QAAQ,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IAC1D,MAAM,CAAC,EAAE,CAAC,KAAK,EAAE,eAAe,CAAC,CAAC,EAAE,SAAS,CAAC,KAAK,IAAI,CAAC;IACxD,SAAS,CAAC,EAAE,CAAC,KAAK,EAAE,sBAAsB,KAAK,OAAO,CAAC;IAEvD,gBAAgB,CACd,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,CAAC,EAAE,OAAO,GAAG,uBAAuB,GAC1C,IAAI,CAAC;IACR,mBAAmB,CACjB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,kCAAkC,GAAG,IAAI,EACnD,OAAO,CAAC,EAAE,oBAAoB,GAAG,OAAO,GACvC,IAAI,CAAC;CACT;AAED,MAAM,WAAW,eAAe,CAAC,CAAC,GAAG,GAAG,EAAE,SAAS,GAAG,GAAG;IACvD;;OAEG;IACH,KAAK,EAAE,SAAS,CAAC;IAEjB;;OAEG;IACH,KAAK,EAAE,MAAM,CAAC;IAEd;;OAEG;IACH,IAAI,EAAE,MAAM,CAAC;IAEb;;OAEG;IACH,KAAK,EAAE,CAAC,EAAE,CAAC;IAEX;;;;OAIG;IACH,OAAO,EAAE,CAAC,KAAK,EAAE,SAAS,KAAK,IAAI,CAAC;IAEpC;;;OAGG;IACH,cAAc,EAAE,OAAO,GAAG,IAAI,CAAC;IAE/B;;;;OAIG;IACH,UAAU,CAAC,EAAE,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;CAC5C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { Fragment, Node, type ParseOptions, Schema } from 'prosemirror-model';
|
|
2
|
+
import { type Converter, type CoreEditor, Extension } from '../../editor/src/mod.js';
|
|
3
|
+
export type CreateNodeFromContentOptions = {
|
|
4
|
+
parseOptions?: ParseOptions;
|
|
5
|
+
errorOnInvalidContent?: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare function getHTMLFromFragment(fragment: Fragment, schema: Schema): string;
|
|
8
|
+
export declare function elementFromString(value: string): HTMLElement;
|
|
9
|
+
export declare function createNodeFromHTML(content: string, schema: Schema, options?: CreateNodeFromContentOptions): Node;
|
|
10
|
+
export declare function createFragmentFromHTML(content: string, schema: Schema, options?: CreateNodeFromContentOptions): Fragment;
|
|
11
|
+
export declare class ExtensionHtml extends Extension {
|
|
12
|
+
name: string;
|
|
13
|
+
getConverters(editor: CoreEditor, schema: Schema): Record<string, Converter>;
|
|
14
|
+
}
|
|
15
|
+
//# sourceMappingURL=ExtensionHtml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionHtml.d.ts","sourceRoot":"","sources":["../../../src/extension-basic-editor/src/ExtensionHtml.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,QAAQ,EACR,IAAI,EACJ,KAAK,YAAY,EACjB,MAAM,EACP,MAAM,mBAAmB,CAAC;AAE3B,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,UAAU,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAErF,MAAM,MAAM,4BAA4B,GAAG;IACzC,YAAY,CAAC,EAAE,YAAY,CAAC;IAC5B,qBAAqB,CAAC,EAAE,OAAO,CAAC;CACjC,CAAC;AAEF,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,QAAQ,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAaR;AAqBD,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CAQ5D;AA+BD,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,GACrC,IAAI,CAgBN;AAED,wBAAgB,sBAAsB,CACpC,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,CAAC,EAAE,4BAA4B,GACrC,QAAQ,CAiBV;AAED,qBAAa,aAAc,SAAQ,SAAS;IAC1C,IAAI,SAAU;IAEL,aAAa,CACpB,MAAM,EAAE,UAAU,EAClB,MAAM,EAAE,MAAM,GACb,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC;CAe7B"}
|
|
@@ -0,0 +1,108 @@
|
|
|
1
|
+
import { DOMParser, DOMSerializer, Schema, } from 'prosemirror-model';
|
|
2
|
+
import { Extension } from '../../editor/src/mod.js';
|
|
3
|
+
export function getHTMLFromFragment(fragment, schema) {
|
|
4
|
+
const document = globalThis.document;
|
|
5
|
+
const documentFragment = DOMSerializer.fromSchema(schema).serializeFragment(fragment, { document });
|
|
6
|
+
const temporaryDocument = document.implementation.createHTMLDocument();
|
|
7
|
+
const container = temporaryDocument.createElement('div');
|
|
8
|
+
container.appendChild(documentFragment);
|
|
9
|
+
return container.innerHTML;
|
|
10
|
+
}
|
|
11
|
+
const removeWhitespaces = (node) => {
|
|
12
|
+
const children = node.childNodes;
|
|
13
|
+
for (let i = children.length - 1; i >= 0; i -= 1) {
|
|
14
|
+
const child = children[i];
|
|
15
|
+
if (child.nodeType === 3 && child.nodeValue &&
|
|
16
|
+
/^(\n\s\s|\n)$/.test(child.nodeValue)) {
|
|
17
|
+
node.removeChild(child);
|
|
18
|
+
}
|
|
19
|
+
else if (child.nodeType === 1) {
|
|
20
|
+
removeWhitespaces(child);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return node;
|
|
24
|
+
};
|
|
25
|
+
export function elementFromString(value) {
|
|
26
|
+
// add a wrapper to preserve leading and trailing whitespace
|
|
27
|
+
const wrappedValue = `<body>${value}</body>`;
|
|
28
|
+
const html = new globalThis.DOMParser().parseFromString(wrappedValue, 'text/html').body;
|
|
29
|
+
return removeWhitespaces(html);
|
|
30
|
+
}
|
|
31
|
+
function prepareContentCheckSchema(schema) {
|
|
32
|
+
const contentCheckSchema = new Schema({
|
|
33
|
+
topNode: schema.spec.topNode,
|
|
34
|
+
marks: schema.spec.marks,
|
|
35
|
+
// Prosemirror's schemas are executed such that: the last to execute, matches last
|
|
36
|
+
// This means that we can add a catch-all node at the end of the schema to catch any content that we don't know how to handle
|
|
37
|
+
nodes: schema.spec.nodes.append({
|
|
38
|
+
__unknown__catch__all__node: {
|
|
39
|
+
content: 'inline*',
|
|
40
|
+
group: 'block',
|
|
41
|
+
parseDOM: [
|
|
42
|
+
{
|
|
43
|
+
tag: '*',
|
|
44
|
+
getAttrs: (e) => {
|
|
45
|
+
// Try to stringify the element for a more helpful error message
|
|
46
|
+
const invalidContent = typeof e === 'string' ? e : e.outerHTML;
|
|
47
|
+
throw new Error('Invalid HTML content', {
|
|
48
|
+
cause: new Error(`Invalid element found: ${invalidContent}`),
|
|
49
|
+
});
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
],
|
|
53
|
+
},
|
|
54
|
+
}),
|
|
55
|
+
});
|
|
56
|
+
return contentCheckSchema;
|
|
57
|
+
}
|
|
58
|
+
export function createNodeFromHTML(content, schema, options) {
|
|
59
|
+
options = {
|
|
60
|
+
parseOptions: {},
|
|
61
|
+
...options,
|
|
62
|
+
};
|
|
63
|
+
if (options.errorOnInvalidContent) {
|
|
64
|
+
const contentCheckSchema = prepareContentCheckSchema(schema);
|
|
65
|
+
DOMParser.fromSchema(contentCheckSchema).parse(elementFromString(content), options.parseOptions);
|
|
66
|
+
}
|
|
67
|
+
const parser = DOMParser.fromSchema(schema);
|
|
68
|
+
return parser.parse(elementFromString(content), options.parseOptions);
|
|
69
|
+
}
|
|
70
|
+
export function createFragmentFromHTML(content, schema, options) {
|
|
71
|
+
options = {
|
|
72
|
+
parseOptions: {},
|
|
73
|
+
...options,
|
|
74
|
+
};
|
|
75
|
+
if (options.errorOnInvalidContent) {
|
|
76
|
+
const contentCheckSchema = prepareContentCheckSchema(schema);
|
|
77
|
+
DOMParser.fromSchema(contentCheckSchema).parseSlice(elementFromString(content), options.parseOptions);
|
|
78
|
+
}
|
|
79
|
+
const parser = DOMParser.fromSchema(schema);
|
|
80
|
+
return parser.parseSlice(elementFromString(content), options.parseOptions)
|
|
81
|
+
.content;
|
|
82
|
+
}
|
|
83
|
+
export class ExtensionHtml extends Extension {
|
|
84
|
+
constructor() {
|
|
85
|
+
super(...arguments);
|
|
86
|
+
Object.defineProperty(this, "name", {
|
|
87
|
+
enumerable: true,
|
|
88
|
+
configurable: true,
|
|
89
|
+
writable: true,
|
|
90
|
+
value: 'html'
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
getConverters(editor, schema) {
|
|
94
|
+
const config = this.config;
|
|
95
|
+
return {
|
|
96
|
+
'text/html': {
|
|
97
|
+
fromDoc: async (document) => {
|
|
98
|
+
const html = getHTMLFromFragment(document.content, editor.schema);
|
|
99
|
+
return new TextEncoder().encode(html);
|
|
100
|
+
},
|
|
101
|
+
toDoc: async (buffer) => {
|
|
102
|
+
const html = new TextDecoder().decode(buffer);
|
|
103
|
+
return createNodeFromHTML(html, editor.schema);
|
|
104
|
+
},
|
|
105
|
+
},
|
|
106
|
+
};
|
|
107
|
+
}
|
|
108
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Plugin } from 'prosemirror-state';
|
|
2
|
+
import { ExtensionLsp } from './ExtensionLsp.js';
|
|
3
|
+
import { PositionMapper } from '../../extension-markdown/src/PositionMapper.js';
|
|
4
|
+
interface LspRange {
|
|
5
|
+
line: number;
|
|
6
|
+
character: number;
|
|
7
|
+
}
|
|
8
|
+
interface DiagnosticsItem {
|
|
9
|
+
severity: number;
|
|
10
|
+
range: {
|
|
11
|
+
start: LspRange;
|
|
12
|
+
end: LspRange;
|
|
13
|
+
};
|
|
14
|
+
message: string;
|
|
15
|
+
source: string;
|
|
16
|
+
code: string;
|
|
17
|
+
data: any;
|
|
18
|
+
}
|
|
19
|
+
interface DiagnosticPluginState {
|
|
20
|
+
diagnostics: DiagnosticsItem[];
|
|
21
|
+
mapper?: PositionMapper;
|
|
22
|
+
}
|
|
23
|
+
interface DiagnosticConfig {
|
|
24
|
+
}
|
|
25
|
+
export declare class DiagnosticPlugin extends Plugin<DiagnosticPluginState> {
|
|
26
|
+
diagListener: ((event: Event) => void) | undefined;
|
|
27
|
+
listenerDisconnect: ((event: Event) => void) | undefined;
|
|
28
|
+
listenerChange: ((event: Event) => void) | undefined;
|
|
29
|
+
constructor(config: DiagnosticConfig, extension: ExtensionLsp);
|
|
30
|
+
}
|
|
31
|
+
export {};
|
|
32
|
+
//# sourceMappingURL=DiagnosticPlugin.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiagnosticPlugin.d.ts","sourceRoot":"","sources":["../../../src/extension-lsp/src/DiagnosticPlugin.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAA0B,MAAM,mBAAmB,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,MAAM,gDAAgD,CAAC;AAEhF,UAAU,QAAQ;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,UAAU,eAAe;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,EAAE;QACL,KAAK,EAAE,QAAQ,CAAC;QAChB,GAAG,EAAE,QAAQ,CAAC;KACf,CAAC;IACF,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,GAAG,CAAC;CACX;AAED,UAAU,qBAAqB;IAC7B,WAAW,EAAE,eAAe,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,cAAc,CAAC;CACzB;AAED,UAAU,gBAAgB;CACzB;AAID,qBAAa,gBAAiB,SAAQ,MAAM,CAAC,qBAAqB,CAAC;IACjE,YAAY,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACnD,kBAAkB,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;IACzD,cAAc,EAAE,CAAC,CAAC,KAAK,EAAE,KAAK,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;gBAEzC,MAAM,EAAE,gBAAgB,EAAE,SAAS,EAAE,YAAY;CA8J9D"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
import { Plugin, PluginKey } from 'prosemirror-state';
|
|
2
|
+
import { Decoration, DecorationSet } from 'prosemirror-view';
|
|
3
|
+
const DiagnosticPluginKey = new PluginKey('lsp-diagnostic');
|
|
4
|
+
export class DiagnosticPlugin extends Plugin {
|
|
5
|
+
constructor(config, extension) {
|
|
6
|
+
super({
|
|
7
|
+
key: DiagnosticPluginKey,
|
|
8
|
+
view(view) {
|
|
9
|
+
return {
|
|
10
|
+
destroy: () => {
|
|
11
|
+
const client = extension.getClient(extension.mainLang);
|
|
12
|
+
if (this.listener && client) {
|
|
13
|
+
client.removeEventListener('textDocument/publishDiagnostics', this.listener);
|
|
14
|
+
}
|
|
15
|
+
if (this.listenerDisconnect && client) {
|
|
16
|
+
client.removeEventListener('close', this.listenerDisconnect);
|
|
17
|
+
}
|
|
18
|
+
if (this.changeListener) {
|
|
19
|
+
extension.getEditor().removeEventListener('change', this.changeListener);
|
|
20
|
+
}
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
},
|
|
24
|
+
state: {
|
|
25
|
+
init() {
|
|
26
|
+
return {
|
|
27
|
+
diagnostics: [],
|
|
28
|
+
};
|
|
29
|
+
},
|
|
30
|
+
apply(tr, prev, oldState, newState) {
|
|
31
|
+
const next = { ...prev };
|
|
32
|
+
const meta = tr.getMeta(DiagnosticPluginKey);
|
|
33
|
+
if (meta?.diagnostics) {
|
|
34
|
+
next.diagnostics = meta.diagnostics;
|
|
35
|
+
}
|
|
36
|
+
if (meta?.mapper) {
|
|
37
|
+
next.mapper = meta.mapper;
|
|
38
|
+
}
|
|
39
|
+
return next;
|
|
40
|
+
},
|
|
41
|
+
},
|
|
42
|
+
props: {
|
|
43
|
+
decorations(state) {
|
|
44
|
+
const decorations = [];
|
|
45
|
+
const pluginState = this.getState(state);
|
|
46
|
+
if (pluginState) {
|
|
47
|
+
const { diagnostics, mapper } = pluginState;
|
|
48
|
+
if (mapper) {
|
|
49
|
+
for (const diag of diagnostics) {
|
|
50
|
+
const from = mapper.fromLineChar(diag.range.start.line, diag.range.start.character);
|
|
51
|
+
const end = mapper.fromLineChar(diag.range.end.line, diag.range.end.character);
|
|
52
|
+
if (from > -1 && end > -1) {
|
|
53
|
+
const decoration = Decoration.inline(from, end, { class: 'kb-lsp__error', title: diag.message });
|
|
54
|
+
decorations.push(decoration);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return DecorationSet.create(state.doc, decorations);
|
|
60
|
+
},
|
|
61
|
+
},
|
|
62
|
+
});
|
|
63
|
+
Object.defineProperty(this, "diagListener", {
|
|
64
|
+
enumerable: true,
|
|
65
|
+
configurable: true,
|
|
66
|
+
writable: true,
|
|
67
|
+
value: void 0
|
|
68
|
+
});
|
|
69
|
+
Object.defineProperty(this, "listenerDisconnect", {
|
|
70
|
+
enumerable: true,
|
|
71
|
+
configurable: true,
|
|
72
|
+
writable: true,
|
|
73
|
+
value: void 0
|
|
74
|
+
});
|
|
75
|
+
Object.defineProperty(this, "listenerChange", {
|
|
76
|
+
enumerable: true,
|
|
77
|
+
configurable: true,
|
|
78
|
+
writable: true,
|
|
79
|
+
value: void 0
|
|
80
|
+
});
|
|
81
|
+
let lastDiag = 0;
|
|
82
|
+
const editor = extension.getEditor();
|
|
83
|
+
const uri = editor.config.uri;
|
|
84
|
+
if (uri) {
|
|
85
|
+
const client = extension.getClient(extension.mainLang);
|
|
86
|
+
this.diagListener = (event) => {
|
|
87
|
+
const detail = event.detail;
|
|
88
|
+
if (detail.params.uri !== uri) {
|
|
89
|
+
return;
|
|
90
|
+
}
|
|
91
|
+
event.preventDefault();
|
|
92
|
+
lastDiag = +Date();
|
|
93
|
+
if (client) {
|
|
94
|
+
const file = client.workspace.getFile(uri);
|
|
95
|
+
if (file) {
|
|
96
|
+
const { mapper } = file;
|
|
97
|
+
const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
|
|
98
|
+
diagnostics: detail.params.diagnostics,
|
|
99
|
+
mapper,
|
|
100
|
+
});
|
|
101
|
+
editor.view.dispatch(tr);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
if (client) {
|
|
106
|
+
client.addEventListener('textDocument/publishDiagnostics', this.diagListener);
|
|
107
|
+
}
|
|
108
|
+
this.listenerDisconnect = (event) => {
|
|
109
|
+
const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
|
|
110
|
+
diagnostics: [],
|
|
111
|
+
mapper: undefined,
|
|
112
|
+
});
|
|
113
|
+
editor.view.dispatch(tr);
|
|
114
|
+
};
|
|
115
|
+
if (client) {
|
|
116
|
+
client.addEventListener('close', this.listenerDisconnect);
|
|
117
|
+
}
|
|
118
|
+
this.listenerChange = (event) => {
|
|
119
|
+
if (lastDiag === 0 && +Date() - lastDiag > 10_1000) {
|
|
120
|
+
return;
|
|
121
|
+
}
|
|
122
|
+
const tr = editor.view.state.tr.setMeta(DiagnosticPluginKey, {
|
|
123
|
+
diagnostics: [],
|
|
124
|
+
mapper: undefined,
|
|
125
|
+
});
|
|
126
|
+
editor.view.dispatch(tr);
|
|
127
|
+
};
|
|
128
|
+
// extension.getEditor().addEventListener('changed', this.listenerChange);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Plugin } from 'prosemirror-state';
|
|
2
|
+
import { Extension } from '../../editor/src/mod.js';
|
|
3
|
+
import { type ExtensionMarkdown } from '../../extension-markdown/src/ExtensionMarkdown.js';
|
|
4
|
+
import { type ExtensionAutocomplete } from '../../extension-autocomplete/src/mod.js';
|
|
5
|
+
import { LSPClient, Transport } from './LSPClient.js';
|
|
6
|
+
import { LspSource } from './workspace.js';
|
|
7
|
+
export type LspTransportGetter = (lang: string) => Transport | undefined;
|
|
8
|
+
export interface LspConfig {
|
|
9
|
+
getLspTransport: LspTransportGetter;
|
|
10
|
+
}
|
|
11
|
+
export declare class ExtensionLsp extends Extension {
|
|
12
|
+
protected config: LspConfig;
|
|
13
|
+
name: string;
|
|
14
|
+
clients: Record<string, LSPClient>;
|
|
15
|
+
uri: string | undefined;
|
|
16
|
+
extensionMarkdown: ExtensionMarkdown;
|
|
17
|
+
extensionAutocomplete: ExtensionAutocomplete;
|
|
18
|
+
mainLang: string;
|
|
19
|
+
source: LspSource;
|
|
20
|
+
constructor(config: LspConfig);
|
|
21
|
+
getProseMirrorPlugins(): Plugin[];
|
|
22
|
+
created(): void;
|
|
23
|
+
getClient(lang: string): LSPClient | undefined;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=ExtensionLsp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ExtensionLsp.d.ts","sourceRoot":"","sources":["../../../src/extension-lsp/src/ExtensionLsp.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AAE3C,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,mDAAmD,CAAC;AAC3F,OAAO,EAAE,KAAK,qBAAqB,EAAE,MAAM,yCAAyC,CAAC;AAGrF,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAItD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAE3C,MAAM,MAAM,kBAAkB,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,SAAS,GAAG,SAAS,CAAC;AAEzE,MAAM,WAAW,SAAS;IACxB,eAAe,EAAE,kBAAkB,CAAC;CACrC;AAED,qBAAa,YAAa,SAAQ,SAAS;cASV,MAAM,EAAE,SAAS;IARhD,IAAI,SAAS;IACb,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,CAAM;IACxC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAC;IACxB,iBAAiB,EAAG,iBAAiB,CAAC;IACtC,qBAAqB,EAAG,qBAAqB,CAAC;IAC9C,QAAQ,EAAE,MAAM,CAAc;IAC9B,MAAM,EAAG,SAAS,CAAC;gBAEY,MAAM,EAAE,SAAS;IAIvC,qBAAqB,IAAI,MAAM,EAAE;IAWjC,OAAO;IA6DhB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,SAAS,GAAG,SAAS;CAW/C"}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { Extension } from '../../editor/src/mod.js';
|
|
2
|
+
import { PositionMapper } from '../../extension-markdown/src/PositionMapper.js';
|
|
3
|
+
import { LSPClient } from './LSPClient.js';
|
|
4
|
+
import { AutocompletePlugin } from '../../extension-autocomplete/src/AutocompletePlugin.js';
|
|
5
|
+
import { DiagnosticPlugin } from './DiagnosticPlugin.js';
|
|
6
|
+
import { createLspAutocomplete } from './createLspAutocomplete.js';
|
|
7
|
+
export class ExtensionLsp extends Extension {
|
|
8
|
+
constructor(config) {
|
|
9
|
+
super(config);
|
|
10
|
+
Object.defineProperty(this, "config", {
|
|
11
|
+
enumerable: true,
|
|
12
|
+
configurable: true,
|
|
13
|
+
writable: true,
|
|
14
|
+
value: config
|
|
15
|
+
});
|
|
16
|
+
Object.defineProperty(this, "name", {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
configurable: true,
|
|
19
|
+
writable: true,
|
|
20
|
+
value: 'lsp'
|
|
21
|
+
});
|
|
22
|
+
Object.defineProperty(this, "clients", {
|
|
23
|
+
enumerable: true,
|
|
24
|
+
configurable: true,
|
|
25
|
+
writable: true,
|
|
26
|
+
value: {}
|
|
27
|
+
});
|
|
28
|
+
Object.defineProperty(this, "uri", {
|
|
29
|
+
enumerable: true,
|
|
30
|
+
configurable: true,
|
|
31
|
+
writable: true,
|
|
32
|
+
value: void 0
|
|
33
|
+
});
|
|
34
|
+
Object.defineProperty(this, "extensionMarkdown", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
configurable: true,
|
|
37
|
+
writable: true,
|
|
38
|
+
value: void 0
|
|
39
|
+
});
|
|
40
|
+
Object.defineProperty(this, "extensionAutocomplete", {
|
|
41
|
+
enumerable: true,
|
|
42
|
+
configurable: true,
|
|
43
|
+
writable: true,
|
|
44
|
+
value: void 0
|
|
45
|
+
});
|
|
46
|
+
Object.defineProperty(this, "mainLang", {
|
|
47
|
+
enumerable: true,
|
|
48
|
+
configurable: true,
|
|
49
|
+
writable: true,
|
|
50
|
+
value: 'markdown'
|
|
51
|
+
});
|
|
52
|
+
Object.defineProperty(this, "source", {
|
|
53
|
+
enumerable: true,
|
|
54
|
+
configurable: true,
|
|
55
|
+
writable: true,
|
|
56
|
+
value: void 0
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
getProseMirrorPlugins() {
|
|
60
|
+
const plugins = [];
|
|
61
|
+
const { autocompleteConfig } = createLspAutocomplete(this);
|
|
62
|
+
plugins.push(new AutocompletePlugin(autocompleteConfig, this.editor));
|
|
63
|
+
plugins.push(new DiagnosticPlugin({}, this));
|
|
64
|
+
return plugins;
|
|
65
|
+
}
|
|
66
|
+
created() {
|
|
67
|
+
this.mainLang = this.editor.config.languageID || 'markdown';
|
|
68
|
+
this.source = {
|
|
69
|
+
ui: this.editor.ui,
|
|
70
|
+
getMappedContent: () => {
|
|
71
|
+
const editor = this.editor;
|
|
72
|
+
const result = this.extensionMarkdown.toMarkdown(editor.state.doc);
|
|
73
|
+
const mapper = new PositionMapper(editor, result.rawTextMap);
|
|
74
|
+
return {
|
|
75
|
+
...result,
|
|
76
|
+
mapper,
|
|
77
|
+
};
|
|
78
|
+
},
|
|
79
|
+
};
|
|
80
|
+
const extensionMarkdown = this.editor
|
|
81
|
+
.getExtension('markdown');
|
|
82
|
+
if (!extensionMarkdown) {
|
|
83
|
+
throw new Error('No markdown extension');
|
|
84
|
+
}
|
|
85
|
+
this.extensionMarkdown = extensionMarkdown;
|
|
86
|
+
this.editor.addEventListener('doc:loaded', async () => {
|
|
87
|
+
const languageID = this.mainLang;
|
|
88
|
+
this.uri = this.editor.config.uri;
|
|
89
|
+
if (this.uri) {
|
|
90
|
+
const client = this.getClient(this.mainLang);
|
|
91
|
+
if (client) {
|
|
92
|
+
client.connect(this.uri, this.source);
|
|
93
|
+
await client.restart();
|
|
94
|
+
client.workspace.openFile(this.uri, languageID, this.source);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
this.editor.addEventListener('changed', () => {
|
|
99
|
+
if (this.editor.config.uri) {
|
|
100
|
+
const client = this.getClient(this.mainLang);
|
|
101
|
+
if (client) {
|
|
102
|
+
client.workspace.changedFile(this.editor.config.uri);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
});
|
|
106
|
+
this.editor.addEventListener('beforeDestroy', () => {
|
|
107
|
+
if (this.uri) {
|
|
108
|
+
const client = this.getClient(this.mainLang);
|
|
109
|
+
if (client) {
|
|
110
|
+
client.disconnect(this.uri);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
getClient(lang) {
|
|
116
|
+
if (!this.clients[lang]) {
|
|
117
|
+
const transport = this.config.getLspTransport(lang);
|
|
118
|
+
if (!transport) {
|
|
119
|
+
console.warn(`No lsp transport for ${lang}`);
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
this.clients[lang] = new LSPClient(transport, { rootUri: 'file:///' });
|
|
123
|
+
}
|
|
124
|
+
return this.clients[lang];
|
|
125
|
+
}
|
|
126
|
+
}
|