@lvce-editor/editor-worker 18.24.0 → 18.25.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/dist/editorWorkerMain.js +66 -28
- package/package.json +1 -1
package/dist/editorWorkerMain.js
CHANGED
|
@@ -1936,6 +1936,7 @@ const {
|
|
|
1936
1936
|
|
|
1937
1937
|
const state$7 = {
|
|
1938
1938
|
pending: Object.create(null),
|
|
1939
|
+
tokenizePaths: Object.create(null),
|
|
1939
1940
|
tokenizers: Object.create(null)
|
|
1940
1941
|
};
|
|
1941
1942
|
const has = languageId => {
|
|
@@ -1947,6 +1948,19 @@ const set$4 = (languageId, tokenizer) => {
|
|
|
1947
1948
|
const get$4 = languageId => {
|
|
1948
1949
|
return state$7.tokenizers[languageId];
|
|
1949
1950
|
};
|
|
1951
|
+
const setTokenizePath = (languageId, tokenizePath) => {
|
|
1952
|
+
state$7.tokenizePaths[languageId] = tokenizePath;
|
|
1953
|
+
};
|
|
1954
|
+
const getTokenizePath$1 = languageId => {
|
|
1955
|
+
return state$7.tokenizePaths[languageId] || '';
|
|
1956
|
+
};
|
|
1957
|
+
const setTokenizePaths = languages => {
|
|
1958
|
+
for (const language of languages) {
|
|
1959
|
+
if (language && language.id && language.tokenize) {
|
|
1960
|
+
setTokenizePath(language.id, language.tokenize);
|
|
1961
|
+
}
|
|
1962
|
+
}
|
|
1963
|
+
};
|
|
1950
1964
|
const isPending = languageId => {
|
|
1951
1965
|
return Object.hasOwn(state$7.pending, languageId);
|
|
1952
1966
|
};
|
|
@@ -1964,6 +1978,7 @@ const loadTokenizer = async (languageId, tokenizePath) => {
|
|
|
1964
1978
|
if (!tokenizePath) {
|
|
1965
1979
|
return;
|
|
1966
1980
|
}
|
|
1981
|
+
setTokenizePath(languageId, tokenizePath);
|
|
1967
1982
|
if (getEnabled$1()) {
|
|
1968
1983
|
// @ts-ignore
|
|
1969
1984
|
const tokenMap = await invoke$8('Tokenizer.load', languageId, tokenizePath);
|
|
@@ -2008,10 +2023,37 @@ const get$2 = id => {
|
|
|
2008
2023
|
return tokenizers[id] || TokenizePlainText;
|
|
2009
2024
|
};
|
|
2010
2025
|
|
|
2026
|
+
const getEmbeddedTokenization = (langageId, line, embeddedLanguage, embeddedLanguageStart, embeddedLanguageEnd, topContexts, tokenizersToLoad) => {
|
|
2027
|
+
const embeddedTokenizer = getTokenizer(embeddedLanguage);
|
|
2028
|
+
if (embeddedLanguageStart !== line.length && embeddedTokenizer && embeddedTokenizer !== TokenizePlainText) {
|
|
2029
|
+
const isFull = embeddedLanguageStart === 0 && embeddedLanguageEnd === line.length;
|
|
2030
|
+
const partialLine = line.slice(embeddedLanguageStart, embeddedLanguageEnd);
|
|
2031
|
+
const embedResult = safeTokenizeLine(langageId, embeddedTokenizer.tokenizeLine, partialLine, topContexts[embeddedLanguage] || getInitialLineState(embeddedTokenizer.initialLineState), embeddedTokenizer.hasArrayReturn);
|
|
2032
|
+
topContexts[embeddedLanguage] = embedResult;
|
|
2033
|
+
if (embedResult.embeddedLanguage) {
|
|
2034
|
+
const nested = getEmbeddedTokenization(langageId, partialLine, embedResult.embeddedLanguage, embedResult.embeddedLanguageStart, embedResult.embeddedLanguageEnd, topContexts, tokenizersToLoad);
|
|
2035
|
+
if (nested?.isFull) {
|
|
2036
|
+
return nested;
|
|
2037
|
+
}
|
|
2038
|
+
}
|
|
2039
|
+
return {
|
|
2040
|
+
isFull,
|
|
2041
|
+
result: embedResult,
|
|
2042
|
+
TokenMap: embeddedTokenizer.TokenMap
|
|
2043
|
+
};
|
|
2044
|
+
}
|
|
2045
|
+
tokenizersToLoad.push(embeddedLanguage);
|
|
2046
|
+
topContexts[embeddedLanguage] = undefined;
|
|
2047
|
+
return {
|
|
2048
|
+
isFull: false,
|
|
2049
|
+
result: {},
|
|
2050
|
+
TokenMap: []
|
|
2051
|
+
};
|
|
2052
|
+
};
|
|
2011
2053
|
const getTokensViewportEmbedded = (langageId, lines, lineCache, linesWithEmbed) => {
|
|
2012
2054
|
const tokenizersToLoad = [];
|
|
2013
2055
|
const embeddedResults = [];
|
|
2014
|
-
|
|
2056
|
+
const topContexts = Object.create(null);
|
|
2015
2057
|
for (const index of linesWithEmbed) {
|
|
2016
2058
|
const result = lineCache[index + 1];
|
|
2017
2059
|
const line = lines[index];
|
|
@@ -2021,19 +2063,7 @@ const getTokensViewportEmbedded = (langageId, lines, lineCache, linesWithEmbed)
|
|
|
2021
2063
|
embeddedLanguageEnd,
|
|
2022
2064
|
embeddedLanguageStart
|
|
2023
2065
|
} = result;
|
|
2024
|
-
|
|
2025
|
-
if (embeddedLanguageStart !== line.length && embeddedTokenizer && embeddedTokenizer !== TokenizePlainText) {
|
|
2026
|
-
const isFull = embeddedLanguageStart === 0 && embeddedLanguageEnd === line.length;
|
|
2027
|
-
const partialLine = line.slice(embeddedLanguageStart, embeddedLanguageEnd);
|
|
2028
|
-
const embedResult = safeTokenizeLine(langageId, embeddedTokenizer.tokenizeLine, partialLine, topContext || getInitialLineState(embeddedTokenizer.initialLineState), embeddedTokenizer.hasArrayReturn);
|
|
2029
|
-
topContext = embedResult;
|
|
2030
|
-
result.embeddedResultIndex = embeddedResults.length;
|
|
2031
|
-
embeddedResults.push({
|
|
2032
|
-
isFull,
|
|
2033
|
-
result: embedResult,
|
|
2034
|
-
TokenMap: embeddedTokenizer.TokenMap
|
|
2035
|
-
});
|
|
2036
|
-
} else if (line.length === 0) {
|
|
2066
|
+
if (line.length === 0) {
|
|
2037
2067
|
const embedResult = {
|
|
2038
2068
|
tokens: []
|
|
2039
2069
|
};
|
|
@@ -2044,16 +2074,13 @@ const getTokensViewportEmbedded = (langageId, lines, lineCache, linesWithEmbed)
|
|
|
2044
2074
|
TokenMap: []
|
|
2045
2075
|
});
|
|
2046
2076
|
} else {
|
|
2047
|
-
|
|
2048
|
-
embeddedResults.push(
|
|
2049
|
-
isFull: false,
|
|
2050
|
-
result: {},
|
|
2051
|
-
TokenMap: []
|
|
2052
|
-
});
|
|
2053
|
-
topContext = undefined;
|
|
2077
|
+
result.embeddedResultIndex = embeddedResults.length;
|
|
2078
|
+
embeddedResults.push(getEmbeddedTokenization(langageId, line, embeddedLanguage, embeddedLanguageStart, embeddedLanguageEnd, topContexts, tokenizersToLoad));
|
|
2054
2079
|
}
|
|
2055
2080
|
} else {
|
|
2056
|
-
|
|
2081
|
+
for (const embeddedLanguage of Object.keys(topContexts)) {
|
|
2082
|
+
topContexts[embeddedLanguage] = undefined;
|
|
2083
|
+
}
|
|
2057
2084
|
}
|
|
2058
2085
|
}
|
|
2059
2086
|
return {
|
|
@@ -2155,8 +2182,8 @@ const getTokensViewport2 = async (editor, startLineIndex, endLineIndex, syncIncr
|
|
|
2155
2182
|
|
|
2156
2183
|
const loadTokenizers = async languageIds => {
|
|
2157
2184
|
for (const languageId of languageIds) {
|
|
2158
|
-
|
|
2159
|
-
await loadTokenizer(languageId);
|
|
2185
|
+
const tokenizePath = getTokenizePath$1(languageId);
|
|
2186
|
+
await loadTokenizer(languageId, tokenizePath);
|
|
2160
2187
|
}
|
|
2161
2188
|
};
|
|
2162
2189
|
|
|
@@ -2360,6 +2387,8 @@ const positionAt = (textDocument, offset) => {
|
|
|
2360
2387
|
};
|
|
2361
2388
|
};
|
|
2362
2389
|
|
|
2390
|
+
const maxTokenizerLoadPasses = 10;
|
|
2391
|
+
|
|
2363
2392
|
// const getTokensIncremental = (editor, min, max) => {
|
|
2364
2393
|
// const currentLength = editor.lineStateCache.length
|
|
2365
2394
|
// const tokens = []
|
|
@@ -2706,20 +2735,27 @@ const getVisible$1 = async (editor, syncIncremental) => {
|
|
|
2706
2735
|
} = editor;
|
|
2707
2736
|
const maxLineY = Math.min(minLineY + numberOfVisibleLines, lines.length);
|
|
2708
2737
|
// @ts-ignore
|
|
2709
|
-
|
|
2738
|
+
let {
|
|
2710
2739
|
embeddedResults,
|
|
2711
2740
|
tokenizersToLoad,
|
|
2712
2741
|
tokens
|
|
2713
2742
|
} = await getTokensViewport2(editor, minLineY, maxLineY, syncIncremental);
|
|
2743
|
+
for (let i = 0; tokenizersToLoad.length > 0 && i < maxTokenizerLoadPasses; i++) {
|
|
2744
|
+
await loadTokenizers(tokenizersToLoad);
|
|
2745
|
+
// @ts-ignore
|
|
2746
|
+
const refreshed = await getTokensViewport2(editor, minLineY, maxLineY, syncIncremental);
|
|
2747
|
+
({
|
|
2748
|
+
embeddedResults,
|
|
2749
|
+
tokenizersToLoad,
|
|
2750
|
+
tokens
|
|
2751
|
+
} = refreshed);
|
|
2752
|
+
}
|
|
2714
2753
|
const minLineOffset = await offsetAtSync(editor, minLineY, 0);
|
|
2715
2754
|
const averageCharWidth = charWidth;
|
|
2716
2755
|
const {
|
|
2717
2756
|
differences,
|
|
2718
2757
|
result
|
|
2719
2758
|
} = getLineInfosViewport(editor, tokens, embeddedResults, minLineY, maxLineY, minLineOffset, width, deltaX, averageCharWidth);
|
|
2720
|
-
if (tokenizersToLoad.length > 0) {
|
|
2721
|
-
loadTokenizers(tokenizersToLoad);
|
|
2722
|
-
}
|
|
2723
2759
|
return {
|
|
2724
2760
|
differences,
|
|
2725
2761
|
textInfos: result
|
|
@@ -7988,6 +8024,7 @@ const setLanguageId = async (editor, languageId, tokenizePath) => {
|
|
|
7988
8024
|
const {
|
|
7989
8025
|
tokenizerId
|
|
7990
8026
|
} = editor;
|
|
8027
|
+
setTokenizePath(languageId, tokenizePath);
|
|
7991
8028
|
// TODO move tokenizer to syntax highlighting worker
|
|
7992
8029
|
// TODO only load tokenizer if not already loaded
|
|
7993
8030
|
// if already loaded just set tokenizer and rerender text
|
|
@@ -10883,6 +10920,7 @@ const loadContent = async (state, savedState) => {
|
|
|
10883
10920
|
// TODO support overwriting language id by setting it explicitly or via settings
|
|
10884
10921
|
const charWidth = await measureCharacterWidth(fontWeight, fontSize, fontFamily, letterSpacing);
|
|
10885
10922
|
const languages = await getLanguages(platform, assetDir);
|
|
10923
|
+
setTokenizePaths(languages);
|
|
10886
10924
|
const computedLanguageId = getLanguageId$1(uri, languages);
|
|
10887
10925
|
const tokenizePath = getTokenizePath(languages, computedLanguageId);
|
|
10888
10926
|
await loadTokenizer(computedLanguageId, tokenizePath);
|