@codemirror/language 0.20.1 → 6.1.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.
@@ -11,6 +11,6 @@ jobs:
11
11
  with:
12
12
  # You should create a personal access token and store it in your repository
13
13
  token: ${{ secrets.DISPATCH_AUTH }}
14
- repo: codemirror.next
14
+ repo: dev
15
15
  owner: codemirror
16
16
  event_type: push
package/CHANGELOG.md CHANGED
@@ -1,3 +1,21 @@
1
+ ## 6.1.0 (2022-06-20)
2
+
3
+ ### New features
4
+
5
+ The `foldState` field is now public, and can be used to serialize and deserialize the fold state.
6
+
7
+ ## 6.0.0 (2022-06-08)
8
+
9
+ ### New features
10
+
11
+ The `foldingChanged` option to `foldGutter` can now be used to trigger a recomputation of the fold markers.
12
+
13
+ ## 0.20.2 (2022-05-20)
14
+
15
+ ### Bug fixes
16
+
17
+ List style-mod as a dependency.
18
+
1
19
  ## 0.20.1 (2022-05-18)
2
20
 
3
21
  ### Bug fixes
package/README.md CHANGED
@@ -1,13 +1,13 @@
1
1
  # @codemirror/language [![NPM version](https://img.shields.io/npm/v/@codemirror/language.svg)](https://www.npmjs.org/package/@codemirror/language)
2
2
 
