@qnroa/qtype 0.0.2 → 0.0.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/CHANGELOG.md +44 -3
- package/CHANGELOG.zh.md +36 -2
- package/README.md +88 -56
- package/README.zh.md +82 -62
- package/dist/cli/bootstrap.js +4 -115
- package/dist/cli/commands/check/index.js +11 -10
- package/dist/cli/commands/config/action.js +5 -9
- package/dist/cli/commands/content/lint/action.js +38 -44
- package/dist/cli/commands/content/search/action.js +44 -34
- package/dist/cli/commands/content/search/i18n.js +6 -0
- package/dist/cli/commands/content/search/index.js +19 -1
- package/dist/cli/commands/content/validate/action.js +28 -27
- package/dist/cli/commands/index.js +1 -3
- package/dist/cli/commands/pack/index.js +2 -1
- package/dist/cli/commands/publish/build/action.js +88 -11
- package/dist/cli/commands/repo/new/action.js +23 -4
- package/dist/cli/commands/repo/new/i18n.js +2 -2
- package/dist/cli/commands/repo/sync/action.js +24 -4
- package/dist/cli/commands/repo/templates.js +2 -1
- package/dist/cli/utils/material.js +49 -0
- package/dist/core/encrypt.js +24 -1
- package/dist/core/index.js +1 -0
- package/dist/core/parser/frontmatter.js +39 -34
- package/dist/core/parser/parseMaterial.js +174 -24
- package/dist/core/romanization/index.js +152 -0
- package/dist/core/schemas/both.js +52 -0
- package/dist/core/schemas/index.js +3 -0
- package/dist/core/schemas/repo.js +55 -0
- package/dist/core/schemas/user.js +19 -0
- package/dist/core/typing/engine/TypingInput.js +243 -0
- package/dist/core/typing/engine/chars.js +30 -0
- package/dist/core/typing/engine/feedback.js +15 -0
- package/dist/core/typing/engine/index.js +5 -0
- package/dist/core/typing/engine/settings.js +8 -0
- package/dist/core/typing/engine/stats.js +45 -0
- package/dist/core/typing/index.js +9 -1
- package/dist/view/assets/KaTeX_AMS-Regular-BQhdFMY1.woff2 +0 -0
- package/dist/view/assets/KaTeX_AMS-Regular-DMm9YOAa.woff +0 -0
- package/dist/view/assets/KaTeX_AMS-Regular-DRggAlZN.ttf +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Bold-ATXxdsX0.ttf +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Bold-BEiXGLvX.woff +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Bold-Dq_IR9rO.woff2 +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Regular-CTRA-rTL.woff +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Regular-Di6jR-x-.woff2 +0 -0
- package/dist/view/assets/KaTeX_Caligraphic-Regular-wX97UBjC.ttf +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Bold-BdnERNNW.ttf +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Bold-BsDP51OF.woff +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Bold-CL6g_b3V.woff2 +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Regular-CB_wures.ttf +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Regular-CTYiF6lA.woff2 +0 -0
- package/dist/view/assets/KaTeX_Fraktur-Regular-Dxdc4cR9.woff +0 -0
- package/dist/view/assets/KaTeX_Main-Bold-Cx986IdX.woff2 +0 -0
- package/dist/view/assets/KaTeX_Main-Bold-Jm3AIy58.woff +0 -0
- package/dist/view/assets/KaTeX_Main-Bold-waoOVXN0.ttf +0 -0
- package/dist/view/assets/KaTeX_Main-BoldItalic-DxDJ3AOS.woff2 +0 -0
- package/dist/view/assets/KaTeX_Main-BoldItalic-DzxPMmG6.ttf +0 -0
- package/dist/view/assets/KaTeX_Main-BoldItalic-SpSLRI95.woff +0 -0
- package/dist/view/assets/KaTeX_Main-Italic-3WenGoN9.ttf +0 -0
- package/dist/view/assets/KaTeX_Main-Italic-BMLOBm91.woff +0 -0
- package/dist/view/assets/KaTeX_Main-Italic-NWA7e6Wa.woff2 +0 -0
- package/dist/view/assets/KaTeX_Main-Regular-B22Nviop.woff2 +0 -0
- package/dist/view/assets/KaTeX_Main-Regular-Dr94JaBh.woff +0 -0
- package/dist/view/assets/KaTeX_Main-Regular-ypZvNtVU.ttf +0 -0
- package/dist/view/assets/KaTeX_Math-BoldItalic-B3XSjfu4.ttf +0 -0
- package/dist/view/assets/KaTeX_Math-BoldItalic-CZnvNsCZ.woff2 +0 -0
- package/dist/view/assets/KaTeX_Math-BoldItalic-iY-2wyZ7.woff +0 -0
- package/dist/view/assets/KaTeX_Math-Italic-DA0__PXp.woff +0 -0
- package/dist/view/assets/KaTeX_Math-Italic-flOr_0UB.ttf +0 -0
- package/dist/view/assets/KaTeX_Math-Italic-t53AETM-.woff2 +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Bold-CFMepnvq.ttf +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Bold-D1sUS0GD.woff2 +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Bold-DbIhKOiC.woff +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Italic-C3H0VqGB.woff2 +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Italic-DN2j7dab.woff +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Italic-YYjJ1zSn.ttf +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Regular-BNo7hRIc.ttf +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Regular-CS6fqUqJ.woff +0 -0
- package/dist/view/assets/KaTeX_SansSerif-Regular-DDBCnlJ7.woff2 +0 -0
- package/dist/view/assets/KaTeX_Script-Regular-C5JkGWo-.ttf +0 -0
- package/dist/view/assets/KaTeX_Script-Regular-D3wIWfF6.woff2 +0 -0
- package/dist/view/assets/KaTeX_Script-Regular-D5yQViql.woff +0 -0
- package/dist/view/assets/KaTeX_Size1-Regular-C195tn64.woff +0 -0
- package/dist/view/assets/KaTeX_Size1-Regular-Dbsnue_I.ttf +0 -0
- package/dist/view/assets/KaTeX_Size1-Regular-mCD8mA8B.woff2 +0 -0
- package/dist/view/assets/KaTeX_Size2-Regular-B7gKUWhC.ttf +0 -0
- package/dist/view/assets/KaTeX_Size2-Regular-Dy4dx90m.woff2 +0 -0
- package/dist/view/assets/KaTeX_Size2-Regular-oD1tc_U0.woff +0 -0
- package/dist/view/assets/KaTeX_Size3-Regular-CTq5MqoE.woff +0 -0
- package/dist/view/assets/KaTeX_Size3-Regular-DgpXs0kz.ttf +0 -0
- package/dist/view/assets/KaTeX_Size4-Regular-BF-4gkZK.woff +0 -0
- package/dist/view/assets/KaTeX_Size4-Regular-DWFBv043.ttf +0 -0
- package/dist/view/assets/KaTeX_Size4-Regular-Dl5lxZxV.woff2 +0 -0
- package/dist/view/assets/KaTeX_Typewriter-Regular-C0xS9mPB.woff +0 -0
- package/dist/view/assets/KaTeX_Typewriter-Regular-CO6r4hn1.woff2 +0 -0
- package/dist/view/assets/KaTeX_Typewriter-Regular-D3Ib7_Hf.ttf +0 -0
- package/dist/view/assets/abap-BdImnpbu.js +1 -0
- package/dist/view/assets/actionscript-3-B3316cI-.js +1 -0
- package/dist/view/assets/ada-bCR0ucgS.js +1 -0
- package/dist/view/assets/ahk-CsyLZFj1.js +1 -0
- package/dist/view/assets/ahk2-8Zs4aa1G.js +1 -0
- package/dist/view/assets/andromeeda-C4gqWexZ.js +1 -0
- package/dist/view/assets/angular-html-DA-rfuFy.js +1 -0
- package/dist/view/assets/angular-ts-BrjP3tb8.js +1 -0
- package/dist/view/assets/apache-Pmp26Uib.js +1 -0
- package/dist/view/assets/apex-DhZFqWV2.js +1 -0
- package/dist/view/assets/apl-CORt7UWP.js +1 -0
- package/dist/view/assets/applescript-Co6uUVPk.js +1 -0
- package/dist/view/assets/ara-BRHolxvo.js +1 -0
- package/dist/view/assets/asciidoc-CSVQ5wI8.js +1 -0
- package/dist/view/assets/asm-D_Q5rh1f.js +1 -0
- package/dist/view/assets/astro-HNnZUWAn.js +1 -0
- package/dist/view/assets/aurora-x-D-2ljcwZ.js +1 -0
- package/dist/view/assets/awk-DMzUqQB5.js +1 -0
- package/dist/view/assets/ayu-dark-DYE7WIF3.js +1 -0
- package/dist/view/assets/ayu-light-BA47KaF1.js +1 -0
- package/dist/view/assets/ayu-mirage-32ctXXKs.js +1 -0
- package/dist/view/assets/ballerina-BFfxhgS-.js +1 -0
- package/dist/view/assets/bat-CickPsom.js +1 -0
- package/dist/view/assets/beancount-k_qm7-4y.js +1 -0
- package/dist/view/assets/berry-uYugtg8r.js +1 -0
- package/dist/view/assets/bibtex-CHM0blh-.js +1 -0
- package/dist/view/assets/bicep-Bmn6On1c.js +1 -0
- package/dist/view/assets/bird2-Bx8U0n9b.js +1 -0
- package/dist/view/assets/blade-2xfisSek.js +1 -0
- package/dist/view/assets/bsl-DlhNcFeZ.js +1 -0
- package/dist/view/assets/c-BIGW1oBm.js +1 -0
- package/dist/view/assets/c3-Dp5svz6Z.js +1 -0
- package/dist/view/assets/cadence-Bv_4Rxtq.js +1 -0
- package/dist/view/assets/cairo-KRGpt6FW.js +1 -0
- package/dist/view/assets/catppuccin-frappe-CZL1YF0i.js +1 -0
- package/dist/view/assets/catppuccin-latte-DH-8KZSZ.js +1 -0
- package/dist/view/assets/catppuccin-macchiato-B7yYVSCf.js +1 -0
- package/dist/view/assets/catppuccin-mocha-Ct7hS0mc.js +1 -0
- package/dist/view/assets/chapel-DTp_pixX.js +1 -0
- package/dist/view/assets/clarity-Dn5IMItf.js +1 -0
- package/dist/view/assets/clojure-P80f7IUj.js +1 -0
- package/dist/view/assets/cmake-D1j8_8rp.js +1 -0
- package/dist/view/assets/cobol-nBiQ_Alo.js +1 -0
- package/dist/view/assets/codeowners-Bp6g37R7.js +1 -0
- package/dist/view/assets/codeql-DsOJ9woJ.js +1 -0
- package/dist/view/assets/coffee-Ch7k5sss.js +1 -0
- package/dist/view/assets/common-lisp-Cg-RD9OK.js +1 -0
- package/dist/view/assets/coq-C7JzOVbR.js +1 -0
- package/dist/view/assets/cpp-BMRokrvK.js +1 -0
- package/dist/view/assets/crystal-DGywbUpC.js +1 -0
- package/dist/view/assets/csharp-DSvCPggb.js +1 -0
- package/dist/view/assets/css-CLj8gQPS.js +1 -0
- package/dist/view/assets/csv-fuZLfV_i.js +1 -0
- package/dist/view/assets/cue-D82EKSYY.js +1 -0
- package/dist/view/assets/cypher-COkxafJQ.js +1 -0
- package/dist/view/assets/d-85-TOEBH.js +1 -0
- package/dist/view/assets/dark-plus-C3mMm8J8.js +1 -0
- package/dist/view/assets/dart-bE4Kk8sk.js +1 -0
- package/dist/view/assets/dax-CEL-wOlO.js +1 -0
- package/dist/view/assets/desktop-BmXAJ9_W.js +1 -0
- package/dist/view/assets/diff-D97Zzqfu.js +1 -0
- package/dist/view/assets/docker-BcOcwvcX.js +1 -0
- package/dist/view/assets/dotenv-Da5cRb03.js +1 -0
- package/dist/view/assets/dracula-BzJJZx-M.js +1 -0
- package/dist/view/assets/dracula-soft-BXkSAIEj.js +1 -0
- package/dist/view/assets/dream-maker-BtqSS_iP.js +1 -0
- package/dist/view/assets/edge-FbVlp4U3.js +1 -0
- package/dist/view/assets/elixir-CkH2-t6x.js +1 -0
- package/dist/view/assets/elm-DbKCFpqz.js +1 -0
- package/dist/view/assets/emacs-lisp-C_m_b--Z.js +1 -0
- package/dist/view/assets/erb-DXfck5VN.js +1 -0
- package/dist/view/assets/erlang-DsQrWhSR.js +1 -0
- package/dist/view/assets/everforest-dark-BgDCqdQA.js +1 -0
- package/dist/view/assets/everforest-light-C8M2exoo.js +1 -0
- package/dist/view/assets/fennel-BYunw83y.js +1 -0
- package/dist/view/assets/fish-BvzEVeQv.js +1 -0
- package/dist/view/assets/fluent-C4IJs8-o.js +1 -0
- package/dist/view/assets/fortran-fixed-form-CkoXwp7k.js +1 -0
- package/dist/view/assets/fortran-free-form-BxgE0vQu.js +1 -0
- package/dist/view/assets/fsharp-CXgrBDvD.js +1 -0
- package/dist/view/assets/gdresource-TyuKm33G.js +1 -0
- package/dist/view/assets/gdscript-DqcFQ5yU.js +1 -0
- package/dist/view/assets/gdshader-DkwncUOv.js +1 -0
- package/dist/view/assets/genie-D0YGMca9.js +1 -0
- package/dist/view/assets/gherkin-DyxjwDmM.js +1 -0
- package/dist/view/assets/git-commit-F4YmCXRG.js +1 -0
- package/dist/view/assets/git-rebase-r7XF79zn.js +1 -0
- package/dist/view/assets/github-dark-DHJKELXO.js +1 -0
- package/dist/view/assets/github-dark-default-Cuk6v7N8.js +1 -0
- package/dist/view/assets/github-dark-dimmed-DH5Ifo-i.js +1 -0
- package/dist/view/assets/github-dark-high-contrast-E3gJ1_iC.js +1 -0
- package/dist/view/assets/github-light-DAi9KRSo.js +1 -0
- package/dist/view/assets/github-light-default-D7oLnXFd.js +1 -0
- package/dist/view/assets/github-light-high-contrast-BfjtVDDH.js +1 -0
- package/dist/view/assets/gleam-BspZqrRM.js +1 -0
- package/dist/view/assets/glimmer-js-ByusRIyA.js +1 -0
- package/dist/view/assets/glimmer-ts-BfAWNZQY.js +1 -0
- package/dist/view/assets/glsl-DplSGwfg.js +1 -0
- package/dist/view/assets/gn-n2N0HUVH.js +1 -0
- package/dist/view/assets/gnuplot-DdkO51Og.js +1 -0
- package/dist/view/assets/go-C27-OAKa.js +1 -0
- package/dist/view/assets/graphql-ChdNCCLP.js +1 -0
- package/dist/view/assets/groovy-gcz8RCvz.js +1 -0
- package/dist/view/assets/gruvbox-dark-hard-CFHQjOhq.js +1 -0
- package/dist/view/assets/gruvbox-dark-medium-GsRaNv29.js +1 -0
- package/dist/view/assets/gruvbox-dark-soft-CVdnzihN.js +1 -0
- package/dist/view/assets/gruvbox-light-hard-CH1njM8p.js +1 -0
- package/dist/view/assets/gruvbox-light-medium-DRw_LuNl.js +1 -0
- package/dist/view/assets/gruvbox-light-soft-hJgmCMqR.js +1 -0
- package/dist/view/assets/hack-BWmVpMyf.js +1 -0
- package/dist/view/assets/haml-D5jkg6IW.js +1 -0
- package/dist/view/assets/handlebars-BpdQsYii.js +1 -0
- package/dist/view/assets/haskell-Df6bDoY_.js +1 -0
- package/dist/view/assets/haxe-CfZj7gIn.js +1 -0
- package/dist/view/assets/hcl-BWvSN4gD.js +1 -0
- package/dist/view/assets/hjson-D5-asLiD.js +1 -0
- package/dist/view/assets/hlsl-D3lLCCz7.js +1 -0
- package/dist/view/assets/horizon-BUw7H-hv.js +1 -0
- package/dist/view/assets/horizon-bright-CUuTKBJd.js +1 -0
- package/dist/view/assets/houston-DnULxvSX.js +1 -0
- package/dist/view/assets/html-derivative-DlHx6ybY.js +1 -0
- package/dist/view/assets/html-pp8916En.js +1 -0
- package/dist/view/assets/http-jrhK8wxY.js +1 -0
- package/dist/view/assets/hurl-irOxFIW8.js +1 -0
- package/dist/view/assets/hxml-2-FPmUDs.js +1 -0
- package/dist/view/assets/hy-DFXneXwc.js +1 -0
- package/dist/view/assets/imba-DGztddWO.js +1 -0
- package/dist/view/assets/index-1XXyxiQO.js +189 -0
- package/dist/view/assets/index-BLryk3W4.css +1 -0
- package/dist/view/assets/index-DIBSxFYl.js +3 -0
- package/dist/view/assets/index-DgHvnMV9.js +153 -0
- package/dist/view/assets/ini-BEwlwnbL.js +1 -0
- package/dist/view/assets/java-CylS5w8V.js +1 -0
- package/dist/view/assets/javascript-wDzz0qaB.js +1 -0
- package/dist/view/assets/jinja-f2NsQr07.js +1 -0
- package/dist/view/assets/jison-wvAkD_A8.js +1 -0
- package/dist/view/assets/json-Cp-IABpG.js +1 -0
- package/dist/view/assets/json5-C9tS-k6U.js +1 -0
- package/dist/view/assets/jsonc-Des-eS-w.js +1 -0
- package/dist/view/assets/jsonl-DcaNXYhu.js +1 -0
- package/dist/view/assets/jsonnet-DFQXde-d.js +1 -0
- package/dist/view/assets/jssm-C2t-YnRu.js +1 -0
- package/dist/view/assets/jsx-g9-lgVsj.js +1 -0
- package/dist/view/assets/julia-5Bft2YPA.js +1 -0
- package/dist/view/assets/just-Cwhn7H3k.js +1 -0
- package/dist/view/assets/kanagawa-dragon-BuwD2xS4.js +1 -0
- package/dist/view/assets/kanagawa-lotus-C3DzagqV.js +1 -0
- package/dist/view/assets/kanagawa-wave-DFGoQZhC.js +1 -0
- package/dist/view/assets/katex-BYZTj3zW.css +1 -0
- package/dist/view/assets/katex-C5jXJg4s.js +257 -0
- package/dist/view/assets/kdl-DV7GczEv.js +1 -0
- package/dist/view/assets/kotlin-BdnUsdx6.js +1 -0
- package/dist/view/assets/kusto-wEQ09or8.js +1 -0
- package/dist/view/assets/laserwave-DUszq2jm.js +1 -0
- package/dist/view/assets/latex-D5pSuvFb.js +1 -0
- package/dist/view/assets/lean-BZvkOJ9d.js +1 -0
- package/dist/view/assets/less-B1dDrJ26.js +1 -0
- package/dist/view/assets/light-plus-B7mTdjB0.js +1 -0
- package/dist/view/assets/liquid-C0sCDyMI.js +1 -0
- package/dist/view/assets/llvm-BZoOZj88.js +1 -0
- package/dist/view/assets/log-2UxHyX5q.js +1 -0
- package/dist/view/assets/logo-BtOb2qkB.js +1 -0
- package/dist/view/assets/lua-BaeVxFsk.js +1 -0
- package/dist/view/assets/luau-BnpPk5vE.js +1 -0
- package/dist/view/assets/make-CHLpvVh8.js +1 -0
- package/dist/view/assets/markdown-Cvjx9yec.js +1 -0
- package/dist/view/assets/marko-DjSrsDqO.js +1 -0
- package/dist/view/assets/material-theme-D5KoaKCx.js +1 -0
- package/dist/view/assets/material-theme-darker-BfHTSMKl.js +1 -0
- package/dist/view/assets/material-theme-lighter-B0m2ddpp.js +1 -0
- package/dist/view/assets/material-theme-ocean-CyktbL80.js +1 -0
- package/dist/view/assets/material-theme-palenight-Csfq5Kiy.js +1 -0
- package/dist/view/assets/matlab-D7o27uSR.js +1 -0
- package/dist/view/assets/mdc-D1_yUvq7.js +1 -0
- package/dist/view/assets/mdx-Cmh6b_Ma.js +1 -0
- package/dist/view/assets/mermaid-CQcHuHx7.js +1 -0
- package/dist/view/assets/min-dark-CafNBF8u.js +1 -0
- package/dist/view/assets/min-light-CTRr51gU.js +1 -0
- package/dist/view/assets/mipsasm-CKIfxQSi.js +1 -0
- package/dist/view/assets/mojo-DJz3ZmWd.js +1 -0
- package/dist/view/assets/monokai-BRVnQi9A.js +1 -0
- package/dist/view/assets/moonbit-CHtswR0a.js +1 -0
- package/dist/view/assets/move-el3G9tDJ.js +1 -0
- package/dist/view/assets/narrat-DRg8JJMk.js +1 -0
- package/dist/view/assets/nextflow-C-mBbutL.js +1 -0
- package/dist/view/assets/nextflow-groovy-vE_lwT2v.js +1 -0
- package/dist/view/assets/nginx-BpAMiNFr.js +1 -0
- package/dist/view/assets/night-owl-C39BiMTA.js +1 -0
- package/dist/view/assets/night-owl-light-CMTm3GFP.js +1 -0
- package/dist/view/assets/nim-BIad80T-.js +1 -0
- package/dist/view/assets/nix-CwoSXNpI.js +1 -0
- package/dist/view/assets/nord-Ddv68eIx.js +1 -0
- package/dist/view/assets/nsis-BlV79W_Q.js +1 -0
- package/dist/view/assets/nushell-D3jzshHO.js +1 -0
- package/dist/view/assets/objective-c-DXmwc3jG.js +1 -0
- package/dist/view/assets/objective-cpp-CLxacb5B.js +1 -0
- package/dist/view/assets/ocaml-C0hk2d4L.js +1 -0
- package/dist/view/assets/odin-BBf5iR-q.js +1 -0
- package/dist/view/assets/one-dark-pro-DVMEJ2y_.js +1 -0
- package/dist/view/assets/one-light-C3Wv6jpd.js +1 -0
- package/dist/view/assets/openscad-C4EeE6gA.js +1 -0
- package/dist/view/assets/org-DM6o9KBp.js +1 -0
- package/dist/view/assets/pascal-D93ZcfNL.js +1 -0
- package/dist/view/assets/perl-B9cMNwum.js +1 -0
- package/dist/view/assets/php-Csjmro_R.js +1 -0
- package/dist/view/assets/pkl-u5AG7uiY.js +1 -0
- package/dist/view/assets/plastic-3e1v2bzS.js +1 -0
- package/dist/view/assets/plsql-ChMvpjG-.js +1 -0
- package/dist/view/assets/po-BTJTHyun.js +1 -0
- package/dist/view/assets/poimandres-CS3Unz2-.js +1 -0
- package/dist/view/assets/polar-C0HS_06l.js +1 -0
- package/dist/view/assets/postcss-CXtECtnM.js +1 -0
- package/dist/view/assets/powerquery-CEu0bR-o.js +1 -0
- package/dist/view/assets/powershell-BmBUJMz7.js +1 -0
- package/dist/view/assets/prisma-Vru482bI.js +1 -0
- package/dist/view/assets/prolog-CbFg5uaA.js +1 -0
- package/dist/view/assets/proto-C7zT0LnQ.js +1 -0
- package/dist/view/assets/pug-DKIMFp6K.js +1 -0
- package/dist/view/assets/puppet-BMWR74SV.js +1 -0
- package/dist/view/assets/purescript-CklMAg4u.js +1 -0
- package/dist/view/assets/python-B6aJPvgy.js +1 -0
- package/dist/view/assets/qml-3beO22l8.js +1 -0
- package/dist/view/assets/qmldir-C8lEn-DE.js +1 -0
- package/dist/view/assets/qss-IeuSbFQv.js +1 -0
- package/dist/view/assets/r-Cf5RLm7j.js +1 -0
- package/dist/view/assets/racket-BqYA7rlc.js +1 -0
- package/dist/view/assets/raku-DXvB9xmW.js +1 -0
- package/dist/view/assets/razor-BjBPvh-w.js +1 -0
- package/dist/view/assets/rbs-CpoqiR4B.js +1 -0
- package/dist/view/assets/red-hvxz__6c.js +1 -0
- package/dist/view/assets/reg-C-SQnVFl.js +1 -0
- package/dist/view/assets/regexp-CDVJQ6XC.js +1 -0
- package/dist/view/assets/rel-C3B-1QV4.js +1 -0
- package/dist/view/assets/riscv-BM1_JUlF.js +1 -0
- package/dist/view/assets/ron-D8l8udqQ.js +1 -0
- package/dist/view/assets/rose-pine-5qJOZa0Y.js +1 -0
- package/dist/view/assets/rose-pine-dawn-zx0QlTCp.js +1 -0
- package/dist/view/assets/rose-pine-moon-C9pEdX9L.js +1 -0
- package/dist/view/assets/rosmsg-BJDFO7_C.js +1 -0
- package/dist/view/assets/rst-bs7f0vWN.js +1 -0
- package/dist/view/assets/ruby-C0TQ7zu5.js +1 -0
- package/dist/view/assets/rust-B1yitclQ.js +1 -0
- package/dist/view/assets/sas-DEy46yEz.js +1 -0
- package/dist/view/assets/sass-Cj5Yp3dK.js +1 -0
- package/dist/view/assets/scala-CqE71os6.js +1 -0
- package/dist/view/assets/scheme-C98Dy4si.js +1 -0
- package/dist/view/assets/scss-D5BDwBP9.js +1 -0
- package/dist/view/assets/sdbl-DVxCFoDh.js +1 -0
- package/dist/view/assets/shaderlab-Dg9Lc6iA.js +1 -0
- package/dist/view/assets/shellscript-Yzrsuije.js +1 -0
- package/dist/view/assets/shellsession-BADoaaVG.js +1 -0
- package/dist/view/assets/slack-dark-BthQWCQV.js +1 -0
- package/dist/view/assets/slack-ochin-DqwNpetd.js +1 -0
- package/dist/view/assets/smalltalk-BOQMe2GC.js +1 -0
- package/dist/view/assets/smithy-cds9vsN8.js +1 -0
- package/dist/view/assets/snazzy-light-Bw305WKR.js +1 -0
- package/dist/view/assets/solarized-dark-CpvCGNkr.js +1 -0
- package/dist/view/assets/solarized-light-Dlz6yCKv.js +1 -0
- package/dist/view/assets/solidity-DijEV5ha.js +1 -0
- package/dist/view/assets/soy-8wufbnw4.js +1 -0
- package/dist/view/assets/sparql-rVzFXLq3.js +1 -0
- package/dist/view/assets/splunk-BtCnVYZw.js +1 -0
- package/dist/view/assets/sql-CRqJ_cUM.js +1 -0
- package/dist/view/assets/ssh-config-_ykCGR6B.js +1 -0
- package/dist/view/assets/stata-DI20mbqo.js +1 -0
- package/dist/view/assets/stylus-BEDo0Tqx.js +1 -0
- package/dist/view/assets/surrealql-Cjom0U5J.js +1 -0
- package/dist/view/assets/svelte-Cy7k_4gC.js +1 -0
- package/dist/view/assets/swift-C2oV4EkX.js +1 -0
- package/dist/view/assets/synthwave-84-CbfX1IO0.js +1 -0
- package/dist/view/assets/system-verilog-0hqHdDBg.js +1 -0
- package/dist/view/assets/systemd-4A_iFExJ.js +1 -0
- package/dist/view/assets/talonscript-CkByrt1z.js +1 -0
- package/dist/view/assets/tasl-QIJgUcNo.js +1 -0
- package/dist/view/assets/tcl-dwOrl1Do.js +1 -0
- package/dist/view/assets/templ-DhtptRzy.js +1 -0
- package/dist/view/assets/terraform-BETggiCN.js +1 -0
- package/dist/view/assets/tex-D96PA37w.js +1 -0
- package/dist/view/assets/tokyo-night-hegEt444.js +1 -0
- package/dist/view/assets/toml-vGWfd6FD.js +1 -0
- package/dist/view/assets/ts-tags-D351s5mN.js +1 -0
- package/dist/view/assets/tsv-B_m7g4N7.js +1 -0
- package/dist/view/assets/tsx-COt5Ahok.js +1 -0
- package/dist/view/assets/turtle-BsS91CYL.js +1 -0
- package/dist/view/assets/twig-27uCiNez.js +1 -0
- package/dist/view/assets/typescript-BPQ3VLAy.js +1 -0
- package/dist/view/assets/typespec-CAFt9gP4.js +1 -0
- package/dist/view/assets/typst-BUadGCkm.js +1 -0
- package/dist/view/assets/v-BGw2Nkan.js +1 -0
- package/dist/view/assets/vala-CsfeWuGM.js +1 -0
- package/dist/view/assets/vb-Cu-pLBUe.js +1 -0
- package/dist/view/assets/verilog-nZwndyjY.js +1 -0
- package/dist/view/assets/vesper-DRje8inN.js +1 -0
- package/dist/view/assets/vhdl-CeAyd5Ju.js +1 -0
- package/dist/view/assets/viml-CJc9bBzg.js +1 -0
- package/dist/view/assets/vitesse-black-Bkuqu6BP.js +1 -0
- package/dist/view/assets/vitesse-dark-D0r3Knsf.js +1 -0
- package/dist/view/assets/vitesse-light-CVO1_9PV.js +1 -0
- package/dist/view/assets/vue-BqiEGhQt.js +1 -0
- package/dist/view/assets/vue-html-AaS7Mt5G.js +1 -0
- package/dist/view/assets/vue-vine-BoDAl6tE.js +1 -0
- package/dist/view/assets/vyper-CDx5xZoG.js +1 -0
- package/dist/view/assets/wasm-CG6Dc4jp.js +1 -0
- package/dist/view/assets/wasm-MzD3tlZU.js +1 -0
- package/dist/view/assets/wenyan-BV7otONQ.js +1 -0
- package/dist/view/assets/wgsl-Dx-B1_4e.js +1 -0
- package/dist/view/assets/wikitext-BhOHFoWU.js +1 -0
- package/dist/view/assets/wit-5i3qLPDT.js +1 -0
- package/dist/view/assets/wolfram-lXgVvXCa.js +1 -0
- package/dist/view/assets/xml-sdJ4AIDG.js +1 -0
- package/dist/view/assets/xsl-CtQFsRM5.js +1 -0
- package/dist/view/assets/yaml-Buea-lGh.js +1 -0
- package/dist/view/assets/zenscript-DVFEvuxE.js +1 -0
- package/dist/view/assets/zig-VOosw3JB.js +1 -0
- package/dist/view/index.html +11 -3
- package/docs/README.md +21 -15
- package/docs/README.zh.md +15 -9
- package/docs/en/authoring.md +85 -80
- package/docs/en/cli-reference.md +110 -72
- package/docs/en/deployment.md +183 -0
- package/docs/en/getting-started.md +112 -0
- package/docs/en/material-types.md +241 -0
- package/docs/en/settings.md +133 -0
- package/docs/en/shortcuts.md +89 -0
- package/docs/en/typing-rules.md +208 -0
- package/docs/zh/authoring.md +74 -69
- package/docs/zh/cli-reference.md +92 -58
- package/docs/zh/deployment.md +179 -0
- package/docs/zh/getting-started.md +104 -0
- package/docs/zh/material-types.md +769 -0
- package/docs/zh/settings.md +120 -0
- package/docs/zh/shortcuts.md +83 -0
- package/docs/zh/typing-rules.md +191 -0
- package/package.json +13 -11
- package/templates/en/QTYPE.md +155 -495
- package/templates/en/README.md +11 -11
- package/templates/en/TODO.md +1 -1
- package/templates/en/material/article.md +20 -0
- package/templates/en/material/assets/article/sunrise.svg +12 -0
- package/templates/en/material/assets/code/tree.svg +19 -0
- package/templates/en/material/assets/qa/login-flow.svg +17 -0
- package/templates/en/material/assets/sentence/pangram.svg +6 -0
- package/templates/en/material/assets/snippet/moon.svg +8 -0
- package/templates/en/material/assets/word/apple.svg +5 -0
- package/templates/en/material/code.md +55 -0
- package/templates/en/material/qa.md +33 -0
- package/templates/en/material/sentence.md +18 -0
- package/templates/en/material/snippet.md +17 -0
- package/templates/en/material/word.md +20 -0
- package/templates/zh/QTYPE.md +191 -473
- package/templates/zh/README.md +6 -6
- package/templates/zh/index.md +1 -1
- package/templates/zh/material/article.md +18 -0
- package/templates/zh/material/assets/article/sunrise.svg +12 -0
- package/templates/zh/material/assets/code/tree.svg +19 -0
- package/templates/zh/material/assets/qa/login-flow.svg +17 -0
- package/templates/zh/material/assets/sentence/pangram.svg +6 -0
- package/templates/zh/material/assets/snippet/moon.svg +8 -0
- package/templates/zh/material/assets/word/apple.svg +5 -0
- package/templates/zh/material/code.md +55 -0
- package/templates/zh/material/qa.md +33 -0
- package/templates/zh/material/sentence.md +19 -0
- package/templates/zh/material/snippet.md +20 -0
- package/templates/zh/material/word.md +20 -0
- package/dist/cli/commands/check/action.js +0 -56
- package/dist/cli/commands/check/i18n.js +0 -26
- package/dist/cli/commands/plugin/i18n.js +0 -28
- package/dist/cli/commands/plugin/index.js +0 -41
- package/dist/core/typing/engine.js +0 -112
- package/dist/view/assets/index-DBABH3dG.js +0 -111
- package/dist/view/assets/index-RTLZ-zOC.css +0 -1
- package/templates/en/material/example.md +0 -47
- package/templates/zh/material/example.md +0 -47
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
# Settings 参考
|
|
2
|
+
|
|
3
|
+
English: [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/settings.md)
|
|
4
|
+
|
|
5
|
+
qtype 有**两套设置**,分开管:
|
|
6
|
+
|
|
7
|
+
1. **仓库/命令级配置** —— 走 `qtype config`,存在 `~/.config/qtype/config.json`(user 层)+ `<repo>/.qtype/config.json`(repo 层)。见 [cli-reference.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/cli-reference.md#qtype-config-get--set--unset--list)
|
|
8
|
+
2. **浏览器/阅读器界面设置** —— 用户在 view 里点齿轮打开的设置对话框,存在浏览器 kv(`qtype.config.user` blob)。这是本文档的内容
|
|
9
|
+
|
|
10
|
+
阅读器界面设置**只影响本浏览器**,不进 `qtype config`,不进 git,也不影响 CLI。想同步到别的机器可以走浏览器同步 / 手动导出。
|
|
11
|
+
|
|
12
|
+
---
|
|
13
|
+
|
|
14
|
+
## Appearance(外观)
|
|
15
|
+
|
|
16
|
+
| 键 | 类型 | 默认 | 说明 |
|
|
17
|
+
|---|---|---|---|
|
|
18
|
+
| `qtype.themeMode` | `auto` / `mocha` / `latte` | `auto` | 主题(dark / light / 跟系统) |
|
|
19
|
+
| `qtype.uiLang` | `auto` / `zh-CN` / `en-US` | `auto` | 界面语言 |
|
|
20
|
+
| `qtype.typingFontSize` | `s` / `m` / `l` | `m` | 打字区字体大小 |
|
|
21
|
+
| `qtype.letterSpacing` | `tight` / `normal` / `wide` | `normal` | 字符间距 |
|
|
22
|
+
| `qtype.spaceGlyph` | `dot` / `dash` / `blank` | `dash` | 打字目标里的空格显示成什么 |
|
|
23
|
+
| `qtype.breakWord` | boolean | true | 单词过长时是否内部断行 |
|
|
24
|
+
|
|
25
|
+
---
|
|
26
|
+
|
|
27
|
+
## Typing rules(打字规则)
|
|
28
|
+
|
|
29
|
+
详细语义见 [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md)。
|
|
30
|
+
|
|
31
|
+
| 键 | 类型 | 默认 | 说明 |
|
|
32
|
+
|---|---|---|---|
|
|
33
|
+
| `qtype.hint` | `off` / `ghost` | `off` | 是否显示 ghost 目标提示 |
|
|
34
|
+
| `qtype.ignoreCase` | boolean | false | 大小写不敏感对比 |
|
|
35
|
+
| `qtype.ignorePunctuation` | boolean | false | 忽略标点差异(智能引号 / 全半角) |
|
|
36
|
+
| `qtype.allowBackspace` | boolean | true | 允许 Backspace 撤销 |
|
|
37
|
+
| `qtype.tabBehavior` | `reset` / `input` | `reset` | Tab 键:重置本卡 / 当空格输入 |
|
|
38
|
+
| `qtype.tabWidth` | `2` / `4` | `4` | tabBehavior=input 时一个 Tab 展开几个空格 |
|
|
39
|
+
| `qtype.completionMode` | `through` / `perfect` / `lenient` | `through` | 完成一张卡的门槛(见 typing-rules.md) |
|
|
40
|
+
| `qtype.retryOnFail` | `off` / `auto` / `immediate` | `off` | 失败自动重试策略 |
|
|
41
|
+
| `qtype.maxRetries` | 0-20 | 5 | 自动重试上限,0 = 无限 |
|
|
42
|
+
| `qtype.maxWrongRate` | 0-100 | 0 | 错误率阈值(%),超过就锁字。0 = 关闭 |
|
|
43
|
+
| `qtype.targetWpm` | 0-500 | 0 | 目标 WPM(带阴影光标做节拍器)。0 = 关闭 |
|
|
44
|
+
|
|
45
|
+
---
|
|
46
|
+
|
|
47
|
+
## Audio(音效)
|
|
48
|
+
|
|
49
|
+
| 键 | 类型 | 默认 | 说明 |
|
|
50
|
+
|---|---|---|---|
|
|
51
|
+
| `qtype.keySoundEnabled` | boolean | true | 按键点击音 |
|
|
52
|
+
| `qtype.keySoundVolume` | 0-100 | 40 | 按键音音量 |
|
|
53
|
+
| `qtype.errorSoundEnabled` | boolean | true | 错误提示音 |
|
|
54
|
+
| `qtype.errorSoundVolume` | 0-100 | 60 | 错误音音量 |
|
|
55
|
+
| `qtype.completeSoundEnabled` | boolean | true | 完成整个 material 时的音效 |
|
|
56
|
+
| `qtype.autoSpeak` | boolean | true | word / sentence 卡切卡时自动朗读 |
|
|
57
|
+
| `qtype.autoSpeakRepeat` | 1-5 | 1 | 自动朗读重复次数 |
|
|
58
|
+
| `qtype.ttsProvider` | `browser` / `youdao` / `google` | `browser` | TTS 提供方 |
|
|
59
|
+
| `qtype.ttsVolume` | 0-100 | 100 | 朗读音量 |
|
|
60
|
+
| `qtype.ttsRate` | 50-200 | 100 | 朗读语速(%) |
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
64
|
+
## Interface(界面)
|
|
65
|
+
|
|
66
|
+
| 键 | 类型 | 默认 | 说明 |
|
|
67
|
+
|---|---|---|---|
|
|
68
|
+
| `qtype.showKeyboard` | boolean | true | 显示屏幕键盘 |
|
|
69
|
+
| `qtype.showHands` | boolean | true | 屏幕键盘上叠加双手指法 |
|
|
70
|
+
| `qtype.keyboardSize` | `s` / `m` / `l` | `m` | 屏幕键盘大小 |
|
|
71
|
+
| `qtype.autoHideCursor` | boolean | true | 3 秒无鼠标移动自动隐藏鼠标 |
|
|
72
|
+
| `qtype.showNeighborPreview` | boolean | true | 左右显示前后卡预览 |
|
|
73
|
+
| `qtype.showPhonetic` | boolean | true | word / sentence 卡默认显示音标 |
|
|
74
|
+
| `qtype.showGloss` | boolean | true | word / sentence 卡默认显示释义 |
|
|
75
|
+
| `qtype.showResultPopup` | boolean | true | 完成后弹窗显示 WPM / 准确率 |
|
|
76
|
+
| `qtype.speedUnit` | `wpm` / `cpm` | `wpm` | 速度单位:词 / 字符每分钟 |
|
|
77
|
+
| `qtype.afkSeconds` | 5-300 | 60 | 多少秒无输入自动暂停(见 [typing-rules](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md#afk-自动暂停)) |
|
|
78
|
+
| `qtype.minAccuracy` | 0-100 | 0 | 准确率低于此值时提示,0 = 关闭 |
|
|
79
|
+
| `qtype.codeSyntaxHighlight` | boolean | false | code 卡启用 Shiki 语法高亮(默认关,~1MB bundle) |
|
|
80
|
+
| `qtype.mathRenderer` | boolean | true | 用 KaTeX 渲染 `$...$` / `$$...$$` 数学公式(懒加载 ~280KB) |
|
|
81
|
+
|
|
82
|
+
---
|
|
83
|
+
|
|
84
|
+
## Side stores(独立存储的数据)
|
|
85
|
+
|
|
86
|
+
有几类数据不走上面的单 blob,单独存:
|
|
87
|
+
|
|
88
|
+
| 键 | 内容 | 说明 |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `qtype.doneState` | `Record<file, Record<idx, CardStats[]>>` | 每张卡的历次 WPM / 准确率 —— 首页 sparkline 数据源 |
|
|
91
|
+
| `qtype.handOffsets` | 键盘校准 | 按键位置相对默认布局的偏移 |
|
|
92
|
+
| `qtype.keybindings` | 快捷键重绑 | 见 [shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/shortcuts.md) |
|
|
93
|
+
|
|
94
|
+
这三个都由 v2 kv migration 收编到统一 blob 里,内部还是独立的子 map,
|
|
95
|
+
但从 UI 视角看是**唯一 blob** —— `handOffsets` / `keybindings` 也会跟着
|
|
96
|
+
theme / hint 一起进导入导出。
|
|
97
|
+
|
|
98
|
+
---
|
|
99
|
+
|
|
100
|
+
## 导入 / 导出
|
|
101
|
+
|
|
102
|
+
Settings 面板的**「数据」**标签页有导入 / 导出按钮:
|
|
103
|
+
|
|
104
|
+
- 导出 → `qtype-settings.json`,包含上面全部设置 + 三类 side store
|
|
105
|
+
- 导入 → 覆盖当前值,进 kv 前会经过 schema 校验
|
|
106
|
+
|
|
107
|
+
**导入不会合并**,是完整覆盖。如果只想改一两个值,直接用 UI 或代码里
|
|
108
|
+
`kvSet('key', value)`。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 让 CLI 感知界面设置?
|
|
113
|
+
|
|
114
|
+
**不能**。上面这些设置**只在浏览器里存在**,CLI 读不到 —— 分工是:
|
|
115
|
+
|
|
116
|
+
- 谁写卡片 / 谁 publish → CLI 层设置(`qtype config`,进 git)
|
|
117
|
+
- 谁在浏览器里练 → 界面层设置(浏览器 kv,per-device)
|
|
118
|
+
|
|
119
|
+
比如你想让全 team 用一样的默认字体大小 —— 现在**做不到**。这是有意的
|
|
120
|
+
设计:CLI 层是「作品的一部分」,界面层是「每个人自己的阅读偏好」。
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
# 快捷键
|
|
2
|
+
|
|
3
|
+
English: [shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/shortcuts.md)
|
|
4
|
+
|
|
5
|
+
阅读器里的键盘快捷键。这份是**出厂默认**;每一项都可以在 Settings →
|
|
6
|
+
Shortcuts 里重绑,重绑的值存在浏览器 kv 里(不进 git,per-device)。
|
|
7
|
+
|
|
8
|
+
## 全局(任何页面)
|
|
9
|
+
|
|
10
|
+
| 动作 | mac | Windows / Linux | 说明 |
|
|
11
|
+
|---|---|---|---|
|
|
12
|
+
| 打开命令面板 | `Cmd+K` | `Ctrl+K` | ⌘K 风格的 launcher,可以搜任何动作 / material |
|
|
13
|
+
| 命令面板(纯命令) | `Cmd+Shift+P` | `Ctrl+Shift+P` | 只筛动作,不带 material |
|
|
14
|
+
|
|
15
|
+
## 打字页(typing route)
|
|
16
|
+
|
|
17
|
+
### HUD(顶部状态栏)
|
|
18
|
+
|
|
19
|
+
| 动作 | mac | Windows / Linux | 说明 |
|
|
20
|
+
|---|---|---|---|
|
|
21
|
+
| 暂停 / 继续 | `Alt+Space` | `Alt+Space` | 也可以点 HUD 上的 ⏸ 按钮 |
|
|
22
|
+
| 切换 ghost 提示 | `Alt+H` | `Alt+Shift+H` | 在打字目标下方显示褪色目标提示 |
|
|
23
|
+
| 切换屏幕键盘 | `Alt+K` | `Alt+K` | 屏幕键盘可见性 |
|
|
24
|
+
| 切换手部指法 | `Alt+J` | `Alt+J` | 屏幕键盘上叠加双手指法 |
|
|
25
|
+
| 返回首页 | `Alt+R` | `Alt+R` | 退出当前 material |
|
|
26
|
+
|
|
27
|
+
### 卡片导航
|
|
28
|
+
|
|
29
|
+
| 动作 | mac | Windows / Linux | 说明 |
|
|
30
|
+
|---|---|---|---|
|
|
31
|
+
| 上一张卡 | `Alt+Shift+←` | `Alt+Shift+←` | 卡组内往前跳 |
|
|
32
|
+
| 下一张卡 | `Alt+Shift+→` | `Alt+Shift+→` | 卡组内往后跳 |
|
|
33
|
+
|
|
34
|
+
### 仅命令面板(无默认按键)
|
|
35
|
+
|
|
36
|
+
以下动作**没有出厂快捷键**,只能在命令面板里搜到用:
|
|
37
|
+
|
|
38
|
+
- **跳到卡片 N** —— `card.jump`,输入卡号跳过去
|
|
39
|
+
- **换主题** —— `pick.theme`
|
|
40
|
+
- **切换 hint 模式** —— `hint.toggle`
|
|
41
|
+
- **打开设置** —— `settings.open`
|
|
42
|
+
- **搜索 material** —— `search.materials`
|
|
43
|
+
- **切网格视图 / 列表视图** —— `view.grid` / `view.list`(仅首页)
|
|
44
|
+
- **重新加载当前 material** —— `material.reload`
|
|
45
|
+
- **随机跳到一张 material** —— `material.random`
|
|
46
|
+
- **清空所有完成记录** —— `done.clearAll`
|
|
47
|
+
- **重置筛选器** —— `filter.reset`
|
|
48
|
+
|
|
49
|
+
想给它们绑快捷键,在 Settings → Shortcuts 里点对应行 → 按新的键组合。
|
|
50
|
+
|
|
51
|
+
## 打字时的键(不算「快捷键」,是引擎行为)
|
|
52
|
+
|
|
53
|
+
这些是打字过程本身的按键处理,不算可重绑的动作:
|
|
54
|
+
|
|
55
|
+
| 键 | 行为 |
|
|
56
|
+
|---|---|
|
|
57
|
+
| 字母 / 数字 / 标点 / 空格 | 打对 → 光标前进 + 变绿;打错 → 变红,光标不动 |
|
|
58
|
+
| `Backspace` | 撤销一个字符(除非 `allowBackspace: false`,见 [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/typing-rules.md)) |
|
|
59
|
+
| `Enter` | 打进「换行」目标字符(不是提交) |
|
|
60
|
+
| `Tab` | 按 `tabBehavior` 设置:重置本卡 / 输入 2 或 4 个空格 |
|
|
61
|
+
| `Escape` | 让打字区失焦(不暂停) |
|
|
62
|
+
| `←` `→` `↑` `↓` `Home` `End` | **被忽略**(打字工具不需要移动光标) |
|
|
63
|
+
|
|
64
|
+
## 重绑
|
|
65
|
+
|
|
66
|
+
**Settings → Shortcuts**:
|
|
67
|
+
- 每一行显示动作名 + 当前绑定
|
|
68
|
+
- 点行 → 按新键组合(录制模式)
|
|
69
|
+
- Escape 取消录制,Delete 清空绑定
|
|
70
|
+
- 冲突检测:两个动作绑同一键会警告
|
|
71
|
+
- 「重置默认」按钮恢复所有出厂值
|
|
72
|
+
|
|
73
|
+
**重绑存在哪**:浏览器 kv `qtype.keybindings`,由 v2 migration 收进
|
|
74
|
+
主 blob,导入 / 导出会跟着走(见 [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md))。
|
|
75
|
+
|
|
76
|
+
## 平台差异
|
|
77
|
+
|
|
78
|
+
**Mac** 和 **Windows / Linux** 分开定义。你会看到大部分动作两平台一样
|
|
79
|
+
(纯 Alt 组合无 OS 冲突),但少数用了 `Cmd` vs `Ctrl` —— 用户在 mac 上
|
|
80
|
+
习惯 Cmd,在 Windows 上习惯 Ctrl。
|
|
81
|
+
|
|
82
|
+
检测平台是**运行时判断**(`navigator.platform` / `userAgent`),不是构建时。
|
|
83
|
+
所以一个 dist 部署到跨平台的用户都能用。
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
# 打字规则
|
|
2
|
+
|
|
3
|
+
English: [typing-rules.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/typing-rules.md)
|
|
4
|
+
|
|
5
|
+
qtype 有一堆可调的打字规则,决定「打对 / 打错 / 什么时候算完成 / 什么时候
|
|
6
|
+
自动重试」。所有规则都在 Settings 里能改;开关一览见 [settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md)。
|
|
7
|
+
|
|
8
|
+
本文档讲清每个规则的**语义 + 常见组合**。
|
|
9
|
+
|
|
10
|
+
---
|
|
11
|
+
|
|
12
|
+
## 输入判定
|
|
13
|
+
|
|
14
|
+
### `ignoreCase`(默认 off)
|
|
15
|
+
|
|
16
|
+
**开启**:输入 `a` 也能匹配目标 `A`;英文卡里按 Shift 按错也不算错。
|
|
17
|
+
|
|
18
|
+
**关闭**:大小写必须完全一致。
|
|
19
|
+
|
|
20
|
+
**什么时候开**:早期练指法、不用记 Shift 位置。**关掉**:练英文段落、
|
|
21
|
+
要保持严谨。
|
|
22
|
+
|
|
23
|
+
### `ignorePunctuation`(默认 off)
|
|
24
|
+
|
|
25
|
+
**开启**:引擎在打字时**跳过标点**——目标里出现 `.` `,` `!` `?` `。` `,`
|
|
26
|
+
等自动向前推进,不需要用户敲。
|
|
27
|
+
|
|
28
|
+
**关闭**:标点也要打对。
|
|
29
|
+
|
|
30
|
+
**什么时候开**:练英文文章、只关心单词部分,不想打 `,` 打错。**关掉**:
|
|
31
|
+
练精确抄写(法律文书 / 诗词 / 代码)。
|
|
32
|
+
|
|
33
|
+
### `allowBackspace`(默认 on)
|
|
34
|
+
|
|
35
|
+
**开启**:Backspace 撤销一个字符,可以退回改错。
|
|
36
|
+
|
|
37
|
+
**关闭**:Backspace 无效,打错就得往前走(用 `retryOnFail` / `maxWrongRate` 补救)。
|
|
38
|
+
|
|
39
|
+
**什么时候关**:模拟考试严格模式、让用户敲完整句不能反悔。
|
|
40
|
+
|
|
41
|
+
---
|
|
42
|
+
|
|
43
|
+
## 输入限制
|
|
44
|
+
|
|
45
|
+
### `maxWrongRate`(默认 0 = 关闭,范围 0-100)
|
|
46
|
+
|
|
47
|
+
上限错误率(%)。**超过**这个值时:
|
|
48
|
+
- 引擎自动 undo 用户最后一个错字
|
|
49
|
+
- HUD 出错误 toast(「错误率超过 X%」)
|
|
50
|
+
|
|
51
|
+
例:`maxWrongRate: 5` → 累计错误率 > 5% 时,打错就自动回退,强迫用户
|
|
52
|
+
放慢速度。
|
|
53
|
+
|
|
54
|
+
**什么时候开**:想练准确率而非速度。**留 0**:允许边打边错、只要最终
|
|
55
|
+
过完就行。
|
|
56
|
+
|
|
57
|
+
### `retryOnFail`(默认 `off`)
|
|
58
|
+
|
|
59
|
+
「打完这一张但没达到 `completionMode` 门槛」时的自动重试策略。
|
|
60
|
+
|
|
61
|
+
- **`off`** —— 不自动重试。用户手动 `Alt+R` 才回到卡首
|
|
62
|
+
- **`auto`** —— 完成 + 门槛未过 → arena 抖一下(shake)+ 从头开始
|
|
63
|
+
- **`immediate`** —— 更严格:**打错任何一个字**就立刻重来(不等完成)
|
|
64
|
+
|
|
65
|
+
**maxRetries**(0-20,默认 5):自动重试上限。超过就调 `onSkip` 让路由决定
|
|
66
|
+
(通常直接进下一张)。0 = 无限重试。
|
|
67
|
+
|
|
68
|
+
**组合示例**:
|
|
69
|
+
- `retryOnFail: auto` + `completionMode: perfect` → 每卡必须零错才能过,
|
|
70
|
+
否则从头
|
|
71
|
+
- `retryOnFail: immediate` + `maxRetries: 3` → 3 次立即重试失败就跳过
|
|
72
|
+
|
|
73
|
+
---
|
|
74
|
+
|
|
75
|
+
## 完成判定
|
|
76
|
+
|
|
77
|
+
### `completionMode`(默认 `through`)
|
|
78
|
+
|
|
79
|
+
「一张卡打完时,算不算 done?」
|
|
80
|
+
|
|
81
|
+
- **`through`** —— 只要敲到最后一个字就算完成(默认,最宽松)
|
|
82
|
+
- **`lenient`** —— 错误率 ≤ 5% 才算完成
|
|
83
|
+
- **`perfect`** —— 零错才算完成
|
|
84
|
+
|
|
85
|
+
**「不算完成」**发生什么:取决于 `retryOnFail`:
|
|
86
|
+
- `off` → 卡显示为「结束但未完成」,用户可以手动继续下一张
|
|
87
|
+
- `auto` → 从头开始
|
|
88
|
+
- `immediate` → 严格模式下,一般在打错时就已经自动重来了,不会走到这
|
|
89
|
+
|
|
90
|
+
**组合**:completionMode 和 retryOnFail 是**独立**的两个开关:
|
|
91
|
+
- completionMode 决定「什么叫完成」
|
|
92
|
+
- retryOnFail 决定「没完成时怎么办」
|
|
93
|
+
|
|
94
|
+
---
|
|
95
|
+
|
|
96
|
+
## Tab 键行为
|
|
97
|
+
|
|
98
|
+
### `tabBehavior`(默认 `reset`)
|
|
99
|
+
|
|
100
|
+
- **`reset`** —— 按 Tab 重置整张卡(打字工具常见约定)
|
|
101
|
+
- **`input`** —— Tab 作为输入,展开成 `tabWidth` 个空格(练代码常用)
|
|
102
|
+
|
|
103
|
+
### `tabWidth`(2 或 4,默认 4)
|
|
104
|
+
|
|
105
|
+
`tabBehavior: input` 时,一个 Tab 键 = 几个空格。
|
|
106
|
+
|
|
107
|
+
**练 Python 通常用 `4`,练 Go 或 shell 用 `2`**。代码卡里的目标应该用一致的
|
|
108
|
+
缩进方式(全是空格或全是 tab 对齐)——qtype 只处理输入,不改目标。
|
|
109
|
+
|
|
110
|
+
---
|
|
111
|
+
|
|
112
|
+
## 目标速度提示
|
|
113
|
+
|
|
114
|
+
### `targetWpm`(默认 0 = 关闭,范围 0-500)
|
|
115
|
+
|
|
116
|
+
打开后,arena 里显示一个**影子光标**,按目标速度前进。你的实际光标追上
|
|
117
|
+
或落后于它,肉眼就能判断快慢。
|
|
118
|
+
|
|
119
|
+
例:`targetWpm: 40` → 影子按 40 WPM 匀速前进,你要追上它 = 达到 40 WPM。
|
|
120
|
+
|
|
121
|
+
设 0 关闭。开着不影响打字判定,只是节拍器。
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
## AFK 自动暂停
|
|
126
|
+
|
|
127
|
+
### `afkSeconds`(默认 60,范围 5-300)
|
|
128
|
+
|
|
129
|
+
多长时间没「活动」就自动暂停。
|
|
130
|
+
|
|
131
|
+
**「活动」= keydown / mousemove / wheel / touchstart / touchmove**。**鼠标
|
|
132
|
+
悬停不动也算 AFK**(不算移动)。切 tab 或窗口失焦会**立刻**暂停,不等
|
|
133
|
+
AFK 超时。
|
|
134
|
+
|
|
135
|
+
暂停后 arena 变灰,不接受输入,需要 `Alt+Space` 或 HUD 上的 ▶ 恢复。
|
|
136
|
+
|
|
137
|
+
**为什么默认 60**:留出思考的时间。想要严格计时,调到 15 或 30。
|
|
138
|
+
|
|
139
|
+
---
|
|
140
|
+
|
|
141
|
+
## 组合方案参考
|
|
142
|
+
|
|
143
|
+
### 「刚入门,佛系练」
|
|
144
|
+
```
|
|
145
|
+
ignoreCase: on
|
|
146
|
+
ignorePunctuation: on
|
|
147
|
+
allowBackspace: on
|
|
148
|
+
completionMode: through
|
|
149
|
+
retryOnFail: off
|
|
150
|
+
maxWrongRate: 0
|
|
151
|
+
```
|
|
152
|
+
不管对错,打完就下一张,慢慢积累速度。
|
|
153
|
+
|
|
154
|
+
### 「日常练打字」(推荐默认)
|
|
155
|
+
```
|
|
156
|
+
ignoreCase: off
|
|
157
|
+
ignorePunctuation: off
|
|
158
|
+
allowBackspace: on
|
|
159
|
+
completionMode: through
|
|
160
|
+
retryOnFail: auto
|
|
161
|
+
maxRetries: 3
|
|
162
|
+
maxWrongRate: 0
|
|
163
|
+
```
|
|
164
|
+
错了能改,过多重来 3 次跳过。
|
|
165
|
+
|
|
166
|
+
### 「模拟考试严格模式」
|
|
167
|
+
```
|
|
168
|
+
ignoreCase: off
|
|
169
|
+
ignorePunctuation: off
|
|
170
|
+
allowBackspace: off
|
|
171
|
+
completionMode: perfect
|
|
172
|
+
retryOnFail: immediate
|
|
173
|
+
maxRetries: 0
|
|
174
|
+
```
|
|
175
|
+
打错立刻重来,不允许改,零错才过。
|
|
176
|
+
|
|
177
|
+
### 「快速刷完不 grind」
|
|
178
|
+
```
|
|
179
|
+
ignoreCase: on
|
|
180
|
+
ignorePunctuation: on
|
|
181
|
+
completionMode: through
|
|
182
|
+
retryOnFail: off
|
|
183
|
+
```
|
|
184
|
+
所有卡走一遍,记录 WPM,不磨完美主义。
|
|
185
|
+
|
|
186
|
+
---
|
|
187
|
+
|
|
188
|
+
## 相关文档
|
|
189
|
+
|
|
190
|
+
- 每个规则的开关位置:[settings.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/settings.md)
|
|
191
|
+
- 快捷键(暂停 / 上一张 / 下一张):[shortcuts.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/shortcuts.md)
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@qnroa/qtype",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.4",
|
|
4
4
|
"description": "Turn Markdown notes into typing practice — CLI + review + static-site publisher",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"typing",
|
|
@@ -11,8 +11,7 @@
|
|
|
11
11
|
"static-site-generator",
|
|
12
12
|
"spaced-repetition",
|
|
13
13
|
"chinese-typing",
|
|
14
|
-
"pinyin"
|
|
15
|
-
"qrism"
|
|
14
|
+
"pinyin"
|
|
16
15
|
],
|
|
17
16
|
"license": "Apache-2.0",
|
|
18
17
|
"author": "Qnroa",
|
|
@@ -35,12 +34,7 @@
|
|
|
35
34
|
"LICENSE",
|
|
36
35
|
"!dist/**/*.js.map",
|
|
37
36
|
"!dist/**/*.d.ts.map",
|
|
38
|
-
"!docs/**/
|
|
39
|
-
"!docs/**/cli-internals.md",
|
|
40
|
-
"!docs/**/architecture.md",
|
|
41
|
-
"!docs/**/core-architecture.md",
|
|
42
|
-
"!docs/**/cli-architecture.md",
|
|
43
|
-
"!docs/**/view-architecture.md"
|
|
37
|
+
"!docs/**/architecture.md"
|
|
44
38
|
],
|
|
45
39
|
"exports": {
|
|
46
40
|
"./core": "./dist/core/index.js",
|
|
@@ -62,10 +56,18 @@
|
|
|
62
56
|
},
|
|
63
57
|
"dependencies": {
|
|
64
58
|
"@noble/hashes": "^2.2.0",
|
|
59
|
+
"@radix-ui/react-popover": "^1.1.23",
|
|
60
|
+
"@radix-ui/react-tooltip": "^1.2.16",
|
|
61
|
+
"@types/howler": "^2.2.13",
|
|
62
|
+
"cmdk": "^1.1.1",
|
|
65
63
|
"commander": "^15.0.0",
|
|
64
|
+
"howler": "^2.2.4",
|
|
65
|
+
"katex": "^0.16.47",
|
|
66
|
+
"lucide-react": "^1.33.0",
|
|
66
67
|
"mermaid": "^11.15.0",
|
|
67
|
-
"pinyin-pro": "^3.29.
|
|
68
|
-
"puppeteer": "^25.4.0"
|
|
68
|
+
"pinyin-pro": "^3.29.3",
|
|
69
|
+
"puppeteer": "^25.4.0",
|
|
70
|
+
"shiki": "^4.4.3"
|
|
69
71
|
},
|
|
70
72
|
"devDependencies": {
|
|
71
73
|
"@radix-ui/react-dialog": "^1.1.23",
|