diff --git a/crowdin.yml b/crowdin.yml index 89813ca1..9d6bbe3a 100644 --- a/crowdin.yml +++ b/crowdin.yml @@ -32,5 +32,9 @@ { "source": "/docs/guide/*.md", "translation": "/docs/l10n/%osx_code%/guide/%original_file_name%" + }, + { + "source": "/docs/guide/websocket/*.md", + "translation": "/docs/l10n/%osx_code%/guide/websocket/%original_file_name%" } ] diff --git a/docs/.vuepress/config.ts b/docs/.vuepress/config.ts index d9e3a930..18b7fa1b 100644 --- a/docs/.vuepress/config.ts +++ b/docs/.vuepress/config.ts @@ -9,11 +9,70 @@ import { shikiPlugin } from '@vuepress/plugin-shiki' import { defaultTheme } from '@vuepress/theme-default' import { defineUserConfig } from 'vuepress' +import type { Plugin } from 'vite' + import { headConfig } from './configs/head.js' import { mainConfig, defaultThemeConfig } from './configs/locales_config.js' const isProd = process.env.NODE_ENV === 'production' +function vueTemplateTolerantPlugin(): Plugin { + let compilerSfc: typeof import('@vue/compiler-sfc') | undefined + return { + name: 'vue-template-tolerant', + enforce: 'pre', + async transform(code, id) { + if (!id.endsWith('.html.vue') || !id.includes('/l10n/')) return + compilerSfc ??= await import('@vue/compiler-sfc') + const { errors } = compilerSfc.parse(code, { filename: id }) + if (errors.length === 0) return + + const lines = code.split('\n') + const mdPath = id + .replace(/\.vuepress\/\.temp\/pages\//, '') + .replace(/\.html\.vue$/, '.md') + + const yellow = '\x1b[33m' + const red = '\x1b[31m' + const dim = '\x1b[2m' + const cyan = '\x1b[36m' + const reset = '\x1b[0m' + + let output = `${yellow}[vue-template-tolerant]${reset} ${errors.length} error(s) in translation page (replaced with placeholder)\n` + output += ` ${dim}source:${reset} ${cyan}${mdPath}${reset}\n` + + for (const err of errors as any[]) { + const msg = err.message ?? String(err) + const loc = err.loc as { start: { line: number; column: number }; end: { line: number; column: number }; source?: string } | undefined + if (loc) { + output += `\n ${red}error${reset} ${msg}\n` + output += ` ${dim}at ${id}:${loc.start.line}:${loc.start.column}${reset}\n` + const startLine = Math.max(0, loc.start.line - 3) + const endLine = Math.min(lines.length, loc.start.line + 2) + for (let i = startLine; i < endLine; i++) { + const lineNum = String(i + 1).padStart(5) + const marker = i + 1 === loc.start.line ? `${red}>${reset}` : ' ' + const lineContent = lines[i].length > 200 ? lines[i].slice(0, 200) + '...' : lines[i] + output += ` ${marker} ${dim}${lineNum}${reset} | ${lineContent}\n` + if (i + 1 === loc.start.line) { + const col = loc.start.column + output += ` ${' '.repeat(5)} | ${' '.repeat(col)}${red}^${reset}\n` + } + } + } else { + output += `\n ${red}error${reset} ${msg}\n` + } + } + + console.warn(output) + return { + code: '', + map: null, + } + }, + } +} + export default defineUserConfig({ // set site base to default value base: '/', @@ -25,7 +84,14 @@ export default defineUserConfig({ locales: mainConfig, // specify bundler via environment variable - bundler: process.env.DOCS_BUNDLER === 'webpack' ? webpackBundler() : viteBundler(), + bundler: + process.env.DOCS_BUNDLER === 'webpack' + ? webpackBundler() + : viteBundler({ + viteOptions: { + plugins: [vueTemplateTolerantPlugin()], + }, + }), // configure default theme theme: defaultTheme({ diff --git a/docs/guide/usage.md b/docs/guide/usage.md index 270bca36..d6dcfaeb 100644 --- a/docs/guide/usage.md +++ b/docs/guide/usage.md @@ -570,7 +570,7 @@ In scripts and remote control, no slash is needed to perform the command, eg. `q The condition is always returned as a boolean, so only comparison can be done, if needed cast the expression result to bool. - Also the instance of MCC is available with `MCC.`. + Also the instance of MCC is available with `MCC`.

Note

@@ -591,14 +591,6 @@ In scripts and remote control, no slash is needed to perform the command, eg. `q /execif 'test == "Something"' "send Success!" ``` -

Note

- - **You can use single quote (`'`) to wrap your expression if the expression contains double quote (`"`)** - - **Adding back-slash (`\`) before the double quote will also work (`/execif "test == \"Something\"" "send Success!"`)** - -
- ``` /set test2=1 /execif 'test2 == "1"' "send Success 2!" @@ -622,6 +614,12 @@ In scripts and remote control, no slash is needed to perform the command, eg. `q /execif "1 == 1" "execmulti send 1 -> send 2 -> send 3" ``` +- **Note** + + **You can use single quote (`'`) to wrap your expression if the expression contains double quote (`"`)** + + **Adding back-slash (`\`) before the double quote will also work (`/execif "test == \"Something\"" "send Success!"`)** +