wikilint 2.20.1 → 2.20.2

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/lib/text.js CHANGED
@@ -54,7 +54,7 @@ const errorSyntaxUrl = new RegExp(source, 'giu'), noLinkTypes = new Set(['attr-v
54
54
  ]);
55
55
  let wordRegex;
56
56
  try {
57
- // eslint-disable-next-line prefer-regex-literals, es-x/no-regexp-unicode-property-escapes
57
+ // eslint-disable-next-line prefer-regex-literals
58
58
  wordRegex = new RegExp(String.raw `[\p{L}\p{N}_]`, 'u');
59
59
  }
60
60
  catch /* istanbul ignore next */ {
@@ -23,7 +23,7 @@ const toAttributeType = (type) => type.slice(0, -1);
23
23
  const toDirty = (type) => `${toAttributeType(type)}-dirty`;
24
24
  let wordRegex;
25
25
  try {
26
- // eslint-disable-next-line prefer-regex-literals, es-x/no-regexp-unicode-property-escapes
26
+ // eslint-disable-next-line prefer-regex-literals
27
27
  wordRegex = new RegExp(String.raw `[\p{L}\p{N}]`, 'u');
28
28
  }
29
29
  catch /* istanbul ignore next */ {
@@ -14,7 +14,7 @@ const frame = new Map([
14
14
  ['frameless', 'Frameless'],
15
15
  ['framed', 'Frame'],
16
16
  ['thumbnail', 'Thumb'],
17
- ]), horizAlign = new Set(['left', 'right', 'center', 'none']), vertAlign = new Set(['baseline', 'sub', 'super', 'top', 'text-top', 'middle', 'bottom', 'text-bottom']), extensions = new Set(['tiff', 'tif', 'png', 'gif', 'jpg', 'jpeg', 'webp', 'xcf', 'pdf', 'svg', 'djvu']);
17
+ ]), argTypes = new Set(['arg']), transclusion = new Set(['template', 'magic-word']), horizAlign = new Set(['left', 'right', 'center', 'none']), vertAlign = new Set(['baseline', 'sub', 'super', 'top', 'text-top', 'middle', 'bottom', 'text-bottom']), extensions = new Set(['tiff', 'tif', 'png', 'gif', 'jpg', 'jpeg', 'webp', 'xcf', 'pdf', 'svg', 'djvu']);
18
18
  /**
19
19
  * a more sophisticated string-explode function
20
20
  * @param str string to be exploded
@@ -39,6 +39,15 @@ const explode = (str) => {
39
39
  exploded.push(str.slice(lastIndex));
40
40
  return exploded;
41
41
  };
42
+ /**
43
+ * filter out the image parameters that are not of the specified type
44
+ * @param args image parameter tokens
45
+ * @param types token types to be filtered
46
+ */
47
+ const filterArgs = (args, types) => args.filter(({ childNodes }) => {
48
+ const visibleNodes = childNodes.filter(node => node.text().trim());
49
+ return visibleNodes.length !== 1 || !types.has(visibleNodes[0].type);
50
+ });
42
51
  /**
43
52
  * image
44
53
  *
@@ -67,10 +76,7 @@ class FileToken extends base_1.LinkBaseToken {
67
76
  }
68
77
  /** @private */
