@bhsd/codemirror-mediawiki 3.11.5 → 3.12.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 CHANGED
@@ -1,3 +1,22 @@
1
+ @bhsd/codemirror-mediawiki
2
+ Copyright (C) 2022 Bhsd
3
+
4
+ This program is free software; you can redistribute it and/or modify
5
+ it under the terms of the GNU General Public License as published by
6
+ the Free Software Foundation; either version 2 of the License, or
7
+ (at your option) any later version.
8
+
9
+ This program is distributed in the hope that it will be useful,
10
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
11
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
+ GNU General Public License for more details.
13
+
14
+ You should have received a copy of the GNU General Public License along
15
+ with this program; if not, write to the Free Software Foundation, Inc.,
16
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
17
+
18
+
19
+
1
20
  GNU GENERAL PUBLIC LICENSE
2
21
  Version 2, June 1991
3
22
 
package/README.md CHANGED
@@ -68,6 +68,7 @@ If you are just looking for a CodeMirror 6 language mode and language support ex
68
68
  - [bidiIsolates](#bidiisolates)
69
69
  - [bracketMatching](#bracketmatching)
70
70
  - [closeBrackets](#closebrackets)
71
+ - [closeTags](#closetags)
71
72
  - [codeFolding](#codefolding)
72
73
  - [colorPicker](#colorpicker)
73
74
  - [escape](#escape)
@@ -259,11 +260,11 @@ In addition to the common [extensions](#extensions), here are some HTML-specific
259
260
  ```js
260
261
  import {
261
262
  registerBracketMatchingForHTML,
262
- registerCloseBracketsForHTML,
263
+ registerCloseTagsForHTML,
263
264
  registerColorPickerForHTML,
264
265
  } from '@bhsd/codemirror-mediawiki';
265
266
  registerBracketMatchingForHTML();
266
- registerCloseBracketsForHTML();
267
+ registerCloseTagsForHTML();
267
268
  registerColorPickerForHTML();
268
269
  ```
269
270
 
@@ -408,10 +409,10 @@ In addition to the common [extensions](#extensions), here are some Vue-specific
408
409
 
409
410
  ```js
410
411
  import {
411
- registerCloseBracketsForVue,
412
+ registerCloseTagsForVue,
412
413
  registerColorPickerForVue,
413
414
  } from '@bhsd/codemirror-mediawiki';
414
- registerCloseBracketsForVue();
415
+ registerCloseTagsForVue();
415
416
  registerColorPickerForVue();
416
417
  ```
417
418
 
@@ -722,6 +723,7 @@ cm.prefer([
722
723
  'autocompletion',
723
724
  'bracketMatching',
724
725
  'closeBrackets',
726
+ 'closeTags',
725
727
  'codeFolding',
726
728
  'highlightActiveLine',
727
729
  'highlightSelectionMatches',
@@ -746,6 +748,7 @@ cm.prefer({
746
748
  autocompletion: false,
747
749
  bracketMatching: false,
748
750
  closeBrackets: false,
751
+ closeTags: false,
749
752
  codeFolding: false,
750
753
  highlightActiveLine: false,
751
754
  highlightSelectionMatches: false,
@@ -1070,6 +1073,30 @@ registerCloseBrackets();
1070
1073
 
1071
1074
  </details>
1072
1075
 
1076
+ ### closeTags
1077
+
1078
+ <details>
1079
+ <summary>Expand</summary>
1080
+
1081
+ *version added: 3.12.0*
1082
+
1083
+ Automatically close HTML/XML tags.
1084
+
1085
+ For granular control over the bundled extensions, you need to register this extension for specific languages([HTML](#html), [MediaWiki](#mediawiki) or [Vue](#vue)):
1086
+
1087
+ ```js
1088
+ import {
1089
+ registerCloseTagsForHTML,
1090
+ registerCloseTagsForMediaWiki,
1091
+ registerCloseTagsForVue,
1092
+ } from '@bhsd/codemirror-mediawiki';
1093
+ registerCloseTagsForHTML();
1094
+ registerCloseTagsForMediaWiki();
1095
+ registerCloseTagsForVue();
1096
+ ```
1097
+
1098
+ </details>
1099
+
1073
1100
  ### codeFolding
1074
1101
 
1075
1102
  <details>
@@ -1105,11 +1132,19 @@ registerCodeFolding();
1105
1132
 
1106
1133
  Provide color pickers for CSS and MediaWiki modes.
1107
1134
 
1108
- For granular control over the bundled extensions, you can import the `registerColorPicker` functions. Note that you also need to register this extension for specific languages([CSS](#css), [MediaWiki](#mediawiki) or [Vue](#vue)):
1135
+ For granular control over the bundled extensions, you need to register this extension for specific languages([CSS](#css), [HTML](#html), [MediaWiki](#mediawiki) or [Vue](#vue)):
1109
1136
 
1110
1137
  ```js
1111
- import {registerColorPicker} from '@bhsd/codemirror-mediawiki';
1112
- registerColorPicker();
1138
+ import {
1139
+ registerColorPickerForCSS,
1140
+ registerColorPickerForHTML,
1141
+ registerColorPickerForMediaWiki,
1142
+ registerColorPickerForVue,
1143
+ } from '@bhsd/codemirror-mediawiki';
1144
+ registerColorPickerForCSS();
1145
+ registerColorPickerForHTML();
1146
+ registerColorPickerForMediaWiki();
1147
+ registerColorPickerForVue();
1113
1148
  ```
1114
1149
 
1115
1150
  </details>
package/dist/bidi.js CHANGED
@@ -4,10 +4,11 @@
4
4
  * @see https://gerrit.wikimedia.org/g/mediawiki/extensions/CodeMirror
5
5
  */
6
6
  import { EditorView, Direction, ViewPlugin, Decoration } from '@codemirror/view';
7
- import { Prec, RangeSetBuilder } from '@codemirror/state';
7
+ import { Prec } from '@codemirror/state';
8
8
  import { syntaxTree } from '@codemirror/language';
9
9
  import { tokens } from './config.js';
10
10
  import { getTag } from './matchTag.js';
11
+ import { pushDecoration } from './util.js';
11
12
  const isolateSelector = '.cm-bidi-isolate', ltrSelector = '.cm-bidi-ltr', cls = isolateSelector.slice(1), isolateLTR = Decoration.mark({
12
13
  class: `${cls} ${ltrSelector.slice(1)}`,
13
14
  bidiIsolate: Direction.LTR,
@@ -18,7 +19,7 @@ const isolateSelector = '.cm-bidi-isolate', ltrSelector = '.cm-bidi-ltr', cls =
18
19
  * @test
19
20
  */
20
21
  export const computeIsolates = ({ visibleRanges, state, textDirection }) => {
21
- const set = new RangeSetBuilder();
22
+ const set = [];
22
23
  if (textDirection === Direction.RTL) {
23
24
  for (const { from, to } of visibleRanges) {
24
25
  let node = syntaxTree(state).resolve(from, 1), td = 0, table = 0, parameter = 0;
@@ -27,13 +28,13 @@ export const computeIsolates = ({ visibleRanges, state, textDirection }) => {
27
28
  if (/-(?:ext|html)tag-bracket/u.test(name) && state.sliceDoc(f, t).includes('<')) {
28
29
  const tag = getTag(state, nextSibling);
29
30
  if (tag) {
30
- set.add(tag.from, tag.to, isolateLTR);
31
+ pushDecoration(set, isolateLTR, tag);
31
32
  }
32
33
  }
33
34
  else if (!td && !table && name.includes(tokens.tableDefinition)) {
34
35
  if (/-html-(?:table|tr)/u.test(name)) {
35
36
  table = state.doc.lineAt(f).to;
36
- set.add(f, table, isolateLTR);
37
+ pushDecoration(set, isolateLTR, f, table);
37
38
  }
38
39
  else {
39
40
  td = f;
@@ -43,18 +44,18 @@ export const computeIsolates = ({ visibleRanges, state, textDirection }) => {
43
44
  table = 0;
44
45
  }
45
46
  else if (td && name.includes(tokens.tableDelimiter2)) {
46
- set.add(td, f, isolateLTR);
47
+ pushDecoration(set, isolateLTR, td, f);
47
48
  td = 0;
48
49
  }
49
50
  else if (/-(?:template|parserfunction)-delimiter/u.test(name)) {
50
51
  if (parameter) {
51
- set.add(parameter, f, isolate);
52
+ pushDecoration(set, isolate, parameter, f);
52
53
  }
53
54
  parameter = t;
54
55
  }
55
56
  else if (parameter && /-(?:template|parserfunction)-bracket/u.test(name)) {
56
57
  if (state.sliceDoc(f, f + 1) === '}') {
57
- set.add(parameter, f, isolate);
58
+ pushDecoration(set, isolate, parameter, f);
58
59
  }
59
60
  parameter = 0;
60
61
  }
@@ -62,7 +63,7 @@ export const computeIsolates = ({ visibleRanges, state, textDirection }) => {
62
63
  }
63
64
  }
64
65
  }
65
- return set.finish();
66
+ return Decoration.set(set, true);
66
67
  };
67
68
  export default [
68
69
  ViewPlugin.fromClass(class {
@@ -0,0 +1,3 @@
1
+ import type { Extension } from '@codemirror/state';
2
+ declare const _default: () => Extension;
3
+ export default _default;
@@ -0,0 +1,31 @@
1
+ import { EditorView } from '@codemirror/view';
2
+ import { syntaxTree } from '@codemirror/language';
3
+ import { getTag, searchTag } from './matchTag.js';
4
+ import { hasTag } from './mediawiki.js';
5
+ const brackets = ['extTagBracket', 'htmlTagBracket'];
6
+ export default () => EditorView.inputHandler.of((view, from, to, text, insertTransaction) => {
7
+ if (view.composing || view.state.readOnly || from !== to || text !== '>') {
8
+ return false;
9
+ }
10
+ const base = insertTransaction(), { state } = base, tree = syntaxTree(state), closeTags = state.changeByRange(range => {
11
+ const didType = state.sliceDoc(range.from - 1, range.to) === text, { head } = range, after = tree.resolveInner(head, -1);
12
+ if (didType && hasTag(after.name, brackets) && head === after.from + 1) {
13
+ const tag = getTag(state, after.prevSibling);
14
+ if (tag && !tag.closing && !tag.selfClosing && !searchTag(state, tag)) {
15
+ return {
16
+ range,
17
+ changes: { from: head, to: head, insert: `</${tag.name}>` },
18
+ };
19
+ }
20
+ }
21
+ return { range };
22
+ });
23
+ if (closeTags.changes.empty) {
24
+ return false;
25
+ }
26
+ view.dispatch([
27
+ base,
28
+ state.update(closeTags, { userEvent: 'input.complete', scrollIntoView: true }),
29
+ ]);
30
+ return true;
31
+ });
@@ -2,7 +2,7 @@ import { EditorView, lineNumbers, keymap, highlightActiveLineGutter } from '@cod
2
2
  import { EditorSelection, Compartment, EditorState, SelectionRange, } from '@codemirror/state';
3
3
  import { syntaxHighlighting, defaultHighlightStyle, indentOnInput, indentUnit, ensureSyntaxTree, syntaxTree, } from '@codemirror/language';
4
4
  import { defaultKeymap, historyKeymap, history, redo, indentWithTab, insertNewlineKeepIndent, deleteCharBackwardStrict, } from '@codemirror/commands';
5
- import { searchKeymap } from '@codemirror/search';
5
+ import { search, searchKeymap } from '@codemirror/search';
6
6
  import { linter, lintGutter } from '@codemirror/lint';
7
7
  import elt from 'crelt';
8
8
  import { base, panelSelector, panelsSelector, diagnosticSelector, noDetectionLangs } from './constants.js';
@@ -33,7 +33,7 @@ export const optionalFunctions = {
33
33
  return () => { };
34
34
  },
35
35
  };
36
- const editExtensions = new Set(['closeBrackets', 'autocompletion', 'signatureHelp', 'escape']);
36
+ const editExtensions = new Set(['closeBrackets', 'closeTags', 'autocompletion', 'signatureHelp', 'escape']);
37
37
  const linters = {};
38
38
  const phrases = {};
39
39
  /**
@@ -156,6 +156,23 @@ export class CodeMirror6 {
156
156
  EditorView.editorAttributes.of({ lang: l }),
157
157
  lineNumbers(),
158
158
  highlightActiveLineGutter(),
159
+ search({
160
+ scrollToMatch(range, view) {
161
+ const scrollRect = view.scrollDOM.getBoundingClientRect(), startCoords = view.coordsAtPos(range.from), endCoords = view.coordsAtPos(range.to), isInViewport = startCoords && startCoords.top >= scrollRect.top
162
+ && endCoords && endCoords.bottom <= scrollRect.bottom;
163
+ return EditorView.scrollIntoView(range, { y: isInViewport ? 'nearest' : 'center' });
164
+ },
165
+ }),
166
+ EditorView.scrollHandler.of((view, { head }, options) => {
167
+ if (options.x === 'nearest' && options.y === 'center') {
168
+ const { scrollDOM } = view, { clientHeight } = scrollDOM, { top, height } = view.lineBlockAt(head);
169
+ if (height < clientHeight - options.yMargin * 2) {
170
+ scrollDOM.scrollTop = top + (height - clientHeight) / 2;
171
+ }
172
+ options.y = 'nearest';
173
+ }
174
+ return false;
175
+ }),
159
176
  keymap.of([
160
177
  ...defaultKeymap,
161
178
  ...searchKeymap,
@@ -197,7 +214,7 @@ export class CodeMirror6 {
197
214
  if (focusChanged) {
198
215
  textarea.dispatchEvent(new FocusEvent(this.#view.hasFocus ? 'focus' : 'blur'));
199
216
  }
200
- if (selectionSet && this.lang === 'mediawiki'
217
+ GH: if (selectionSet && this.lang === 'mediawiki'
201
218
  && ['localhost:8080', 'bhsd-harry.github.io'].includes(location.host)) {
202
219
  const tree = syntaxTree(state), { head } = state.selection.main, { name } = tree.resolve(head), innerName = tree.resolveInner(head).name;
203
220
  if (name !== innerName) {
@@ -1,3 +1,4 @@
1
- export declare const base: Record<'CDN', string | undefined>, hoverSelector = ".cm-tooltip-hover-mw", diagnosticSelector = ".cm-diagnosticText-clickable", panelSelector = ".cm-panel", panelsSelector = ".cm-panels", actionSelector = ".cm-diagnosticAction", noDetectionLangs: Set<string>, bgDark = "#4c566a", matchingCls = "cm-matchingTag", nonmatchingCls = "cm-nonmatchingTag";
1
+ import { Decoration } from '@codemirror/view';
2
+ export declare const base: Record<'CDN', string | undefined>, hoverSelector = ".cm-tooltip-hover-mw", diagnosticSelector = ".cm-diagnosticText-clickable", panelSelector = ".cm-panel", panelsSelector = ".cm-panels", actionSelector = ".cm-diagnosticAction", doctagMark: Decoration, typeMark: Decoration, noDetectionLangs: Set<string>, bgDark = "#4c566a", matchingCls = "cm-matchingTag", nonmatchingCls = "cm-nonmatchingTag";
2
3
  export declare const isWMF: boolean;
3
4
  export declare const isMac: boolean;
package/dist/constants.js CHANGED
@@ -1,5 +1,6 @@
1
+ import { Decoration } from '@codemirror/view';
1
2
  import { wmf } from '@bhsd/common';
2
- export const base = { CDN: undefined }, hoverSelector = '.cm-tooltip-hover-mw', diagnosticSelector = '.cm-diagnosticText-clickable', panelSelector = '.cm-panel', panelsSelector = '.cm-panels', actionSelector = '.cm-diagnosticAction', noDetectionLangs = new Set(['plain', 'mediawiki']), bgDark = '#4c566a', matchingCls = 'cm-matchingTag', nonmatchingCls = 'cm-nonmatchingTag';
3
+ export const base = { CDN: undefined }, hoverSelector = '.cm-tooltip-hover-mw', diagnosticSelector = '.cm-diagnosticText-clickable', panelSelector = '.cm-panel', panelsSelector = '.cm-panels', actionSelector = '.cm-diagnosticAction', doctagMark = /* @__PURE__ */ Decoration.mark({ class: 'cm-doctag' }), typeMark = /* @__PURE__ */ Decoration.mark({ class: 'cm-doctag-type' }), noDetectionLangs = new Set(['plain', 'mediawiki']), bgDark = '#4c566a', matchingCls = 'cm-matchingTag', nonmatchingCls = 'cm-nonmatchingTag';
3
4
  export const isWMF = /* @__PURE__ */ (() => typeof location === 'object'
4
5
  && new RegExp(String.raw `\.(?:${wmf})\.org$`, 'u').test(location.hostname))();
5
6
  export const isMac = /* @__PURE__ */ (() => {
package/dist/fold.js CHANGED
@@ -5,7 +5,7 @@ import { getRegex } from '@bhsd/common';
5
5
  import elt from 'crelt';
6
6
  import { tokens } from './config.js';
7
7
  import { bgDark } from './constants.js';
8
- import { matchTag, getTag } from './matchTag.js';
8
+ import { searchTag, getTag } from './matchTag.js';
9
9
  import { braceStackUpdate, sliceDoc } from './util.js';
10
10
  const getExtRegex = /* @__PURE__ */ getRegex(tag => new RegExp(`mw-tag-${tag}(?![a-z])`, 'u'));
11
11
  export const updateSelection = (pos, { to }) => Math.max(pos, to), updateAll = (pos, { from, to }) => from <= pos && to > pos ? to : pos;
@@ -80,10 +80,10 @@ export const foldable = (state, posOrNode, tree, refOnly = false) => {
80
80
  while (nextSibling && !(isExtBracket(nextSibling) && !regex.test(nextSibling.name))) {
81
81
  ({ nextSibling } = nextSibling);
82
82
  }
83
- const next = nextSibling?.nextSibling;
83
+ const next = nextSibling?.nextSibling, closing = next && getTag(state, next);
84
84
  // The closing bracket of the current extension tag
85
- if (nextSibling && (!refOnly || next && refNames.has(getTag(state, next)?.name))) {
86
- return { from: matchTag(state, nextSibling.to).end.to, to: nextSibling.from };
85
+ if (closing && (!refOnly || refNames.has(closing.name))) {
86
+ return { from: searchTag(state, closing).to, to: nextSibling.from };
87
87
  }
88
88
  }
89
89
  return false;
@@ -337,14 +337,17 @@ export const buildMarkers = (view) => {
337
337
  };
338
338
  const markers = /* @__PURE__ */ ViewPlugin.fromClass(class {
339
339
  constructor(view) {
340
+ this.tree = syntaxTree(view.state);
340
341
  this.markers = buildMarkers(view);
341
342
  }
342
343
  update({ docChanged, viewportChanged, startState, state, view }) {
344
+ const tree = syntaxTree(state);
343
345
  if (docChanged
344
346
  || viewportChanged
345
347
  || startState.facet(language) !== state.facet(language)
346
348
  || startState.field(foldState, false) !== state.field(foldState, false)
347
- || syntaxTree(startState) !== syntaxTree(state)) {
349
+ || tree !== this.tree) {
350
+ this.tree = tree;
348
351
  this.markers = buildMarkers(view);
349
352
  }
350
353
  }
package/dist/html.js CHANGED
@@ -4,9 +4,9 @@ import { javascript, javascriptLanguage } from '@codemirror/lang-javascript';
4
4
  import { cssLanguage } from '@codemirror/lang-css';
5
5
  import { LanguageSupport } from '@codemirror/language';
6
6
  import { cssCompletion } from './css.js';
7
- import { jsCompletion, markGlobalsPlugin } from './javascript.js';
7
+ import { jsCompletion, markGlobalsAndDocTagPlugin } from './javascript.js';
8
8
  import { mediawikiBase } from './mediawiki.js';
9
- import { getLightHighlightStyle } from './theme.js';
9
+ import { lightHighlightStyle } from './theme.js';
10
10
  export default (config, cm) => {
11
11
  const { language, support } = mediawikiBase(config),
12
12
  /** @test */
@@ -30,8 +30,8 @@ export default (config, cm) => {
30
30
  jsCompletion,
31
31
  cssCompletion(),
32
32
  support,
33
- getLightHighlightStyle(),
34
- markGlobalsPlugin(cm),
33
+ lightHighlightStyle,
34
+ markGlobalsAndDocTagPlugin(cm),
35
35
  ]);
36
36
  Object.assign(langSupport, { nestedMWLanguage: language });
37
37
  return langSupport;
package/dist/index.d.ts CHANGED
@@ -27,7 +27,10 @@ export declare const registerAllowMultipleSelections: () => void;
27
27
  export declare const registerAutocompletion: () => void;
28
28
  /** Register the `codeFolding` extension */
29
29
  export declare const registerCodeFolding: () => void;
30
- /** Register the `colorPicker` extension */
30
+ /**
31
+ * Register the `colorPicker` extension
32
+ * @deprecated This function does nothing and will be removed in a future release
33
+ */
31
34
  export declare const registerColorPicker: () => void;
32
35
  /** Register all common extensions */
33
36
  export declare const registerCommonExtensions: () => void;
@@ -78,6 +81,8 @@ export declare const registerColorPickerForMediaWiki: () => void;
78
81
  export declare const registerBracketMatchingForMediaWiki: () => void;
79
82
  /** Register the `codeFolding` extension for MediaWiki */
80
83
  export declare const registerCodeFoldingForMediaWiki: () => void;
84
+ /** Register the `closeTags` extension for MediaWiki */
85
+ export declare const registerCloseTagsForMediaWiki: () => void;
81
86
  /**
82
87
  * Register MediaWiki core language support
83
88
  * @param articlePath article path (e.g., 'https://www.mediawiki.org/wiki/')
@@ -89,14 +94,21 @@ export declare const registerMediaWikiCore: (articlePath?: string, templatedata?
89
94
  export declare const registerHTML: () => void;
90
95
  /** Register the `bracketMatching` extension for mixed MediaWiki-HTML */
91
96
  export declare const registerBracketMatchingForHTML: () => void;
92
- /** Register the `closeBrackets` extension for mixed MediaWiki-HTML */
97
+ /**
98
+ * Register the `closeBrackets` extension for mixed MediaWiki-HTML
99
+ * @deprecated This function does nothing and will be removed in a future release
100
+ */
93
101
  export declare const registerCloseBracketsForHTML: () => void;
102
+ /** Register the `closeTags` extension for mixed MediaWiki-HTML */
103
+ export declare const registerCloseTagsForHTML: () => void;
94
104
  /** Register the `colorPicker` extension for mixed MediaWiki-HTML */
95
105
  export declare const registerColorPickerForHTML: () => void;
96
106
  /** Register mixed MediaWiki-HTML core language support */
97
107
  export declare const registerHTMLCore: () => void;
98
108
  /** Register JavaScript language support */
99
109
  export declare const registerJavaScript: () => void;
110
+ /** Register the `bracketMatching` extension for JavaScript */
111
+ export declare const registerBracketMatchingForJavaScript: () => void;
100
112
  /** Register JavaScript core language support */
101
113
  export declare const registerJavaScriptCore: () => void;
102
114
  /** Register CSS language support */
@@ -115,8 +127,15 @@ export declare const registerLua: () => void;
115
127
  export declare const registerLuaCore: () => void;
116
128
  /** Register Vue language support */
117
129
  export declare const registerVue: () => void;
118
- /** Register the `closeBrackets` extension for Vue */
130
+ /** Register the `bracketMatching` extension for Vue */
131
+ export declare const registerBracketMatchingForVue: () => void;
132
+ /**
133
+ * Register the `closeBrackets` extension for Vue
134
+ * @deprecated This function does nothing and will be removed in a future release
135
+ */
119
136
  export declare const registerCloseBracketsForVue: () => void;
137
+ /** Register the `closeTags` extension for Vue */
138
+ export declare const registerCloseTagsForVue: () => void;
120
139
  /** Register the `colorPicker` extension for Vue */
121
140
  export declare const registerColorPickerForVue: () => void;
122
141
  /** Register Vue core language support */
package/dist/index.js CHANGED
@@ -8,6 +8,7 @@ import { abusefilter, analyzer } from '@bhsd/lezer-abusefilter';
8
8
  import { getLSP } from '@bhsd/browser';
9
9
  import { colorPicker } from '@bhsd/codemirror-css-color-picker';
10
10
  import bidiIsolates from './bidi.js';
11
+ import closeTags from './closeTags.js';
11
12
  import { CodeMirror6, avail, languages, linterRegistry, destroyListeners, plain, optionalFunctions, themes, } from './codemirror.js';
12
13
  import mediawikiColorPicker from './color.js';
13
14
  import escapeKeymap from './escape.js';
@@ -27,7 +28,7 @@ import { tagModes, getStaticMwConfig } from './static.js';
27
28
  import statusBar from './statusBar.js';
28
29
  import css from './css.js';
29
30
  import html from './html.js';
30
- import javascript from './javascript.js';
31
+ import javascript, { exclude } from './javascript.js';
31
32
  import lua from './lua.js';
32
33
  import vue from './vue.js';
33
34
  export { CodeMirror6 };
@@ -70,7 +71,7 @@ export const registerBracketMatching = () => {
70
71
  };
71
72
  /** Register the `closeBrackets` extension */
72
73
  export const registerCloseBrackets = () => {
73
- registerExtension('closeBrackets', (e = []) => [closeBrackets(), e]);
74
+ registerExtension('closeBrackets', closeBrackets);
74
75
  };
75
76
  /** Register the `scrollPastEnd` extension */
76
77
  export const registerScrollPastEnd = () => {
@@ -100,12 +101,13 @@ export const registerAutocompletion = () => {
100
101
  export const registerCodeFolding = () => {
101
102
  registerExtension('codeFolding', codeFolding);
102
103
  };
103
- /** Register the `colorPicker` extension */
104
- export const registerColorPicker = () => {
105
- registerExtension('colorPicker', (e = []) => e);
106
- };
107
- /** 注册所有通用扩展(除`colorPicker`) */
108
- const registerExtensions = () => {
104
+ /**
105
+ * Register the `colorPicker` extension
106
+ * @deprecated This function does nothing and will be removed in a future release
107
+ */
108
+ export const registerColorPicker = () => { };
109
+ /** Register all common extensions */
110
+ export const registerCommonExtensions = () => {
109
111
  registerHighlightSpecialChars();
110
112
  registerHighlightActiveLine();
111
113
  registerHighlightWhitespace();
@@ -118,15 +120,15 @@ const registerExtensions = () => {
118
120
  registerAutocompletion();
119
121
  registerCodeFolding();
120
122
  };
121
- /** Register all common extensions */
122
- export const registerCommonExtensions = () => {
123
- registerExtensions();
124
- registerColorPicker();
125
- };
123
+ /**
124
+ * 各语言独立定义的扩展
125
+ * @param e 扩展
126
+ */
127
+ const langExtension = (e = []) => e;
126
128
  function mediawikiOnly(ext) {
127
129
  return typeof ext === 'function'
128
130
  ? [(enable, cm) => enable ? ext(cm) : [], { mediawiki: true }]
129
- : [(e = []) => e, { mediawiki: ext }];
131
+ : [langExtension, { mediawiki: ext }];
130
132
  }
131
133
  /**
132
134
  * 注册特定语言的扩展
@@ -135,7 +137,7 @@ function mediawikiOnly(ext) {
135
137
  * @param ext 扩展
136
138
  */
137
139
  const registerLangExtension = (lang, name, ext) => {
138
- avail[name] ??= [() => []];
140
+ avail[name] ??= [langExtension];
139
141
  const addon = avail[name];
140
142
  addon[1] ??= {};
141
143
  addon[1][lang] = ext;
@@ -158,6 +160,7 @@ export const registerMediaWiki = (articlePath, templatedata) => {
158
160
  registerColorPickerForMediaWiki();
159
161
  registerBracketMatchingForMediaWiki();
160
162
  registerCodeFoldingForMediaWiki();
163
+ registerCloseTagsForMediaWiki();
161
164
  };
162
165
  /**
163
166
  * 注册MediaWiki专用扩展
@@ -231,6 +234,10 @@ export const registerCodeFoldingForMediaWiki = () => {
231
234
  registerLangExtension('mediawiki', 'codeFolding', mediawikiFold);
232
235
  optionalFunctions.foldHandler = foldHandler;
233
236
  };
237
+ /** Register the `closeTags` extension for MediaWiki */
238
+ export const registerCloseTagsForMediaWiki = () => {
239
+ registerLangExtension('mediawiki', 'closeTags', closeTags());
240
+ };
234
241
  /**
235
242
  * 注册LintSource
236
243
  * @param lang 语言
@@ -265,19 +272,24 @@ export const registerHTML = () => {
265
272
  registerCommonExtensions();
266
273
  registerHTMLCore();
267
274
  registerBracketMatchingForHTML();
268
- registerCloseBracketsForHTML();
275
+ registerCloseTagsForHTML();
269
276
  registerColorPickerForHTML();
270
277
  };
271
278
  /** Register the `bracketMatching` extension for mixed MediaWiki-HTML */
272
279
  export const registerBracketMatchingForHTML = () => {
273
280
  registerLangExtension('html', 'bracketMatching', [
274
- {},
281
+ { exclude },
275
282
  tagMatchingState,
276
283
  ]);
277
284
  };
278
- /** Register the `closeBrackets` extension for mixed MediaWiki-HTML */
279
- export const registerCloseBracketsForHTML = () => {
280
- registerLangExtension('html', 'closeBrackets', autoCloseTags);
285
+ /**
286
+ * Register the `closeBrackets` extension for mixed MediaWiki-HTML
287
+ * @deprecated This function does nothing and will be removed in a future release
288
+ */
289
+ export const registerCloseBracketsForHTML = () => { };
290
+ /** Register the `closeTags` extension for mixed MediaWiki-HTML */
291
+ export const registerCloseTagsForHTML = () => {
292
+ registerLangExtension('html', 'closeTags', autoCloseTags);
281
293
  };
282
294
  /** Register the `colorPicker` extension for mixed MediaWiki-HTML */
283
295
  export const registerColorPickerForHTML = () => {
@@ -291,8 +303,13 @@ export const registerHTMLCore = () => {
291
303
  };
292
304
  /** Register JavaScript language support */
293
305
  export const registerJavaScript = () => {
294
- registerExtensions();
306
+ registerCommonExtensions();
295
307
  registerJavaScriptCore();
308
+ registerBracketMatchingForJavaScript();
309
+ };
310
+ /** Register the `bracketMatching` extension for JavaScript */
311
+ export const registerBracketMatchingForJavaScript = () => {
312
+ registerLangExtension('javascript', 'bracketMatching', [{ exclude }]);
296
313
  };
297
314
  /** Register JavaScript core language support */
298
315
  export const registerJavaScriptCore = () => {
@@ -318,7 +335,7 @@ export const registerCSSCore = () => {
318
335
  };
319
336
  /** Register JSON language support */
320
337
  export const registerJSON = () => {
321
- registerExtensions();
338
+ registerCommonExtensions();
322
339
  registerJSONCore();
323
340
  };
324
341
  /** Register JSON core language support */
@@ -329,7 +346,7 @@ export const registerJSONCore = () => {
329
346
  };
330
347
  /** Register Lua language support */
331
348
  export const registerLua = () => {
332
- registerExtensions();
349
+ registerCommonExtensions();
333
350
  registerLuaCore();
334
351
  };
335
352
  /** Register Lua core language support */
@@ -342,12 +359,22 @@ export const registerLuaCore = () => {
342
359
  export const registerVue = () => {
343
360
  registerCommonExtensions();
344
361
  registerVueCore();
345
- registerCloseBracketsForVue();
362
+ registerBracketMatchingForVue();
363
+ registerCloseTagsForVue();
346
364
  registerColorPickerForVue();
347
365
  };
348
- /** Register the `closeBrackets` extension for Vue */
349
- export const registerCloseBracketsForVue = () => {
350
- registerLangExtension('vue', 'closeBrackets', autoCloseTags);
366
+ /** Register the `bracketMatching` extension for Vue */
367
+ export const registerBracketMatchingForVue = () => {
368
+ registerLangExtension('vue', 'bracketMatching', [{ exclude }]);
369
+ };
370
+ /**
371
+ * Register the `closeBrackets` extension for Vue
372
+ * @deprecated This function does nothing and will be removed in a future release
373
+ */
374
+ export const registerCloseBracketsForVue = () => { };
375
+ /** Register the `closeTags` extension for Vue */
376
+ export const registerCloseTagsForVue = () => {
377
+ registerLangExtension('vue', 'closeTags', autoCloseTags);
351
378
  };
352
379
  /** Register the `colorPicker` extension for Vue */
353
380
  export const registerColorPickerForVue = () => {
@@ -361,7 +388,7 @@ export const registerVueCore = () => {
361
388
  };
362
389
  /** Register AbuseFilter language support */
363
390
  export const registerAbuseFilter = () => {
364
- registerExtensions();
391
+ registerCommonExtensions();
365
392
  registerAbuseFilterCore();
366
393
  };
367
394
  /** Register AbuseFilter core language support */
@@ -5,11 +5,18 @@ import type { DocRange } from './fold';
5
5
  import type { CodeMirror6 } from './codemirror';
6
6
  export declare const jsCompletion: Extension;
7
7
  /**
8
- * 高亮显示全局变量
8
+ * 忽略JavaScript正则表达式中的括号匹配
9
+ * @param state
10
+ * @param pos 位置
11
+ * @test
12
+ */
13
+ export declare const exclude: (state: EditorState, pos: number) => boolean;
14
+ /**
15
+ * 高亮显示全局变量和JSDoc标签
9
16
  * @ignore
10
17
  * @test
11
18
  */
12
- export declare const markGlobals: (tree: Tree, visibleRanges: readonly DocRange[], state: EditorState, cm?: CodeMirror6) => DecorationSet;
13
- export declare const markGlobalsPlugin: (cm?: CodeMirror6) => Extension;
19
+ export declare const markGlobalsAndDocTag: (tree: Tree, visibleRanges: readonly DocRange[], state: EditorState, cm?: CodeMirror6) => DecorationSet;
20
+ export declare const markGlobalsAndDocTagPlugin: (cm?: CodeMirror6) => Extension;
14
21
  declare const _default: (_?: unknown, cm?: CodeMirror6) => Extension;
15
22
  export default _default;