3
- [ [**WEBSITE**](https://codemirror.net/6/) | [**DOCS**](https://codemirror.net/6/docs/ref/#language) | [**ISSUES**](https://github.com/codemirror/codemirror.next/issues) | [**FORUM**](https://discuss.codemirror.net/c/next/) | [**CHANGELOG**](https://github.com/codemirror/language/blob/main/CHANGELOG.md) ]
3
+ [ [**WEBSITE**](https://codemirror.net/) | [**DOCS**](https://codemirror.net/docs/ref/#language) | [**ISSUES**](https://github.com/codemirror/dev/issues) | [**FORUM**](https://discuss.codemirror.net/c/next/) | [**CHANGELOG**](https://github.com/codemirror/language/blob/main/CHANGELOG.md) ]
4
4
 
5
5
  This package implements the language support infrastructure for the
6
- [CodeMirror](https://codemirror.net/6/) code editor.
6
+ [CodeMirror](https://codemirror.net/) code editor.
7
7
 
8
- The [project page](https://codemirror.net/6/) has more information, a
9
- number of [examples](https://codemirror.net/6/examples/) and the
10
- [documentation](https://codemirror.net/6/docs/).
8
+ The [project page](https://codemirror.net/) has more information, a
9
+ number of [examples](https://codemirror.net/examples/) and the
10
+ [documentation](https://codemirror.net/docs/).
11
11
 
12
12
  This code is released under an
13
13
  [MIT license](https://github.com/codemirror/language/tree/main/LICENSE).
package/dist/index.cjs CHANGED
@@ -616,7 +616,10 @@ const parseWorker = view.ViewPlugin.fromClass(class ParseWorker {
616
616
  eventHandlers: { focus() { this.scheduleWork(); } }
617
617
  });
618
618
  /**
619
- The facet used to associate a language with an editor state.
619
+ The facet used to associate a language with an editor state. Used
620
+ by `Language` object's `extension` property (so you don't need to
621
+ manually wrap your languages in this). Can be used to access the
622
+ current language on a state.
620
623
  */
621
624
  const language = state.Facet.define({
622
625
  combine(languages) { return languages.length ? languages[0] : null; },
@@ -1204,6 +1207,13 @@ function selectedLines(view) {
1204
1207
  }
1205
1208
  return lines;
1206
1209
  }
1210
+ /**
1211
+ The state field that stores the folded ranges (as a [decoration
1212
+ set](https://codemirror.net/6/docs/ref/#view.DecorationSet)). Can be passed to
1213
+ [`EditorState.toJSON`](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) and
1214
+ [`fromJSON`](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) to serialize the fold
1215
+ state.
1216
+ */
1207
1217
  const foldState = state.StateField.define({
1208
1218
  create() {
1209
1219
  return view.Decoration.none;
@@ -1231,7 +1241,24 @@ const foldState = state.StateField.define({
1231
1241
  }
1232
1242
  return folded;
1233
1243
  },
1234
- provide: f => view.EditorView.decorations.from(f)
1244
+ provide: f => view.EditorView.decorations.from(f),
1245
+ toJSON(folded, state) {
1246
+ let ranges = [];
1247
+ folded.between(0, state.doc.length, (from, to) => { ranges.push(from, to); });
1248
+ return ranges;
1249
+ },
1250
+ fromJSON(value) {
1251
+ if (!Array.isArray(value) || value.length % 2)
1252
+ throw new RangeError("Invalid JSON for fold state");
1253
+ let ranges = [];
1254
+ for (let i = 0; i < value.length;) {
1255
+ let from = value[i++], to = value[i++];
1256
+ if (typeof from != "number" || typeof to != "number")
1257
+ throw new RangeError("Invalid JSON for fold state");
1258
+ ranges.push(foldWidget.range(from, to));
1259
+ }
1260
+ return view.Decoration.set(ranges, true);
1261
+ }
1235
1262
  });
1236
1263
  /**
1237
1264
  Get a [range set](https://codemirror.net/6/docs/ref/#state.RangeSet) containing the folded ranges
@@ -1380,6 +1407,7 @@ const foldGutterDefaults = {
1380
1407
  closedText: "›",
1381
1408
  markerDOM: null,
1382
1409
  domEventHandlers: {},
1410
+ foldingChanged: () => false
1383
1411
  };
1384
1412
  class FoldMarker extends view.GutterMarker {
1385
1413
  constructor(config, open) {
@@ -1414,7 +1442,8 @@ function foldGutter(config = {}) {
1414
1442
  if (update.docChanged || update.viewportChanged ||
1415
1443
  update.startState.facet(language) != update.state.facet(language) ||
1416
1444
  update.startState.field(foldState, false) != update.state.field(foldState, false) ||
1417
- syntaxTree(update.startState) != syntaxTree(update.state))
1445
+ syntaxTree(update.startState) != syntaxTree(update.state) ||
1446
+ fullConfig.foldingChanged(update))
1418
1447
  this.markers = this.buildMarkers(update.view);
1419
1448
  }
1420
1449
  buildMarkers(view) {
@@ -2247,8 +2276,8 @@ for (let [legacyName, name] of [
2247
2276
  ["variable-2", "variableName.special"],
2248
2277
  ["string-2", "string.special"],
2249
2278
  ["def", "variableName.definition"],
2250
- ["tag", "typeName"],
2251
- ["attribute", "propertyName"],
2279
+ ["tag", "tagName"],
2280
+ ["attribute", "attributeName"],
2252
2281
  ["type", "typeName"],
2253
2282
  ["builtin", "variableName.standard"],
2254
2283
  ["qualifier", "modifier"],
@@ -2335,6 +2364,7 @@ exports.foldInside = foldInside;
2335
2364
  exports.foldKeymap = foldKeymap;
2336
2365
  exports.foldNodeProp = foldNodeProp;
2337
2366
  exports.foldService = foldService;
2367
+ exports.foldState = foldState;
2338
2368
  exports.foldable = foldable;
2339
2369
  exports.foldedRanges = foldedRanges;
2340
2370
  exports.forceParsing = forceParsing;
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
1
  import { NodeProp, Parser, Tree, TreeFragment, SyntaxNode, NodeType } from '@lezer/common';
2
2
  import { LRParser, ParserConfig } from '@lezer/lr';
3
3
  import * as _codemirror_state from '@codemirror/state';
4
- import { Facet, Extension, EditorState, Range } from '@codemirror/state';
5
- import { EditorView, DecorationSet, Command, KeyBinding, BlockInfo, Decoration } from '@codemirror/view';
4
+ import { Facet, Extension, EditorState, StateField, Range } from '@codemirror/state';
5
+ import { EditorView, DecorationSet, Command, KeyBinding, ViewUpdate, BlockInfo, Decoration } from '@codemirror/view';
6
6
  import { Highlighter, Tag } from '@lezer/highlight';
7
7
  import { StyleModule, StyleSpec } from 'style-mod';
8
8
 
@@ -214,7 +214,10 @@ declare class ParseContext {
214
214
  static get(): ParseContext | null;
215
215
  }
216
216
  /**
217
- The facet used to associate a language with an editor state.
217
+ The facet used to associate a language with an editor state. Used
218
+ by `Language` object's `extension` property (so you don't need to
219
+ manually wrap your languages in this). Can be used to access the
220
+ current language on a state.
218
221
  */
219
222
  declare const language: Facet<Language, Language | null>;
220
223
  /**
@@ -617,6 +620,14 @@ State effect that unfolds the given range (if it was folded).
617
620
  */
618
621
  declare const unfoldEffect: _codemirror_state.StateEffectType<DocRange>;
619
622
  /**
623
+ The state field that stores the folded ranges (as a [decoration
624
+ set](https://codemirror.net/6/docs/ref/#view.DecorationSet)). Can be passed to
625
+ [`EditorState.toJSON`](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) and
626
+ [`fromJSON`](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) to serialize the fold
627
+ state.
628
+ */
629
+ declare const foldState: StateField<DecorationSet>;
630
+ /**
620
631
  Get a [range set](https://codemirror.net/6/docs/ref/#state.RangeSet) containing the folded ranges
621
632
  in the given state.
622
633
  */
@@ -698,6 +709,11 @@ interface FoldGutterConfig {
698
709
  Supply event handlers for DOM events on this gutter.
699
710
  */
700
711
  domEventHandlers?: Handlers;
712
+ /**
713
+ When given, if this returns true for a given view update,
714
+ recompute the fold markers.
715
+ */
716
+ foldingChanged?: (update: ViewUpdate) => boolean;
701
717
  }
702
718
  /**
703
719
  Create an extension that registers a fold gutter, which shows a
@@ -1056,4 +1072,4 @@ declare class StreamLanguage<State> extends Language {
1056
1072
  get allowsNesting(): boolean;
1057
1073
  }
1058
1074
 
1059
- export { Config, HighlightStyle, IndentContext, LRLanguage, Language, LanguageDescription, LanguageSupport, MatchResult, ParseContext, StreamLanguage, StreamParser, StringStream, TagStyle, TreeIndentContext, bracketMatching, codeFolding, continuedIndent, defaultHighlightStyle, defineLanguageFacet, delimitedIndent, ensureSyntaxTree, flatIndent, foldAll, foldCode, foldEffect, foldGutter, foldInside, foldKeymap, foldNodeProp, foldService, foldable, foldedRanges, forceParsing, getIndentUnit, getIndentation, highlightingFor, indentNodeProp, indentOnInput, indentService, indentString, indentUnit, language, languageDataProp, matchBrackets, syntaxHighlighting, syntaxParserRunning, syntaxTree, syntaxTreeAvailable, unfoldAll, unfoldCode, unfoldEffect };
1075
+ export { Config, HighlightStyle, IndentContext, LRLanguage, Language, LanguageDescription, LanguageSupport, MatchResult, ParseContext, StreamLanguage, StreamParser, StringStream, TagStyle, TreeIndentContext, bracketMatching, codeFolding, continuedIndent, defaultHighlightStyle, defineLanguageFacet, delimitedIndent, ensureSyntaxTree, flatIndent, foldAll, foldCode, foldEffect, foldGutter, foldInside, foldKeymap, foldNodeProp, foldService, foldState, foldable, foldedRanges, forceParsing, getIndentUnit, getIndentation, highlightingFor, indentNodeProp, indentOnInput, indentService, indentString, indentUnit, language, languageDataProp, matchBrackets, syntaxHighlighting, syntaxParserRunning, syntaxTree, syntaxTreeAvailable, unfoldAll, unfoldCode, unfoldEffect };
package/dist/index.js CHANGED
@@ -612,7 +612,10 @@ const parseWorker = /*@__PURE__*/ViewPlugin.fromClass(class ParseWorker {
612
612
  eventHandlers: { focus() { this.scheduleWork(); } }
613
613
  });
614
614
  /**
615
- The facet used to associate a language with an editor state.
615
+ The facet used to associate a language with an editor state. Used
616
+ by `Language` object's `extension` property (so you don't need to
617
+ manually wrap your languages in this). Can be used to access the
618
+ current language on a state.
616
619
  */
617
620
  const language = /*@__PURE__*/Facet.define({
618
621
  combine(languages) { return languages.length ? languages[0] : null; },
@@ -1200,6 +1203,13 @@ function selectedLines(view) {
1200
1203
  }
1201
1204
  return lines;
1202
1205
  }
1206
+ /**
1207
+ The state field that stores the folded ranges (as a [decoration
1208
+ set](https://codemirror.net/6/docs/ref/#view.DecorationSet)). Can be passed to
1209
+ [`EditorState.toJSON`](https://codemirror.net/6/docs/ref/#state.EditorState.toJSON) and
1210
+ [`fromJSON`](https://codemirror.net/6/docs/ref/#state.EditorState^fromJSON) to serialize the fold
1211
+ state.
1212
+ */
1203
1213
  const foldState = /*@__PURE__*/StateField.define({
1204
1214
  create() {
1205
1215
  return Decoration.none;
@@ -1227,7 +1237,24 @@ const foldState = /*@__PURE__*/StateField.define({
1227
1237
  }
1228
1238
  return folded;
1229
1239
  },
1230
- provide: f => EditorView.decorations.from(f)
1240
+ provide: f => EditorView.decorations.from(f),
1241
+ toJSON(folded, state) {
1242
+ let ranges = [];
1243
+ folded.between(0, state.doc.length, (from, to) => { ranges.push(from, to); });
1244
+ return ranges;
1245
+ },
1246
+ fromJSON(value) {
1247
+ if (!Array.isArray(value) || value.length % 2)
1248
+ throw new RangeError("Invalid JSON for fold state");
1249
+ let ranges = [];
1250
+ for (let i = 0; i < value.length;) {
1251
+ let from = value[i++], to = value[i++];
1252
+ if (typeof from != "number" || typeof to != "number")
1253
+ throw new RangeError("Invalid JSON for fold state");
1254
+ ranges.push(foldWidget.range(from, to));
1255
+ }
1256
+ return Decoration.set(ranges, true);
1257
+ }
1231
1258
  });
1232
1259
  /**
1233
1260
  Get a [range set](https://codemirror.net/6/docs/ref/#state.RangeSet) containing the folded ranges
@@ -1376,6 +1403,7 @@ const foldGutterDefaults = {
1376
1403
  closedText: "›",
1377
1404
  markerDOM: null,
1378
1405
  domEventHandlers: {},
1406
+ foldingChanged: () => false
1379
1407
  };
1380
1408
  class FoldMarker extends GutterMarker {
1381
1409
  constructor(config, open) {
@@ -1410,7 +1438,8 @@ function foldGutter(config = {}) {
1410
1438
  if (update.docChanged || update.viewportChanged ||
1411
1439
  update.startState.facet(language) != update.state.facet(language) ||
1412
1440
  update.startState.field(foldState, false) != update.state.field(foldState, false) ||
1413
- syntaxTree(update.startState) != syntaxTree(update.state))
1441
+ syntaxTree(update.startState) != syntaxTree(update.state) ||
1442
+ fullConfig.foldingChanged(update))
1414
1443
  this.markers = this.buildMarkers(update.view);
1415
1444
  }
1416
1445
  buildMarkers(view) {
@@ -2243,8 +2272,8 @@ for (let [legacyName, name] of [
2243
2272
  ["variable-2", "variableName.special"],
2244
2273
  ["string-2", "string.special"],
2245
2274
  ["def", "variableName.definition"],
2246
- ["tag", "typeName"],
2247
- ["attribute", "propertyName"],
2275
+ ["tag", "tagName"],
2276
+ ["attribute", "attributeName"],
2248
2277
  ["type", "typeName"],
2249
2278
  ["builtin", "variableName.standard"],
2250
2279
  ["qualifier", "modifier"],
@@ -2305,4 +2334,4 @@ function docID(data) {
2305
2334
  return type;
2306
2335
  }
2307
2336
 
2308
- export { HighlightStyle, IndentContext, LRLanguage, Language, LanguageDescription, LanguageSupport, ParseContext, StreamLanguage, StringStream, TreeIndentContext, bracketMatching, codeFolding, continuedIndent, defaultHighlightStyle, defineLanguageFacet, delimitedIndent, ensureSyntaxTree, flatIndent, foldAll, foldCode, foldEffect, foldGutter, foldInside, foldKeymap, foldNodeProp, foldService, foldable, foldedRanges, forceParsing, getIndentUnit, getIndentation, highlightingFor, indentNodeProp, indentOnInput, indentService, indentString, indentUnit, language, languageDataProp, matchBrackets, syntaxHighlighting, syntaxParserRunning, syntaxTree, syntaxTreeAvailable, unfoldAll, unfoldCode, unfoldEffect };
2337
+ export { HighlightStyle, IndentContext, LRLanguage, Language, LanguageDescription, LanguageSupport, ParseContext, StreamLanguage, StringStream, TreeIndentContext, bracketMatching, codeFolding, continuedIndent, defaultHighlightStyle, defineLanguageFacet, delimitedIndent, ensureSyntaxTree, flatIndent, foldAll, foldCode, foldEffect, foldGutter, foldInside, foldKeymap, foldNodeProp, foldService, foldState, foldable, foldedRanges, forceParsing, getIndentUnit, getIndentation, highlightingFor, indentNodeProp, indentOnInput, indentService, indentString, indentUnit, language, languageDataProp, matchBrackets, syntaxHighlighting, syntaxParserRunning, syntaxTree, syntaxTreeAvailable, unfoldAll, unfoldCode, unfoldEffect };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@codemirror/language",
3
- "version": "0.20.1",
3
+ "version": "6.1.0",
4
4
  "description": "Language support infrastructure for the CodeMirror code editor",
5
5
  "scripts": {
6
6
  "test": "cm-runtests",
@@ -26,15 +26,16 @@
26
26
  "sideEffects": false,
27
27
  "license": "MIT",
28
28
  "dependencies": {
29
- "@codemirror/state": "^0.20.0",
30
- "@codemirror/view": "^0.20.0",
31
- "@lezer/common": "^0.16.0",
32
- "@lezer/highlight": "^0.16.0",
33
- "@lezer/lr": "^0.16.0"
29
+ "@codemirror/state": "^6.0.0",
30
+ "@codemirror/view": "^6.0.0",
31
+ "@lezer/common": "^1.0.0",
32
+ "@lezer/highlight": "^1.0.0",
33
+ "@lezer/lr": "^1.0.0",
34
+ "style-mod": "^4.0.0"
34
35
  },
35
36
  "devDependencies": {
36
37
  "@codemirror/buildhelper": "^0.1.5",
37
- "@lezer/javascript": "^0.16.0"
38
+ "@lezer/javascript": "^1.0.0"
38
39
  },
39
40
  "repository": {
40
41
  "type": "git",