From 4325c27968bd96ee592a8dfeb886af239424304d Mon Sep 17 00:00:00 2001 From: pengzhanbo Date: Thu, 18 Jul 2024 00:09:50 +0800 Subject: [PATCH] style: lint regexp --- eslint.config.js | 4 ---- plugins/plugin-md-power/src/node/features/caniuse.ts | 4 ++-- plugins/plugin-md-power/src/node/features/codeSandbox.ts | 2 +- plugins/plugin-md-power/src/node/features/codepen.ts | 2 +- plugins/plugin-md-power/src/node/features/icons/writer.ts | 2 +- plugins/plugin-md-power/src/node/features/jsfiddle.ts | 2 +- plugins/plugin-md-power/src/node/features/langRepl.ts | 2 +- plugins/plugin-md-power/src/node/features/pdf.ts | 3 ++- plugins/plugin-md-power/src/node/features/replit.ts | 2 +- plugins/plugin-md-power/src/node/features/video/bilibili.ts | 3 ++- plugins/plugin-md-power/src/node/features/video/youtube.ts | 2 +- plugins/plugin-md-power/src/node/utils/resolveAttrs.ts | 2 +- plugins/plugin-search/src/node/prepareSearchIndex.ts | 2 ++ plugins/plugin-shikiji/src/client/composables/copy-code.ts | 2 +- plugins/plugin-shikiji/src/node/highlight.ts | 4 ++-- .../src/node/markdown/highlightLinesPlugin.ts | 2 +- .../plugin-shikiji/src/node/markdown/lineNumberPlugin.ts | 2 +- .../plugin-shikiji/src/node/markdown/preWrapperPlugin.ts | 2 +- .../src/node/twoslash/renderer-floating-vue.ts | 2 +- .../plugin-shikiji/src/node/twoslash/rendererTransformer.ts | 2 +- plugins/plugin-shikiji/src/node/utils/attrsToLines.ts | 1 + plugins/plugin-shikiji/src/node/utils/resolveAttrs.ts | 4 ++-- theme/src/client/styles/md-enhance.css | 6 +----- theme/src/node/setupPages.ts | 3 ++- 24 files changed, 30 insertions(+), 32 deletions(-) diff --git a/eslint.config.js b/eslint.config.js index 79b2984a..dda5695f 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -1,10 +1,6 @@ import config from '@pengzhanbo/eslint-config-vue' export default config({ - // todo: 正则校验 - // 当前项目中的 正则 还并不能完全通过 规则,存在 53 个问题 - // 但处理起来比较麻烦,因此将会作为一项比较长期的工作来完成。 - regexp: false, ignores: [ 'lib', 'docs/notes/theme/snippet/code-block.snippet.md', diff --git a/plugins/plugin-md-power/src/node/features/caniuse.ts b/plugins/plugin-md-power/src/node/features/caniuse.ts index 6ead0daf..83d6729a 100644 --- a/plugins/plugin-md-power/src/node/features/caniuse.ts +++ b/plugins/plugin-md-power/src/node/features/caniuse.ts @@ -24,7 +24,7 @@ export const caniusePlugin: PluginWithOptions = ( ): void => { createRuleBlock(md, { type: 'caniuse', - syntaxPattern: /^@\[caniuse(?:\s*?(embed|image)?(?:{([0-9,\-]*?)})?)\]\(([^)]*)\)/, + syntaxPattern: /^@\[caniuse\s*(embed|image)?(?:\{([0-9,\-]*)\})?\]\(([^)]*)\)/, meta: ([, mode, versions = '', feature]) => ({ feature, mode: (mode as CanIUseMode) || defaultMode, @@ -53,7 +53,7 @@ export function legacyCaniuse( mode = isMode(mode) ? mode : modeMap[0] const type = 'caniuse' - const validateReg = new RegExp(`^${type}\\s+(.*)$`) + const validateReg = new RegExp(`^${type}`) const validate = (info: string): boolean => { return validateReg.test(info.trim()) diff --git a/plugins/plugin-md-power/src/node/features/codeSandbox.ts b/plugins/plugin-md-power/src/node/features/codeSandbox.ts index 38c78888..6c95e7af 100644 --- a/plugins/plugin-md-power/src/node/features/codeSandbox.ts +++ b/plugins/plugin-md-power/src/node/features/codeSandbox.ts @@ -12,7 +12,7 @@ import { createRuleBlock } from '../utils/createRuleBlock.js' export const codeSandboxPlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'codesandbox', - syntaxPattern: /^@\[codesandbox(?:\s+(embed|button))?(?:\s+([^]*?))?\]\(([^)]*?)\)/, + syntaxPattern: /^@\[codesandbox(?:\s+(embed|button))?([^\]]*)\]\(([^)]*)\)/, meta([, type, info = '', source = '']) { const { attrs } = resolveAttrs(info) const [profile, filepath = ''] = source.split('#') diff --git a/plugins/plugin-md-power/src/node/features/codepen.ts b/plugins/plugin-md-power/src/node/features/codepen.ts index 83cdc3e1..b57b375a 100644 --- a/plugins/plugin-md-power/src/node/features/codepen.ts +++ b/plugins/plugin-md-power/src/node/features/codepen.ts @@ -14,7 +14,7 @@ const CODEPEN_LINK = 'https://codepen.io/' export const codepenPlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'codepen', - syntaxPattern: /^@\[codepen(?:\s+([^]*?))?\]\(([^)]*?)\)/, + syntaxPattern: /^@\[codepen([^\]]*)\]\(([^)]*)\)/, meta: ([, info = '', source = '']) => { const { attrs } = resolveAttrs(info) const [user, slash] = source.split('/') diff --git a/plugins/plugin-md-power/src/node/features/icons/writer.ts b/plugins/plugin-md-power/src/node/features/icons/writer.ts index 750afdf5..6a770d7c 100644 --- a/plugins/plugin-md-power/src/node/features/icons/writer.ts +++ b/plugins/plugin-md-power/src/node/features/icons/writer.ts @@ -15,7 +15,7 @@ export interface IconCacheItem { const nanoid = customAlphabet('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ', 8) const iconDataCache = new Map() -const URL_CONTENT_RE = /(url\([^]+?\))/ +const URL_CONTENT_RE = /(url\([\s\S]+?\))/ const CSS_PATH = 'internal/md-power/icons.css' function resolveOption(opt?: boolean | IconsOptions): Required { diff --git a/plugins/plugin-md-power/src/node/features/jsfiddle.ts b/plugins/plugin-md-power/src/node/features/jsfiddle.ts index 913d75dc..c960a2d6 100644 --- a/plugins/plugin-md-power/src/node/features/jsfiddle.ts +++ b/plugins/plugin-md-power/src/node/features/jsfiddle.ts @@ -11,7 +11,7 @@ import { createRuleBlock } from '../utils/createRuleBlock.js' export const jsfiddlePlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'jsfiddle', - syntaxPattern: /^@\[jsfiddle(?:\s+([^]*?))?\]\(([^)]*?)\)/, + syntaxPattern: /^@\[jsfiddle([^\]]*)\]\(([^)]*)\)/, meta([, info = '', source]) { const { attrs } = resolveAttrs(info) const [user, id] = source.split('/') diff --git a/plugins/plugin-md-power/src/node/features/langRepl.ts b/plugins/plugin-md-power/src/node/features/langRepl.ts index 277d13af..a5857d61 100644 --- a/plugins/plugin-md-power/src/node/features/langRepl.ts +++ b/plugins/plugin-md-power/src/node/features/langRepl.ts @@ -5,7 +5,7 @@ import type { App } from 'vuepress/core' import { fs, getDirname, path } from 'vuepress/utils' import type { ReplEditorData, ReplOptions } from '../../shared/repl.js' -const RE_INFO = /^(#editable)?\s*?(.*)$/ +const RE_INFO = /^(#editable)?(.*)$/ function createReplContainer(md: markdownIt, lang: string) { const type = `${lang}-repl` diff --git a/plugins/plugin-md-power/src/node/features/pdf.ts b/plugins/plugin-md-power/src/node/features/pdf.ts index e351f8e1..6c16f40c 100644 --- a/plugins/plugin-md-power/src/node/features/pdf.ts +++ b/plugins/plugin-md-power/src/node/features/pdf.ts @@ -13,7 +13,8 @@ import { createRuleBlock } from '../utils/createRuleBlock.js' export const pdfPlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'pdf', - syntaxPattern: /^@\[pdf(?:\s+(\d+))?(?:\s+([^]*?))?\]\(([^)]*?)\)/, + // eslint-disable-next-line regexp/no-super-linear-backtracking + syntaxPattern: /^@\[pdf(?:\s+(\d+))?([^\]]*)\]\(([^)]*)\)/, meta([, page, info = '', src = '']) { const { attrs } = resolveAttrs(info) return { diff --git a/plugins/plugin-md-power/src/node/features/replit.ts b/plugins/plugin-md-power/src/node/features/replit.ts index 2666c42a..cb4f6c93 100644 --- a/plugins/plugin-md-power/src/node/features/replit.ts +++ b/plugins/plugin-md-power/src/node/features/replit.ts @@ -12,7 +12,7 @@ import { createRuleBlock } from '../utils/createRuleBlock.js' export const replitPlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'replit', - syntaxPattern: /^@\[replit(?:\s+([^]*?))?\]\(([^)]*?)\)/, + syntaxPattern: /^@\[replit([^\]]*)\]\(([^)]*)\)/, meta: ([, info = '', source = '']) => { const { attrs } = resolveAttrs(info) return { diff --git a/plugins/plugin-md-power/src/node/features/video/bilibili.ts b/plugins/plugin-md-power/src/node/features/video/bilibili.ts index b4d4fd52..3b8a8aab 100644 --- a/plugins/plugin-md-power/src/node/features/video/bilibili.ts +++ b/plugins/plugin-md-power/src/node/features/video/bilibili.ts @@ -18,7 +18,8 @@ export const bilibiliPlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'bilibili', name: 'video_bilibili', - syntaxPattern: /^@\[bilibili(?:\s+p(\d+))?(?:\s+([^]*?))?\]\(([^)]*)\)/, + // eslint-disable-next-line regexp/no-super-linear-backtracking + syntaxPattern: /^@\[bilibili(?:\s+p(\d+))?([^\]]*)\]\(([^)]*)\)/, meta([, page, info = '', source = '']) { const { attrs } = resolveAttrs(info) const ids = source.trim().split(/\s+/) diff --git a/plugins/plugin-md-power/src/node/features/video/youtube.ts b/plugins/plugin-md-power/src/node/features/video/youtube.ts index 98fdea7a..89f81175 100644 --- a/plugins/plugin-md-power/src/node/features/video/youtube.ts +++ b/plugins/plugin-md-power/src/node/features/video/youtube.ts @@ -15,7 +15,7 @@ export const youtubePlugin: PluginWithOptions = (md) => { createRuleBlock(md, { type: 'youtube', name: 'video_youtube', - syntaxPattern: /^@\[youtube(?:\s+([^]*?))?\]\(([^)]*)\)/, + syntaxPattern: /^@\[youtube([^\]]*)\]\(([^)]*)\)/, meta([, info = '', id = '']) { const { attrs } = resolveAttrs(info) diff --git a/plugins/plugin-md-power/src/node/utils/resolveAttrs.ts b/plugins/plugin-md-power/src/node/utils/resolveAttrs.ts index 4465d4fb..3f321f88 100644 --- a/plugins/plugin-md-power/src/node/utils/resolveAttrs.ts +++ b/plugins/plugin-md-power/src/node/utils/resolveAttrs.ts @@ -1,4 +1,4 @@ -const RE_ATTR_VALUE = /(?:^|\s+)(?[\w\d-]+)(?:=\s*(?['"])(?.+?)\k)?(?:\s+|$)/ +const RE_ATTR_VALUE = /(?:^|\s+)(?[\w-]+)(?:=\s*(?['"])(?.+?)\k)?(?:\s+|$)/ export function resolveAttrs(info: string): { attrs: Record diff --git a/plugins/plugin-search/src/node/prepareSearchIndex.ts b/plugins/plugin-search/src/node/prepareSearchIndex.ts index 910bd13b..61f7b9a1 100644 --- a/plugins/plugin-search/src/node/prepareSearchIndex.ts +++ b/plugins/plugin-search/src/node/prepareSearchIndex.ts @@ -147,7 +147,9 @@ async function indexFile(page: Page, options: SearchIndexOptions['searchOptions' } } +// eslint-disable-next-line regexp/no-super-linear-backtracking const headingRegex = /(.*?<\/a>)<\/h\1>/gi +// eslint-disable-next-line regexp/no-super-linear-backtracking const headingContentRegex = /(.*?)<\/a>/i /** diff --git a/plugins/plugin-shikiji/src/client/composables/copy-code.ts b/plugins/plugin-shikiji/src/client/composables/copy-code.ts index 87067cbe..3f04faba 100644 --- a/plugins/plugin-shikiji/src/client/composables/copy-code.ts +++ b/plugins/plugin-shikiji/src/client/composables/copy-code.ts @@ -1,6 +1,6 @@ import { useClipboard, useEventListener } from '@vueuse/core' -const SHELL_RE = /language-(shellscript|shell|bash|sh|zsh)/ +const SHELL_RE = /language-(?:shellscript|shell|bash|sh|zsh)/ const IGNORE_NODES = ['.vp-copy-ignore', '.diff.remove'] interface CopyCodeOptions { diff --git a/plugins/plugin-shikiji/src/node/highlight.ts b/plugins/plugin-shikiji/src/node/highlight.ts index 2e7176d0..31caddf6 100644 --- a/plugins/plugin-shikiji/src/node/highlight.ts +++ b/plugins/plugin-shikiji/src/node/highlight.ts @@ -27,7 +27,7 @@ const cache = new LRUCache(64) const vueRE = /-vue$/ const mustacheRE = /\{\{.*?\}\}/g -const decorationsRE = /^\/\/ @decorations:(.*?)\n/ +const decorationsRE = /^\/\/ @decorations:(.*)\n/ export async function highlight( theme: ThemeOptions, @@ -136,7 +136,7 @@ export async function highlight( }) if (enabledTwoslash && options.twoslash) - s = s.replace(/{/g, '{') + s = s.replace(/\{/g, '{') return `${s}\n` } diff --git a/plugins/plugin-shikiji/src/node/markdown/highlightLinesPlugin.ts b/plugins/plugin-shikiji/src/node/markdown/highlightLinesPlugin.ts index 3c30f3c0..71a72d59 100644 --- a/plugins/plugin-shikiji/src/node/markdown/highlightLinesPlugin.ts +++ b/plugins/plugin-shikiji/src/node/markdown/highlightLinesPlugin.ts @@ -4,7 +4,7 @@ import type { Markdown } from 'vuepress/markdown' -const HIGHLIGHT_LINES_REGEXP = /{([\d,-]+)}/ +const HIGHLIGHT_LINES_REGEXP = /\{([\d,-]+)\}/ export function highlightLinesPlugin(md: Markdown): void { const rawFence = md.renderer.rules.fence! diff --git a/plugins/plugin-shikiji/src/node/markdown/lineNumberPlugin.ts b/plugins/plugin-shikiji/src/node/markdown/lineNumberPlugin.ts index 59aa7960..451e57dc 100644 --- a/plugins/plugin-shikiji/src/node/markdown/lineNumberPlugin.ts +++ b/plugins/plugin-shikiji/src/node/markdown/lineNumberPlugin.ts @@ -56,7 +56,7 @@ export function lineNumberPlugin(md: Markdown, { lineNumbers = true }: LineNumbe const finalCode = rawCode .replace(/<\/div>$/, `${lineNumbersWrapperCode}`) - .replace(/"(language-[^"]*?)"/, '"$1 line-numbers-mode"') + .replace(/"(language-[^"]*)"/, '"$1 line-numbers-mode"') return finalCode } diff --git a/plugins/plugin-shikiji/src/node/markdown/preWrapperPlugin.ts b/plugins/plugin-shikiji/src/node/markdown/preWrapperPlugin.ts index ecc8457c..c6f6f455 100644 --- a/plugins/plugin-shikiji/src/node/markdown/preWrapperPlugin.ts +++ b/plugins/plugin-shikiji/src/node/markdown/preWrapperPlugin.ts @@ -22,7 +22,7 @@ export function preWrapperPlugin(md: Markdown, { preWrapper = true }: PreWrapper if (!preWrapper) { // remove `` attributes - result = result.replace(//, '') + result = result.replace(//, '') result = `
(el: T): T {
 
 function renderMarkdown(this: ShikiTransformerContextCommon, md: string): ElementContent[] {
   const mdast = fromMarkdown(
-    md.replace(/{@link ([^}]*)}/g, '$1'), // replace jsdoc links
+    md.replace(/\{@link ([^}]*)\}/g, '$1'), // replace jsdoc links
     { mdastExtensions: [gfmFromMarkdown()] },
   )
 
diff --git a/plugins/plugin-shikiji/src/node/twoslash/rendererTransformer.ts b/plugins/plugin-shikiji/src/node/twoslash/rendererTransformer.ts
index 3040ff3a..34e30347 100644
--- a/plugins/plugin-shikiji/src/node/twoslash/rendererTransformer.ts
+++ b/plugins/plugin-shikiji/src/node/twoslash/rendererTransformer.ts
@@ -60,7 +60,7 @@ export function transformerTwoslash(options: VitePressPluginTwoslashOptions = {}
     },
     postprocess(html) {
       if (this.meta.twoslash)
-        return html.replace(/{/g, '{')
+        return html.replace(/\{/g, '{')
 
       return html
     },
diff --git a/plugins/plugin-shikiji/src/node/utils/attrsToLines.ts b/plugins/plugin-shikiji/src/node/utils/attrsToLines.ts
index af17e68a..131f4c11 100644
--- a/plugins/plugin-shikiji/src/node/utils/attrsToLines.ts
+++ b/plugins/plugin-shikiji/src/node/utils/attrsToLines.ts
@@ -9,6 +9,7 @@ import type { TransformerCompactLineOption } from '@shikijs/transformers'
  *    [{ line: number, classes: string[] }]
  */
 export function attrsToLines(attrs: string): TransformerCompactLineOption[] {
+  // eslint-disable-next-line regexp/optimal-quantifier-concatenation, regexp/no-super-linear-backtracking
   attrs = attrs.replace(/^(?:\[.*?\])?.*?([\d,-]+).*/, '$1').trim()
 
   const result: number[] = []
diff --git a/plugins/plugin-shikiji/src/node/utils/resolveAttrs.ts b/plugins/plugin-shikiji/src/node/utils/resolveAttrs.ts
index ccb67ce8..a2acb2e7 100644
--- a/plugins/plugin-shikiji/src/node/utils/resolveAttrs.ts
+++ b/plugins/plugin-shikiji/src/node/utils/resolveAttrs.ts
@@ -1,5 +1,5 @@
-const RE_ATTR_VALUE = /(?:^|\s+)(?[\w\d-]+)(?:=\s*(?['"])(?.+?)\k)?(?:\s+|$)/
-const RE_CODE_BLOCKS = /^[\w\d-]*(\s*:[\w\d-]*)?(\s*\{[\d\w-,\s]+\})?\s*/
+const RE_ATTR_VALUE = /(?:^|\s+)(?[\w-]+)(?:=\s*(?['"])(?.+?)\k)?(?:\s+|$)/
+const RE_CODE_BLOCKS = /^[\w\-]*(\s*:[\w\-]*)?(\s*\{[\w\-,\s]+\})?\s*/
 
 export function resolveAttrs(info: string): {
   attrs: Record
diff --git a/theme/src/client/styles/md-enhance.css b/theme/src/client/styles/md-enhance.css
index ea22394d..444deb1c 100644
--- a/theme/src/client/styles/md-enhance.css
+++ b/theme/src/client/styles/md-enhance.css
@@ -26,11 +26,6 @@
   margin-bottom: 0 !important;
 }
 
-.vp-doc .hint-container code {
-  font-size: var(--vp-custom-block-code-font-size);
-  color: inherit;
-}
-
 .vp-doc .hint-container th,
 .vp-doc .hint-container blockquote > p {
   font-size: var(--vp-custom-block-font-size);
@@ -46,6 +41,7 @@
 }
 
 .vp-doc .hint-container div[class*="language-"] code {
+  font-size: var(--vp-custom-block-code-font-size);
   font-weight: 400;
   background-color: transparent;
 }
diff --git a/theme/src/node/setupPages.ts b/theme/src/node/setupPages.ts
index 23d1b713..3beb8c93 100644
--- a/theme/src/node/setupPages.ts
+++ b/theme/src/node/setupPages.ts
@@ -115,7 +115,8 @@ export function extendsPageData(
 
 let uuid = 10000
 const cache: Record = {}
-const RE_CATEGORY = /^(\d+)?(?:\.?)([^]+)$/
+// eslint-disable-next-line regexp/no-super-linear-backtracking, regexp/no-misleading-capturing-group
+const RE_CATEGORY = /^(\d+)?\.?([\s\S]+)$/
 let LOCALE_RE: RegExp
 
 export function autoCategory(