@qnroa/qtype 0.0.2 → 0.0.3
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 +1 -3
- package/CHANGELOG.zh.md +1 -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 +39 -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-BLryk3W4.css +1 -0
- package/dist/view/assets/index-ByMJp0a5.js +3 -0
- package/dist/view/assets/index-CRh4USfC.js +189 -0
- package/dist/view/assets/index-JNx7Ohoj.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 +10 -2
- 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
package/docs/zh/authoring.md
CHANGED
|
@@ -1,112 +1,116 @@
|
|
|
1
1
|
# 撰写 material 文件
|
|
2
2
|
|
|
3
|
-
English: [authoring.md](
|
|
3
|
+
English: [authoring.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/authoring.md)
|
|
4
4
|
|
|
5
|
-
`material/*.md`
|
|
6
|
-
[
|
|
7
|
-
|
|
5
|
+
`material/*.md` 的快速入门。深度参考见
|
|
6
|
+
[material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md);LLM 协作用的完整规范见
|
|
7
|
+
[`templates/zh/QTYPE.md`](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=templates/zh/QTYPE.md)(`qtype init
|
|
8
|
+
--lang zh` 时会拷到新 repo)。有疑问先查那两份。
|
|
8
9
|
|
|
9
10
|
## 文件位置
|
|
10
11
|
|
|
11
12
|
```
|
|
12
13
|
my-deck/
|
|
13
|
-
├── QTYPE.md #
|
|
14
|
-
├── index.md #
|
|
14
|
+
├── QTYPE.md # 规范(init 时自动拷贝;留着,给 LLM 用)
|
|
15
|
+
├── index.md # 面向人的目录(可选)
|
|
15
16
|
├── material/
|
|
16
|
-
│ ├──
|
|
17
|
-
│ ├──
|
|
18
|
-
│
|
|
17
|
+
│ ├── word.md # 6 种类型的入门模板
|
|
18
|
+
│ ├── sentence.md # 由 qtype init 自动拷入
|
|
19
|
+
│ ├── article.md
|
|
20
|
+
│ ├── snippet.md
|
|
21
|
+
│ ├── qa.md
|
|
22
|
+
│ └── code.md
|
|
19
23
|
└── .qtype/
|
|
20
24
|
└── config.json # 单 repo 配置
|
|
21
25
|
```
|
|
22
26
|
|
|
23
|
-
|
|
27
|
+
**一个 `.md` 文件 = 一副卡组,整个文件一个 `type`**。想加新卡组,
|
|
28
|
+
复制一个类型模板重命名即可。
|
|
24
29
|
|
|
25
|
-
##
|
|
30
|
+
## 六种类型
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
的多张卡用 `\n\n---\n\n`(独占一行的 `---`,前后各留空行)分隔。
|
|
32
|
+
qtype 支持 6 种 material 类型,每种有自己的 Markdown 结构:
|
|
29
33
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
| type | 打字目标 | 结构 |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| `word` | H1 单词本身 | H1 + 可选 H2 音标 / H3 释义 / H4 图片 |
|
|
37
|
+
| `sentence` | H1 整句 | 结构同 word |
|
|
38
|
+
| `article` | H1 之下正文 | H1 是章节标题(不打),下方段落是目标 |
|
|
39
|
+
| `snippet` | H1 之下正文 | 结构同 article,渲染时**居中排版**;适合诗句 / 格言 |
|
|
40
|
+
| `qa` | `## A` 块 | H1 卡名, `## Q` 题干, `## A` 打字目标 |
|
|
41
|
+
| `code` | `## A` 里的 fenced code block | 同 qa,但 A 里是代码块 |
|
|
37
42
|
|
|
38
|
-
|
|
43
|
+
## 卡片切分
|
|
39
44
|
|
|
40
|
-
|
|
45
|
+
同一文件里的多张卡用 **`# H1`** 分隔 —— 每一个 H1 起一张新卡。**不用
|
|
46
|
+
`---` 分割**。
|
|
41
47
|
|
|
42
|
-
|
|
48
|
+
## 举例
|
|
43
49
|
|
|
50
|
+
**word:**
|
|
51
|
+
```markdown
|
|
52
|
+
---
|
|
53
|
+
type: word
|
|
54
|
+
tags: [example]
|
|
44
55
|
---
|
|
45
56
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
## A:
|
|
57
|
+
# apple
|
|
58
|
+
## /ˈæp.əl/
|
|
59
|
+
### 苹果
|
|
51
60
|
|
|
52
|
-
|
|
61
|
+
# ephemeral
|
|
62
|
+
## /əˈfem(ə)rəl/
|
|
63
|
+
### 短暂的
|
|
53
64
|
```
|
|
54
65
|
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
YAML fence 放到该卡上方(见规范)。
|
|
62
|
-
|
|
63
|
-
| 字段 | 类型 | 说明 |
|
|
64
|
-
|---|---|---|
|
|
65
|
-
| `tags` | `string[]` | 自由形式;用于列表过滤 |
|
|
66
|
-
| `type` | `normal \| word \| sentence` | 默认 `normal` |
|
|
67
|
-
| `hint` | `none \| ghost` | 下方是否显示褪色目标 |
|
|
68
|
-
| `difficulty` | `1..5` | 可选,信息用 |
|
|
69
|
-
| `phonetic` | `string` | `type: word` 用 —— IPA / 拼音 |
|
|
70
|
-
| `gloss` | `string` | `type: word` 用 —— 释义 |
|
|
71
|
-
| `translation` | `string` | `type: sentence` 用 —— 目标语等价句 |
|
|
66
|
+
**sentence:**
|
|
67
|
+
```markdown
|
|
68
|
+
---
|
|
69
|
+
type: sentence
|
|
70
|
+
tags: [example]
|
|
71
|
+
---
|
|
72
72
|
|
|
73
|
-
|
|
73
|
+
# The quick brown fox jumps over the lazy dog.
|
|
74
|
+
### 英文全字母句。
|
|
75
|
+
```
|
|
74
76
|
|
|
77
|
+
**qa:**
|
|
75
78
|
```markdown
|
|
76
79
|
---
|
|
77
|
-
type:
|
|
78
|
-
|
|
79
|
-
gloss: 捕获词法作用域的函数
|
|
80
|
+
type: qa
|
|
81
|
+
tags: [js]
|
|
80
82
|
---
|
|
81
83
|
|
|
82
|
-
|
|
84
|
+
# 什么是闭包
|
|
83
85
|
|
|
84
|
-
|
|
86
|
+
## Q
|
|
87
|
+
用一句话解释闭包。
|
|
85
88
|
|
|
86
|
-
## A
|
|
87
|
-
|
|
88
|
-
closure
|
|
89
|
+
## A
|
|
90
|
+
闭包是函数与它诞生时的词法作用域组合在一起。
|
|
89
91
|
```
|
|
90
92
|
|
|
91
|
-
|
|
93
|
+
其余三种见 [material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md)。
|
|
94
|
+
|
|
95
|
+
## 被打字的是什么?
|
|
92
96
|
|
|
93
|
-
|
|
94
|
-
|
|
97
|
+
**答案侧**(见每种类型的「打字目标」列)是用户要打的内容。题干 / 音标 /
|
|
98
|
+
释义只做展示,不打。所有字符必须 OS 键盘(含中文 IME)能敲得出来。
|
|
95
99
|
|
|
96
|
-
|
|
97
|
-
|
|
100
|
+
打字引擎处理不了的字符(某些代理对 emoji / 零宽字符 / 控制字符)会
|
|
101
|
+
出现在 `qtype check` 输出里 —— 发布前修掉或删掉。
|
|
98
102
|
|
|
99
103
|
## 跑 `qtype check`
|
|
100
104
|
|
|
101
|
-
|
|
105
|
+
发布前始终跑:
|
|
102
106
|
|
|
103
107
|
```bash
|
|
104
108
|
qtype check
|
|
105
109
|
```
|
|
106
110
|
|
|
107
|
-
|
|
108
|
-
- `material/`
|
|
109
|
-
-
|
|
111
|
+
它报告:
|
|
112
|
+
- `material/` 目录不存在(致命)
|
|
113
|
+
- 含无法打字字符的卡片(致命,附逐卡列表)
|
|
110
114
|
|
|
111
115
|
退出码 0 = 可以安全发布。
|
|
112
116
|
|
|
@@ -117,15 +121,16 @@ qtype publish build
|
|
|
117
121
|
qtype publish serve # http://localhost:4000
|
|
118
122
|
```
|
|
119
123
|
|
|
120
|
-
|
|
124
|
+
密码保护的卡组:
|
|
121
125
|
|
|
122
126
|
```bash
|
|
123
127
|
qtype publish password set # 写入 repo 配置
|
|
124
128
|
qtype publish build # 出栈时加密 material
|
|
125
129
|
```
|
|
126
130
|
|
|
127
|
-
##
|
|
131
|
+
## 完整参考
|
|
128
132
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
[`templates/zh/QTYPE.md`](
|
|
133
|
+
- [material-types.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/zh/material-types.md) —— 6 种类型的**深度**参考,
|
|
134
|
+
含解析器行为 / UI 布局 / 交互细节
|
|
135
|
+
- [`templates/zh/QTYPE.md`](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=templates/zh/QTYPE.md) —— **LLM 协作
|
|
136
|
+
规范**,init 时自动拷入 repo,让 AI agent 直接按规矩生成 material
|
package/docs/zh/cli-reference.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# qtype CLI 简介
|
|
2
2
|
|
|
3
|
-
English: [cli-reference.md](
|
|
3
|
+
English: [cli-reference.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/cli-reference.md)
|
|
4
4
|
|
|
5
5
|
每个顶层命令的简单介绍。跑 `qtype <cmd> --help` 看完整选项。
|
|
6
6
|
|
|
@@ -12,69 +12,107 @@ English: [cli-reference.md](../en/cli-reference.md)
|
|
|
12
12
|
| `-v, --version` | 显示版本 |
|
|
13
13
|
| `--lang <zh\|en>` | 本次调用的 UI 语言 |
|
|
14
14
|
|
|
15
|
-
|
|
15
|
+
语言优先级:`--lang` > `$QTYPE_LANG` > `~/.config/qtype/config.json` 里的
|
|
16
16
|
`cli.lang` > 系统 locale。
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
|
-
## `qtype init [
|
|
20
|
+
## `qtype init [path]`
|
|
21
21
|
|
|
22
|
-
在已有目录里搭起 material 仓库脚手架。`qtype repo sync`
|
|
22
|
+
在已有目录里搭起 material 仓库脚手架。`qtype repo sync` 的顶层别名。
|
|
23
23
|
|
|
24
24
|
```bash
|
|
25
|
-
qtype init
|
|
26
|
-
qtype init
|
|
25
|
+
mkdir my-deck && qtype init my-deck --lang zh
|
|
26
|
+
qtype init # 当前目录
|
|
27
|
+
qtype init my-deck --force # 覆盖 qtype 管理的规范文件
|
|
28
|
+
qtype init my-deck --dry-run # 只打印计划,不写盘
|
|
27
29
|
```
|
|
28
30
|
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
`log.md
|
|
31
|
+
创建:`QTYPE.md`(撰写规范)、`AGENTS.md` / `CLAUDE.md` / `GEMINI.md`
|
|
32
|
+
(指向 `QTYPE.md` 的软链)、`README.md`、`TODO.md`、`index.md`、
|
|
33
|
+
`log.md`、`material/{word,sentence,article,snippet,qa,code}.md` 6 张起手模板
|
|
34
|
+
+ 对应的 SVG 图片(`material/assets/<type>/*.svg`)、`.qtype/` 骨架。
|
|
32
35
|
|
|
33
|
-
幂等 ——
|
|
36
|
+
幂等 —— 跳过已有的用户内容,只有 `--force` 才会覆盖 qtype 管理的规范文件。
|
|
34
37
|
|
|
35
38
|
---
|
|
36
39
|
|
|
37
40
|
## `qtype repo new <name>`
|
|
38
41
|
|
|
39
|
-
|
|
42
|
+
在**父目录**下新建一个 material 仓库子目录。
|
|
40
43
|
|
|
41
44
|
```bash
|
|
42
45
|
qtype repo new my-deck --lang zh
|
|
43
|
-
|
|
46
|
+
qtype repo new my-deck --description "GRE 词汇" --git
|
|
44
47
|
```
|
|
45
48
|
|
|
46
|
-
|
|
49
|
+
| 选项 | 说明 |
|
|
50
|
+
|---|---|
|
|
51
|
+
| `--lang <zh\|en>` | 语言,决定模板 |
|
|
52
|
+
| `--description <text>` | README 里的一句简介 |
|
|
53
|
+
| `--dir <path>` | 父目录(默认当前) |
|
|
54
|
+
| `--git` | 顺手 `git init` |
|
|
55
|
+
|
|
56
|
+
## `qtype repo sync [path]`
|
|
47
57
|
|
|
48
58
|
在已有 repo 里补齐约定。与 `qtype init` 相同。
|
|
49
59
|
|
|
50
60
|
---
|
|
51
61
|
|
|
52
|
-
## `qtype check [
|
|
62
|
+
## `qtype check [path]`
|
|
63
|
+
|
|
64
|
+
`qtype content lint` 的顶层别名,校验 `material/*.md`:报告含打字引擎无法处理
|
|
65
|
+
字符的卡片。返回非零码用于 CI。
|
|
66
|
+
|
|
67
|
+
```bash
|
|
68
|
+
qtype check # 当前目录
|
|
69
|
+
qtype check --json # JSON 输出,便于工具处理
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
---
|
|
73
|
+
|
|
74
|
+
## `qtype content lint | validate | search`
|
|
75
|
+
|
|
76
|
+
- `lint` —— 卡片文本级校验(打字目标里有无法打字的字符 → 报错)
|
|
77
|
+
- `validate` —— schema 级校验(frontmatter 字段类型 / 必填等)
|
|
78
|
+
- `search <query>` —— 卡片全量子串搜索
|
|
53
79
|
|
|
54
|
-
|
|
55
|
-
(返回非零码)。只读;建议在 CI 里放在 `publish build` 前面。
|
|
80
|
+
`search` 支持过滤 + 结构化输出:
|
|
56
81
|
|
|
57
82
|
```bash
|
|
58
|
-
qtype
|
|
83
|
+
qtype content search "闭包"
|
|
84
|
+
qtype content search "apple" --tag GRE --type word --limit 5
|
|
85
|
+
qtype content search "*" --tag 数学 --json # 脚本友好
|
|
59
86
|
```
|
|
60
87
|
|
|
88
|
+
| `search` 选项 | 说明 |
|
|
89
|
+
|---|---|
|
|
90
|
+
| `--limit <n>` | 最多返回结果数(默认 20) |
|
|
91
|
+
| `--tag <tag...>` | 按 tag 过滤(可多次;AND 语义,需全部匹配) |
|
|
92
|
+
| `--type <type...>` | 按 material 类型过滤(可多次) |
|
|
93
|
+
| `--json` | 以 JSON 输出结果 |
|
|
94
|
+
|
|
61
95
|
---
|
|
62
96
|
|
|
63
|
-
## `qtype publish build [
|
|
97
|
+
## `qtype publish build [path]`
|
|
64
98
|
|
|
65
|
-
拼装静态站到
|
|
99
|
+
拼装静态站到 `<repo>/dist/`。执行:
|
|
66
100
|
|
|
67
101
|
1. 解析每个 `material/*.md`
|
|
68
|
-
2. 预渲染 Mermaid
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
102
|
+
2. 预渲染 Mermaid 图(除非 `publish.mermaid=off`),生成
|
|
103
|
+
`dist/material/mermaid.json` + `mermaid.css`(dark + light 两版 SVG)
|
|
104
|
+
3. 加密 material(如果 `publish.password.enabled=true`)—— 用 argon2id
|
|
105
|
+
派生 AES-256 密钥,AES-GCM 加密每份 material,输出 `<file>.enc.json`
|
|
106
|
+
4. 生成 `dist/material/index.json` manifest(供浏览器懒加载)
|
|
107
|
+
5. 把预构建的 view bundle 拷到 `dist/` 根,可以直接静态部署
|
|
72
108
|
|
|
73
109
|
```bash
|
|
74
110
|
qtype publish build
|
|
111
|
+
QTYPE_PUBLISH_PASSWORD=demo qtype publish build # 非交互输密码
|
|
112
|
+
qtype publish build --out ./build # 自定义输出目录
|
|
75
113
|
```
|
|
76
114
|
|
|
77
|
-
## `qtype publish serve [
|
|
115
|
+
## `qtype publish serve [path]`
|
|
78
116
|
|
|
79
117
|
本地 HTTP 预览 `dist/`。默认端口 4000。
|
|
80
118
|
|
|
@@ -85,18 +123,31 @@ qtype publish serve --port 8080
|
|
|
85
123
|
|
|
86
124
|
## `qtype publish init`
|
|
87
125
|
|
|
88
|
-
|
|
126
|
+
写入部署辅助文件。**默认只写 `.gitignore`**;`--ci github` 追加
|
|
127
|
+
`.github/workflows/pages.yml`,push 到 `main` 就触发构建 + 部署。
|
|
128
|
+
|
|
129
|
+
```bash
|
|
130
|
+
qtype publish init # 只写 .gitignore
|
|
131
|
+
qtype publish init --ci github # 带 GitHub Pages 部署
|
|
132
|
+
```
|
|
89
133
|
|
|
90
134
|
## `qtype publish password set / clear / status`
|
|
91
135
|
|
|
92
|
-
密码保护生命周期。`set`
|
|
93
|
-
|
|
136
|
+
密码保护生命周期。`set` 会提示输入密码,用 Argon2id(64 MiB / t=3 / p=1)
|
|
137
|
+
派生一个短暂 AES 密钥,把 hash + salt 写到 `.qtype/config.json`。密码本身
|
|
138
|
+
**不存**,只存 hash;每次 `publish build` 需要重新提供密码派生 AES 密钥
|
|
139
|
+
加密内容。
|
|
94
140
|
|
|
95
141
|
```bash
|
|
96
|
-
qtype publish password set
|
|
142
|
+
qtype publish password set # 交互输入
|
|
143
|
+
echo "hunter2" | qtype publish password set # stdin 输入,便于脚本
|
|
97
144
|
qtype publish password status
|
|
145
|
+
qtype publish password clear
|
|
98
146
|
```
|
|
99
147
|
|
|
148
|
+
浏览器端:用户在 `PasswordGate` 输密码 → argon2id 派生同一 AES 密钥 →
|
|
149
|
+
解密 material。派生结果缓存到 `sessionStorage`(同一 tab 内刷新不再问)。
|
|
150
|
+
|
|
100
151
|
---
|
|
101
152
|
|
|
102
153
|
## `qtype pack [-o file]`
|
|
@@ -110,25 +161,13 @@ qtype pack -o my-deck.tar.gz
|
|
|
110
161
|
|
|
111
162
|
---
|
|
112
163
|
|
|
113
|
-
## `qtype content lint | validate | search`
|
|
114
|
-
|
|
115
|
-
- `lint` —— material 文件的样式级 pass
|
|
116
|
-
- `validate` —— schema 级 pass;`qtype check` 的补充
|
|
117
|
-
- `search <query>` —— 卡片全量子串搜索
|
|
118
|
-
|
|
119
|
-
```bash
|
|
120
|
-
qtype content search "closure"
|
|
121
|
-
```
|
|
122
|
-
|
|
123
|
-
---
|
|
124
|
-
|
|
125
164
|
## `qtype config get / set / unset / list`
|
|
126
165
|
|
|
127
|
-
git
|
|
128
|
-
在 `<repo>/.qtype/config.json
|
|
166
|
+
git 风格的双层配置(user 层在 `~/.config/qtype/config.json`,repo 层
|
|
167
|
+
在 `<repo>/.qtype/config.json`)。
|
|
129
168
|
|
|
130
|
-
|
|
131
|
-
repo
|
|
169
|
+
读优先级:**CLI flag > repo > user > schema default**。写入默认:
|
|
170
|
+
repo-only 键写到 repo,user-only 键写到 user,双 scope 键优先写 repo。
|
|
132
171
|
|
|
133
172
|
```bash
|
|
134
173
|
qtype config set cli.lang zh --global
|
|
@@ -138,25 +177,20 @@ qtype config list
|
|
|
138
177
|
qtype config unset typing.targetWpm
|
|
139
178
|
```
|
|
140
179
|
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
- `cli.lang`、`cli.color`(user-only)
|
|
144
|
-
- `repo.name`、`publish.password.*`(repo-only)
|
|
145
|
-
- `repo.lang`、`typing.theme`、`typing.targetWpm`、`typing.tabBehavior`、
|
|
146
|
-
`typing.hint`、`typing.showKeyboard`、`typing.showHands`、
|
|
147
|
-
`publish.mermaid`(双 scope)
|
|
148
|
-
|
|
149
|
-
严格模式:未知键会被拒绝。
|
|
150
|
-
|
|
151
|
-
---
|
|
180
|
+
**已知配置键**:
|
|
152
181
|
|
|
153
|
-
|
|
182
|
+
- **User-only**: `cli.lang`、`cli.color`
|
|
183
|
+
- **Repo-only**: `repo.name`、`publish.password.enabled`、`publish.password.hash`、
|
|
184
|
+
`publish.password.aesSalt`、`publish.password.scope`、`publish.password.selected`
|
|
185
|
+
- **双 scope**: `repo.lang`、`typing.theme`、`typing.targetWpm`、`typing.tabBehavior`、
|
|
186
|
+
`typing.hint`、`typing.showKeyboard`、`typing.showHands`、`publish.mermaid`
|
|
154
187
|
|
|
155
|
-
|
|
188
|
+
严格模式:未知键会被拒绝。View-side 的界面设置(自动朗读 / 数学渲染 /
|
|
189
|
+
AFK 阈值等)存在**浏览器 kv 层**,不在这个 config 里。
|
|
156
190
|
|
|
157
191
|
---
|
|
158
192
|
|
|
159
193
|
## 退出码
|
|
160
194
|
|
|
161
195
|
- `0` —— 成功
|
|
162
|
-
- `1` —— 校验 / lint /
|
|
196
|
+
- `1` —— 校验 / lint / 构建失败,或任何抛出的错误
|
|
@@ -0,0 +1,179 @@
|
|
|
1
|
+
# 部署指南
|
|
2
|
+
|
|
3
|
+
English: [deployment.md](https://www.npmjs.com/package/@qnroa/qtype?activeTab=code&filepath=docs/en/deployment.md)
|
|
4
|
+
|
|
5
|
+
`qtype publish build` 出的 `dist/` 是一个纯静态目录:HTML + JS + CSS +
|
|
6
|
+
`material/*.md`(或加密的 `.enc.json`)+ assets。**没有 server 端**,
|
|
7
|
+
可以扔到任何 CDN / 静态托管上。
|
|
8
|
+
|
|
9
|
+
## 部署前的 checklist
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
qtype check # 校验干净?
|
|
13
|
+
qtype publish build # 生成 dist/
|
|
14
|
+
ls dist/ # 应看到 index.html + assets/ + material/
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
**关键点**:构建产物是 `dist/`,不是 `dist/view/`。前者是**用户仓库
|
|
18
|
+
里**的输出目录,后者是**开发时**的 view bundle 缓存(publish build 会
|
|
19
|
+
把 dist/view/* 拷进你的 dist/)。
|
|
20
|
+
|
|
21
|
+
## GitHub Pages
|
|
22
|
+
|
|
23
|
+
qtype 自带一键 workflow:
|
|
24
|
+
|
|
25
|
+
```bash
|
|
26
|
+
qtype publish init --ci github
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
它会写 `.github/workflows/pages.yml`。push 到 `main` 分支就会:
|
|
30
|
+
1. `npm install -g @qnroa/qtype`
|
|
31
|
+
2. `qtype publish build`
|
|
32
|
+
3. 把 `dist/` 上传到 GitHub Pages
|
|
33
|
+
|
|
34
|
+
**需要在 GitHub 仓库设置里**手动开启 Pages:
|
|
35
|
+
- Settings → Pages → Source 选 **GitHub Actions**
|
|
36
|
+
|
|
37
|
+
**如果启用了密码保护**:workflow 里得用 secret 注入密码:
|
|
38
|
+
|
|
39
|
+
```yaml
|
|
40
|
+
- run: qtype publish build
|
|
41
|
+
env:
|
|
42
|
+
QTYPE_PUBLISH_PASSWORD: ${{ secrets.QTYPE_PASSWORD }}
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
在 Settings → Secrets and variables → Actions 里加一个叫
|
|
46
|
+
`QTYPE_PASSWORD` 的 secret。
|
|
47
|
+
|
|
48
|
+
## Cloudflare Pages
|
|
49
|
+
|
|
50
|
+
1. Cloudflare Dashboard → Pages → Create → Connect Git
|
|
51
|
+
2. 构建配置:
|
|
52
|
+
- **Framework preset**: `None`
|
|
53
|
+
- **Build command**: `npx @qnroa/qtype publish build`
|
|
54
|
+
- **Build output directory**: `dist`
|
|
55
|
+
- **Node version**: `20` (环境变量 `NODE_VERSION=20`)
|
|
56
|
+
3. 密码保护:在 Settings → Environment variables 加
|
|
57
|
+
`QTYPE_PUBLISH_PASSWORD`(选「Production」+ 勾「Encrypt」)
|
|
58
|
+
|
|
59
|
+
## Vercel
|
|
60
|
+
|
|
61
|
+
`vercel.json`(仓库根):
|
|
62
|
+
|
|
63
|
+
```json
|
|
64
|
+
{
|
|
65
|
+
"buildCommand": "npx @qnroa/qtype publish build",
|
|
66
|
+
"outputDirectory": "dist",
|
|
67
|
+
"framework": null
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
密码用 `vercel env add QTYPE_PUBLISH_PASSWORD` 加。
|
|
72
|
+
|
|
73
|
+
## Netlify
|
|
74
|
+
|
|
75
|
+
`netlify.toml`(仓库根):
|
|
76
|
+
|
|
77
|
+
```toml
|
|
78
|
+
[build]
|
|
79
|
+
command = "npx @qnroa/qtype publish build"
|
|
80
|
+
publish = "dist"
|
|
81
|
+
|
|
82
|
+
[build.environment]
|
|
83
|
+
NODE_VERSION = "20"
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
密码在 Site settings → Environment variables 里加。
|
|
87
|
+
|
|
88
|
+
## 自建 nginx
|
|
89
|
+
|
|
90
|
+
`qtype publish build` 完之后:
|
|
91
|
+
|
|
92
|
+
```bash
|
|
93
|
+
scp -r dist/* user@yourhost:/var/www/your-site/
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
nginx 配置:
|
|
97
|
+
|
|
98
|
+
```nginx
|
|
99
|
+
server {
|
|
100
|
+
listen 80;
|
|
101
|
+
server_name your-site.example;
|
|
102
|
+
root /var/www/your-site;
|
|
103
|
+
index index.html;
|
|
104
|
+
|
|
105
|
+
# SPA 回退:任何未命中的路由都返回 index.html,
|
|
106
|
+
# 让客户端路由接管(/typing/xxx.md 等)
|
|
107
|
+
location / {
|
|
108
|
+
try_files $uri $uri/ /index.html;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
# 静态资源长缓存 —— hash 化过的文件名,可以放心 immutable
|
|
112
|
+
location /assets/ {
|
|
113
|
+
expires 1y;
|
|
114
|
+
add_header Cache-Control "public, immutable";
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
# material/* 短缓存 —— 用户可能重发,不要缓存太久
|
|
118
|
+
location /material/ {
|
|
119
|
+
expires 5m;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
启用 gzip(整个 config 或 site-level):
|
|
125
|
+
|
|
126
|
+
```nginx
|
|
127
|
+
gzip on;
|
|
128
|
+
gzip_types text/plain text/css application/javascript application/json image/svg+xml;
|
|
129
|
+
gzip_min_length 1024;
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
## Docker
|
|
133
|
+
|
|
134
|
+
一个最小 Dockerfile,serve 静态站:
|
|
135
|
+
|
|
136
|
+
```dockerfile
|
|
137
|
+
FROM node:20-alpine AS build
|
|
138
|
+
WORKDIR /app
|
|
139
|
+
COPY . .
|
|
140
|
+
RUN npm install -g @qnroa/qtype && qtype publish build
|
|
141
|
+
|
|
142
|
+
FROM nginx:alpine
|
|
143
|
+
COPY --from=build /app/dist /usr/share/nginx/html
|
|
144
|
+
COPY nginx.conf /etc/nginx/conf.d/default.conf
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
nginx.conf 用上一节的 SPA fallback 配置。
|
|
148
|
+
|
|
149
|
+
## 密码保护的部署注意
|
|
150
|
+
|
|
151
|
+
密码保护是**客户端解密** —— server 只 serve 加密的 `.enc.json`,
|
|
152
|
+
浏览器输密码后本地解密。所以:
|
|
153
|
+
|
|
154
|
+
- ✅ **server 不需要认证** —— 加密内容本身就是保护
|
|
155
|
+
- ✅ 可以放到公开的 GitHub Pages / Cloudflare Pages
|
|
156
|
+
- ⚠️ **攻击者能下载整个 dist**,离线暴力破解 KDF —— argon2id 参数
|
|
157
|
+
(64 MiB / t=3 / p=1)让每次尝试 ≈ 700ms,但不是无限强度。**别用
|
|
158
|
+
弱密码**(< 12 字符的 dictionary 词组)
|
|
159
|
+
- ⚠️ 密码错了后端不知道,只有客户端能识别 —— 所以没有服务端限速。
|
|
160
|
+
view 端有本地限速(3 次错误后冷却 2/5/15 秒)是防止手动敲错的,
|
|
161
|
+
不是安全屏障
|
|
162
|
+
|
|
163
|
+
## 子路径部署(sub-path)
|
|
164
|
+
|
|
165
|
+
如果你的站在 `https://example.com/mydeck/` 而不是根,现在**不支持**
|
|
166
|
+
—— 客户端 fetch `/material/*` 是硬编码的绝对路径。要求根部署,或者
|
|
167
|
+
用反代把 `/mydeck/*` rewrite 成 `/*`。
|
|
168
|
+
|
|
169
|
+
## 验证部署
|
|
170
|
+
|
|
171
|
+
部署完打开:
|
|
172
|
+
- `/` → 应看到 material 列表(如果加密,先看到密码框)
|
|
173
|
+
- `/material/index.json` → JSON manifest
|
|
174
|
+
- 打开浏览器 devtools → Network,应看到:
|
|
175
|
+
- 一次 `/material/index.json`
|
|
176
|
+
- 点某张卡后一次 `/material/<file>.md`(或 `.enc.json`)
|
|
177
|
+
- 图片时 `/material/assets/**/*.svg`
|
|
178
|
+
|
|
179
|
+
**任一 404** = server 没配 SPA fallback 或路径搞错了。
|