@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.
@@ -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
- let topContext;
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
- const embeddedTokenizer = getTokenizer(embeddedLanguage);
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
- tokenizersToLoad.push(embeddedLanguage);
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
- topContext = undefined;
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
- // @ts-ignore
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
- const {
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);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lvce-editor/editor-worker",
3
- "version": "18.24.0",
3
+ "version": "18.25.0",
4
4
  "repository": {
5
5
  "type": "git",
6
6
  "url": "git@github.com:lvce-editor/editor-worker.git"