@bhsd/codemirror-mediawiki 2.7.2 → 2.7.4

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/mw/openLinks.ts CHANGED
@@ -5,7 +5,6 @@ import type {CodeMirror} from './base';
5
5
  declare type MouseEventListener = (e: MouseEvent) => void;
6
6
 
7
7
  const modKey = isMac ? 'metaKey' : 'ctrlKey',
8
- regex = /-template-name|-link-pagename/u,
9
8
  handlers = new WeakMap<CodeMirror, MouseEventListener>();
10
9
 
11
10
  /**
@@ -18,6 +17,19 @@ function getName(node: SyntaxNode | null): string | undefined {
18
17
  return node?.name.replace(/_+/gu, ' ').trim();
19
18
  }
20
19
 
20
+ /**
21
+ * 查找连续同名节点
22
+ * @param node 起始节点
23
+ * @param dir 方向
24
+ * @param name 节点名称
25
+ */
26
+ const search = (node: SyntaxNode, dir: 'prevSibling' | 'nextSibling', name = getName(node)): SyntaxNode => {
27
+ while (getName(node[dir]!) === name) {
28
+ node = node[dir]!; // eslint-disable-line no-param-reassign
29
+ }
30
+ return node;
31
+ };
32
+
21
33
  /**
22
34
  * 点击时在新页面打开链接、模板等
23
35
  * @param cm
@@ -32,25 +44,31 @@ const getHandler = (cm: CodeMirror): MouseEventListener => {
32
44
  return;
33
45
  }
34
46
  const {view} = cm,
47
+ {state} = view,
35
48
  node = cm.getNodeAt(view.posAtCoords(e)!);
36
- if (!node || !regex.test(node.name)) {
37
- return;
38
- }
39
- e.preventDefault();
40
- const name = getName(node);
41
- let prev = node,
42
- next = node;
43
- while (getName(prev.prevSibling!) === name) {
44
- prev = prev.prevSibling!;
45
- }
46
- while (getName(next.nextSibling!) === name) {
47
- next = next.nextSibling!;
48
- }
49
- let page = view.state.sliceDoc(prev.from, next.to).trim();
50
- if (page.startsWith('/')) {
51
- page = `:${mw.config.get('wgPageName')}${page}`;
49
+ if (!node) {
50
+ // pass
51
+ } else if (/-template-name|-link-pagename/u.test(node.name)) {
52
+ e.preventDefault();
53
+ const name = getName(node);
54
+ let page = state.sliceDoc(
55
+ search(node, 'prevSibling', name).from,
56
+ search(node, 'nextSibling', name).to,
57
+ ).trim();
58
+ if (page.startsWith('/')) {
59
+ page = `:${mw.config.get('wgPageName')}${page}`;
60
+ }
61
+ open(new mw.Title(page, name.includes('-template-name') ? 10 : 0).getUrl(undefined), '_blank');
62
+ } else if (/-extlink-protocol/u.test(node.name)) {
63
+ e.preventDefault();
64
+ open(state.sliceDoc(node.from, search(node.nextSibling!, 'nextSibling').to), '_blank');
65
+ } else if (/-extlink(?:_|$)/u.test(node.name)) {
66
+ e.preventDefault();
67
+ const name = getName(node),
68
+ prev = search(node, 'prevSibling', name).prevSibling!,
69
+ next = search(node, 'nextSibling', name);
70
+ open(state.sliceDoc(prev.from, next.to), '_blank');
52
71
  }
53
- open(new mw.Title(page, name.includes('-template-name') ? 10 : 0).getUrl(undefined), '_blank');
54
72
  };
55
73
  handlers.set(cm, handler);
56
74
  return handler;
package/mw/preference.ts CHANGED
@@ -165,7 +165,7 @@ export const openPreference = async (editors: (CodeMirror | undefined)[]): Promi
165
165
  $('<p>', {html: msg('feedback', 'codemirror-mediawiki')}),
166
166
  );
167
167
  panelWikilint.$element.append(
168
- ...rules.map(rule => {
168
+ ...rules.filter(rule => rule !== 'table-layout').map(rule => {
169
169
  const state = rule === 'no-arg' ? RuleState.off : RuleState.error,
170
170
  dropdown = new OO.ui.DropdownInputWidget({
171
171
  options: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@bhsd/codemirror-mediawiki",
3
- "version": "2.7.2",
3
+ "version": "2.7.4",
4
4
  "description": "Modified CodeMirror mode based on wikimedia/mediawiki-extensions-CodeMirror",
5
5
  "keywords": [
6
6
  "mediawiki",