69
78
  lint(start = this.getAbsoluteIndex(), re) {
70
- const errors = super.lint(start, re), args = this.getAllArgs().filter(({ childNodes }) => {
71
- const visibleNodes = childNodes.filter(node => node.text().trim());
72
- return visibleNodes.length !== 1 || visibleNodes[0].type !== 'arg';
73
- }), keys = [...new Set(args.map(({ name }) => name))], frameKeys = keys.filter(key => frame.has(key)), horizAlignKeys = keys.filter(key => horizAlign.has(key)), vertAlignKeys = keys.filter(key => vertAlign.has(key)), [fr] = frameKeys, unscaled = fr === 'framed' || fr === 'manualthumb', rect = new rect_1.BoundingRect(this, start);
79
+ const errors = super.lint(start, re), args = filterArgs(this.getAllArgs(), argTypes), keys = [...new Set(args.map(({ name }) => name))], frameKeys = keys.filter(key => frame.has(key)), horizAlignKeys = keys.filter(key => horizAlign.has(key)), vertAlignKeys = keys.filter(key => vertAlign.has(key)), [fr] = frameKeys, unscaled = fr === 'framed' || fr === 'manualthumb', rect = new rect_1.BoundingRect(this, start);
74
80
  if (this.closest('ext-link-text')
75
81
  && this.getValue('link')?.trim() !== '') {
76
82
  errors.push((0, lint_1.generateForSelf)(this, rect, 'nested-link', 'internal link in an external link'));
@@ -94,8 +100,8 @@ class FileToken extends base_1.LinkBaseToken {
94
100
  * @param p1 替换$1
95
101
  * @param severity 错误等级
96
102
  */
97
- const generate = (msg, p1, severity) => (arg) => {
98
- const e = (0, lint_1.generateForChild)(arg, rect, 'no-duplicate', index_1.default.msg(`${msg} image $1 parameter`, p1), severity);
103
+ const generate = (msg, p1, severity = true) => (arg) => {
104
+ const isError = typeof severity === 'function' ? severity(arg) : severity, e = (0, lint_1.generateForChild)(arg, rect, 'no-duplicate', index_1.default.msg(`${msg} image $1 parameter`, p1), isError ? 'error' : 'warning');
99
105
  e.suggestions = [{ desc: 'remove', range: [e.startIndex - 1, e.endIndex], text: '' }];
100
106
  return e;
101
107
  };
@@ -104,15 +110,21 @@ class FileToken extends base_1.LinkBaseToken {
104
110
  if (key === 'invalid' || key === 'width' && unscaled) {
105
111
  continue;
106
112
  }
113
+ const isCaption = key === 'caption';
107
114
  let relevantArgs = args.filter(({ name }) => name === key);
108
- if (key === 'caption') {
115
+ if (isCaption) {
109
116
  relevantArgs = [
110
117
  ...relevantArgs.slice(0, -1).filter(arg => arg.text()),
111
118
  ...relevantArgs.slice(-1),
112
119
  ];
113
120
  }
114
121
  if (relevantArgs.length > 1) {
115
- errors.push(...relevantArgs.map(generate('duplicated', key, key === 'caption' && extension && !extensions.has(extension) ? 'warning' : 'error')));
122
+ let severity = !isCaption || !extension || extensions.has(extension);
123
+ if (isCaption && severity) {
124
+ const plainArgs = filterArgs(relevantArgs, transclusion);
125
+ severity = plainArgs.length > 1 && ((arg) => plainArgs.includes(arg));
126
+ }
127
+ errors.push(...relevantArgs.map(generate('duplicated', key, severity)));
116
128
  }
117
129
  }
118
130
  if (frameKeys.length > 1) {
@@ -174,8 +174,8 @@ let TranscludeToken = (() => {
174
174
  }
175
175
  const magicWord = lcModifier.slice(0, -1).toLowerCase(), isRaw = raw.includes(magicWord), isSubst = subst.includes(magicWord);
176
176
  if (this.#raw && isRaw
177
- || !this.#raw && (isSubst || modifier === '')
178
- || (debug_1.Shadow.running || this.length > 1) && (isRaw || isSubst || modifier === '')) {
177
+ || !this.#raw && (isSubst || !modifier)
178
+ || (debug_1.Shadow.running || this.length > 1) && (isRaw || isSubst || !modifier)) {
179
179
  this.setAttribute('modifier', modifier);
180
180
  this.#raw = isRaw;
181
181
  return Boolean(modifier);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wikilint",
3
- "version": "2.20.1",
3
+ "version": "2.20.2",
4
4
  "description": "A Node.js linter for MediaWiki markup",
5
5
  "keywords": [
6
6
  "mediawiki",
@@ -66,7 +66,7 @@
66
66
  ]
67
67
  },
68
68
  "dependencies": {
69
- "@bhsd/common": "^0.9.3",
69
+ "@bhsd/common": "^0.9.4",
70
70
  "vscode-languageserver-types": "^3.17.5"
71
71
  },
72
72
  "optionalDependencies": {
@@ -75,7 +75,7 @@
75
75
  "entities": "^6.0.0",
76
76
  "mathjax": "^3.2.2",
77
77
  "minimatch": "^10.0.1",
78
- "stylelint": "^16.14.1",
78
+ "stylelint": "^16.19.1",
79
79
  "vscode-css-languageservice": "^6.3.4",
80
80
  "vscode-html-languageservice": "^5.3.3",
81
81
  "vscode-json-languageservice": "^5.4.4"
@@ -92,7 +92,6 @@
92
92
  "color-rgba": "^3.0.0",
93
93
  "esbuild": "^0.25.2",
94
94
  "eslint": "^8.57.1",
95
- "eslint-plugin-es-x": "^8.4.1",
96
95
  "eslint-plugin-eslint-comments": "^3.2.0",
97
96
  "eslint-plugin-jsdoc": "^50.6.3",
98
97
  "eslint-plugin-json-es": "^1.6.0",
@@ -104,7 +103,6 @@
104
103
  "http-server": "^14.1.1",
105
104
  "mocha": "^11.1.0",
106
105
  "nyc": "^17.1.0",
107
- "stylelint-config-recommended": "^15.0.0",
108
106
  "typescript": "^5.8.2",
109
107
  "v8r": "^4.2.1",
110
108
  "vscode-languageserver-textdocument": "^1.0.12"