├── .dumirc.ts ├── .eslintrc.json ├── .github ├── FUNDING.yml └── workflows │ ├── gh-pages.yml │ └── node.js.yml ├── .gitignore ├── .npmignore ├── CNAME ├── Makefile ├── README.md ├── assets ├── pinyin-favicon.png └── pinyin.png ├── babel.config.js ├── benchmark ├── benchmark.js ├── long.js └── short.js ├── bin └── pinyin ├── docs ├── CHANGELOG.en-US.md ├── CHANGELOG.ko-KR.md ├── CHANGELOG.md ├── EXAMPLE.en-US.md ├── EXAMPLE.ko-KR.md ├── EXAMPLE.md ├── api │ ├── v2 │ │ ├── index.en-US.md │ │ ├── index.ko-KR.md │ │ └── index.md │ ├── v3 │ │ ├── index.en-US.md │ │ ├── index.ko-KR.md │ │ └── index.md │ └── v4 │ │ ├── index.en-US.md │ │ ├── index.ko-KR.md │ │ └── index.md ├── index.en-US.md ├── index.ko-KR.md ├── index.md └── pinyin-table.md ├── index.ts ├── package.json ├── pnpm-lock.yaml ├── public ├── audio │ ├── a.mp3 │ ├── ai.mp3 │ ├── an.mp3 │ ├── ang.mp3 │ ├── ao.mp3 │ ├── ba.mp3 │ ├── bai.mp3 │ ├── ban.mp3 │ ├── bang.mp3 │ ├── bao.mp3 │ ├── bei.mp3 │ ├── ben.mp3 │ ├── beng.mp3 │ ├── bi.mp3 │ ├── bian.mp3 │ ├── biao.mp3 │ ├── bie.mp3 │ ├── bin.mp3 │ ├── bing.mp3 │ ├── bo.mp3 │ ├── bu.mp3 │ ├── ca.mp3 │ ├── cai.mp3 │ ├── can.mp3 │ ├── cang.mp3 │ ├── cao.mp3 │ ├── ce.mp3 │ ├── cen.mp3 │ ├── ceng.mp3 │ ├── cha.mp3 │ ├── chai.mp3 │ ├── chan.mp3 │ ├── chang.mp3 │ ├── chao.mp3 │ ├── che.mp3 │ ├── chen.mp3 │ ├── cheng.mp3 │ ├── chi.mp3 │ ├── chong.mp3 │ ├── chou.mp3 │ ├── chu.mp3 │ ├── chua.mp3 │ ├── chuai.mp3 │ ├── chuan.mp3 │ ├── chuang.mp3 │ ├── chui.mp3 │ ├── chun.mp3 │ ├── chuo.mp3 │ ├── ci.mp3 │ ├── cong.mp3 │ ├── cou.mp3 │ ├── cu.mp3 │ ├── cuan.mp3 │ ├── cui.mp3 │ ├── cun.mp3 │ ├── cuo.mp3 │ ├── da.mp3 │ ├── dai.mp3 │ ├── dan.mp3 │ ├── dang.mp3 │ ├── dao.mp3 │ ├── de.mp3 │ ├── dei.mp3 │ ├── den.mp3 │ ├── deng.mp3 │ ├── di.mp3 │ ├── dian.mp3 │ ├── diao.mp3 │ ├── die.mp3 │ ├── ding.mp3 │ ├── diu.mp3 │ ├── dong.mp3 │ ├── dou.mp3 │ ├── du.mp3 │ ├── duan.mp3 │ ├── dui.mp3 │ ├── dun.mp3 │ ├── duo.mp3 │ ├── e.mp3 │ ├── ei.mp3 │ ├── en.mp3 │ ├── eng.mp3 │ ├── er.mp3 │ ├── fa.mp3 │ ├── fan.mp3 │ ├── fang.mp3 │ ├── fei.mp3 │ ├── fen.mp3 │ ├── feng.mp3 │ ├── fo.mp3 │ ├── fou.mp3 │ ├── fu.mp3 │ ├── ga.mp3 │ ├── gai.mp3 │ ├── gan.mp3 │ ├── gang.mp3 │ ├── gao.mp3 │ ├── ge.mp3 │ ├── gei.mp3 │ ├── gen.mp3 │ ├── geng.mp3 │ ├── gong.mp3 │ ├── gou.mp3 │ ├── gu.mp3 │ ├── gua.mp3 │ ├── guai.mp3 │ ├── guan.mp3 │ ├── guang.mp3 │ ├── gui.mp3 │ ├── gun.mp3 │ ├── guo.mp3 │ ├── ha.mp3 │ ├── hai.mp3 │ ├── han.mp3 │ ├── hang.mp3 │ ├── hao.mp3 │ ├── he.mp3 │ ├── hei.mp3 │ ├── hen.mp3 │ ├── heng.mp3 │ ├── hong.mp3 │ ├── hou.mp3 │ ├── hu.mp3 │ ├── hua.mp3 │ ├── huai.mp3 │ ├── huan.mp3 │ ├── huang.mp3 │ ├── hui.mp3 │ ├── hun.mp3 │ ├── huo (1).mp3 │ ├── huo.mp3 │ ├── ji.mp3 │ ├── jia.mp3 │ ├── jian.mp3 │ ├── jiang.mp3 │ ├── jiao.mp3 │ ├── jie.mp3 │ ├── jin.mp3 │ ├── jing.mp3 │ ├── jiong.mp3 │ ├── jiu.mp3 │ ├── ju.mp3 │ ├── juan.mp3 │ ├── jue.mp3 │ ├── jun.mp3 │ ├── ka.mp3 │ ├── kai.mp3 │ ├── kan.mp3 │ ├── kang.mp3 │ ├── kao.mp3 │ ├── ke.mp3 │ ├── kei.mp3 │ ├── ken.mp3 │ ├── keng.mp3 │ ├── kong.mp3 │ ├── kou.mp3 │ ├── ku.mp3 │ ├── kua.mp3 │ ├── kuai.mp3 │ ├── kuan.mp3 │ ├── kuang.mp3 │ ├── kui.mp3 │ ├── kun.mp3 │ ├── kuo.mp3 │ ├── la.mp3 │ ├── lai.mp3 │ ├── lan.mp3 │ ├── lang.mp3 │ ├── lao.mp3 │ ├── le.mp3 │ ├── lei.mp3 │ ├── leng.mp3 │ ├── li.mp3 │ ├── lia.mp3 │ ├── lian.mp3 │ ├── liang.mp3 │ ├── liao.mp3 │ ├── lie.mp3 │ ├── lin.mp3 │ ├── ling.mp3 │ ├── liu.mp3 │ ├── long.mp3 │ ├── lou.mp3 │ ├── lu.mp3 │ ├── luan.mp3 │ ├── lun.mp3 │ ├── luo.mp3 │ ├── lv.mp3 │ ├── lve.mp3 │ ├── ma.mp3 │ ├── mai.mp3 │ ├── man.mp3 │ ├── mang.mp3 │ ├── mao.mp3 │ ├── me.mp3 │ ├── mei.mp3 │ ├── men.mp3 │ ├── meng.mp3 │ ├── mi.mp3 │ ├── mian.mp3 │ ├── miao.mp3 │ ├── mie.mp3 │ ├── min.mp3 │ ├── ming.mp3 │ ├── miu.mp3 │ ├── mo.mp3 │ ├── mou.mp3 │ ├── mu.mp3 │ ├── na.mp3 │ ├── nai.mp3 │ ├── nan.mp3 │ ├── nang.mp3 │ ├── nao.mp3 │ ├── ne.mp3 │ ├── nei.mp3 │ ├── nen.mp3 │ ├── neng.mp3 │ ├── ni.mp3 │ ├── nian.mp3 │ ├── niang.mp3 │ ├── niao.mp3 │ ├── nie.mp3 │ ├── nin.mp3 │ ├── ning.mp3 │ ├── niu.mp3 │ ├── nong.mp3 │ ├── nou.mp3 │ ├── nu.mp3 │ ├── nuan.mp3 │ ├── nuo.mp3 │ ├── nv.mp3 │ ├── nve.mp3 │ ├── o.mp3 │ ├── ou.mp3 │ ├── pa.mp3 │ ├── pai.mp3 │ ├── pan.mp3 │ ├── pang.mp3 │ ├── pao.mp3 │ ├── pei.mp3 │ ├── pen.mp3 │ ├── peng.mp3 │ ├── pi.mp3 │ ├── pian.mp3 │ ├── piao.mp3 │ ├── pie.mp3 │ ├── pin.mp3 │ ├── ping.mp3 │ ├── po.mp3 │ ├── pou.mp3 │ ├── pu.mp3 │ ├── qi.mp3 │ ├── qia.mp3 │ ├── qian.mp3 │ ├── qiang.mp3 │ ├── qiao.mp3 │ ├── qie.mp3 │ ├── qin.mp3 │ ├── qing.mp3 │ ├── qiong.mp3 │ ├── qiu.mp3 │ ├── qu.mp3 │ ├── quan.mp3 │ ├── que.mp3 │ ├── qun.mp3 │ ├── ran.mp3 │ ├── rang.mp3 │ ├── rao.mp3 │ ├── re.mp3 │ ├── ren.mp3 │ ├── reng.mp3 │ ├── ri.mp3 │ ├── rong.mp3 │ ├── rou.mp3 │ ├── ru.mp3 │ ├── rua.mp3 │ ├── ruan.mp3 │ ├── rui.mp3 │ ├── run.mp3 │ ├── ruo.mp3 │ ├── sa.mp3 │ ├── sai.mp3 │ ├── san.mp3 │ ├── sang.mp3 │ ├── sao.mp3 │ ├── se.mp3 │ ├── sen.mp3 │ ├── seng.mp3 │ ├── sha.mp3 │ ├── shai.mp3 │ ├── shan.mp3 │ ├── shang.mp3 │ ├── shao.mp3 │ ├── she.mp3 │ ├── shei.mp3 │ ├── shen.mp3 │ ├── sheng.mp3 │ ├── shi.mp3 │ ├── shou.mp3 │ ├── shu.mp3 │ ├── shua.mp3 │ ├── shuai.mp3 │ ├── shuan.mp3 │ ├── shuang.mp3 │ ├── shui.mp3 │ ├── shun.mp3 │ ├── shuo.mp3 │ ├── si.mp3 │ ├── song.mp3 │ ├── sou.mp3 │ ├── su.mp3 │ ├── suan.mp3 │ ├── sui.mp3 │ ├── sun.mp3 │ ├── suo.mp3 │ ├── ta.mp3 │ ├── tai.mp3 │ ├── tan.mp3 │ ├── tang.mp3 │ ├── tao.mp3 │ ├── te.mp3 │ ├── teng.mp3 │ ├── ti.mp3 │ ├── tian.mp3 │ ├── tiao.mp3 │ ├── tie.mp3 │ ├── ting.mp3 │ ├── tong.mp3 │ ├── tou.mp3 │ ├── tu.mp3 │ ├── tuan.mp3 │ ├── tui.mp3 │ ├── tun.mp3 │ ├── tuo.mp3 │ ├── wa.mp3 │ ├── wai.mp3 │ ├── wan.mp3 │ ├── wang.mp3 │ ├── wei.mp3 │ ├── wen.mp3 │ ├── weng.mp3 │ ├── wo.mp3 │ ├── wu.mp3 │ ├── xi.mp3 │ ├── xia.mp3 │ ├── xian.mp3 │ ├── xiang.mp3 │ ├── xiao.mp3 │ ├── xie.mp3 │ ├── xin.mp3 │ ├── xing.mp3 │ ├── xiong.mp3 │ ├── xiu.mp3 │ ├── xu.mp3 │ ├── xuan.mp3 │ ├── xue.mp3 │ ├── xun.mp3 │ ├── ya.mp3 │ ├── yan.mp3 │ ├── yang.mp3 │ ├── yao.mp3 │ ├── ye.mp3 │ ├── yi.mp3 │ ├── yin.mp3 │ ├── ying.mp3 │ ├── yong.mp3 │ ├── you.mp3 │ ├── yu.mp3 │ ├── yuan.mp3 │ ├── yue.mp3 │ ├── yun.mp3 │ ├── za.mp3 │ ├── zai.mp3 │ ├── zan.mp3 │ ├── zang.mp3 │ ├── zao.mp3 │ ├── ze.mp3 │ ├── zei.mp3 │ ├── zen.mp3 │ ├── zeng.mp3 │ ├── zha.mp3 │ ├── zhai.mp3 │ ├── zhan.mp3 │ ├── zhang.mp3 │ ├── zhao.mp3 │ ├── zhe.mp3 │ ├── zhei.mp3 │ ├── zhen.mp3 │ ├── zheng.mp3 │ ├── zhi.mp3 │ ├── zhong.mp3 │ ├── zhou.mp3 │ ├── zhu.mp3 │ ├── zhua.mp3 │ ├── zhuai.mp3 │ ├── zhuan.mp3 │ ├── zhuang.mp3 │ ├── zhui.mp3 │ ├── zhun.mp3 │ ├── zhuo.mp3 │ ├── zi.mp3 │ ├── zong.mp3 │ ├── zou.mp3 │ ├── zu.mp3 │ ├── zuan.mp3 │ ├── zui.mp3 │ └── zuo.mp3 ├── favicon.png └── logo.png ├── rollup.config.js ├── src ├── PinyinBase.ts ├── constant.ts ├── data │ ├── compound_surname.ts │ ├── dict-zi.ts │ ├── dict.bin │ ├── phrases-dict.ts │ └── surname.ts ├── declare.ts ├── format.ts ├── phonetic-symbol.ts ├── pinyin-web.ts ├── pinyin.ts ├── segment-web.ts ├── segment.ts └── util.ts ├── test ├── cli.test.ts ├── segment-web.test.ts ├── segment.test.ts ├── test.ts └── util.test.ts ├── tools ├── a2b.js ├── ci │ └── phrases.js ├── combo-dict.js ├── debug.ts ├── dict │ ├── dict-ci.js │ ├── dict-pinyin.js │ ├── dict-zi-frequent.js │ ├── dict-zi-infrequent.js │ ├── dict-zi-web.js │ └── dict-zi.js ├── infrequent.js ├── phonetics.js ├── pinyin-table │ ├── context.tsx │ ├── pinyin-table.css │ └── pinyin-table.tsx ├── robot-ci.js ├── robot-frequent.js ├── robot-infrequent.js ├── robot-zdic-zi.js ├── robot-zi.js ├── segment.js ├── urlencode.js └── zi │ ├── all.js │ ├── frequent.js │ ├── frequent2.js │ └── infrequent.js ├── tsconfig-amd.json ├── tsconfig-es5.json └── tsconfig.json /.dumirc.ts: -------------------------------------------------------------------------------- 1 | // import { readdirSync } from 'fs'; 2 | // import { join } from 'path'; 3 | import { defineConfig } from 'dumi'; 4 | 5 | // const headPkgList = []; 6 | // // utils must build before core 7 | // // runtime must build before renderer-react 8 | // const pkgList = readdirSync(join(__dirname, 'packages')).filter( 9 | // (pkg) => pkg.charAt(0) !== '.' && !headPkgList.includes(pkg), 10 | // ); 11 | // const alias = pkgList.reduce((pre, pkg) => { 12 | // pre[`@alipay/${pkg}`] = join(__dirname, 'packages', pkg, 'src'); 13 | // return { 14 | // ...pre, 15 | // }; 16 | // }, {}); 17 | 18 | export default defineConfig({ 19 | title: 'pīnyīn', 20 | favicons: [ 21 | '/favicon.png', 22 | 'https://gw.alipayobjects.com/mdn/rms_f6322a/afts/img/A*VqPXS4ODZTMAAAAAAAAAAAAAARQnAQ', 23 | ], 24 | logo: '/logo.png', 25 | outputPath: 'docs-dist', 26 | // mode: 'doc', 27 | exportStatic: {}, 28 | ssr: { mode: 'stream' }, 29 | hash: true, 30 | themeConfig: { 31 | nav: { 32 | 'zh-CN': [ 33 | { title: '首页', link: '/' }, 34 | { title: 'API文档', link: '/api/v4/', 35 | children: [ 36 | { title: 'v4', link: '/api/v4/' }, 37 | { title: 'v3', link: '/api/v3/' }, 38 | { title: 'v2', link: '/api/v2/' }, 39 | ], 40 | }, 41 | { title: '演示文档', link: '/example/' }, 42 | { title: '拼音表', link: '/pinyin-table' }, 43 | ], 44 | 'en-US': [ 45 | { title: 'Home', link: '/en-US/' }, 46 | { title: 'API', link: '/en-US/api/v4/', 47 | children: [ 48 | { title: 'v4', link: '/en-US/api/v4/' }, 49 | { title: 'v3', link: '/en-US/api/v3/' }, 50 | { title: 'v2', link: '/en-US/api/v2/' }, 51 | ], 52 | }, 53 | { title: 'Example', link: '/en-US/example/' }, 54 | { title: 'Pinyin Table', link: '/pinyin-table' }, 55 | ], 56 | 'ko-KR': [ 57 | { title: 'Home', link: '/ko-KR/' }, 58 | { title: 'API', link: '/ko-KR/api/v4/', 59 | children: [ 60 | { title: 'v4', link: '/ko-KR/api/v4/' }, 61 | { title: 'v3', link: '/ko-KR/api/v3/' }, 62 | { title: 'v2', link: '/ko-KR/api/v2/' }, 63 | ], 64 | }, 65 | { title: 'Example', link: '/ko-KR/example/' }, 66 | { title: 'Pinyin Table', link: '/pinyin-table' }, 67 | ], 68 | }, 69 | prefersColor: { default: 'auto' }, 70 | socialLinks: { 71 | github: 'https://github.com/hotoo/pinyin', 72 | }, 73 | footer: `Open-source MIT Licensed | Copyright © 2019-${new Date().getFullYear()}`, 74 | }, 75 | // resolve: { 76 | // includes: ['.'], 77 | // }, 78 | locales: [ 79 | { id: 'zh-CN', name: '中文'}, 80 | { id: 'en-US', name: 'English' }, 81 | { id: 'ko-KR', name: '한국어' }, 82 | ], 83 | // Because of using GitHub Pages 84 | base: '/', 85 | publicPath: '/', 86 | copy: [ 87 | 'CNAME', 'public', 88 | ], 89 | // alias, 90 | mfsu: { 91 | esbuild: true, 92 | ignoreNodeBuiltInModules: true, 93 | }, 94 | legacy: { 95 | nodeModulesTransform: false, 96 | }, 97 | extraBabelIncludes: [ 98 | 'nodejieba', '@node-rs/jieba', 99 | ], 100 | analytics: { 101 | ga_v2: 'G-B24X7338JP', 102 | }, 103 | // more config: https://d.umijs.org/config 104 | }); 105 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "parser": "@typescript-eslint/parser", 3 | "plugins": ["@typescript-eslint", "prettier"], 4 | "extends": [ 5 | "eslint:recommended", 6 | "plugin:@typescript-eslint/recommended", 7 | "prettier" 8 | ], 9 | "rules": { 10 | "@typescript-eslint/ban-ts-comment": "warn", 11 | 12 | "@typescript-eslint/no-unused-vars": "error", 13 | "@typescript-eslint/no-explicit-any": "warn", 14 | "quotes": ["error", "double"], 15 | "comma-dangle": ["error", "always-multiline"], 16 | "semi": ["error", "always"] 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /.github/FUNDING.yml: -------------------------------------------------------------------------------- 1 | # These are supported funding model platforms 2 | 3 | github: [hotoo] 4 | 5 | # patreon: # Replace with a single Patreon username 6 | # open_collective: # Replace with a single Open Collective username 7 | # ko_fi: # Replace with a single Ko-fi username 8 | # tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel 9 | # community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry 10 | # liberapay: # Replace with a single Liberapay username 11 | # issuehunt: # Replace with a single IssueHunt username 12 | # lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry 13 | # polar: # Replace with a single Polar username 14 | # buy_me_a_coffee: # Replace with a single Buy Me a Coffee username 15 | # thanks_dev: # Replace with a single thanks.dev username 16 | # custom: # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2'] 17 | -------------------------------------------------------------------------------- /.github/workflows/gh-pages.yml: -------------------------------------------------------------------------------- 1 | name: github pages 2 | 3 | on: 4 | push: 5 | branches: 6 | - master # default branch 7 | 8 | jobs: 9 | deploy: 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Checkout 13 | uses: actions/checkout@v4 14 | with: 15 | # 如果配置 themeConfig.lastUpdated 为 false,则不需要添加该参数以加快检出速度 16 | fetch-depth: 0 17 | - name: Install pnpm 18 | uses: pnpm/action-setup@v4 19 | with: 20 | version: 10 21 | - name: Install dependencies 22 | run: pnpm install 23 | - name: Build project 24 | run: pnpm build 25 | - name: Build with dumi 26 | # 文档编译命令,如果是 react 模板需要修改为 npm run docs:build 27 | run: pnpm doc:build 28 | - name: Deploy 29 | uses: peaceiris/actions-gh-pages@v3 30 | with: 31 | github_token: ${{ secrets.GITHUB_TOKEN }} 32 | # 文档目录,如果是 react 模板需要修改为 docs-dist 33 | publish_dir: ./docs-dist -------------------------------------------------------------------------------- /.github/workflows/node.js.yml: -------------------------------------------------------------------------------- 1 | # This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node 2 | # For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions 3 | 4 | name: Node.js CI 5 | 6 | on: 7 | push: 8 | branches: [ master, v3.x, v2.x ] 9 | pull_request: 10 | branches: [ master, v3.x, v2.x ] 11 | 12 | jobs: 13 | build: 14 | 15 | runs-on: ubuntu-latest 16 | 17 | strategy: 18 | matrix: 19 | node-version: [18.x, 20.x, 22.x] 20 | # See supported Node.js release schedule at https://nodejs.org/en/about/releases/ 21 | 22 | steps: 23 | - uses: actions/checkout@v4 24 | - name: Install pnpm 25 | uses: pnpm/action-setup@v4 26 | with: 27 | version: 10 28 | - name: Use Node.js ${{ matrix.node-version }} 29 | uses: actions/setup-node@v4 30 | with: 31 | node-version: ${{ matrix.node-version }} 32 | - name: Install dependencies 33 | run: pnpm install 34 | - name: Lint 35 | run: pnpm lint 36 | - name: Build project 37 | run: pnpm build 38 | - name: Test project 39 | run: pnpm test 40 | 41 | - name: Coveralls 42 | uses: coverallsapp/github-action@master 43 | with: 44 | github-token: ${{ secrets.GITHUB_TOKEN }} 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .idea/ 3 | .ipr 4 | .iws 5 | *~ 6 | ~* 7 | *.diff 8 | *.patch 9 | *.bak 10 | .DS_Store 11 | Thumbs.db 12 | .project 13 | .*proj 14 | .svn/ 15 | *.swp 16 | *.swo 17 | *.pyc 18 | *.pyo 19 | build 20 | esm 21 | amd 22 | lib 23 | lib2 24 | node_modules 25 | _site 26 | sea-modules 27 | .jscoverage/ 28 | tmp/* 29 | Desktop.ini 30 | Thumb.db 31 | .cache/* 32 | dist/ 33 | npm-debug.log 34 | spm_modules/ 35 | tools/dict/error.log 36 | coverage/ 37 | package-lock.json 38 | yarn.lock 39 | .umi/ 40 | .nyc_output 41 | .pnpm-debug.log 42 | .umi-production 43 | .dumi/ 44 | docs-dist/ 45 | server/ 46 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | tools/ 2 | spm_modules/ 3 | CNAME 4 | .travis.yml 5 | .spmignore 6 | tests/ 7 | -------------------------------------------------------------------------------- /CNAME: -------------------------------------------------------------------------------- 1 | pinyin.js.org 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | version = $(shell cat package.json | grep version | awk -F'"' '{print $$4}') 2 | 3 | install: 4 | @npm install 5 | 6 | publish: test 7 | @npm publish --tag alpha 8 | @git tag $(version) 9 | @git push origin $(version) 10 | 11 | publishDoc: 12 | @npm run doc:deploy 13 | 14 | clean: 15 | @rm -fr _site 16 | 17 | 18 | runner = _site/tests/runner.html 19 | 20 | benchmark: 21 | @node benchmark/benchmark.js 22 | 23 | test-npm: 24 | @npm test 25 | 26 | 27 | lint: 28 | @npm run lint 29 | 30 | test: lint test-npm 31 | 32 | test-local: test-npm 33 | 34 | output = _site/coverage.html 35 | coverage: 36 | @rm -fr _site/src-cov 37 | @jscoverage --encoding=utf8 src _site/src-cov 38 | @mocha-browser ${runner}?cov -S -R html-cov > ${output} 39 | @echo "Build coverage to ${output}" 40 | 41 | 42 | ZI_DICT_FREQUENT = ./tools/dict/zi-frequent.js 43 | ZI_DICT_INFREQUENT = ./tools/dict/zi-infrequent.js 44 | ZI_DICT= ./tools/dict/dict-zi.js 45 | ZI_DICT_WEB= ./tools/dict/dict-zi-web.js 46 | 47 | dict-web: 48 | @echo 'module.exports = {' > $(ZI_DICT_FREQUENT) 49 | @node ./tools/robot-frequent.js >> $(ZI_DICT_FREQUENT) 50 | @echo '};' >> $(ZI_DICT_FREQUENT) 51 | @echo 'module.exports = {' > $(ZI_DICT_INFREQUENT) 52 | @node ./tools/robot-infrequent.js >> $(ZI_DICT_INFREQUENT) 53 | @echo '};' >> $(ZI_DICT_INFREQUENT) 54 | @node ./tools/combo-dict.js > $(ZI_DICT_WEB) 55 | 56 | dict-node: 57 | @echo 'var dict = [];' > $(ZI_DICT) 58 | @node ./tools/robot-zdic-zi.js >> $(ZI_DICT) 59 | @echo 'module.exports = dict;' >> $(ZI_DICT) 60 | 61 | infrequent: 62 | @node ./tools/infrequent.js > ./tools/zi/infrequent.js 63 | 64 | .PHONY: server clean test test-local coverage test-npm test-cli lint benchmark publish publishDoc 65 | -------------------------------------------------------------------------------- /assets/pinyin-favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/assets/pinyin-favicon.png -------------------------------------------------------------------------------- /assets/pinyin.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/assets/pinyin.png -------------------------------------------------------------------------------- /babel.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [ 3 | [ "@babel/preset-env", {targets: {node: "current"}} ], 4 | [ "@babel/preset-typescript", {allExtensions: true}], 5 | ], 6 | "compact": true, 7 | }; 8 | -------------------------------------------------------------------------------- /benchmark/benchmark.js: -------------------------------------------------------------------------------- 1 | const Benchmark = require("benchmark"); 2 | const pinyin = require("../"); 3 | 4 | const pkg = require("../package.json"); 5 | 6 | let memory = process.memoryUsage().rss; 7 | 8 | console.log(pkg.name + "@" + pkg.version); 9 | 10 | function formatNunber(num) { 11 | return String(num).replace(/(\d)(?=(\d{3})+$)/g, "$1,"); 12 | } 13 | 14 | const suite = new Benchmark.Suite(); 15 | 16 | suite.add("pinyin 中文", function(){ 17 | return pinyin("中文"); 18 | }) 19 | .add("pinyin --heteronym 中文", function(){ 20 | return pinyin("中文", { 21 | heteronym: true, 22 | }); 23 | }) 24 | .add("pinyin --style NORMAL --heteronym 中文", function(){ 25 | return pinyin("中文", { 26 | heteronym: true, 27 | style: "NORMAL", 28 | }); 29 | }) 30 | .add("pinyin --segment 中文", function(){ 31 | return pinyin("中文", { 32 | segment: true, 33 | }); 34 | }) 35 | .add("pinyin --segment --heteronym 中文", function(){ 36 | return pinyin("中文", { 37 | heteronym: true, 38 | segment: true, 39 | }); 40 | }) 41 | .add("pinyin --segment --heteronym --style NORMAL 中文", function(){ 42 | return pinyin("中文", { 43 | heteronym: true, 44 | segment: true, 45 | style: "NORMAL", 46 | }); 47 | }) 48 | .on("cycle", function(event) { 49 | const mem = process.memoryUsage().rss; 50 | console.log(String(event.target) + " memory usage: %s bytes.", formatNunber(mem - memory)); 51 | memory = mem; 52 | }) 53 | .on("complete", function() { 54 | console.log("Fastest is " + this.filter("fastest").pluck("name")); 55 | }) 56 | .run(); 57 | -------------------------------------------------------------------------------- /benchmark/short.js: -------------------------------------------------------------------------------- 1 | var memory = process.memoryUsage().rss; 2 | 3 | var text = "你好拼音"; 4 | 5 | var pinyin = require("../web-pinyin"); 6 | console.time("pinyin"); 7 | pinyin(text); 8 | console.timeEnd("pinyin"); 9 | console.log(process.memoryUsage().rss - memory); 10 | -------------------------------------------------------------------------------- /bin/pinyin: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | var commander = require('commander'); 4 | 5 | commander. 6 | version(require('../package').version). 7 | usage('[options] 汉字'). 8 | option('-v, --version', 'output the version number'). 9 | option('-s, --style 143 | -------------------------------------------------------------------------------- /docs/api/v2/index.en-US.md: -------------------------------------------------------------------------------- 1 | # pīnyīn (v2) 2 | 3 | pinyin, The convert tool of chinese pinyin. 4 | 5 | --- 6 | 7 | [![NPM version][npm-badge]][npm-url] 8 | [![Build Status][build-badge]][build-url] 9 | [![Coverage Status][coveralls-badge]][coveralls-url] 10 | [![NPM downloads][npm-downloads]][npm-url] 11 | 12 | 13 | [npm-badge]: https://img.shields.io/npm/v/pinyin.svg?style=flat 14 | [npm-url]: https://www.npmjs.com/package/pinyin 15 | [npm-downloads]: http://img.shields.io/npm/dm/pinyin.svg?style=flat 16 | [build-badge]: https://github.com/hotoo/pinyin/actions/workflows/node.js.yml/badge.svg 17 | [build-url]: https://github.com/hotoo/pinyin/actions 18 | [coveralls-badge]: https://coveralls.io/repos/hotoo/pinyin/badge.svg?branch=master 19 | [coveralls-url]: https://coveralls.io/r/hotoo/pinyin 20 | 21 | 22 | [简体中文](https://pinyin.js.org/api/v2/) | English 23 | 24 | 25 | Convert Han to pinyin. useful for phonetic notation, sorting, and searching. 26 | 27 | > Note: This module both support Node and Web browser. 28 | > 29 | > Python version see [mozillazg/python-pinyin](https://github.com/mozillazg/python-pinyin) 30 | 31 | --- 32 | 33 | ## Feature 34 | 35 | * Segmentation for heteronym words. 36 | * Support Traditional and Simplified Chinese. 37 | * Support multiple pinyin style. 38 | 39 | ## Install 40 | 41 | via npm: 42 | 43 | ```bash 44 | npm install pinyin@2.0 --save 45 | ``` 46 | 47 | ## Usage 48 | 49 | for developer: 50 | 51 | ```js 52 | var pinyin = require("pinyin"); 53 | 54 | console.log(pinyin("中心")); // [ [ 'zhōng' ], [ 'xīn' ] ] 55 | console.log(pinyin("中心", { 56 | heteronym: true // Enable heteronym mode. 57 | })); // [ [ 'zhōng', 'zhòng' ], [ 'xīn' ] ] 58 | console.log(pinyin("中心", { 59 | heteronym: true, // Enable heteronym mode. 60 | segment: true // Enable Chinese words segmentation, fix most heteronym problem. 61 | })); // [ [ 'zhōng' ], [ 'xīn' ] ] 62 | console.log(pinyin("我喜欢你", { 63 | segment: true, // Enable segmentation. Needed for grouping. 64 | group: true // Group pinyin segments 65 | })); // [ [ 'wǒ' ], [ 'xǐhuān' ], [ 'nǐ' ] ] 66 | console.log(pinyin("中心", { 67 | style: pinyin.STYLE_INITIALS, // Setting pinyin style. 68 | heteronym: true 69 | })); // [ [ 'zh' ], [ 'x' ] ] 70 | ``` 71 | 72 | for cli: 73 | 74 | ```bash 75 | $ pinyin 中心 76 | zhōng xīn 77 | $ pinyin -h 78 | ``` 79 | 80 | ## API 81 | 82 | ### ` pinyin(words[, options])` 83 | 84 | Convert Han (汉字) to pinyin. 85 | 86 | `options` argument is optional, for sepcify heteronym mode and pinyin styles. 87 | 88 | Return a `Array>`. If one of Han is heteronym word, it would be 89 | have multiple pinyin. 90 | 91 | ### `Number pinyin.compare(a, b)` 92 | 93 | Default compare implementation for pinyin. 94 | 95 | 96 | ## Options 97 | 98 | #### ` options.segment` 99 | 100 | Enable Chinese word segmentation. Segmentation is helpful for fix heteronym 101 | problem, but performance will be more slow, and need more CPU and memory. 102 | 103 | Default is `false`. 104 | 105 | ### ` options.heteronym` 106 | 107 | Enable or disable heteronym mode. default is disabled, `false`. 108 | 109 | ### ` options.group` 110 | 111 | Group pinyin by phrases. for example: 112 | 113 | ``` 114 | 我喜欢你 115 | wǒ xǐhuān nǐ 116 | ``` 117 | 118 | ### ` options.style` 119 | 120 | Specify pinyin style. please use static properties like `STYLE_*`. 121 | default is `.STYLE_TONE`. see Static Property for more. 122 | 123 | ### `options.mode` 124 | 125 | pinyin mode, default is `pinyin.MODE_NORMAL`. If you cleared in surname scene, 126 | use `pinyin.MODE_SURNAME` maybe better. 127 | 128 | ## Static Property 129 | 130 | ### `.STYLE_NORMAL` 131 | 132 | Normal mode. 133 | 134 | Example: `pin yin` 135 | 136 | ### `.STYLE_TONE` 137 | 138 | Tone style, this is default. 139 | 140 | Example: `pīn yīn` 141 | 142 | ### `.STYLE_TONE2` 143 | 144 | tone style by postfix number [0-4]. 145 | 146 | Example: `pin1 yin1` 147 | 148 | ### `.STYLE_TO3NE` 149 | 150 | tone style by number [0-4] after phonetic notation character. 151 | 152 | Example: `pin1 yin1` 153 | 154 | ### `.STYLE_INITIALS` 155 | 156 | Initial consonant (of a Chinese syllable). 157 | 158 | Example: pinyin of `中国` is `zh g` 159 | 160 | Note: when a Han (汉字) without initial consonant, will convert to empty string. 161 | 162 | ### `.STYLE_FIRST_LETTER` 163 | 164 | First letter style. 165 | 166 | Example: `p y` 167 | 168 | ### `pinyin.MODE_NORMAL` 169 | 170 | Normal mode. This is the default mode. 171 | 172 | ### `pinyin.MODE_SURNAME` 173 | 174 | Surname mode. If chinese word is surname, The pinyin of surname is prioritized. 175 | 176 | ## Test 177 | 178 | ``` 179 | npm test 180 | ``` 181 | 182 | ## Q&A 183 | 184 | ### What's the different Node version and Web version? 185 | 186 | `pinyin` support Node and Web browser now, the API and usage is complete same. 187 | 188 | But the Web version is simple than Node version. Just frequently-used dict, 189 | without segmentation, and the dict is compress for web. 190 | 191 | Because of Traditional and Segmentation, the convert result will be not complete same. 192 | and the test case have some different too. 193 | 194 | | Feature | Web version | Node version | 195 | |--------------|---------------------------------|----------------------------------| 196 | | Dict | Frequently-used Dict, Compress. | Complete Dict, without Compress. | 197 | | Segmentation | NO | Segmentation options. | 198 | | Traditional | NO | Full Traditional support. | 199 | 200 | 201 | ### How to sort by pinyin? 202 | 203 | This module provide default compare implementation: 204 | 205 | ```js 206 | const pinyin = require('pinyin'); 207 | 208 | const data = '我要排序'.split(''); 209 | const sortedData = data.sort(pinyin.compare); 210 | ``` 211 | 212 | But if you need different implementation, do it like: 213 | 214 | ``` 215 | const pinyin = require('pinyin'); 216 | 217 | const data = '我要排序'.split(''); 218 | 219 | // Suggest you to store pinyin result by data persistence. 220 | const pinyinData = data.map(han => ({ 221 | han: han, 222 | pinyin: pinyin(han)[0][0], // Choose you options and styles. 223 | })); 224 | const sortedData = pinyinData.sort((a, b) => { 225 | return a.pinyin.localeCompare(b.pinyin); 226 | }).map(d => d.han); 227 | ``` 228 | 229 | ## Donate 230 | 231 | If this module is helpful for you, please Star this repository. 232 | 233 | And you have chioce donate to me via Aliapy or WeChat: 234 | 235 | Alipay:hotoo.cn@gmail.com, WeChat:hotoome 236 | 237 | 238 | ## License 239 | 240 | [MIT](http://hotoo.mit-license.org/) 241 | -------------------------------------------------------------------------------- /docs/api/v2/index.ko-KR.md: -------------------------------------------------------------------------------- 1 | # pīnyīn (v2) 2 | 3 | [简体中文](https://pinyin.js.org/api/v2/) | [English](https://pinyin.js.org/en-US/api/v2/) -------------------------------------------------------------------------------- /docs/api/v2/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | nav: 3 | # 同时设置二级导航名称和顺序,order 越小越靠前,默认为 0 4 | second: 5 | title: 2.x 6 | order: 2 7 | --- 8 | 9 | # pīnyīn (v2) 10 | 11 | pīnyīn, 汉字拼音转换工具。 12 | 13 | ---- 14 | 15 | [![NPM version][npm-badge]][npm-url] 16 | [![Build Status][build-badge]][build-url] 17 | [![Coverage Status][coveralls-badge]][coveralls-url] 18 | [![NPM downloads][npm-downloads]][npm-url] 19 | 20 | 21 | [npm-badge]: https://img.shields.io/npm/v/pinyin.svg?style=flat 22 | [npm-url]: https://www.npmjs.com/package/pinyin 23 | [npm-downloads]: http://img.shields.io/npm/dm/pinyin.svg?style=flat 24 | [build-badge]: https://github.com/hotoo/pinyin/actions/workflows/node.js.yml/badge.svg 25 | [build-url]: https://github.com/hotoo/pinyin/actions 26 | [coveralls-badge]: https://coveralls.io/repos/hotoo/pinyin/badge.svg?branch=master 27 | [coveralls-url]: https://coveralls.io/r/hotoo/pinyin 28 | 29 | 30 | 简体中文 | [English](https://pinyin.js.org/en-US/api/v2/) 31 | 32 | 33 | 转换中文字符为拼音。可以用于汉字注音、排序、检索。 34 | 35 | > 注:这个版本同时支持在 Node 和 Web 浏览器环境运行, 36 | > 37 | > Python 版请关注 [mozillazg/python-pinyin](https://github.com/mozillazg/python-pinyin) 38 | 39 | ---- 40 | 41 | ## 特性 42 | 43 | * 根据词组智能匹配最正确的拼音。 44 | * 支持多音字。 45 | * 简单的繁体支持。 46 | * 支持多种不同拼音风格。 47 | 48 | ## 安装 49 | 50 | via npm: 51 | 52 | ```bash 53 | npm install pinyin@2.0 --save 54 | ``` 55 | 56 | ## 用法 57 | 58 | 开发者: 59 | 60 | ```js 61 | var pinyin = require("pinyin"); 62 | 63 | console.log(pinyin("中心")); // [ [ 'zhōng' ], [ 'xīn' ] ] 64 | console.log(pinyin("中心", { 65 | heteronym: true // 启用多音字模式 66 | })); // [ [ 'zhōng', 'zhòng' ], [ 'xīn' ] ] 67 | console.log(pinyin("中心", { 68 | heteronym: true, // 启用多音字模式 69 | segment: true // 启用分词,以解决多音字问题。 70 | })); // [ [ 'zhōng' ], [ 'xīn' ] ] 71 | console.log(pinyin("我喜欢你", { 72 | segment: true, // 启用分词 73 | group: true // 启用词组 74 | })); // [ [ 'wǒ' ], [ 'xǐhuān' ], [ 'nǐ' ] ] 75 | console.log(pinyin("中心", { 76 | style: pinyin.STYLE_INITIALS, // 设置拼音风格 77 | heteronym: true 78 | })); // [ [ 'zh' ], [ 'x' ] ] 79 | ``` 80 | 81 | 命令行: 82 | 83 | ```bash 84 | $ pinyin 中心 85 | zhōng xīn 86 | $ pinyin -h 87 | ``` 88 | 89 | 90 | ## API 91 | 92 | ### 方法 ` pinyin(words[, options])` 93 | 94 | 将传入的中文字符串 (words) 转换成拼音符号串。 95 | 96 | options 是可选的,可以设定拼音风格,或打开多音字选项。 97 | 98 | 返回二维数组,第一维每个数组项位置对应每个中文字符串位置。 99 | 第二维是各个汉字的读音列表,多音字会有多个拼音项。 100 | 101 | ### 方法 `Number pinyin.compare(a, b)` 102 | 103 | 按拼音排序的默认算法。 104 | 105 | ## 参数 106 | 107 | ### ` options.segment` 108 | 109 | 是否启用分词模式,中文分词有助于极大的降低多音字问题。 110 | 但性能会极大的下降,内存也会使用更多。 111 | 112 | ### ` options.heteronym` 113 | 114 | 是否启用多音字模式,默认关闭。 115 | 116 | 关闭多音字模式时,返回每个汉字第一个匹配的拼音。 117 | 118 | 启用多音字模式时,返回多音字的所有拼音列表。 119 | 120 | ### ` options.group` 121 | 122 | 按词组分组拼音,例如: 123 | 124 | ``` 125 | 我喜欢你 126 | wǒ xǐhuān nǐ 127 | ``` 128 | 129 | ### ` options.style` 130 | 131 | 指定拼音 风格。可以通过以下几种 `STYLE_` 开头的静态属性进行指定。 132 | 133 | ### options.mode 134 | 135 | 拼音模式,默认 `pinyin.MODE_NORMAL` 普通模式。 136 | 如果你明确的在姓名场景下,可以使用 `pinyin.MODE_SURNAME` 让姓氏使用更准确的拼音。 137 | 138 | ## 静态属性 139 | 140 | ### `.STYLE_NORMAL` 141 | 142 | 普通风格,即不带声调。 143 | 144 | 如:`pin yin` 145 | 146 | ### `.STYLE_TONE` 147 | 148 | 声调风格,拼音声调在韵母第一个字母上。 149 | 150 | 注:这是默认的风格。 151 | 152 | 如:`pīn yīn` 153 | 154 | ### `.STYLE_TONE2` 155 | 156 | 声调风格 2,即拼音声调以数字形式在各个拼音之后,用数字 [0-4] 进行表示。 157 | 158 | 如:`pin1 yin1` 159 | 160 | ### `.STYLE_TO3NE` 161 | 162 | 声调风格 3,即拼音声调以数字形式在注音字符之后,用数字 [0-4] 进行表示。 163 | 164 | 如:`pi1n yi1n` 165 | 166 | ### `.STYLE_INITIALS` 167 | 168 | 声母风格,只返回各个拼音的声母部分。对于没有声母的汉字,返回空白字符串。 169 | 170 | 如:`中国` 的拼音 `zh g` 171 | 172 | 注:声明风格会区分 `zh` 和 `z`,`ch` 和 `c`,`sh` 和 `s`。 173 | 174 | 注意:部分汉字没有声母,如 `啊`,`饿` 等,另外 `y`, `w`, `yu` 都不是声母, 175 | 这些汉字的拼音声母风格会返回 `""`。请仔细考虑你的需求是否应该使用首字母风格。 176 | 详情请参考 [为什么没有 y, w, yu 几个声母](#为什么没有 -y-w-yu- 几个声母) 177 | 178 | ### `.STYLE_FIRST_LETTER` 179 | 180 | 首字母风格,只返回拼音的首字母部分。 181 | 182 | 如:`p y` 183 | 184 | ### `.MODE_NORMAL` 185 | 186 | 普通模式,自动识别读音。 187 | 188 | ### `.MODE_SURNAME` 189 | 190 | 姓名模式,对于明确的姓名场景,可以更准确的识别姓氏的读音。 191 | 192 | ## Test 193 | 194 | ```bash 195 | npm test 196 | ``` 197 | 198 | ## Q&A 199 | 200 | ### 关于 Web 版如何使用 201 | 202 | 首先,我建议大家应该优先考虑在服务端一次性转换拼音并将结果持久化,避免在客户端每次转换损耗性能和体验。 203 | 204 | 如果你坚持在客户端使用,你可以考虑使用 [Webpack](http://webpack.github.io/) + [Babel](http://babeljs.io/) 来转换成低端浏览器的可执行代码。 205 | 206 | 实在不想折腾,可以试试 https://www.jsdelivr.com/package/npm/pinyin 207 | 208 | ### 为什么没有 `y`, `w`, `yu` 几个声母? 209 | 210 | 声母风格(INITIALS)下,“雨”、“我”、“圆”等汉字返回空字符串,因为根据《汉语拼音方案》, 211 | `y`,`w`,`ü (yu)` 都不是声母,在某些特定韵母无声母时,才加上 `y` 或 `w`,而 `ü` 也有其特定规则。 212 | 213 | 如果你觉得这个给你带来了麻烦,那么也请小心一些无声母的汉字(如“啊”、“饿”、“按”、“昂”等)。 214 | 这时候你也许需要的是首字母风格(FIRST_LETTER)。 215 | 216 | ### 如何实现按拼音排序? 217 | 218 | pinyin 模块提供了默认的排序方案: 219 | 220 | ```js 221 | const pinyin = require('pinyin'); 222 | 223 | const data = '我要排序'.split(''); 224 | const sortedData = data.sort(pinyin.compare); 225 | ``` 226 | 227 | 如果默认的比较方法不能满足你的需求,你可以自定义 pinyinCompare 方法: 228 | 229 | ```js 230 | const pinyin = require('pinyin'); 231 | 232 | const data = '我要排序'.split(''); 233 | 234 | // 建议将汉字的拼音持久化存储起来。 235 | const pinyinData = data.map(han => ({ 236 | han: han, 237 | pinyin: pinyin(han)[0][0], // 可以自行选择不同的生成拼音方案和风格。 238 | })); 239 | const sortedData = pinyinData.sort((a, b) => { 240 | return a.pinyin.localeCompare(b.pinyin); 241 | }).map(d => d.han); 242 | ``` 243 | 244 | ### node 版和 web 版有什么异同? 245 | 246 | `pinyin` 目前可以同时运行在 Node 服务器端和 Web 浏览器端。 247 | API 和使用方式完成一致。 248 | 249 | 但 Web 版较 Node 版稍简单,拼音库只有常用字部分,没有使用分词算法, 250 | 并且考虑了网络传输对词库进行了压缩处理。 251 | 252 | 由于分词和繁体中文的特性,部分情况下的结果也不尽相同。 253 | 254 | | 特性 | Web 版 | Node 版 | 255 | |--------------|--------------------------------|----------------------------------| 256 | | 拼音库 | 常用字库。压缩、合并 | 完整字库。不压缩、合并 | 257 | | 分词 | 没有分词 | 使用分词算法,多音字拼音更准确。 | 258 | | 拼音频度排序 | 有根据拼音使用频度优先级排序。 | 同 Web 版。 | 259 | | 繁体中文 | 没有繁体中文支持。 | 有简单的繁简汉字转换。 | 260 | 261 | 由于这些区别,测试不同运行环境的用例也不尽相同。 262 | 263 | ## 捐赠 264 | 265 | 如果这个模块有帮助到您,请 Star 这个仓库。 266 | 267 | 你也可以选择使用支付宝或微信给我捐赠: 268 | 269 | Alipay:hotoo.cn@gmail.com, WeChat:hotoome 270 | 271 | 272 | ## 许可证 273 | 274 | [MIT](http://hotoo.mit-license.org/) 275 | -------------------------------------------------------------------------------- /docs/index.en-US.md: -------------------------------------------------------------------------------- 1 | # pīnyīn (v4) 2 | 3 | pinyin, The convert tool of chinese pinyin. 4 | 5 | --- 6 | 7 | [![NPM version][npm-badge]][npm-url] 8 | [![Build Status][build-badge]][build-url] 9 | [![Coverage Status][coveralls-badge]][coveralls-url] 10 | [![NPM downloads][npm-downloads]][npm-url] 11 | 12 | 13 | [npm-badge]: https://img.shields.io/npm/v/pinyin.svg?style=flat 14 | [npm-url]: https://www.npmjs.com/package/pinyin 15 | [npm-downloads]: http://img.shields.io/npm/dm/pinyin.svg?style=flat 16 | [build-badge]: https://github.com/hotoo/pinyin/actions/workflows/node.js.yml/badge.svg 17 | [build-url]: https://github.com/hotoo/pinyin/actions 18 | [coveralls-badge]: https://coveralls.io/repos/hotoo/pinyin/badge.svg?branch=master 19 | [coveralls-url]: https://coveralls.io/r/hotoo/pinyin 20 | 21 | 22 | [简体中文](https://pinyin.js.org/) | English | [한국어](https://pinyin.js.org/ko-KR/) 23 | 24 | 25 | Convert Han to pinyin. useful for phonetic notation, sorting, and searching. 26 | 27 | > Note: This module both support Node and Web browser. 28 | > 29 | > Python version see [mozillazg/python-pinyin](https://github.com/mozillazg/python-pinyin) 30 | 31 | --- 32 | 33 | ## Feature 34 | 35 | * Segmentation for heteronym words. 36 | * Support Traditional and Simplified Chinese. 37 | * Support multiple pinyin style. 38 | 39 | ## Install 40 | 41 | via npm: 42 | 43 | ```bash 44 | npm install pinyin --save 45 | ``` 46 | 47 | ## Usage 48 | 49 | for developer: 50 | 51 | ```typescript 52 | import { pinyin } from "pinyin"; 53 | 54 | console.log(pinyin("中心")); // [ [ 'zhōng' ], [ 'xīn' ] ] 55 | 56 | console.log(pinyin("中心", { 57 | heteronym: true // Enable heteronym mode. 58 | })); // [ [ 'zhōng', 'zhòng' ], [ 'xīn' ] ] 59 | 60 | console.log(pinyin("中心", { 61 | heteronym: true, // Enable heteronym mode. 62 | segment: true // Enable Chinese words segmentation, fix most heteronym problem. 63 | })); // [ [ 'zhōng' ], [ 'xīn' ] ] 64 | 65 | console.log(pinyin("我喜欢你", { 66 | segment: true, // Enable segmentation. Needed for grouping. 67 | group: true // Group pinyin segments 68 | })); // [ [ 'wǒ' ], [ 'xǐhuān' ], [ 'nǐ' ] ] 69 | 70 | console.log(pinyin("中心", { 71 | style: pinyin.STYLE_INITIALS, // Setting pinyin style. 72 | heteronym: true 73 | })); // [ [ 'zh' ], [ 'x' ] ] 74 | 75 | console.log(pinyin("华夫人", { 76 | mode: "surname", // 姓名模式。 77 | })); // [ ['huà'], ['fū'], ['rén'] ] 78 | ``` 79 | 80 | for cli: 81 | 82 | ```bash 83 | $ pinyin 中心 84 | zhōng xīn 85 | $ pinyin -h 86 | ``` 87 | 88 | ## Types 89 | 90 | ### IPinyinOptions 91 | 92 | The types for the second argument of pinyin method. 93 | 94 | ```typescript 95 | export interface IPinyinOptions { 96 | style?: IPinyinStyle; // output style of pinyin. 97 | mode?: IPinyinMode, // mode of pinyin. 98 | segment?: IPinyinSegment | boolean; 99 | heteronym?: boolean; 100 | group?: boolean; 101 | compact?: boolean; 102 | } 103 | ``` 104 | 105 | ### IPinyinStyle 106 | 107 | The output style of pinyin. 108 | 109 | ```typescript 110 | export type IPinyinStyle = 111 | "normal" | "tone" | "tone2" | "to3ne" | "initials" | "first_letter" | // Suggest. 112 | "NORMAL" | "TONE" | "TONE2" | "TO3NE" | "INITIALS" | "FIRST_LETTER" | 113 | 0 | 1 | 2 | 5 | 3 | 4; // compatibility. 114 | ``` 115 | 116 | ### IPinyinMode 117 | 118 | The mode of pinyin. 119 | 120 | ```typescript 121 | // - NORMAL: Default mode is normal mode. 122 | // - SURNAME: surname mode, for chinese surname. 123 | export type IPinyinMode = 124 | "normal" | "surname" | 125 | "NORMAL" | "SURNAME"; 126 | ``` 127 | 128 | ### IPinyinSegment 129 | 130 | The segment method. 131 | 132 | - Default is disable segment: `false`, 133 | - If set `true`, use "Intl.Segmenter" module default for segment on Web and Node. 134 | - Also specify follow string for segment (bug just "Intl.Segmenter", "segmentit" is support on web): 135 | 136 | ```typescript 137 | export type IPinyinSegment = "Intl.Segmenter" | "nodejieba" | "segmentit" | "@node-rs/jieba"; 138 | ``` 139 | 140 | 141 | ## API 142 | 143 | ### ` pinyin(words[, options])` 144 | 145 | Convert Han (汉字) to pinyin. 146 | 147 | `options` argument is optional, for sepcify heteronym mode and pinyin styles. 148 | 149 | Return a `Array>`. If one of Han is heteronym word, it would be 150 | have multiple pinyin. 151 | 152 | ### `Number pinyin.compare(a, b)` 153 | 154 | Default compare implementation for pinyin. 155 | 156 | 157 | ## Options 158 | 159 | #### ` options.segment` 160 | 161 | Enable Chinese word segmentation. Segmentation is helpful for fix heteronym 162 | problem, but performance will be more slow, and need more CPU and memory. 163 | 164 | Default is `false`. 165 | 166 | ### ` options.heteronym` 167 | 168 | Enable or disable heteronym mode. default is disabled, `false`. 169 | 170 | ### ` options.group` 171 | 172 | Group pinyin by phrases. for example: 173 | 174 | ``` 175 | 我喜欢你 176 | wǒ xǐhuān nǐ 177 | ``` 178 | 179 | ### ` options.style` 180 | 181 | Specify pinyin style. please use static properties like `STYLE_*`. 182 | default is `.STYLE_TONE`. see Static Property for more. 183 | 184 | ### `options.mode` 185 | 186 | pinyin mode, default is `pinyin.MODE_NORMAL`. If you cleared in surname scene, 187 | use `pinyin.MODE_SURNAME` maybe better. 188 | 189 | ## Static Property 190 | 191 | ### `.STYLE_NORMAL` 192 | 193 | Normal mode. 194 | 195 | Example: `pin yin` 196 | 197 | ### `.STYLE_TONE` 198 | 199 | Tone style, this is default. 200 | 201 | Example: `pīn yīn` 202 | 203 | ### `.STYLE_TONE2` 204 | 205 | tone style by postfix number [0-4]. 206 | 207 | Example: `pin1 yin1` 208 | 209 | ### `.STYLE_TO3NE` 210 | 211 | tone style by number [0-4] after phonetic notation character. 212 | 213 | Example: `pin1 yin1` 214 | 215 | ### `.STYLE_INITIALS` 216 | 217 | Initial consonant (of a Chinese syllable). 218 | 219 | Example: pinyin of `中国` is `zh g` 220 | 221 | Note: when a Han (汉字) without initial consonant, will convert to empty string. 222 | 223 | ### `.STYLE_FIRST_LETTER` 224 | 225 | First letter style. 226 | 227 | Example: `p y` 228 | 229 | ### `pinyin.MODE_NORMAL` 230 | 231 | Normal mode. This is the default mode. 232 | 233 | ### `pinyin.MODE_SURNAME` 234 | 235 | Surname mode. If chinese word is surname, The pinyin of surname is prioritized. 236 | 237 | ## Test 238 | 239 | ``` 240 | npm test 241 | ``` 242 | 243 | ## Q&A 244 | 245 | ### How to sort by pinyin? 246 | 247 | This module provide default compare implementation: 248 | 249 | ```js 250 | const pinyin = require('pinyin'); 251 | 252 | const data = '我要排序'.split(''); 253 | const sortedData = data.sort(pinyin.compare); 254 | ``` 255 | 256 | But if you need different implementation, do it like: 257 | 258 | ``` 259 | const pinyin = require('pinyin'); 260 | 261 | const data = '我要排序'.split(''); 262 | 263 | // Suggest you to store pinyin result by data persistence. 264 | const pinyinData = data.map(han => ({ 265 | han: han, 266 | pinyin: pinyin(han)[0][0], // Choose you options and styles. 267 | })); 268 | const sortedData = pinyinData.sort((a, b) => { 269 | return a.pinyin.localeCompare(b.pinyin); 270 | }).map(d => d.han); 271 | ``` 272 | 273 | ## Donate 274 | 275 | If this module is helpful for you, please Star this repository. 276 | 277 | And you have chioce donate to me via Aliapy or WeChat: 278 | 279 | Alipay:hotoo.cn@gmail.com, WeChat:hotoome 280 | 281 | 282 | ## License 283 | 284 | [MIT](http://hotoo.mit-license.org/) 285 | -------------------------------------------------------------------------------- /docs/pinyin-table.md: -------------------------------------------------------------------------------- 1 | --- 2 | sidebar: false 3 | --- 4 | 5 | # 拼音表 6 | 7 | 8 | 这是带声音的拼音表。可以用于发音练习和听力训练。 9 | 10 | 点击拼音可以播放读音,将按第一声、第二声、第三声、第四声的顺序发音。 11 |

12 | 13 | 14 | 15 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export * from "./src/pinyin"; 2 | export { pinyin as default } from "./src/pinyin"; 3 | 4 | export type { 5 | IPinyinOptions, 6 | IPinyinSegment, 7 | IPinyinStyle, 8 | } from "./src/declare"; 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "pinyin", 3 | "version": "4.0.0", 4 | "description": "汉语拼音转换工具。", 5 | "types": "./lib/types/pinyin.d.ts", 6 | "main": "./lib/cjs/pinyin.js", 7 | "module": "./lib/esm/pinyin.js", 8 | "browser": "./lib/umd/pinyin.js", 9 | "bin": { 10 | "pinyin": "./bin/pinyin" 11 | }, 12 | "homepage": "https://pinyin.js.org/", 13 | "author": "闲耘 ", 14 | "repository": { 15 | "type": "git", 16 | "url": "https://github.com/hotoo/pinyin.git" 17 | }, 18 | "bugs": { 19 | "url": "https://github.com/hotoo/pinyin/issues" 20 | }, 21 | "scripts": { 22 | "start": "dumi dev", 23 | "prepublishOnly": "pnpm build", 24 | "build": "pnpm build:rollup", 25 | "build:rollup": "rm -rf lib && rollup -c", 26 | "build:tsup": "rm -rf dist && tsup src/pinyin.ts src/pinyin-web.ts --format cjs,esm --global-name pinyin --dts --out-dir dist", 27 | "build:tsc": "tsc --downlevelIteration -p tsconfig-es5.json & tsc --downlevelIteration -p tsconfig.json & pnpm build:amd", 28 | "build:amd": "tsc --downlevelIteration -p tsconfig-amd.json", 29 | "doc:build": "rm -rf ./.dumi ./docs-dist && dumi build", 30 | "doc:deploy": "pnpm doc:build && gh-pages -d docs-dist", 31 | "lint": "eslint ./src/ ./test/", 32 | "test": "jest --coverage", 33 | "debug": "npx ts-node tools/debug.ts" 34 | }, 35 | "dependencies": { 36 | "commander": "~1.1.1" 37 | }, 38 | "peerDependencies": { 39 | "@node-rs/jieba": "^1.6.0", 40 | "nodejieba": "^3.4.4", 41 | "segmentit": "^2.0.3" 42 | }, 43 | "peerDependenciesMeta": { 44 | "@node-rs/jieba": { 45 | "optional": true 46 | }, 47 | "nodejieba": { 48 | "optional": true 49 | }, 50 | "segmentit": { 51 | "optional": true 52 | } 53 | }, 54 | "devDependencies": { 55 | "@babel/preset-env": "^7.15.6", 56 | "@babel/preset-typescript": "^7.15.0", 57 | "@rollup/plugin-commonjs": "^17.1.0", 58 | "@rollup/plugin-json": "^4.1.0", 59 | "@rollup/plugin-node-resolve": "^11.2.0", 60 | "@textea/json-viewer": "^4.0.1", 61 | "@types/jest": "^27.0.2", 62 | "@types/node": "^22.15.17", 63 | "@typescript-eslint/eslint-plugin": "^5.14.0", 64 | "@typescript-eslint/parser": "^5.14.0", 65 | "aurl": "^1.2.0", 66 | "aws-sdk": "^2.1011.0", 67 | "beautify-benchmark": "^0.2.4", 68 | "benchmark": "~1.0.0", 69 | "dumi": "^2.4.21", 70 | "eslint": "^8.11.0", 71 | "eslint-config-prettier": "^8.5.0", 72 | "eslint-import-resolver-typescript": "^2.5.0", 73 | "eslint-plugin-prettier": "^4.0.0", 74 | "gh-pages": "^3.2.3", 75 | "jest": "^27.2.3", 76 | "mock-aws-s3": "^4.0.2", 77 | "nock": "^13.1.4", 78 | "npx": "^10.2.2", 79 | "prettier": "^2.6.0", 80 | "react": "^18.0.0", 81 | "request": "~2.68.0", 82 | "rollup": "2.60.0", 83 | "rollup-plugin-alias": "^2.2.0", 84 | "rollup-plugin-cleanup": "^3.2.1", 85 | "rollup-plugin-terser": "^7.0.2", 86 | "rollup-plugin-typescript2": "^0.34.1", 87 | "ts-node": "^10.5.0", 88 | "tsup": "^8.4.0", 89 | "typescript": "^4.4.4" 90 | }, 91 | "registry": "https://registry.npmmirror.com", 92 | "publishConfig": { 93 | "registry": "https://registry.npmjs.org/" 94 | }, 95 | "files": [ 96 | "package.json", 97 | "build/", 98 | "bin", 99 | "data", 100 | "lib", 101 | "esm", 102 | "amd", 103 | "index.js" 104 | ], 105 | "keywords": [ 106 | "拼音", 107 | "汉语", 108 | "汉字", 109 | "中文", 110 | "Pinyin" 111 | ], 112 | "directories": { 113 | "example": "examples", 114 | "test": "test" 115 | }, 116 | "engines": { 117 | "install-node": "^18.0.0" 118 | }, 119 | "pnpm": { 120 | "onlyBuiltDependencies": [ 121 | "nodejieba" 122 | ] 123 | }, 124 | "license": "MIT" 125 | } 126 | -------------------------------------------------------------------------------- /public/audio/a.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/a.mp3 -------------------------------------------------------------------------------- /public/audio/ai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ai.mp3 -------------------------------------------------------------------------------- /public/audio/an.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/an.mp3 -------------------------------------------------------------------------------- /public/audio/ang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ang.mp3 -------------------------------------------------------------------------------- /public/audio/ao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ao.mp3 -------------------------------------------------------------------------------- /public/audio/ba.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ba.mp3 -------------------------------------------------------------------------------- /public/audio/bai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bai.mp3 -------------------------------------------------------------------------------- /public/audio/ban.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ban.mp3 -------------------------------------------------------------------------------- /public/audio/bang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bang.mp3 -------------------------------------------------------------------------------- /public/audio/bao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bao.mp3 -------------------------------------------------------------------------------- /public/audio/bei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bei.mp3 -------------------------------------------------------------------------------- /public/audio/ben.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ben.mp3 -------------------------------------------------------------------------------- /public/audio/beng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/beng.mp3 -------------------------------------------------------------------------------- /public/audio/bi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bi.mp3 -------------------------------------------------------------------------------- /public/audio/bian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bian.mp3 -------------------------------------------------------------------------------- /public/audio/biao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/biao.mp3 -------------------------------------------------------------------------------- /public/audio/bie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bie.mp3 -------------------------------------------------------------------------------- /public/audio/bin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bin.mp3 -------------------------------------------------------------------------------- /public/audio/bing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bing.mp3 -------------------------------------------------------------------------------- /public/audio/bo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bo.mp3 -------------------------------------------------------------------------------- /public/audio/bu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/bu.mp3 -------------------------------------------------------------------------------- /public/audio/ca.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ca.mp3 -------------------------------------------------------------------------------- /public/audio/cai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cai.mp3 -------------------------------------------------------------------------------- /public/audio/can.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/can.mp3 -------------------------------------------------------------------------------- /public/audio/cang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cang.mp3 -------------------------------------------------------------------------------- /public/audio/cao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cao.mp3 -------------------------------------------------------------------------------- /public/audio/ce.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ce.mp3 -------------------------------------------------------------------------------- /public/audio/cen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cen.mp3 -------------------------------------------------------------------------------- /public/audio/ceng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ceng.mp3 -------------------------------------------------------------------------------- /public/audio/cha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cha.mp3 -------------------------------------------------------------------------------- /public/audio/chai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chai.mp3 -------------------------------------------------------------------------------- /public/audio/chan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chan.mp3 -------------------------------------------------------------------------------- /public/audio/chang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chang.mp3 -------------------------------------------------------------------------------- /public/audio/chao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chao.mp3 -------------------------------------------------------------------------------- /public/audio/che.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/che.mp3 -------------------------------------------------------------------------------- /public/audio/chen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chen.mp3 -------------------------------------------------------------------------------- /public/audio/cheng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cheng.mp3 -------------------------------------------------------------------------------- /public/audio/chi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chi.mp3 -------------------------------------------------------------------------------- /public/audio/chong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chong.mp3 -------------------------------------------------------------------------------- /public/audio/chou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chou.mp3 -------------------------------------------------------------------------------- /public/audio/chu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chu.mp3 -------------------------------------------------------------------------------- /public/audio/chua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chua.mp3 -------------------------------------------------------------------------------- /public/audio/chuai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chuai.mp3 -------------------------------------------------------------------------------- /public/audio/chuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chuan.mp3 -------------------------------------------------------------------------------- /public/audio/chuang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chuang.mp3 -------------------------------------------------------------------------------- /public/audio/chui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chui.mp3 -------------------------------------------------------------------------------- /public/audio/chun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chun.mp3 -------------------------------------------------------------------------------- /public/audio/chuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/chuo.mp3 -------------------------------------------------------------------------------- /public/audio/ci.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ci.mp3 -------------------------------------------------------------------------------- /public/audio/cong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cong.mp3 -------------------------------------------------------------------------------- /public/audio/cou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cou.mp3 -------------------------------------------------------------------------------- /public/audio/cu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cu.mp3 -------------------------------------------------------------------------------- /public/audio/cuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cuan.mp3 -------------------------------------------------------------------------------- /public/audio/cui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cui.mp3 -------------------------------------------------------------------------------- /public/audio/cun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cun.mp3 -------------------------------------------------------------------------------- /public/audio/cuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/cuo.mp3 -------------------------------------------------------------------------------- /public/audio/da.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/da.mp3 -------------------------------------------------------------------------------- /public/audio/dai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dai.mp3 -------------------------------------------------------------------------------- /public/audio/dan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dan.mp3 -------------------------------------------------------------------------------- /public/audio/dang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dang.mp3 -------------------------------------------------------------------------------- /public/audio/dao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dao.mp3 -------------------------------------------------------------------------------- /public/audio/de.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/de.mp3 -------------------------------------------------------------------------------- /public/audio/dei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dei.mp3 -------------------------------------------------------------------------------- /public/audio/den.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/den.mp3 -------------------------------------------------------------------------------- /public/audio/deng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/deng.mp3 -------------------------------------------------------------------------------- /public/audio/di.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/di.mp3 -------------------------------------------------------------------------------- /public/audio/dian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dian.mp3 -------------------------------------------------------------------------------- /public/audio/diao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/diao.mp3 -------------------------------------------------------------------------------- /public/audio/die.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/die.mp3 -------------------------------------------------------------------------------- /public/audio/ding.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ding.mp3 -------------------------------------------------------------------------------- /public/audio/diu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/diu.mp3 -------------------------------------------------------------------------------- /public/audio/dong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dong.mp3 -------------------------------------------------------------------------------- /public/audio/dou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dou.mp3 -------------------------------------------------------------------------------- /public/audio/du.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/du.mp3 -------------------------------------------------------------------------------- /public/audio/duan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/duan.mp3 -------------------------------------------------------------------------------- /public/audio/dui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dui.mp3 -------------------------------------------------------------------------------- /public/audio/dun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/dun.mp3 -------------------------------------------------------------------------------- /public/audio/duo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/duo.mp3 -------------------------------------------------------------------------------- /public/audio/e.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/e.mp3 -------------------------------------------------------------------------------- /public/audio/ei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ei.mp3 -------------------------------------------------------------------------------- /public/audio/en.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/en.mp3 -------------------------------------------------------------------------------- /public/audio/eng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/eng.mp3 -------------------------------------------------------------------------------- /public/audio/er.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/er.mp3 -------------------------------------------------------------------------------- /public/audio/fa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fa.mp3 -------------------------------------------------------------------------------- /public/audio/fan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fan.mp3 -------------------------------------------------------------------------------- /public/audio/fang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fang.mp3 -------------------------------------------------------------------------------- /public/audio/fei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fei.mp3 -------------------------------------------------------------------------------- /public/audio/fen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fen.mp3 -------------------------------------------------------------------------------- /public/audio/feng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/feng.mp3 -------------------------------------------------------------------------------- /public/audio/fo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fo.mp3 -------------------------------------------------------------------------------- /public/audio/fou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fou.mp3 -------------------------------------------------------------------------------- /public/audio/fu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/fu.mp3 -------------------------------------------------------------------------------- /public/audio/ga.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ga.mp3 -------------------------------------------------------------------------------- /public/audio/gai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gai.mp3 -------------------------------------------------------------------------------- /public/audio/gan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gan.mp3 -------------------------------------------------------------------------------- /public/audio/gang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gang.mp3 -------------------------------------------------------------------------------- /public/audio/gao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gao.mp3 -------------------------------------------------------------------------------- /public/audio/ge.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ge.mp3 -------------------------------------------------------------------------------- /public/audio/gei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gei.mp3 -------------------------------------------------------------------------------- /public/audio/gen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gen.mp3 -------------------------------------------------------------------------------- /public/audio/geng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/geng.mp3 -------------------------------------------------------------------------------- /public/audio/gong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gong.mp3 -------------------------------------------------------------------------------- /public/audio/gou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gou.mp3 -------------------------------------------------------------------------------- /public/audio/gu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gu.mp3 -------------------------------------------------------------------------------- /public/audio/gua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gua.mp3 -------------------------------------------------------------------------------- /public/audio/guai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/guai.mp3 -------------------------------------------------------------------------------- /public/audio/guan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/guan.mp3 -------------------------------------------------------------------------------- /public/audio/guang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/guang.mp3 -------------------------------------------------------------------------------- /public/audio/gui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gui.mp3 -------------------------------------------------------------------------------- /public/audio/gun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/gun.mp3 -------------------------------------------------------------------------------- /public/audio/guo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/guo.mp3 -------------------------------------------------------------------------------- /public/audio/ha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ha.mp3 -------------------------------------------------------------------------------- /public/audio/hai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hai.mp3 -------------------------------------------------------------------------------- /public/audio/han.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/han.mp3 -------------------------------------------------------------------------------- /public/audio/hang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hang.mp3 -------------------------------------------------------------------------------- /public/audio/hao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hao.mp3 -------------------------------------------------------------------------------- /public/audio/he.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/he.mp3 -------------------------------------------------------------------------------- /public/audio/hei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hei.mp3 -------------------------------------------------------------------------------- /public/audio/hen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hen.mp3 -------------------------------------------------------------------------------- /public/audio/heng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/heng.mp3 -------------------------------------------------------------------------------- /public/audio/hong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hong.mp3 -------------------------------------------------------------------------------- /public/audio/hou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hou.mp3 -------------------------------------------------------------------------------- /public/audio/hu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hu.mp3 -------------------------------------------------------------------------------- /public/audio/hua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hua.mp3 -------------------------------------------------------------------------------- /public/audio/huai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/huai.mp3 -------------------------------------------------------------------------------- /public/audio/huan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/huan.mp3 -------------------------------------------------------------------------------- /public/audio/huang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/huang.mp3 -------------------------------------------------------------------------------- /public/audio/hui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hui.mp3 -------------------------------------------------------------------------------- /public/audio/hun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/hun.mp3 -------------------------------------------------------------------------------- /public/audio/huo (1).mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/huo (1).mp3 -------------------------------------------------------------------------------- /public/audio/huo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/huo.mp3 -------------------------------------------------------------------------------- /public/audio/ji.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ji.mp3 -------------------------------------------------------------------------------- /public/audio/jia.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jia.mp3 -------------------------------------------------------------------------------- /public/audio/jian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jian.mp3 -------------------------------------------------------------------------------- /public/audio/jiang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jiang.mp3 -------------------------------------------------------------------------------- /public/audio/jiao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jiao.mp3 -------------------------------------------------------------------------------- /public/audio/jie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jie.mp3 -------------------------------------------------------------------------------- /public/audio/jin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jin.mp3 -------------------------------------------------------------------------------- /public/audio/jing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jing.mp3 -------------------------------------------------------------------------------- /public/audio/jiong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jiong.mp3 -------------------------------------------------------------------------------- /public/audio/jiu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jiu.mp3 -------------------------------------------------------------------------------- /public/audio/ju.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ju.mp3 -------------------------------------------------------------------------------- /public/audio/juan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/juan.mp3 -------------------------------------------------------------------------------- /public/audio/jue.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jue.mp3 -------------------------------------------------------------------------------- /public/audio/jun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/jun.mp3 -------------------------------------------------------------------------------- /public/audio/ka.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ka.mp3 -------------------------------------------------------------------------------- /public/audio/kai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kai.mp3 -------------------------------------------------------------------------------- /public/audio/kan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kan.mp3 -------------------------------------------------------------------------------- /public/audio/kang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kang.mp3 -------------------------------------------------------------------------------- /public/audio/kao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kao.mp3 -------------------------------------------------------------------------------- /public/audio/ke.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ke.mp3 -------------------------------------------------------------------------------- /public/audio/kei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kei.mp3 -------------------------------------------------------------------------------- /public/audio/ken.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ken.mp3 -------------------------------------------------------------------------------- /public/audio/keng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/keng.mp3 -------------------------------------------------------------------------------- /public/audio/kong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kong.mp3 -------------------------------------------------------------------------------- /public/audio/kou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kou.mp3 -------------------------------------------------------------------------------- /public/audio/ku.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ku.mp3 -------------------------------------------------------------------------------- /public/audio/kua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kua.mp3 -------------------------------------------------------------------------------- /public/audio/kuai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kuai.mp3 -------------------------------------------------------------------------------- /public/audio/kuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kuan.mp3 -------------------------------------------------------------------------------- /public/audio/kuang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kuang.mp3 -------------------------------------------------------------------------------- /public/audio/kui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kui.mp3 -------------------------------------------------------------------------------- /public/audio/kun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kun.mp3 -------------------------------------------------------------------------------- /public/audio/kuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/kuo.mp3 -------------------------------------------------------------------------------- /public/audio/la.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/la.mp3 -------------------------------------------------------------------------------- /public/audio/lai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lai.mp3 -------------------------------------------------------------------------------- /public/audio/lan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lan.mp3 -------------------------------------------------------------------------------- /public/audio/lang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lang.mp3 -------------------------------------------------------------------------------- /public/audio/lao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lao.mp3 -------------------------------------------------------------------------------- /public/audio/le.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/le.mp3 -------------------------------------------------------------------------------- /public/audio/lei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lei.mp3 -------------------------------------------------------------------------------- /public/audio/leng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/leng.mp3 -------------------------------------------------------------------------------- /public/audio/li.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/li.mp3 -------------------------------------------------------------------------------- /public/audio/lia.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lia.mp3 -------------------------------------------------------------------------------- /public/audio/lian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lian.mp3 -------------------------------------------------------------------------------- /public/audio/liang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/liang.mp3 -------------------------------------------------------------------------------- /public/audio/liao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/liao.mp3 -------------------------------------------------------------------------------- /public/audio/lie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lie.mp3 -------------------------------------------------------------------------------- /public/audio/lin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lin.mp3 -------------------------------------------------------------------------------- /public/audio/ling.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ling.mp3 -------------------------------------------------------------------------------- /public/audio/liu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/liu.mp3 -------------------------------------------------------------------------------- /public/audio/long.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/long.mp3 -------------------------------------------------------------------------------- /public/audio/lou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lou.mp3 -------------------------------------------------------------------------------- /public/audio/lu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lu.mp3 -------------------------------------------------------------------------------- /public/audio/luan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/luan.mp3 -------------------------------------------------------------------------------- /public/audio/lun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lun.mp3 -------------------------------------------------------------------------------- /public/audio/luo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/luo.mp3 -------------------------------------------------------------------------------- /public/audio/lv.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lv.mp3 -------------------------------------------------------------------------------- /public/audio/lve.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/lve.mp3 -------------------------------------------------------------------------------- /public/audio/ma.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ma.mp3 -------------------------------------------------------------------------------- /public/audio/mai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mai.mp3 -------------------------------------------------------------------------------- /public/audio/man.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/man.mp3 -------------------------------------------------------------------------------- /public/audio/mang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mang.mp3 -------------------------------------------------------------------------------- /public/audio/mao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mao.mp3 -------------------------------------------------------------------------------- /public/audio/me.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/me.mp3 -------------------------------------------------------------------------------- /public/audio/mei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mei.mp3 -------------------------------------------------------------------------------- /public/audio/men.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/men.mp3 -------------------------------------------------------------------------------- /public/audio/meng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/meng.mp3 -------------------------------------------------------------------------------- /public/audio/mi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mi.mp3 -------------------------------------------------------------------------------- /public/audio/mian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mian.mp3 -------------------------------------------------------------------------------- /public/audio/miao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/miao.mp3 -------------------------------------------------------------------------------- /public/audio/mie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mie.mp3 -------------------------------------------------------------------------------- /public/audio/min.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/min.mp3 -------------------------------------------------------------------------------- /public/audio/ming.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ming.mp3 -------------------------------------------------------------------------------- /public/audio/miu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/miu.mp3 -------------------------------------------------------------------------------- /public/audio/mo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mo.mp3 -------------------------------------------------------------------------------- /public/audio/mou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mou.mp3 -------------------------------------------------------------------------------- /public/audio/mu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/mu.mp3 -------------------------------------------------------------------------------- /public/audio/na.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/na.mp3 -------------------------------------------------------------------------------- /public/audio/nai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nai.mp3 -------------------------------------------------------------------------------- /public/audio/nan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nan.mp3 -------------------------------------------------------------------------------- /public/audio/nang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nang.mp3 -------------------------------------------------------------------------------- /public/audio/nao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nao.mp3 -------------------------------------------------------------------------------- /public/audio/ne.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ne.mp3 -------------------------------------------------------------------------------- /public/audio/nei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nei.mp3 -------------------------------------------------------------------------------- /public/audio/nen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nen.mp3 -------------------------------------------------------------------------------- /public/audio/neng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/neng.mp3 -------------------------------------------------------------------------------- /public/audio/ni.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ni.mp3 -------------------------------------------------------------------------------- /public/audio/nian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nian.mp3 -------------------------------------------------------------------------------- /public/audio/niang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/niang.mp3 -------------------------------------------------------------------------------- /public/audio/niao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/niao.mp3 -------------------------------------------------------------------------------- /public/audio/nie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nie.mp3 -------------------------------------------------------------------------------- /public/audio/nin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nin.mp3 -------------------------------------------------------------------------------- /public/audio/ning.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ning.mp3 -------------------------------------------------------------------------------- /public/audio/niu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/niu.mp3 -------------------------------------------------------------------------------- /public/audio/nong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nong.mp3 -------------------------------------------------------------------------------- /public/audio/nou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nou.mp3 -------------------------------------------------------------------------------- /public/audio/nu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nu.mp3 -------------------------------------------------------------------------------- /public/audio/nuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nuan.mp3 -------------------------------------------------------------------------------- /public/audio/nuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nuo.mp3 -------------------------------------------------------------------------------- /public/audio/nv.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nv.mp3 -------------------------------------------------------------------------------- /public/audio/nve.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/nve.mp3 -------------------------------------------------------------------------------- /public/audio/o.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/o.mp3 -------------------------------------------------------------------------------- /public/audio/ou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ou.mp3 -------------------------------------------------------------------------------- /public/audio/pa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pa.mp3 -------------------------------------------------------------------------------- /public/audio/pai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pai.mp3 -------------------------------------------------------------------------------- /public/audio/pan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pan.mp3 -------------------------------------------------------------------------------- /public/audio/pang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pang.mp3 -------------------------------------------------------------------------------- /public/audio/pao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pao.mp3 -------------------------------------------------------------------------------- /public/audio/pei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pei.mp3 -------------------------------------------------------------------------------- /public/audio/pen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pen.mp3 -------------------------------------------------------------------------------- /public/audio/peng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/peng.mp3 -------------------------------------------------------------------------------- /public/audio/pi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pi.mp3 -------------------------------------------------------------------------------- /public/audio/pian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pian.mp3 -------------------------------------------------------------------------------- /public/audio/piao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/piao.mp3 -------------------------------------------------------------------------------- /public/audio/pie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pie.mp3 -------------------------------------------------------------------------------- /public/audio/pin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pin.mp3 -------------------------------------------------------------------------------- /public/audio/ping.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ping.mp3 -------------------------------------------------------------------------------- /public/audio/po.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/po.mp3 -------------------------------------------------------------------------------- /public/audio/pou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pou.mp3 -------------------------------------------------------------------------------- /public/audio/pu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/pu.mp3 -------------------------------------------------------------------------------- /public/audio/qi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qi.mp3 -------------------------------------------------------------------------------- /public/audio/qia.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qia.mp3 -------------------------------------------------------------------------------- /public/audio/qian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qian.mp3 -------------------------------------------------------------------------------- /public/audio/qiang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qiang.mp3 -------------------------------------------------------------------------------- /public/audio/qiao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qiao.mp3 -------------------------------------------------------------------------------- /public/audio/qie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qie.mp3 -------------------------------------------------------------------------------- /public/audio/qin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qin.mp3 -------------------------------------------------------------------------------- /public/audio/qing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qing.mp3 -------------------------------------------------------------------------------- /public/audio/qiong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qiong.mp3 -------------------------------------------------------------------------------- /public/audio/qiu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qiu.mp3 -------------------------------------------------------------------------------- /public/audio/qu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qu.mp3 -------------------------------------------------------------------------------- /public/audio/quan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/quan.mp3 -------------------------------------------------------------------------------- /public/audio/que.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/que.mp3 -------------------------------------------------------------------------------- /public/audio/qun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/qun.mp3 -------------------------------------------------------------------------------- /public/audio/ran.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ran.mp3 -------------------------------------------------------------------------------- /public/audio/rang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rang.mp3 -------------------------------------------------------------------------------- /public/audio/rao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rao.mp3 -------------------------------------------------------------------------------- /public/audio/re.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/re.mp3 -------------------------------------------------------------------------------- /public/audio/ren.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ren.mp3 -------------------------------------------------------------------------------- /public/audio/reng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/reng.mp3 -------------------------------------------------------------------------------- /public/audio/ri.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ri.mp3 -------------------------------------------------------------------------------- /public/audio/rong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rong.mp3 -------------------------------------------------------------------------------- /public/audio/rou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rou.mp3 -------------------------------------------------------------------------------- /public/audio/ru.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ru.mp3 -------------------------------------------------------------------------------- /public/audio/rua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rua.mp3 -------------------------------------------------------------------------------- /public/audio/ruan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ruan.mp3 -------------------------------------------------------------------------------- /public/audio/rui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/rui.mp3 -------------------------------------------------------------------------------- /public/audio/run.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/run.mp3 -------------------------------------------------------------------------------- /public/audio/ruo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ruo.mp3 -------------------------------------------------------------------------------- /public/audio/sa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sa.mp3 -------------------------------------------------------------------------------- /public/audio/sai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sai.mp3 -------------------------------------------------------------------------------- /public/audio/san.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/san.mp3 -------------------------------------------------------------------------------- /public/audio/sang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sang.mp3 -------------------------------------------------------------------------------- /public/audio/sao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sao.mp3 -------------------------------------------------------------------------------- /public/audio/se.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/se.mp3 -------------------------------------------------------------------------------- /public/audio/sen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sen.mp3 -------------------------------------------------------------------------------- /public/audio/seng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/seng.mp3 -------------------------------------------------------------------------------- /public/audio/sha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sha.mp3 -------------------------------------------------------------------------------- /public/audio/shai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shai.mp3 -------------------------------------------------------------------------------- /public/audio/shan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shan.mp3 -------------------------------------------------------------------------------- /public/audio/shang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shang.mp3 -------------------------------------------------------------------------------- /public/audio/shao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shao.mp3 -------------------------------------------------------------------------------- /public/audio/she.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/she.mp3 -------------------------------------------------------------------------------- /public/audio/shei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shei.mp3 -------------------------------------------------------------------------------- /public/audio/shen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shen.mp3 -------------------------------------------------------------------------------- /public/audio/sheng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sheng.mp3 -------------------------------------------------------------------------------- /public/audio/shi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shi.mp3 -------------------------------------------------------------------------------- /public/audio/shou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shou.mp3 -------------------------------------------------------------------------------- /public/audio/shu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shu.mp3 -------------------------------------------------------------------------------- /public/audio/shua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shua.mp3 -------------------------------------------------------------------------------- /public/audio/shuai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shuai.mp3 -------------------------------------------------------------------------------- /public/audio/shuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shuan.mp3 -------------------------------------------------------------------------------- /public/audio/shuang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shuang.mp3 -------------------------------------------------------------------------------- /public/audio/shui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shui.mp3 -------------------------------------------------------------------------------- /public/audio/shun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shun.mp3 -------------------------------------------------------------------------------- /public/audio/shuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/shuo.mp3 -------------------------------------------------------------------------------- /public/audio/si.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/si.mp3 -------------------------------------------------------------------------------- /public/audio/song.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/song.mp3 -------------------------------------------------------------------------------- /public/audio/sou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sou.mp3 -------------------------------------------------------------------------------- /public/audio/su.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/su.mp3 -------------------------------------------------------------------------------- /public/audio/suan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/suan.mp3 -------------------------------------------------------------------------------- /public/audio/sui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sui.mp3 -------------------------------------------------------------------------------- /public/audio/sun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/sun.mp3 -------------------------------------------------------------------------------- /public/audio/suo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/suo.mp3 -------------------------------------------------------------------------------- /public/audio/ta.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ta.mp3 -------------------------------------------------------------------------------- /public/audio/tai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tai.mp3 -------------------------------------------------------------------------------- /public/audio/tan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tan.mp3 -------------------------------------------------------------------------------- /public/audio/tang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tang.mp3 -------------------------------------------------------------------------------- /public/audio/tao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tao.mp3 -------------------------------------------------------------------------------- /public/audio/te.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/te.mp3 -------------------------------------------------------------------------------- /public/audio/teng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/teng.mp3 -------------------------------------------------------------------------------- /public/audio/ti.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ti.mp3 -------------------------------------------------------------------------------- /public/audio/tian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tian.mp3 -------------------------------------------------------------------------------- /public/audio/tiao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tiao.mp3 -------------------------------------------------------------------------------- /public/audio/tie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tie.mp3 -------------------------------------------------------------------------------- /public/audio/ting.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ting.mp3 -------------------------------------------------------------------------------- /public/audio/tong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tong.mp3 -------------------------------------------------------------------------------- /public/audio/tou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tou.mp3 -------------------------------------------------------------------------------- /public/audio/tu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tu.mp3 -------------------------------------------------------------------------------- /public/audio/tuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tuan.mp3 -------------------------------------------------------------------------------- /public/audio/tui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tui.mp3 -------------------------------------------------------------------------------- /public/audio/tun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tun.mp3 -------------------------------------------------------------------------------- /public/audio/tuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/tuo.mp3 -------------------------------------------------------------------------------- /public/audio/wa.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wa.mp3 -------------------------------------------------------------------------------- /public/audio/wai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wai.mp3 -------------------------------------------------------------------------------- /public/audio/wan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wan.mp3 -------------------------------------------------------------------------------- /public/audio/wang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wang.mp3 -------------------------------------------------------------------------------- /public/audio/wei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wei.mp3 -------------------------------------------------------------------------------- /public/audio/wen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wen.mp3 -------------------------------------------------------------------------------- /public/audio/weng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/weng.mp3 -------------------------------------------------------------------------------- /public/audio/wo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wo.mp3 -------------------------------------------------------------------------------- /public/audio/wu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/wu.mp3 -------------------------------------------------------------------------------- /public/audio/xi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xi.mp3 -------------------------------------------------------------------------------- /public/audio/xia.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xia.mp3 -------------------------------------------------------------------------------- /public/audio/xian.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xian.mp3 -------------------------------------------------------------------------------- /public/audio/xiang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xiang.mp3 -------------------------------------------------------------------------------- /public/audio/xiao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xiao.mp3 -------------------------------------------------------------------------------- /public/audio/xie.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xie.mp3 -------------------------------------------------------------------------------- /public/audio/xin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xin.mp3 -------------------------------------------------------------------------------- /public/audio/xing.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xing.mp3 -------------------------------------------------------------------------------- /public/audio/xiong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xiong.mp3 -------------------------------------------------------------------------------- /public/audio/xiu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xiu.mp3 -------------------------------------------------------------------------------- /public/audio/xu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xu.mp3 -------------------------------------------------------------------------------- /public/audio/xuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xuan.mp3 -------------------------------------------------------------------------------- /public/audio/xue.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xue.mp3 -------------------------------------------------------------------------------- /public/audio/xun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/xun.mp3 -------------------------------------------------------------------------------- /public/audio/ya.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ya.mp3 -------------------------------------------------------------------------------- /public/audio/yan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yan.mp3 -------------------------------------------------------------------------------- /public/audio/yang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yang.mp3 -------------------------------------------------------------------------------- /public/audio/yao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yao.mp3 -------------------------------------------------------------------------------- /public/audio/ye.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ye.mp3 -------------------------------------------------------------------------------- /public/audio/yi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yi.mp3 -------------------------------------------------------------------------------- /public/audio/yin.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yin.mp3 -------------------------------------------------------------------------------- /public/audio/ying.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ying.mp3 -------------------------------------------------------------------------------- /public/audio/yong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yong.mp3 -------------------------------------------------------------------------------- /public/audio/you.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/you.mp3 -------------------------------------------------------------------------------- /public/audio/yu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yu.mp3 -------------------------------------------------------------------------------- /public/audio/yuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yuan.mp3 -------------------------------------------------------------------------------- /public/audio/yue.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yue.mp3 -------------------------------------------------------------------------------- /public/audio/yun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/yun.mp3 -------------------------------------------------------------------------------- /public/audio/za.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/za.mp3 -------------------------------------------------------------------------------- /public/audio/zai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zai.mp3 -------------------------------------------------------------------------------- /public/audio/zan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zan.mp3 -------------------------------------------------------------------------------- /public/audio/zang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zang.mp3 -------------------------------------------------------------------------------- /public/audio/zao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zao.mp3 -------------------------------------------------------------------------------- /public/audio/ze.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/ze.mp3 -------------------------------------------------------------------------------- /public/audio/zei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zei.mp3 -------------------------------------------------------------------------------- /public/audio/zen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zen.mp3 -------------------------------------------------------------------------------- /public/audio/zeng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zeng.mp3 -------------------------------------------------------------------------------- /public/audio/zha.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zha.mp3 -------------------------------------------------------------------------------- /public/audio/zhai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhai.mp3 -------------------------------------------------------------------------------- /public/audio/zhan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhan.mp3 -------------------------------------------------------------------------------- /public/audio/zhang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhang.mp3 -------------------------------------------------------------------------------- /public/audio/zhao.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhao.mp3 -------------------------------------------------------------------------------- /public/audio/zhe.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhe.mp3 -------------------------------------------------------------------------------- /public/audio/zhei.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhei.mp3 -------------------------------------------------------------------------------- /public/audio/zhen.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhen.mp3 -------------------------------------------------------------------------------- /public/audio/zheng.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zheng.mp3 -------------------------------------------------------------------------------- /public/audio/zhi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhi.mp3 -------------------------------------------------------------------------------- /public/audio/zhong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhong.mp3 -------------------------------------------------------------------------------- /public/audio/zhou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhou.mp3 -------------------------------------------------------------------------------- /public/audio/zhu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhu.mp3 -------------------------------------------------------------------------------- /public/audio/zhua.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhua.mp3 -------------------------------------------------------------------------------- /public/audio/zhuai.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhuai.mp3 -------------------------------------------------------------------------------- /public/audio/zhuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhuan.mp3 -------------------------------------------------------------------------------- /public/audio/zhuang.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhuang.mp3 -------------------------------------------------------------------------------- /public/audio/zhui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhui.mp3 -------------------------------------------------------------------------------- /public/audio/zhun.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhun.mp3 -------------------------------------------------------------------------------- /public/audio/zhuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zhuo.mp3 -------------------------------------------------------------------------------- /public/audio/zi.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zi.mp3 -------------------------------------------------------------------------------- /public/audio/zong.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zong.mp3 -------------------------------------------------------------------------------- /public/audio/zou.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zou.mp3 -------------------------------------------------------------------------------- /public/audio/zu.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zu.mp3 -------------------------------------------------------------------------------- /public/audio/zuan.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zuan.mp3 -------------------------------------------------------------------------------- /public/audio/zui.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zui.mp3 -------------------------------------------------------------------------------- /public/audio/zuo.mp3: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/audio/zuo.mp3 -------------------------------------------------------------------------------- /public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/favicon.png -------------------------------------------------------------------------------- /public/logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/public/logo.png -------------------------------------------------------------------------------- /rollup.config.js: -------------------------------------------------------------------------------- 1 | import resolve from "@rollup/plugin-node-resolve"; 2 | import commonjs from "@rollup/plugin-commonjs"; 3 | import typescript from "rollup-plugin-typescript2"; 4 | import pkg from "./package.json"; 5 | 6 | export default [ 7 | // ESM 8 | { 9 | input: "src/pinyin.ts", 10 | output: { 11 | file: pkg.module, // package.json 中 module 字段指定 12 | format: "esm", 13 | sourcemap: true, 14 | }, 15 | plugins: [ 16 | resolve(), 17 | commonjs(), 18 | typescript({ useTsconfigDeclarationDir: true }), 19 | ], 20 | external: Object.keys(pkg.dependencies || {}), 21 | }, 22 | 23 | // CJS 24 | { 25 | input: "src/pinyin.ts", 26 | output: { 27 | file: pkg.main, // package.json 中 main 字段指定 28 | format: "cjs", 29 | sourcemap: true, 30 | exports: "named", 31 | }, 32 | plugins: [ 33 | resolve(), 34 | commonjs(), 35 | typescript({ useTsconfigDeclarationDir: true, clean: true }), 36 | ], 37 | external: Object.keys(pkg.dependencies || {}), 38 | }, 39 | 40 | // UMD 41 | // { 42 | // input: "src/pinyin.ts", 43 | // output: { 44 | // file: pkg.browser, // package.json 中 browser 字段指定 45 | // format: "umd", 46 | // name: "pinyin", // UMD 全局变量名 47 | // sourcemap: true, 48 | // exports: "named", 49 | // }, 50 | // plugins: [ 51 | // resolve(), 52 | // commonjs(), 53 | // typescript({ useTsconfigDeclarationDir: false }), // UMD不产声明文件 54 | // ], 55 | // external: Object.keys(pkg.dependencies || []), 56 | // }, 57 | { 58 | input: "src/pinyin-web.ts", 59 | output: { 60 | file: pkg.browser, // package.json 中 browser 字段指定 61 | format: "umd", 62 | name: "pinyin", // UMD 全局变量名 63 | sourcemap: true, 64 | exports: "named", 65 | }, 66 | plugins: [ 67 | resolve(), 68 | commonjs(), 69 | typescript({ useTsconfigDeclarationDir: false }), // UMD不产声明文件 70 | ], 71 | external: Object.keys(pkg.dependencies || []), 72 | }, 73 | ]; -------------------------------------------------------------------------------- /src/constant.ts: -------------------------------------------------------------------------------- 1 | import type { IPinyinAllOptions } from "./declare"; 2 | 3 | // 拼音风格枚举 4 | export enum ENUM_PINYIN_STYLE { 5 | NORMAL = 0, // 普通风格,不带声调。 6 | TONE = 1, // 标准风格,声调在韵母的第一个字母上。 7 | TONE2 = 2, // 声调以数字形式在拼音之后,使用数字 0~4 标识。 8 | TO3NE = 5, // 声调以数字形式在声母之后,使用数字 0~4 标识。 9 | INITIALS = 3, // 仅需要声母部分。 10 | FIRST_LETTER = 4, // 仅保留首字母。 11 | PASSPORT = 6, // 护照风格,转换成大写,且 `ü` 会以 `YU` 形式输出。 12 | }; 13 | 14 | // 拼音模式。 15 | export enum ENUM_PINYIN_MODE { 16 | NORMAL = 0, // 普通模式 17 | SURNAME = 1, // 姓氏模式,优先使用姓氏的拼音。 18 | // PLACENAME = 2, // TODO: 地名模式,优先使用地名拼音。 19 | }; 20 | 21 | export const DEFAULT_OPTIONS: IPinyinAllOptions = { 22 | style: ENUM_PINYIN_STYLE.TONE, // 风格 23 | mode: ENUM_PINYIN_MODE.NORMAL, // 模式 24 | heteronym: false, // 多音字 25 | group: false, // 词组拼音分组 26 | compact: false, 27 | }; 28 | 29 | // 带声调字符。 30 | export const PHONETIC_SYMBOL : Record = { 31 | "ā": "a1", 32 | "á": "a2", 33 | "ǎ": "a3", 34 | "à": "a4", 35 | "ē": "e1", 36 | "é": "e2", 37 | "ě": "e3", 38 | "è": "e4", 39 | "ō": "o1", 40 | "ó": "o2", 41 | "ǒ": "o3", 42 | "ò": "o4", 43 | "ī": "i1", 44 | "í": "i2", 45 | "ǐ": "i3", 46 | "ì": "i4", 47 | "ū": "u1", 48 | "ú": "u2", 49 | "ǔ": "u3", 50 | "ù": "u4", 51 | "ü": "v0", 52 | "ǘ": "v2", 53 | "ǚ": "v3", 54 | "ǜ": "v4", 55 | "ń": "n2", 56 | "ň": "n3", 57 | "": "m2", 58 | }; 59 | 60 | // 声母表。 61 | export const INITIALS: string[] = "b,p,m,f,d,t,n,l,g,k,h,j,q,x,r,zh,ch,sh,z,c,s".split(","); 62 | 63 | // 韵母表。 64 | export const FINALS: string[] = "ang,eng,ing,ong,an,en,in,un,er,ai,ei,ui,ao,ou,iu,ie,ve,a,o,e,i,u,v".split(","); 65 | -------------------------------------------------------------------------------- /src/data/compound_surname.ts: -------------------------------------------------------------------------------- 1 | // 复姓 2 | export default { 3 | "万俟": [["mò"], ["qí"]], 4 | "上官": [["shàng"], ["guān"]], 5 | "东方": [["dōng"], ["fāng"]], 6 | "东郭": [["dōng"], ["guō"]], 7 | "东门": [["dōng"], ["mén"]], 8 | "乐正": [["yuè"], ["zhèng"]], 9 | "亓官": [["qí"], ["guān"]], 10 | "仉督": [["zhǎng"], ["dū"]], 11 | "令狐": [["líng"], ["hú"]], 12 | "仲孙": [["zhòng"], ["sūn"]], 13 | "公冶": [["gōng"], ["yě"]], 14 | "公孙": [["gōng"], ["sūn"]], 15 | "公羊": [["gōng"], ["yáng"]], 16 | "公良": [["gōng"], ["liáng"]], 17 | "公西": [["gōng"], ["xī"]], 18 | "单于": [["chán"], ["yú"]], 19 | "南宫": [["nán"], ["gōng"]], 20 | "南门": [["nán"], ["mén"]], 21 | "司寇": [["sī"], ["kòu"]], 22 | "司徒": [["sī"], ["tú"]], 23 | "司空": [["sī"], ["kōng"]], 24 | "司马": [["sī"], ["mǎ"]], 25 | "呼延": [["hū"], ["yán"]], 26 | "壤驷": [["rǎng"], ["sì"]], 27 | "夏侯": [["xià"], ["hóu"]], 28 | "太叔": [["tài"], ["shū"]], 29 | "夹谷": [["jiá"], ["gǔ"]], 30 | "子车": [["zǐ"], ["jū"]], 31 | "宇文": [["yǔ"], ["wén"]], 32 | "宗政": [["zōng"], ["zhèng"]], 33 | "宰父": [["zǎi"], ["fǔ"]], 34 | "尉迟": [["yù"], ["chí"]], 35 | "左丘": [["zuǒ"], ["qiū"]], 36 | "巫马": [["wū"], ["mǎ"]], 37 | "慕容": [["mù"], ["róng"]], 38 | "拓跋": [["tuò"], ["bá"]], 39 | "梁丘": [["liáng"], ["qiū"]], 40 | "榖梁": [["gǔ"], ["liáng"]], 41 | "欧阳": [["ōu"], ["yáng"]], 42 | "段干": [["duàn"], ["gān"]], 43 | "淳于": [["chún"], ["yú"]], 44 | "漆雕": [["qī"], ["diāo"]], 45 | "澹台": [["tán"], ["tái"]], 46 | "濮阳": [["pú"], ["yáng"]], 47 | "申屠": [["shēn"], ["tú"]], 48 | "百里": [["bǎi"], ["lǐ"]], 49 | "皇甫": [["huáng"], ["pǔ"]], 50 | "端木": [["duān"], ["mù"]], 51 | "第五": [["dì"], ["wǔ"]], 52 | "羊舌": [["yáng"], ["shé"]], 53 | "西门": [["xī"], ["mén"]], 54 | "诸葛": [["zhū"], ["gě"]], 55 | "赫连": [["hè"], ["lián"]], 56 | "轩辕": [["xuān"], ["yuán"]], 57 | "钟离": [["zhōng"], ["lí"]], 58 | "长孙": [["zhǎng"], ["sūn"]], 59 | "闻人": [["wén"], ["rén"]], 60 | "闾丘": [["lǘ"], ["qiū"]], 61 | "颛孙": [["zhuān"], ["sūn"]], 62 | "鲜于": [["xiān"], ["yú"]], 63 | } as Record; 64 | -------------------------------------------------------------------------------- /src/data/dict.bin: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hotoo/pinyin/28e5d20c5a3c2a9c9fd0793fadd5ba64294b9920/src/data/dict.bin -------------------------------------------------------------------------------- /src/declare.ts: -------------------------------------------------------------------------------- 1 | import { ENUM_PINYIN_STYLE, ENUM_PINYIN_MODE } from "./constant"; 2 | 3 | export interface IPinyin { 4 | (han: string, options?: IPinyinOptions): string[][]; 5 | 6 | compare: (a: string, b: string) => number; 7 | compact: (arr: string[][]) => string[][]; 8 | 9 | // pinyin styles: 兼容 v2.x 中的属性透出 10 | STYLE_TONE: ENUM_PINYIN_STYLE; 11 | STYLE_TONE2: ENUM_PINYIN_STYLE; 12 | STYLE_TO3NE: ENUM_PINYIN_STYLE; 13 | STYLE_NORMAL: ENUM_PINYIN_STYLE; 14 | STYLE_INITIALS: ENUM_PINYIN_STYLE; 15 | STYLE_FIRST_LETTER: ENUM_PINYIN_STYLE; 16 | STYLE_PASSPORT: ENUM_PINYIN_STYLE; 17 | 18 | // pinyin mode: 兼容 v2.x 中的属性透出 19 | MODE_NORMAL: ENUM_PINYIN_MODE; 20 | MODE_SURNAME: ENUM_PINYIN_MODE; 21 | // MODE_PLACENAME: ENUM_PINYIN_MODE; 22 | } 23 | 24 | export type IPinyinStyle = 25 | ENUM_PINYIN_STYLE | 26 | "normal" | "tone" | "tone2" | "to3ne" | "initials" | "first_letter" | "passport" | // 推荐使用小写,和输出的拼音一致 27 | "NORMAL" | "TONE" | "TONE2" | "TO3NE" | "INITIALS" | "FIRST_LETTER" | "PASSPORT" | // 方便老版本迁移 28 | 0 | 1 | 2 | 5 | 3 | 4; // 兼容老版本 29 | 30 | // 拼音模式。 31 | // 32 | // - NORMAL: 普通模式 33 | // - SURNAME: 姓氏模式,优先使用姓氏的拼音。 34 | // - TODO: PLACENAME: 地名模式,优先使用地名拼音。 35 | export type IPinyinMode = 36 | ENUM_PINYIN_MODE | 37 | "normal" | "surname" | 38 | "NORMAL" | "SURNAME"; 39 | 40 | export type IPinyinSegment = "nodejieba" | "segmentit" | "@node-rs/jieba" | "Intl.Segmenter"; 41 | 42 | // 程序内部使用的强类型,所有字段都有合法值类型。 43 | export interface IPinyinAllOptions { 44 | style: ENUM_PINYIN_STYLE; // 拼音输出形式 45 | mode: ENUM_PINYIN_MODE, // 拼音模式 46 | // 指定分词库。不指定则表示不开启分词。 47 | segment?: IPinyinSegment; 48 | // 是否返回多音字 49 | heteronym: boolean; 50 | // 是否分组词组拼音 51 | group: boolean; 52 | // 是否以多音字的不同组合形式,“紧凑”形式连贯的返回不同可能组合形式。 53 | // 例如:“你好吗” 54 | // compact=false: [[nǐ], [hǎo,hào], [ma,má,mǎ]] 55 | // compact=true: [ 56 | // [nǐ,hǎo,ma], [nǐ,hǎo,má], [nǐ,hǎo,mǎ], 57 | // [nǐ,hào,ma], [nǐ,hào,má], [nǐ,hào,mǎ], 58 | // ] 59 | compact: boolean; 60 | } 61 | 62 | // 给到用户的类型,大都可选项,有默认值,且形式友好。 63 | export interface IPinyinOptions { 64 | style?: IPinyinStyle; // 拼音输出形式 65 | mode?: IPinyinMode, // 拼音模式 66 | // 指定分词库。 67 | // 为了兼容老版本,可以使用 boolean 类型指定是否开启分词,默认开启。 68 | segment?: IPinyinSegment | boolean; 69 | // 是否返回多音字 70 | heteronym?: boolean; 71 | // 是否分组词组拼音 72 | group?: boolean; 73 | compact?: boolean; 74 | } 75 | -------------------------------------------------------------------------------- /src/format.ts: -------------------------------------------------------------------------------- 1 | import { ENUM_PINYIN_STYLE, PHONETIC_SYMBOL, INITIALS } from "./constant"; 2 | import { hasKey } from "./util"; 3 | 4 | /* 5 | * 格式化拼音为声母(Initials)形式。 6 | * @param {string} py 原始拼音字符串。 7 | * @return {string} 转换后的拼音声母部分。 8 | */ 9 | function initials(py: string): string { 10 | for (let i = 0, l = INITIALS.length; i < l; i++){ 11 | if (py.indexOf(INITIALS[i]) === 0) { 12 | return INITIALS[i]; 13 | } 14 | } 15 | return ""; 16 | } 17 | 18 | const RE_PHONETIC_SYMBOL = new RegExp("([" + Object.keys(PHONETIC_SYMBOL).join("") + "])", "g"); 19 | const RE_TONE2 = /([aeoiuvnm])([0-4])$/; 20 | 21 | /** 22 | * 格式化拼音风格。 23 | * 24 | * @param {string} pinyin TONE 风格的拼音。 25 | * @param {ENUM_PINYIN_STYLE} style 目标转换的拼音风格。 26 | * @return {string} 转换后的拼音。 27 | */ 28 | export function toFixed(pinyin: string, style: ENUM_PINYIN_STYLE): string { 29 | let tone = ""; // 声调。 30 | let first_letter: string; 31 | let py: string; 32 | switch(style) { 33 | case ENUM_PINYIN_STYLE.INITIALS: 34 | return initials(pinyin); 35 | 36 | case ENUM_PINYIN_STYLE.FIRST_LETTER: 37 | first_letter = pinyin.charAt(0); 38 | if (hasKey(PHONETIC_SYMBOL, first_letter)) { 39 | first_letter = PHONETIC_SYMBOL[first_letter].charAt(0); 40 | } 41 | return first_letter; 42 | 43 | case ENUM_PINYIN_STYLE.NORMAL: 44 | return pinyin.replace(RE_PHONETIC_SYMBOL, function($0: string, $1_phonetic: string) { 45 | return PHONETIC_SYMBOL[$1_phonetic].replace(RE_TONE2, "$1"); 46 | }); 47 | 48 | case ENUM_PINYIN_STYLE.PASSPORT: 49 | return pinyin.replace(RE_PHONETIC_SYMBOL, function($0: string, $1_phonetic: string) { 50 | return PHONETIC_SYMBOL[$1_phonetic].replace(RE_TONE2, "$1").replace("v", "YU"); 51 | }).toUpperCase(); 52 | 53 | case ENUM_PINYIN_STYLE.TO3NE: 54 | return pinyin.replace(RE_PHONETIC_SYMBOL, function($0: string, $1_phonetic: string) { 55 | return PHONETIC_SYMBOL[$1_phonetic]; 56 | }); 57 | 58 | case ENUM_PINYIN_STYLE.TONE2: 59 | py = pinyin.replace(RE_PHONETIC_SYMBOL, function($0: string, $1: string){ 60 | // 声调数值。 61 | tone = PHONETIC_SYMBOL[$1].replace(RE_TONE2, "$2"); 62 | 63 | return PHONETIC_SYMBOL[$1].replace(RE_TONE2, "$1"); 64 | }); 65 | return py + tone; 66 | 67 | case ENUM_PINYIN_STYLE.TONE: 68 | default: 69 | return pinyin; 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/phonetic-symbol.ts: -------------------------------------------------------------------------------- 1 | // 带声调字符。 2 | const phonetic_symbol: Record = { 3 | "ā": "a1", 4 | "á": "a2", 5 | "ǎ": "a3", 6 | "à": "a4", 7 | "ē": "e1", 8 | "é": "e2", 9 | "ě": "e3", 10 | "è": "e4", 11 | "ō": "o1", 12 | "ó": "o2", 13 | "ǒ": "o3", 14 | "ò": "o4", 15 | "ī": "i1", 16 | "í": "i2", 17 | "ǐ": "i3", 18 | "ì": "i4", 19 | "ū": "u1", 20 | "ú": "u2", 21 | "ǔ": "u3", 22 | "ù": "u4", 23 | "ü": "v0", 24 | "ǘ": "v2", 25 | "ǚ": "v3", 26 | "ǜ": "v4", 27 | "ń": "n2", 28 | "ň": "n3", 29 | "": "m2", 30 | }; 31 | 32 | export default phonetic_symbol; 33 | -------------------------------------------------------------------------------- /src/pinyin-web.ts: -------------------------------------------------------------------------------- 1 | import PinyinBase, { getPinyinInstance } from "./PinyinBase"; 2 | 3 | export class Pinyin extends PinyinBase { 4 | } 5 | 6 | export const pinyin = getPinyinInstance(new Pinyin()); 7 | export default pinyin; 8 | 9 | export const compare = pinyin.compare; 10 | export { compact } from "./util"; 11 | -------------------------------------------------------------------------------- /src/pinyin.ts: -------------------------------------------------------------------------------- 1 | import PinyinBase, { getPinyinInstance } from "./PinyinBase"; 2 | import { segment } from "./segment"; 3 | import type { IPinyinSegment } from "./declare"; 4 | 5 | export class Pinyin extends PinyinBase { 6 | segment(hans: string, segmentType?: IPinyinSegment): string[] { 7 | return segment(hans, segmentType); 8 | } 9 | } 10 | 11 | export const pinyin = getPinyinInstance(new Pinyin()); 12 | export default pinyin; 13 | 14 | export const compare = pinyin.compare; 15 | export { compact } from "./util"; 16 | -------------------------------------------------------------------------------- /src/segment-web.ts: -------------------------------------------------------------------------------- 1 | // @ts-ignore 2 | import { Segment, useDefault } from "segmentit"; 3 | import type { IPinyinSegment } from "./declare"; 4 | 5 | let segmentit: any; // segmentit 加载词典。 6 | let hansIntlSegmenter: any; // Intl.Segmenter 7 | 8 | /** 9 | * TODO: 分词并带词性信息,需要调整 segment_pinyin 方法。 10 | * 分词并标注词性。 11 | */ 12 | export function segment(hans: string, segment?: IPinyinSegment): string[] { 13 | // segmentit (Node.js) 14 | if (segment === "segmentit") { 15 | if (!segmentit) { 16 | segmentit = useDefault(new Segment()); 17 | } 18 | return segmentit.doSegment(hans, { 19 | simple: true, 20 | }); 21 | } 22 | 23 | // Intl.Segmenter 24 | if (segment === "Intl.Segmenter") { 25 | if (typeof Intl?.Segmenter === "function") { 26 | if (!hansIntlSegmenter) { 27 | hansIntlSegmenter = new Intl.Segmenter("zh-Hans-CN", { 28 | granularity: "word", 29 | }); 30 | } 31 | return [...hansIntlSegmenter.segment(hans)].map((s) => s.segment); 32 | } 33 | } 34 | 35 | return [hans]; 36 | } 37 | -------------------------------------------------------------------------------- /src/segment.ts: -------------------------------------------------------------------------------- 1 | import type { IPinyinSegment } from "./declare"; 2 | 3 | let nodeRsJiebaLoaded = false; // @node-rs/jieba 加载词典。 4 | let segmentit: any; // segmentit 加载词典。 5 | let hansIntlSegmenter: any; // Intl.Segmenter 6 | 7 | /** 8 | * TODO: 分词并带词性信息,需要调整 segment_pinyin 方法。 9 | * 分词并标注词性。 10 | */ 11 | export function segment(hans: string, segment?: IPinyinSegment): string[] { 12 | try { 13 | // @node-rs/jieba (Rust) 14 | if (segment === "@node-rs/jieba") { 15 | // eslint-disable-next-line @typescript-eslint/no-var-requires 16 | const { load, cut /*, tag */ } = require("@node-rs/jieba"); 17 | if (!load || !cut) { 18 | console.error("pinyin v4: \"@node-rs/jieba\" is peerDependencies"); 19 | return [hans]; 20 | } 21 | if (!nodeRsJiebaLoaded) { 22 | nodeRsJiebaLoaded = true; 23 | load(); 24 | } 25 | return cut(hans, false); 26 | // return tag(hans); 27 | } 28 | 29 | // segmentit (Node.js) 30 | if (segment === "segmentit") { 31 | // eslint-disable-next-line @typescript-eslint/no-var-requires 32 | const { Segment, useDefault } = require("segmentit"); 33 | if (!Segment) { 34 | console.error("pinyin v4: \"segmentit\" is peerDependencies"); 35 | return [hans]; 36 | } 37 | if (!segmentit) { 38 | segmentit = useDefault(new Segment()); 39 | } 40 | return segmentit.doSegment(hans, { 41 | simple: true, 42 | }); 43 | } 44 | 45 | // Intl.Segmenter 46 | if (segment === "Intl.Segmenter") { 47 | if (typeof Intl?.Segmenter === "function") { 48 | if (!hansIntlSegmenter) { 49 | hansIntlSegmenter = new Intl.Segmenter("zh-Hans-CN", { 50 | granularity: "word", 51 | }); 52 | } 53 | return [...hansIntlSegmenter.segment(hans)].map((s) => s.segment); 54 | } 55 | } 56 | 57 | // eslint-disable-next-line @typescript-eslint/no-var-requires 58 | const nodejieba = require("nodejieba"); 59 | if (!nodejieba) { 60 | console.error("pinyin v4: \"nodejieba\" is peerDependencies"); 61 | return [hans]; 62 | } 63 | // 默认使用 nodejieba (C++) 64 | // return nodejieba.tag(hans); 65 | // nodejieba 定义的类型返回值错误,先忽略。 66 | return nodejieba.cutSmall(hans, 4) as unknown as string[]; 67 | } catch (ex) { 68 | return [hans]; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /src/util.ts: -------------------------------------------------------------------------------- 1 | import type { 2 | IPinyinAllOptions, 3 | IPinyinOptions, 4 | IPinyinStyle, 5 | IPinyinMode, 6 | IPinyinSegment, 7 | } from "./declare"; 8 | import { ENUM_PINYIN_STYLE, ENUM_PINYIN_MODE, DEFAULT_OPTIONS } from "./constant"; 9 | 10 | export function hasKey(obj: any, key: string) { 11 | return Object.prototype.hasOwnProperty.call(obj, key); 12 | } 13 | 14 | const pinyinStyleMap: Map = new Map([ 15 | [ "tone", ENUM_PINYIN_STYLE.TONE ], 16 | [ "TONE", ENUM_PINYIN_STYLE.TONE ], 17 | [ "1", ENUM_PINYIN_STYLE.TONE ], 18 | 19 | [ "tone2", ENUM_PINYIN_STYLE.TONE2 ], 20 | [ "TONE2", ENUM_PINYIN_STYLE.TONE2 ], 21 | [ "2", ENUM_PINYIN_STYLE.TONE2 ], 22 | 23 | [ "to3ne", ENUM_PINYIN_STYLE.TO3NE ], 24 | [ "TO3NE", ENUM_PINYIN_STYLE.TO3NE ], 25 | [ "5", ENUM_PINYIN_STYLE.TO3NE ], 26 | 27 | [ "first_letter", ENUM_PINYIN_STYLE.FIRST_LETTER ], 28 | [ "FIRST_LETTER", ENUM_PINYIN_STYLE.FIRST_LETTER ], 29 | [ "4", ENUM_PINYIN_STYLE.FIRST_LETTER ], 30 | 31 | [ "initials", ENUM_PINYIN_STYLE.INITIALS ], 32 | [ "INITIALS", ENUM_PINYIN_STYLE.INITIALS ], 33 | [ "3", ENUM_PINYIN_STYLE.INITIALS ], 34 | 35 | [ "normal", ENUM_PINYIN_STYLE.NORMAL ], 36 | [ "NORMAL", ENUM_PINYIN_STYLE.NORMAL ], 37 | [ "0", ENUM_PINYIN_STYLE.NORMAL ], 38 | 39 | [ "passport", ENUM_PINYIN_STYLE.PASSPORT ], 40 | [ "PASSPORT", ENUM_PINYIN_STYLE.PASSPORT ], 41 | [ "6", ENUM_PINYIN_STYLE.PASSPORT ], 42 | ]); 43 | 44 | // 将用户输入的拼音形式参数转换成唯一指定的强类型。 45 | export function convertPinyinStyle(style?: IPinyinStyle): ENUM_PINYIN_STYLE { 46 | const s = String(style); 47 | if (pinyinStyleMap.has(s)) { 48 | return pinyinStyleMap.get(s) as ENUM_PINYIN_STYLE; 49 | } 50 | return ENUM_PINYIN_STYLE.TONE; 51 | } 52 | 53 | const pinyinModeMap: Map = new Map([ 54 | [ "normal", ENUM_PINYIN_MODE.NORMAL ], 55 | [ "NORMAL", ENUM_PINYIN_MODE.NORMAL ], 56 | [ "surname", ENUM_PINYIN_MODE.SURNAME ], 57 | [ "SURNAME", ENUM_PINYIN_MODE.SURNAME ], 58 | ]); 59 | 60 | // 将用户输入的拼音形式参数转换成唯一指定的强类型。 61 | export function convertPinyinMode(mode?: IPinyinMode): ENUM_PINYIN_MODE { 62 | const s = String(mode); 63 | if (pinyinModeMap.has(s)) { 64 | return pinyinModeMap.get(s) as ENUM_PINYIN_MODE; 65 | } 66 | return ENUM_PINYIN_MODE.NORMAL; 67 | } 68 | 69 | export function convertUserOptions(options?: IPinyinOptions): IPinyinAllOptions { 70 | let segment: IPinyinSegment | undefined = undefined; 71 | if (options?.segment) { 72 | if (options?.segment === true) { 73 | segment = "Intl.Segmenter"; 74 | } else { 75 | segment = options.segment; 76 | } 77 | } 78 | const opt: IPinyinAllOptions = { 79 | ...DEFAULT_OPTIONS, 80 | style: convertPinyinStyle(options?.style), 81 | mode: convertPinyinMode(options?.mode), 82 | segment, 83 | heteronym: options?.heteronym || false, 84 | group: options?.group || false, 85 | }; 86 | return opt; 87 | } 88 | 89 | /** 90 | * 组合 2 个拼音数组。 91 | * @param {string[]} a1 第一个数组,形如 ["zhāo", "cháo"] 92 | * @param {string[]} a2 字符串型数组。形如 ["yáng"] 93 | * @return {string[]} 组合后的一维数组,如上可得 ["zhāoyáng", "cháoyáng"] 94 | */ 95 | export function combo2array(a1: string[], a2: string[]): string[] { 96 | const result: string[] = []; 97 | if (!a1.length) { 98 | return a2; 99 | } 100 | if (!a2.length) { 101 | return a1; 102 | } 103 | for (let i = 0, l = a1.length; i < l; i++) { 104 | for (let j = 0, m = a2.length; j < m; j++) { 105 | result.push(a1[i] + a2[j]); 106 | } 107 | } 108 | return result; 109 | } 110 | 111 | /** 112 | * 合并二维元祖。 113 | * @param {string[][]} arr 二维元祖 [["zhāo", "cháo"], ["yáng"], ["dōng"], ["shēng"]] 114 | * @return {string[]} 返回二维字符串组合数组。形如 115 | * [ 116 | * ["zhāoyáng"], ["dōng"], ["shēng"], 117 | * ["cháoyáng"], ["dōng"], ["shēng"] 118 | * ] 119 | */ 120 | export function combo(arr: string[][]): string[] { 121 | if (arr.length === 0) { 122 | return []; 123 | } 124 | if (arr.length === 1) { 125 | return arr[0]; 126 | } 127 | let result: string[] = combo2array(arr[0], arr[1]); 128 | for (let i = 2, l = arr.length; i < l; i++) { 129 | result = combo2array(result, arr[i]); 130 | } 131 | return result; 132 | } 133 | 134 | /** 135 | * 组合两个拼音数组,形成一个新的二维数组 136 | * @param {string[]|string[][]} arr1 eg: ["hai", "huan"] 137 | * @param {string[]} arr2 eg: ["qian"] 138 | * @returns {string[][]} 组合后的二维数组,eg: [ ["hai", "qian"], ["huan", "qian"] ] 139 | */ 140 | export function compact2array(a1: string[]|string[][], a2: string[]): string[][] { 141 | if (!Array.isArray(a1) || !Array.isArray(a2)) { 142 | throw new Error("compact2array expect two array as parameters"); 143 | } 144 | if (!a1.length) { 145 | a1 = [""]; 146 | } 147 | if (!a2.length) { 148 | a2 = [""]; 149 | } 150 | const result: string[][] = []; 151 | for (let i = 0, l = a1.length; i < l; i++) { 152 | for (let j = 0, m = a2.length; j < m; j++) { 153 | if (Array.isArray(a1[i])) { 154 | result.push([...a1[i], a2[j]]); 155 | } else { 156 | result.push([a1[i] as string, a2[j]]); 157 | } 158 | } 159 | } 160 | return result; 161 | } 162 | 163 | export function compact(arr: string[][]) { 164 | if (arr.length === 0) { 165 | return []; 166 | } 167 | if (arr.length === 1) { 168 | return [arr[0]]; 169 | } 170 | let result = compact2array(arr[0], arr[1]); 171 | for (let i = 2, l = arr.length; i < l; ++i) { 172 | result = compact2array(result, arr[i]); 173 | } 174 | return result; 175 | } 176 | -------------------------------------------------------------------------------- /test/cli.test.ts: -------------------------------------------------------------------------------- 1 | import { exec } from "child_process"; 2 | 3 | const testcases = [ 4 | { 5 | command: "pinyin 中国", 6 | stdout: "zhōng guó", 7 | }, 8 | { 9 | command: "pinyin -h 中国", 10 | stdout: "zhōng,zhòng guó", 11 | }, 12 | { 13 | command: "pinyin -hS 中国", 14 | stdout: "zhōng guó", 15 | }, 16 | { 17 | command: "pinyin -S 中国", 18 | stdout: "zhōng guó", 19 | }, 20 | { 21 | command: "pinyin 重心", 22 | stdout: "zhòng xīn", 23 | }, 24 | { 25 | command: "pinyin 重复", 26 | stdout: "zhòng fù", 27 | }, 28 | { 29 | command: "pinyin -h 重复", 30 | stdout: "zhòng,chóng fù", 31 | }, 32 | { 33 | command: "pinyin -hS 重复", 34 | stdout: "chóng fù", 35 | }, 36 | { 37 | command: "pinyin -hS -s NORMAL 重复", 38 | stdout: "chong fu", 39 | }, 40 | { 41 | command: "pinyin -s INITIALS 重复", 42 | stdout: "zh f", 43 | }, 44 | { 45 | command: "pinyin -p _ 重心", 46 | stdout: "zhòng_xīn", 47 | }, 48 | { 49 | command: "pinyin -p '*' -s INITIALS 重复", 50 | stdout: "zh*f", 51 | }, 52 | { 53 | command: "pinyin -p '' -s normal 重复", 54 | stdout: "zhongfu", 55 | }, 56 | { 57 | command: "pinyin -Sg 我喜欢你", 58 | stdout: "wǒ xǐhuān nǐ", 59 | }, 60 | 61 | ]; 62 | 63 | describe("cli: command line interface.", function() { 64 | 65 | testcases.forEach(function(testcase) { 66 | 67 | it("$ " + testcase.command, function(done) { 68 | exec("bin/" + testcase.command, function(err, stdout) { 69 | expect(err).toEqual(null); 70 | expect(stdout).toEqual(testcase.stdout + "\n"); 71 | done(); 72 | }); 73 | }); 74 | 75 | }); 76 | 77 | }); 78 | -------------------------------------------------------------------------------- /test/segment-web.test.ts: -------------------------------------------------------------------------------- 1 | import { segment } from "../src/segment-web"; 2 | 3 | describe("segment-web", function() { 4 | it("segment()", function() { 5 | expect(segment("我要排序")).toEqual(["我要排序"]); 6 | expect(segment("中文汉字")).toEqual(["中文汉字"]); 7 | expect(segment("我来到北京清华大学")).toEqual(["我来到北京清华大学"]); 8 | expect(segment("每股24.67美元的确定性协议")).toEqual(["每股24.67美元的确定性协议"]); 9 | }); 10 | 11 | it("segment(segmentit)", function() { 12 | expect(segment("我要排序", "segmentit")).toEqual(["我", "要", "排序"]); 13 | expect(segment("中文汉字", "segmentit")).toEqual(["中文", "汉字"]); 14 | expect(segment("我来到北京清华大学", "segmentit")).toEqual(["我", "来到", "北京", "清华大学"]); 15 | expect(segment("每股24.67美元的确定性协议", "segmentit")).toEqual(["每股", "24.67", "美元", "的确", "定性", "协议"]); 16 | }); 17 | 18 | it("segment(Intl.Segmenter)", function() { 19 | expect(segment("我要排序", "Intl.Segmenter")).toEqual(["我要", "排序"]); 20 | expect(segment("中文汉字", "Intl.Segmenter")).toEqual(["中文", "汉字"]); 21 | expect(segment("我来到北京清华大学", "Intl.Segmenter")).toEqual(["我", "来到", "北京", "清华大学"]); 22 | expect(segment("每股24.67美元的确定性协议", "Intl.Segmenter")).toEqual(["每股", "24.67", "美元", "的", "确定", "性", "协议"]); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/segment.test.ts: -------------------------------------------------------------------------------- 1 | import { segment } from "../src/segment"; 2 | 3 | describe("segment", function() { 4 | it("segment()", function() { 5 | expect(segment("我要排序")).toEqual(["我", "要", "排序"]); 6 | expect(segment("中文汉字")).toEqual(["中文", "汉字"]); 7 | expect(segment("我来到北京清华大学")).toEqual(["我", "来到", "北京", "清华大学"]); 8 | expect(segment("每股24.67美元的确定性协议")).toEqual(["每股", "2", "4", ".", "6", "7", "美元", "的", "确定性", "协议"]); 9 | }); 10 | 11 | it("segment(segmentit)", function() { 12 | expect(segment("我要排序", "segmentit")).toEqual(["我", "要", "排序"]); 13 | expect(segment("中文汉字", "segmentit")).toEqual(["中文", "汉字"]); 14 | expect(segment("我来到北京清华大学", "segmentit")).toEqual(["我", "来到", "北京", "清华大学"]); 15 | expect(segment("每股24.67美元的确定性协议", "segmentit")).toEqual(["每股", "24.67", "美元", "的确", "定性", "协议"]); 16 | }); 17 | 18 | it("segment(Intl.Segmenter)", function() { 19 | expect(segment("我要排序", "Intl.Segmenter")).toEqual(["我要", "排序"]); 20 | expect(segment("中文汉字", "Intl.Segmenter")).toEqual(["中文", "汉字"]); 21 | expect(segment("我来到北京清华大学", "Intl.Segmenter")).toEqual(["我", "来到", "北京", "清华大学"]); 22 | expect(segment("每股24.67美元的确定性协议", "Intl.Segmenter")).toEqual(["每股", "24.67", "美元", "的", "确定", "性", "协议"]); 23 | }); 24 | }); 25 | -------------------------------------------------------------------------------- /test/util.test.ts: -------------------------------------------------------------------------------- 1 | import { 2 | combo2array, 3 | combo, 4 | compact2array, 5 | compact, 6 | } from "../src/util"; 7 | 8 | describe("test/util.test.js", function() { 9 | describe("combo2array", function() { 10 | it("combo2array([], [])", function() { 11 | expect(combo2array([], [])).toEqual([]); 12 | }); 13 | 14 | it("combo2array([a], [])", function() { 15 | expect(combo2array(["a"], [])).toEqual(["a"]); 16 | }); 17 | 18 | it("combo2array([], [1])", function() { 19 | expect(combo2array([], ["1"])).toEqual(["1"]); 20 | }); 21 | 22 | it("combo2array([a], [1])", function() { 23 | expect(combo2array(["a"], ["1"])).toEqual(["a1"]); 24 | }); 25 | 26 | it("combo2array([a,b], [1])", function() { 27 | expect(combo2array(["a", "b"], ["1"])).toEqual(["a1", "b1"]); 28 | }); 29 | 30 | it("combo2array([a], [1,2])", function() { 31 | expect(combo2array(["a"], ["1", "2"])).toEqual(["a1", "a2"]); 32 | }); 33 | 34 | it("combo2array([a,b], [1,2])", function() { 35 | expect(combo2array(["a", "b"], ["1", "2"])).toEqual(["a1", "a2", "b1", "b2"]); 36 | }); 37 | 38 | it("combo2array([a,b,c], [1,2,3])", function() { 39 | expect(combo2array(["a", "b", "c"], ["1", "2", "3"])).toEqual(["a1", "a2", "a3", "b1", "b2", "b3", "c1", "c2", "c3"]); 40 | }); 41 | }); 42 | 43 | describe("combo", function() { 44 | it("combo([])", function() { 45 | expect(combo([])).toEqual([]); 46 | }); 47 | 48 | it("combo([[a]])", function() { 49 | expect(combo([["a"]])).toEqual(["a"]); 50 | // expect(combo([["a"]])).toEqual([["a"]]); 51 | }); 52 | 53 | it("combo([[a,b]])", function() { 54 | expect(combo([["a", "b"]])).toEqual(["a", "b"]); 55 | // expect(combo([["a", "b"]])).toEqual([["a", "b"]]); 56 | }); 57 | 58 | it("combo([[a,b],[1]])", function() { 59 | expect(combo([["a", "b"], ["1"]])).toEqual(["a1", "b1"]); 60 | // expect(combo([["a", "b"], ["1"]])).toEqual([["a1", "b1"]]); 61 | }); 62 | 63 | it("combo([[a,b],[1,2]])", function() { 64 | expect(combo([["a", "b"], ["1", "2"]])).toEqual(["a1", "a2", "b1", "b2"]); 65 | // expect(combo([["a", "b"], ["1", "2"]])).toEqual([["a1", "a2", "b1", "b2"]]); 66 | }); 67 | 68 | it("combo([[a,b],[1,2],[A]])", function() { 69 | expect(combo([["a", "b"], ["1", "2"], ["A"]])).toEqual(["a1A", "a2A", "b1A", "b2A"]); 70 | // expect(combo([["a", "b"], ["1", "2"], ["A"]])).toEqual([["a1A", "a2A", "b1A", "b2A"]]); 71 | }); 72 | 73 | it("combo([[a,b],[1,2],[A,B]])", function() { 74 | expect(combo([["a", "b"], ["1", "2"], ["A", "B"]])).toEqual(["a1A", "a1B", "a2A", "a2B", "b1A", "b1B", "b2A", "b2B"]); 75 | // expect(combo([["a", "b"], ["1", "2"], ["A", "B"]])).toEqual([["a1A", "a1B", "a2A", "a2B", "b1A", "b1B", "b2A", "b2B"]]); 76 | }); 77 | }); 78 | 79 | describe("compact2array", function() { 80 | it("compact2array([], [])", function() { 81 | expect(compact2array([], [])).toEqual([["", ""]]); 82 | }); 83 | 84 | it("compact2array([a], [])", function() { 85 | expect(compact2array(["a"], [])).toEqual([["a", ""]]); 86 | }); 87 | 88 | it("compact2array([], [1])", function() { 89 | expect(compact2array([], ["1"])).toEqual([["", "1"]]); 90 | }); 91 | 92 | it("compact2array([a, b, c], [])", function() { 93 | expect(compact2array(["a", "b", "c"], [])).toEqual([["a", ""], ["b", ""], ["c", ""]]); 94 | }); 95 | 96 | it("compact2array([], [a, b, c])", function() { 97 | expect(compact2array([], ["a", "b", "c"])).toEqual([["", "a"], ["", "b"], ["", "c"]]); 98 | }); 99 | 100 | it("compact2array([a], [1])", function() { 101 | expect(compact2array(["a"], ["1"])).toEqual([["a", "1"]]); 102 | }); 103 | 104 | it("compact2array([a,b], [1])", function() { 105 | expect(compact2array(["a", "b"], ["1"])).toEqual([["a", "1"], ["b", "1"]]); 106 | }); 107 | 108 | it("compact2array([a], [1,2])", function() { 109 | expect(compact2array(["a"], ["1", "2"])).toEqual([["a", "1"], ["a", "2"]]); 110 | }); 111 | 112 | it("compact2array([a,b], [1,2])", function() { 113 | expect(compact2array(["a", "b"], ["1", "2"])).toEqual([["a", "1"], ["a", "2"], ["b", "1"], ["b", "2"]]); 114 | }); 115 | 116 | it("compact2array([a,b,c], [1,2,3])", function() { 117 | expect(compact2array(["a", "b", "c"], ["1", "2", "3"])).toEqual([["a", "1"], ["a", "2"], ["a", "3"], ["b", "1"], ["b", "2"], ["b", "3"], ["c", "1"], ["c", "2"], ["c", "3"]]); 118 | }); 119 | }); 120 | 121 | describe("compact", function() { 122 | it("compact([])", function() { 123 | expect(compact([])).toEqual([]); 124 | }); 125 | 126 | it("compact([[a]])", function() { 127 | expect(compact([["a"]])).toEqual([["a"]]); 128 | }); 129 | 130 | it("compact([[a,b]])", function() { 131 | expect(compact([["a", "b"]])).toEqual([["a", "b"]]); 132 | }); 133 | 134 | it("compact([[a,b],[1]])", function() { 135 | expect(compact([["a", "b"], ["1"]])).toEqual([["a", "1"], ["b", "1"]]); 136 | }); 137 | 138 | it("compact([[a,b],[1,2]])", function() { 139 | expect(compact([["a", "b"], ["1", "2"]])).toEqual([["a", "1"], ["a", "2"], ["b", "1"], ["b", "2"]]); 140 | }); 141 | 142 | it("compact([[a,b],[1,2],[A]])", function() { 143 | expect(compact([["a", "b"], ["1", "2"], ["A"]])).toEqual([["a", "1", "A"], ["a", "2", "A"], ["b", "1", "A"], ["b", "2", "A"]]); 144 | }); 145 | 146 | it("compact([[a,b],[1,2],[A]])", function() { 147 | expect(compact([["a", "b"], ["1", "2"], ["A"]])).toEqual([["a", "1", "A"], ["a", "2", "A"], ["b", "1", "A"], ["b", "2", "A"]]); 148 | }); 149 | 150 | it("compact([[a,b],[1,2],[A,B]])", function() { 151 | expect(compact([["a", "b"], ["1", "2"], ["A", "B"]])).toEqual([["a", "1", "A"], ["a", "1", "B"], ["a", "2", "A"], ["a", "2", "B"], ["b", "1", "A"], ["b", "1", "B"], ["b", "2", "A"], ["b", "2", "B"]]); 152 | }); 153 | 154 | it("compact([[ni],[],[hao, hai]])", function() { 155 | expect(compact([["ni"], [], ["hao", "hai"]])).toEqual([["ni", "", "hao"], ["ni", "", "hai"]]); 156 | }); 157 | }); 158 | }); 159 | -------------------------------------------------------------------------------- /tools/a2b.js: -------------------------------------------------------------------------------- 1 | /*jshint node:true,strict:false*/ 2 | var fs = require('fs'); 3 | var path = require('path'); 4 | var root = path.join(__dirname, '..'); 5 | 6 | var dict = require('./tmp-dict'); 7 | 8 | var START = 0x3400; 9 | var END = 0x2A599; 10 | var result = []; 11 | //var offset = START; 12 | var startCode; 13 | var ranges = []; 14 | 15 | function a2b(ascii) { 16 | var codes = []; 17 | for (var i = 0, l = ascii.length; i < l; i++) { 18 | codes.push(ascii.charCodeAt(i)); 19 | } 20 | return codes; 21 | } 22 | console.log('a2b:', a2b('中2b')); 23 | console.log('hex:', (999999).toString(16)); 24 | 25 | for (var hanCode = START; hanCode < END; hanCode++) { 26 | if (!dict[hanCode]) { 27 | if (startCode) { 28 | ranges.push([startCode, hanCode - 1]); 29 | console.log('[', startCode.toString(16), (hanCode - 1).toString(16), ']'); 30 | startCode = null; 31 | } 32 | continue; 33 | } 34 | if (!startCode) { 35 | startCode = hanCode; 36 | } 37 | 38 | result.push(Buffer.concat([ 39 | new Buffer(getBufferArr(hanCode, 3)), 40 | new Buffer(a2b(dict[hanCode] + '\n')) 41 | ])); 42 | } 43 | 44 | //fs.writeFileSync(path.join(root, 'data/dict.bin'), Buffer.concat(result)); 45 | console.log(getBufferArr(0x3400, 3)); 46 | fs.writeFileSync(path.join(root, 'data/dict.bin'), Buffer.concat([new Buffer(getBufferArr(0x3400, 3)), new Buffer(a2b('中2b'))])); 47 | 48 | function right (str, length) { 49 | if (str.length <= length) { 50 | return str; 51 | } 52 | return str.substring(str.length - length); 53 | } 54 | 55 | function getBufferArr(number, bytes){ 56 | var ret = []; 57 | var str = number.toString(16); 58 | // 超出长度后,取后面部分。 59 | if(str.length > bytes * 2) { 60 | str = right(str, bytes * 2); 61 | console.log(str); 62 | } else { // 不足长度补 0。 63 | str = right('0'.repeat(bytes * 2) + str, bytes * 2); 64 | } 65 | // 将每个数字转成 16 进制存储。 66 | for(var i = 0; i < bytes; i++){ 67 | ret.push(parseInt(str.substr(i * 2, 2), 16)); 68 | } 69 | return ret; 70 | } 71 | -------------------------------------------------------------------------------- /tools/combo-dict.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @overview 3 | * 4 | * @author 闲耘™ (hotoo.cn[AT]gmail.com) 5 | * @version 2013/01/28 6 | */ 7 | 8 | var dict = require("./dict/dict-zi-frequent"); 9 | 10 | var comboed = {}; 11 | for(var han in dict){ 12 | 13 | if(!dict.hasOwnProperty(han)){continue;} 14 | 15 | // 方案一:先拆分多音字的拼音,单独进行合并。 16 | // 多音字会被拆分到多个拼音中去,且无法调整多音字常用拼音的排序。 17 | //var pys = dict[han].split(","); 18 | //for(var i=0,py,l=pys.length; i { 10 | setPlayingPinyin(pinyin); 11 | }; 12 | 13 | return ( 14 | 15 | {children} 16 | 17 | ); 18 | } 19 | 20 | // 自定义 Hook 来便捷使用 context 21 | export function usePinyinTable() { 22 | return useContext(PinyinTableContext); 23 | } -------------------------------------------------------------------------------- /tools/pinyin-table/pinyin-table.css: -------------------------------------------------------------------------------- 1 | 2 | * { 3 | box-sizing: border-box; 4 | } 5 | h1 { 6 | font-size: 55px; 7 | } 8 | 9 | .container { 10 | max-width: 1170px; 11 | width: 100%; 12 | margin: 0 auto; 13 | } 14 | 15 | .top-wrapper { 16 | padding: 90px 0 50px 0; 17 | /* background-image: url(./image/chinese-background.jpg); */ 18 | background-size: cover; 19 | color: white; 20 | text-align: center; 21 | opacity: 0.7; 22 | } 23 | 24 | .top-wrapper p { 25 | margin: 0; 26 | } 27 | 28 | .tablewrapper { 29 | overflow: scroll; 30 | -webkit-overflow-scrolling: touch; 31 | overflow-scrolling: touch; 32 | } 33 | 34 | table, 35 | td, 36 | th { 37 | border: 1px solid #eee !important; 38 | border-collapse: collapse; 39 | text-align: center; 40 | font-size: 12px!important; 41 | /*謾ケ陦後&縺帙↑縺�*/ 42 | white-space: nowrap; 43 | } 44 | 45 | td, 46 | th { 47 | padding: 3px!important; 48 | width: 30px!important; 49 | height: 25px!important; 50 | } 51 | 52 | th { 53 | background: #f0e6cc; 54 | font-weight: normal; 55 | } 56 | 57 | .even { 58 | background: #fbf8f0; 59 | } 60 | 61 | .odd { 62 | background: #fefcf9; 63 | } 64 | 65 | .light_green { 66 | color: #777; 67 | background-color: #f6f6f6; 68 | /* background-color: #CEF6CE; */ 69 | } 70 | 71 | .pink { 72 | background-color: #F8E0F1; 73 | } 74 | 75 | .orange { 76 | background-color: #F5D0A9; 77 | } 78 | 79 | .blue { 80 | background-color: #CED8F6; 81 | } 82 | 83 | .yellow { 84 | background-color: #F5F6CE; 85 | } 86 | 87 | .purple { 88 | background-color: #E3CEF6; 89 | } 90 | 91 | .emerald { 92 | background-color: #A9F5E1; 93 | } 94 | 95 | .pink, 96 | .orange, 97 | .blue, 98 | .yellow, 99 | .purple, 100 | .emerald { 101 | opacity: 0.4; 102 | } 103 | 104 | .pinyin_audio { 105 | opacity: 1.0; 106 | cursor: pointer; 107 | box-shadow: inset -0px -1px 1px -0px rgba(0, 0, 0, 0.2); 108 | /* box-shadow: inset -1px -2px 2px 1px rgba(0, 0, 0, 0.4); */ 109 | } 110 | 111 | 112 | .loading-audio { 113 | box-shadow: inset 1px 1px 1px 0px rgba(0, 0, 0, 0.2); 114 | } 115 | 116 | .playing-audio { 117 | box-shadow: inset 1px 1px 1px 0px rgba(0, 0, 0, 0.2); 118 | color: red; 119 | } 120 | 121 | 122 | 123 | #loader { 124 | display: none; 125 | pointer-events: none 126 | } -------------------------------------------------------------------------------- /tools/robot-ci.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @overview 3 | * 4 | * @author 闲耘™ (hotoo.cn[AT]gmail.com) 5 | * @version 2013/01/27 6 | */ 7 | 8 | var remote = require("./remote"); 9 | var URLEncoder = require("./urlencode"); 10 | // 分词程序的词库。 11 | var WORDS = require("./data-phrases"); 12 | var PINYIN_DICT = require("../src/pinyin-dict.js"); 13 | 14 | var dict = []; 15 | checkWords: 16 | for(var i=0 ,word,l=WORDS.length; i 0){ 23 | dict.push(word); 24 | break; 25 | //continue checkWords; 26 | } 27 | } 28 | } 29 | console.log(dict.length); 30 | 31 | 32 | // 从快典网查询,带注音的 GBK 编码拼音,Iconv 无法正常转换编码, 33 | // 而其注音格式参数无效,未完成。 34 | function getKDDPinyinDict(han){ 35 | remote("http://py.kdd.cc/index.asp?zy=1&u=3&dy=red&ps=gray&zs=blue&kd=55&wz="+ 36 | URLEncoder.encode(han), "POST", function(html){ 37 | var py_start = ""; 38 | var py_end = ""; 39 | var idx = html.indexOf(py_start); 40 | var idx2 = html.indexOf(py_end, idx); 41 | if(idx < 0){ 42 | console.log(han, "No Found.") 43 | return; 44 | } 45 | console.log(han, ":", html.substring(idx+py_start.length, idx2)); 46 | //console.log(html); 47 | }, function(response){ 48 | }); 49 | } 50 | 51 | function trim(str){ 52 | return str.replace(/^\s+/, '').replace(/\s+$/, ''); 53 | } 54 | 55 | // 各个汉字的读音独立存储。 56 | var PINYIN_DATA = {}; 57 | // 同音字合并存储。 58 | var PINYIN_DATA_MIXED = {}; 59 | var counts = 0; 60 | function getPinyinDict(han){ 61 | remote("http://zi.artx.cn/ci/search/?dsearch_kind=1&dsearch_main="+ 62 | encodeURIComponent(han)+"&x=0&y=0", "POST", function(html){ 63 | var py_start = '

'; 64 | var py_middle = '
' 65 | var py_end = '
'; 66 | var idx = html.indexOf(py_start); 67 | var idx1 = html.indexOf(py_middle, idx); 68 | var idx2 = html.indexOf(py_end, idx); 69 | if(idx < 0){ 70 | return; 71 | }else{ 72 | var s_py = html.substring(idx1+py_middle.length, idx2); 73 | s_py = trim(s_py); 74 | if(s_py===""){return;} 75 | s_py = s_py.replace(/\s{2,}/g, " "); 76 | var a_py = s_py.split(" "); 77 | PINYIN_DATA[han] = a_py; 78 | console.log('"'+han+'": ["'+a_py.join('", "')+'"],'); 79 | } 80 | 81 | counts++; 82 | // finished. 83 | // XXX: 前面有 return, 这里可能无法得到执行。 84 | if(WORDS.length === counts){ 85 | //console.log(JSON.stringify(PINYIN_DATA)); 86 | } 87 | }, 88 | function(response){ 89 | } 90 | ); 91 | } 92 | 93 | function chunk(array, process, context){ 94 | var items = array.concat(); //clone the array 95 | var delay = 15; 96 | setTimeout(function(){ 97 | var item = items.shift(); 98 | process.call(context, item); 99 | 100 | if (items.length > 0){ 101 | setTimeout(arguments.callee, delay); 102 | } 103 | }, delay); 104 | } 105 | 106 | chunk(dict, getPinyinDict); 107 | 108 | //for(var i=0,l=dict.length; i([^<]+)<\/a>/g; 34 | var m; 35 | var py = []; 36 | while(m = re_py.exec(html)){ 37 | py.push(m[1]); 38 | } 39 | if(py.length === 0){ 40 | console.error("404, Not Matched.", haxCode, han, url); 41 | }else{ 42 | console.log('dict[' + haxCode + '] = "' + py.join(",") + '"; /* ' + han + ' */'); 43 | } 44 | }); 45 | } 46 | 47 | 48 | var START = 0x3400; 49 | var END = 0x2A599; 50 | 51 | for(var i=START; i<=END; i++){ 52 | getPinyin(i); 53 | } 54 | 55 | 56 | 57 | 58 | // 分时处理数组的每一项数据。 59 | // @param {Array} array, 待处理的数值数据。 60 | // @param {Function} process, 处理过程。 61 | // @param {Object} 处理过程和回调函数中 this 指向的上下文。 62 | // @param {Function} 分时处理完成的回调函数。 63 | function chunk(array, process, context, callback){ 64 | var items = array.concat(); //clone the array 65 | var delay = 25; 66 | 67 | setTimeout(function(){ 68 | var item = items.shift(); 69 | process.call(context, item); 70 | 71 | if(items.length > 0){ 72 | setTimeout(arguments.callee, delay); 73 | }else{ 74 | callback && callback.call(context); 75 | } 76 | }, delay); 77 | } 78 | 79 | function getPinyinDict(han){ 80 | request.post(SERVER + "/sousuo/?lb_a=hp&lb_b=mh&lb_c=mh&tp=tp1&q=" + encodeURIComponent(han), function(error, response, html){ 81 | if(error || response.statusCode !== 302){ 82 | console.error("404, Not Found. 0", han); 83 | return; 84 | } 85 | 86 | var url = response.headers.location; 87 | 88 | request(SERVER + url, function(err, res, body){ 89 | 90 | if(error || response.statusCode !== 200){ 91 | console.error("404, Not Found 1.", han); 92 | return; 93 | } 94 | 95 | var re_py = /
拼音:([^<]+)<\/span>/; 96 | var m_py = body.match(re_py); 97 | if(m_py && m_py[1]){ 98 | 99 | var py = m_py[1]; 100 | console.log('"' + han + '": "' + py + '",'); 101 | 102 | }else{ 103 | console.error("404, Not Found. 2", han); 104 | } 105 | 106 | }); 107 | } 108 | ); 109 | } 110 | -------------------------------------------------------------------------------- /tools/robot-zi.js: -------------------------------------------------------------------------------- 1 | 2 | //var remote = require("./remote"); 3 | //var URLEncoder = require("./urlencode"); 4 | var request = require("request"); 5 | 6 | var SERVER = "http://zi.artx.cn"; 7 | 8 | // 各个汉字的读音独立存储。 9 | // 同音字合并存储。 10 | 11 | function getPinyinDict(han){ 12 | request(SERVER + "/zi/search/?dsearch_kind=1&dsearch_kind2=on&dsearch_main="+ 13 | encodeURIComponent(han), "GET", function(error, response, html){ 14 | if(error || response.statusCode !== 200){ 15 | console.error("404, Not Found. 0", han); 16 | return; 17 | } 18 | 19 | var re_zi = /
总笔划 \d+ 画:<\/div>.+<\/a><\/div>/; 20 | var m = html.match(re_zi); 21 | if(m && m[1]){ 22 | var url = m[1]; 23 | 24 | request(SERVER + url, function(err, res, body){ 25 | 26 | if(error || response.statusCode !== 200){ 27 | console.error("404, Not Found 1.", han); 28 | return; 29 | } 30 | 31 | var re_py = /
拼音:([^<]+)<\/span>/; 32 | var m_py = body.match(re_py); 33 | if(m_py && m_py[1]){ 34 | 35 | var py = m_py[1]; 36 | console.log('"' + han + '": "' + py + '",'); 37 | 38 | }else{ 39 | console.error("404, Not Found. 2", han); 40 | } 41 | 42 | }); 43 | }else{ 44 | console.error("404, Not Found. 3", han); 45 | } 46 | } 47 | ); 48 | } 49 | 50 | // 分时处理数组的每一项数据。 51 | // @param {Array} array, 待处理的数值数据。 52 | // @param {Function} process, 处理过程。 53 | // @param {Object} 处理过程和回调函数中 this 指向的上下文。 54 | // @param {Function} 分时处理完成的回调函数。 55 | function chunk(array, process, context, callback){ 56 | var items = array.concat(); //clone the array 57 | var delay = 25; 58 | 59 | setTimeout(function(){ 60 | var item = items.shift(); 61 | process.call(context, item); 62 | 63 | if(items.length > 0){ 64 | setTimeout(arguments.callee, delay); 65 | }else{ 66 | callback && callback.call(context); 67 | } 68 | }, delay); 69 | } 70 | 71 | 72 | // @param {Array} hans 汉字集合。 73 | exports.dict = function(hans){ 74 | chunk(hans, getPinyinDict); 75 | }; 76 | 77 | 78 | // 从快典网查询,带注音的 GBK 编码拼音,Iconv 无法正常转换编码, 79 | // 而其注音格式参数无效,未完成。 80 | // @deprecated 81 | function getKDDPinyinDict(han){ 82 | remote("http://py.kdd.cc/index.asp?zy=1&u=3&dy=red&ps=gray&zs=blue&kd=55&wz="+ 83 | URLEncoder.encode(han), "POST", function(html){ 84 | var py_start = ""; 85 | var py_end = ""; 86 | var idx = html.indexOf(py_start); 87 | var idx2 = html.indexOf(py_end, idx); 88 | if(idx < 0){ 89 | console.log(han, "No Found.") 90 | return; 91 | } 92 | console.log(han, ":", html.substring(idx+py_start.length, idx2)); 93 | //console.log(html); 94 | }, function(response){ 95 | }); 96 | } 97 | -------------------------------------------------------------------------------- /tools/segment.js: -------------------------------------------------------------------------------- 1 | const nodejieba = require("nodejieba"); 2 | const rustjieba = require("@node-rs/jieba"); 3 | console.log('----debug', rustjieba); 4 | 5 | const words = "我的名字叫做江大桥,田亮"; 6 | console.log('nodejieba: ', nodejieba.tag(words, 4)); 7 | console.log('rustjieba: ', rustjieba.tag(words)); 8 | -------------------------------------------------------------------------------- /tools/zi/frequent.js: -------------------------------------------------------------------------------- 1 | // 常用字(2500字) 2 | // 笔画顺序表 3 | // @see http://www.china-language.gov.cn/wenziguifan/shanghi/013c.htm 4 | module.exports = [ 5 | 6 | // 一画 7 | "一乙", 8 | 9 | // 二画 10 | "二十丁厂七卜人入八九几儿了力乃刀又", 11 | 12 | // 三画 13 | "三于干亏士工土才寸下大丈与万上小", 14 | "口巾山千乞川亿个勺久凡及夕丸么广", 15 | "亡门义之尸弓己已子卫也女飞刃习叉", 16 | "马乡", 17 | 18 | 19 | // 四画 20 | "丰王井开夫天无元专云扎艺木五支厅", 21 | "不太犬区历尤友匹车巨牙屯比互切瓦", 22 | "止少日中冈贝内水见午牛手毛气升长", 23 | "仁什片仆化仇币仍仅斤爪反介父从今", 24 | "凶分乏公仓月氏勿欠风丹匀乌凤勾文", 25 | "六方火为斗忆订计户认心尺引丑巴孔", 26 | "队办以允予劝双书幻", 27 | 28 | // 五画 29 | "玉刊示末未击打巧正扑扒功扔去甘世", 30 | "古节本术可丙左厉右石布龙平灭轧东", 31 | "卡北占业旧帅归且旦目叶甲申叮电号", 32 | "田由史只央兄叼叫另叨叹四生失禾丘", 33 | "付仗代仙们仪白仔他斥瓜乎丛令用甩", 34 | "印乐句匆册犯外处冬鸟务包饥主市立", 35 | "闪兰半汁汇头汉宁穴它讨写让礼训必", 36 | "议讯记永司尼民出辽奶奴加召皮边发", 37 | "孕圣对台矛纠母幼丝", 38 | 39 | // 六画 40 | "式刑动扛寺吉扣考托老执巩圾扩扫地", 41 | "扬场耳共芒亚芝朽朴机权过臣再协西", 42 | "压厌在有百存而页匠夸夺灰达列死成", 43 | "夹轨邪划迈毕至此贞师尘尖劣光当早", 44 | "吐吓虫曲团同吊吃因吸吗屿帆岁回岂", 45 | "刚则肉网年朱先丢舌竹迁乔伟传乒乓", 46 | "休伍伏优伐延件任伤价份华仰仿伙伪", 47 | "自血向似后行舟全会杀合兆企众爷伞", 48 | "创肌朵杂危旬旨负各名多争色壮冲冰", 49 | "庄庆亦刘齐交次衣产决充妄闭问闯羊", 50 | "并关米灯州汗污江池汤忙兴宇守宅字", 51 | "安讲军许论农讽设访寻那迅尽导异孙", 52 | "阵阳收阶阴防奸如妇好她妈戏羽观欢", 53 | "买红纤级约纪驰巡", 54 | 55 | // 七画 56 | "寿弄麦形进戒吞远违运扶抚坛技坏扰", 57 | "拒找批扯址走抄坝贡攻赤折抓扮抢孝", 58 | "均抛投坟抗坑坊抖护壳志扭块声把报", 59 | "却劫芽花芹芬苍芳严芦劳克苏杆杠杜", 60 | "材村杏极李杨求更束豆两丽医辰励否", 61 | "还歼来连步坚旱盯呈时吴助县里呆园", 62 | "旷围呀吨足邮男困吵串员听吩吹呜吧", 63 | "吼别岗帐财针钉告我乱利秃秀私每兵", 64 | "估体何但伸作伯伶佣低你住位伴身皂", 65 | "佛近彻役返余希坐谷妥含邻岔肝肚肠", 66 | "龟免狂犹角删条卵岛迎饭饮系言冻状", 67 | "亩况床库疗应冷这序辛弃冶忘闲间闷", 68 | "判灶灿弟汪沙汽沃泛沟没沈沉怀忧快", 69 | "完宋宏牢究穷灾良证启评补初社识诉", 70 | "诊词译君灵即层尿尾迟局改张忌际陆", 71 | "阿陈阻附妙妖妨努忍劲鸡驱纯纱纳纲", 72 | "驳纵纷纸纹纺驴纽", 73 | 74 | // 八画 75 | "奉玩环武青责现表规抹拢拔拣担坦押", 76 | "抽拐拖拍者顶拆拥抵拘势抱垃拉拦拌", 77 | "幸招坡披拨择抬其取苦若茂苹苗英范", 78 | "直茄茎茅林枝杯柜析板松枪构杰述枕", 79 | "丧或画卧事刺枣雨卖矿码厕奔奇奋态", 80 | "欧垄妻轰顷转斩轮软到非叔肯齿些虎", 81 | "虏肾贤尚旺具果味昆国昌畅明易昂典", 82 | "固忠咐呼鸣咏呢岸岩帖罗帜岭凯败贩", 83 | "购图钓制知垂牧物乖刮秆和季委佳侍", 84 | "供使例版侄侦侧凭侨佩货依的迫质欣", 85 | "征往爬彼径所舍金命斧爸采受乳贪念", 86 | "贫肤肺肢肿胀朋股肥服胁周昏鱼兔狐", 87 | "忽狗备饰饱饲变京享店夜庙府底剂郊", 88 | "废净盲放刻育闸闹郑券卷单炒炊炕炎", 89 | "炉沫浅法泄河沾泪油泊沿泡注泻泳泥", 90 | "沸波泼泽治怖性怕怜怪学宝宗定宜审", 91 | "宙官空帘实试郎诗肩房诚衬衫视话诞", 92 | "询该详建肃录隶居届刷屈弦承孟孤陕", 93 | "降限妹姑姐姓始驾参艰线练组细驶织", 94 | "终驻驼绍经贯", 95 | 96 | // 九画 97 | "奏春帮珍玻毒型挂封持项垮挎城挠政", 98 | "赴赵挡挺括拴拾挑指垫挣挤拼挖按挥", 99 | "挪某甚革荐巷带草茧茶荒茫荡荣故胡", 100 | "南药标枯柄栋相查柏柳柱柿栏树要咸", 101 | "威歪研砖厘厚砌砍面耐耍牵残殃轻鸦", 102 | "皆背战点临览竖省削尝是盼眨哄显哑", 103 | "冒映星昨畏趴胃贵界虹虾蚁思蚂虽品", 104 | "咽骂哗咱响哈咬咳哪炭峡罚贱贴骨钞", 105 | "钟钢钥钩卸缸拜看矩怎牲选适秒香种", 106 | "秋科重复竿段便俩贷顺修保促侮俭俗", 107 | "俘信皇泉鬼侵追俊盾待律很须叙剑逃", 108 | "食盆胆胜胞胖脉勉狭狮独狡狱狠贸怨", 109 | "急饶蚀饺饼弯将奖哀亭亮度迹庭疮疯", 110 | "疫疤姿亲音帝施闻阀阁差养美姜叛送", 111 | "类迷前首逆总炼炸炮烂剃洁洪洒浇浊", 112 | "洞测洗活派洽染济洋洲浑浓津恒恢恰", 113 | "恼恨举觉宣室宫宪突穿窃客冠语扁袄", 114 | "祖神祝误诱说诵垦退既屋昼费陡眉孩", 115 | "除险院娃姥姨姻娇怒架贺盈勇怠柔垒", 116 | "绑绒结绕骄绘给络骆绝绞统", 117 | 118 | // 十画 119 | "耕耗艳泰珠班素蚕顽盏匪捞栽捕振载", 120 | "赶起盐捎捏埋捉捆捐损都哲逝捡换挽", 121 | "热恐壶挨耻耽恭莲莫荷获晋恶真框桂", 122 | "档桐株桥桃格校核样根索哥速逗栗配", 123 | "翅辱唇夏础破原套逐烈殊顾轿较顿毙", 124 | "致柴桌虑监紧党晒眠晓鸭晃晌晕蚊哨", 125 | "哭恩唤啊唉罢峰圆贼贿钱钳钻铁铃铅", 126 | "缺氧特牺造乘敌秤租积秧秩称秘透笔", 127 | "笑笋债借值倚倾倒倘俱倡候俯倍倦健", 128 | "臭射躬息徒徐舰舱般航途拿爹爱颂翁", 129 | "脆脂胸胳脏胶脑狸狼逢留皱饿恋桨浆", 130 | "衰高席准座脊症病疾疼疲效离唐资凉", 131 | "站剖竞部旁旅畜阅羞瓶拳粉料益兼烤", 132 | "烘烦烧烛烟递涛浙涝酒涉消浩海涂浴", 133 | "浮流润浪浸涨烫涌悟悄悔悦害宽家宵", 134 | "宴宾窄容宰案请朗诸读扇袜袖袍被祥", 135 | "课谁调冤谅谈谊剥恳展剧屑弱陵陶陷", 136 | "陪娱娘通能难预桑绢绣验继", 137 | 138 | // 十一画 139 | "球理捧堵描域掩捷排掉堆推掀授教掏", 140 | "掠培接控探据掘职基著勒黄萌萝菌菜", 141 | "萄菊萍菠营械梦梢梅检梳梯桶救副票", 142 | "戚爽聋袭盛雪辅辆虚雀堂常匙晨睁眯", 143 | "眼悬野啦晚啄距跃略蛇累唱患唯崖崭", 144 | "崇圈铜铲银甜梨犁移笨笼笛符第敏做", 145 | "袋悠偿偶偷您售停偏假得衔盘船斜盒", 146 | "鸽悉欲彩领脚脖脸脱象够猜猪猎猫猛", 147 | "馅馆凑减毫麻痒痕廊康庸鹿盗章竟商", 148 | "族旋望率着盖粘粗粒断剪兽清添淋淹", 149 | "渠渐混渔淘液淡深婆梁渗情惜惭悼惧", 150 | "惕惊惨惯寇寄宿窑密谋谎祸谜逮敢屠", 151 | "弹随蛋隆隐婚婶颈绩绪续骑绳维绵绸", 152 | "绿", 153 | 154 | // 十二画 155 | "琴斑替款堪搭塔越趁趋超提堤博揭喜", 156 | "插揪搜煮援裁搁搂搅握揉斯期欺联散", 157 | "惹葬葛董葡敬葱落朝辜葵棒棋植森椅", 158 | "椒棵棍棉棚棕惠惑逼厨厦硬确雁殖裂", 159 | "雄暂雅辈悲紫辉敞赏掌晴暑最量喷晶", 160 | "喇遇喊景践跌跑遗蛙蛛蜓喝喂喘喉幅", 161 | "帽赌赔黑铸铺链销锁锄锅锈锋锐短智", 162 | "毯鹅剩稍程稀税筐等筑策筛筒答筋筝", 163 | "傲傅牌堡集焦傍储奥街惩御循艇舒番", 164 | "释禽腊脾腔鲁猾猴然馋装蛮就痛童阔", 165 | "善羡普粪尊道曾焰港湖渣湿温渴滑湾", 166 | "渡游滋溉愤慌惰愧愉慨割寒富窜窝窗", 167 | "遍裕裤裙谢谣谦属屡强粥疏隔隙絮嫂", 168 | "登缎缓编骗缘", 169 | 170 | // 十三画 171 | "瑞魂肆摄摸填搏塌鼓摆携搬摇搞塘摊", 172 | "蒜勤鹊蓝墓幕蓬蓄蒙蒸献禁楚想槐榆", 173 | "楼概赖酬感碍碑碎碰碗碌雷零雾雹输", 174 | "督龄鉴睛睡睬鄙愚暖盟歇暗照跨跳跪", 175 | "路跟遣蛾蜂嗓置罪罩错锡锣锤锦键锯", 176 | "矮辞稠愁筹签简毁舅鼠催傻像躲微愈", 177 | "遥腰腥腹腾腿触解酱痰廉新韵意粮数", 178 | "煎塑慈煤煌满漠源滤滥滔溪溜滚滨粱", 179 | "滩慎誉塞谨福群殿辟障嫌嫁叠缝缠", 180 | 181 | // 十四画 182 | "静碧璃墙撇嘉摧截誓境摘摔聚蔽慕暮", 183 | "蔑模榴榜榨歌遭酷酿酸磁愿需弊裳颗", 184 | "嗽蜻蜡蝇蜘赚锹锻舞稳算箩管僚鼻魄", 185 | "貌膜膊膀鲜疑馒裹敲豪膏遮腐瘦辣竭", 186 | "端旗精歉熄熔漆漂漫滴演漏慢寨赛察", 187 | "蜜谱嫩翠熊凳骡缩", 188 | 189 | // 十五画 190 | "慧撕撒趣趟撑播撞撤增聪鞋蕉蔬横槽", 191 | "樱橡飘醋醉震霉瞒题暴瞎影踢踏踩踪", 192 | "蝶蝴嘱墨镇靠稻黎稿稼箱箭篇僵躺僻", 193 | "德艘膝膛熟摩颜毅糊遵潜潮懂额慰劈", 194 | 195 | // 十六画 196 | "操燕薯薪薄颠橘整融醒餐嘴蹄器赠默", 197 | "镜赞篮邀衡膨雕磨凝辨辩糖糕燃澡激", 198 | "懒壁避缴", 199 | 200 | // 十七画 201 | "戴擦鞠藏霜霞瞧蹈螺穗繁辫赢糟糠燥", 202 | "臂翼骤", 203 | 204 | // 十八画 205 | "鞭覆蹦镰翻鹰", 206 | 207 | // 十九画 208 | "警攀蹲颤瓣爆疆", 209 | 210 | // 二十画 211 | "壤耀躁嚼嚷籍魔灌", 212 | 213 | // 二十一画 214 | "蠢霸露", 215 | 216 | // 二十二画 217 | "囊", 218 | 219 | // 二十三画 220 | "罐" 221 | ].join(""); 222 | -------------------------------------------------------------------------------- /tools/zi/frequent2.js: -------------------------------------------------------------------------------- 1 | // 次常用字(1000字) 2 | // 笔画顺序表 3 | // @see http://www.china-language.gov.cn/wenziguifan/shanghi/013d.htm 4 | module.exports = [ 5 | // 画 6 | "匕刁", 7 | 8 | // 画 9 | "丐歹戈夭仑讥冗邓", 10 | 11 | // 画 12 | "艾夯凸卢叭叽皿凹囚矢乍尔冯玄", 13 | 14 | // 画 15 | "邦迂邢芋芍吏夷吁吕吆屹廷迄臼仲伦", 16 | "伊肋旭匈凫妆亥汛讳讶讹讼诀弛阱驮", 17 | "驯纫", 18 | 19 | // 画 20 | "玖玛韧抠扼汞扳抡坎坞抑拟抒芙芜苇", 21 | "芥芯芭杖杉巫杈甫匣轩卤肖吱吠呕呐", 22 | "吟呛吻吭邑囤吮岖牡佑佃伺囱肛肘甸", 23 | "狈鸠彤灸刨庇吝庐闰兑灼沐沛汰沥沦", 24 | "汹沧沪忱诅诈罕屁坠妓姊妒纬", 25 | 26 | // 画 27 | "玫卦坷坯拓坪坤拄拧拂拙拇拗茉昔苛", 28 | "苫苟苞茁苔枉枢枚枫杭郁矾奈奄殴歧", 29 | "卓昙哎咕呵咙呻咒咆咖帕账贬贮氛秉", 30 | "岳侠侥侣侈卑刽刹肴觅忿瓮肮肪狞庞", 31 | "疟疙疚卒氓炬沽沮泣泞泌沼怔怯宠宛", 32 | "衩祈诡帚屉弧弥陋陌函姆虱叁绅驹绊", 33 | "绎", 34 | 35 | // 画 36 | "契贰玷玲珊拭拷拱挟垢垛拯荆茸茬荚", 37 | "茵茴荞荠荤荧荔栈柑栅柠枷勃柬砂泵", 38 | "砚鸥轴韭虐昧盹咧昵昭盅勋哆咪哟幽", 39 | "钙钝钠钦钧钮毡氢秕俏俄俐侯徊衍胚", 40 | "胧胎狰饵峦奕咨飒闺闽籽娄烁炫洼柒", 41 | "涎洛恃恍恬恤宦诫诬祠诲屏屎逊陨姚", 42 | "娜蚤骇", 43 | 44 | // 画 45 | "耘耙秦匿埂捂捍袁捌挫挚捣捅埃耿聂", 46 | "荸莽莱莉莹莺梆栖桦栓桅桩贾酌砸砰", 47 | "砾殉逞哮唠哺剔蚌蚜畔蚣蚪蚓哩圃鸯", 48 | "唁哼唆峭唧峻赂赃钾铆氨秫笆俺赁倔", 49 | "殷耸舀豺豹颁胯胰脐脓逛卿鸵鸳馁凌", 50 | "凄衷郭斋疹紊瓷羔烙浦涡涣涤涧涕涩", 51 | "悍悯窍诺诽袒谆祟恕娩骏", 52 | 53 | // 一画 54 | "琐麸琉琅措捺捶赦埠捻掐掂掖掷掸掺", 55 | "勘聊娶菱菲萎菩萤乾萧萨菇彬梗梧梭", 56 | "曹酝酗厢硅硕奢盔匾颅彪眶晤曼晦冕", 57 | "啡畦趾啃蛆蚯蛉蛀唬啰唾啤啥啸崎逻", 58 | "崔崩婴赊铐铛铝铡铣铭矫秸秽笙笤偎", 59 | "傀躯兜衅徘徙舶舷舵敛翎脯逸凰猖祭", 60 | "烹庶庵痊阎阐眷焊焕鸿涯淑淌淮淆渊", 61 | "淫淳淤淀涮涵惦悴惋寂窒谍谐裆袱祷", 62 | "谒谓谚尉堕隅婉颇绰绷综绽缀巢", 63 | 64 | // 二画 65 | "琳琢琼揍堰揩揽揖彭揣搀搓壹搔葫募", 66 | "蒋蒂韩棱椰焚椎棺榔椭粟棘酣酥硝硫", 67 | "颊雳翘凿棠晰鼎喳遏晾畴跋跛蛔蜒蛤", 68 | "鹃喻啼喧嵌赋赎赐锉锌甥掰氮氯黍筏", 69 | "牍粤逾腌腋腕猩猬惫敦痘痢痪竣翔奠", 70 | "遂焙滞湘渤渺溃溅湃愕惶寓窖窘雇谤", 71 | "犀隘媒媚婿缅缆缔缕骚", 72 | 73 | // 三画 74 | "瑟鹉瑰搪聘斟靴靶蓖蒿蒲蓉楔椿楷榄", 75 | "楞楣酪碘硼碉辐辑频睹睦瞄嗜嗦暇畸", 76 | "跷跺蜈蜗蜕蛹嗅嗡嗤署蜀幌锚锥锨锭", 77 | "锰稚颓筷魁衙腻腮腺鹏肄猿颖煞雏馍", 78 | "馏禀痹廓痴靖誊漓溢溯溶滓溺寞窥窟", 79 | "寝褂裸谬媳嫉缚缤剿", 80 | 81 | // 四画 82 | "赘熬赫蔫摹蔓蔗蔼熙蔚兢榛榕酵碟碴", 83 | "碱碳辕辖雌墅嘁踊蝉嘀幔镀舔熏箍箕", 84 | "箫舆僧孵瘩瘟彰粹漱漩漾慷寡寥谭褐", 85 | "褪隧嫡缨", 86 | 87 | // 五画 88 | "撵撩撮撬擒墩撰鞍蕊蕴樊樟橄敷豌醇", 89 | "磕磅碾憋嘶嘲嘹蝠蝎蝌蝗蝙嘿幢镊镐", 90 | "稽篓膘鲤鲫褒瘪瘤瘫凛澎潭潦澳潘澈", 91 | "澜澄憔懊憎翩褥谴鹤憨履嬉豫缭", 92 | 93 | // 六画 94 | "撼擂擅蕾薛薇擎翰噩橱橙瓢蟥霍霎辙", 95 | "冀踱蹂蟆螃螟噪鹦黔穆篡篷篙篱儒膳", 96 | "鲸瘾瘸糙燎濒憾懈窿缰", 97 | 98 | // 七画 99 | "壕藐檬檐檩檀礁磷瞭瞬瞳瞪曙蹋蟋蟀", 100 | "嚎赡镣魏簇儡徽爵朦臊鳄糜癌懦豁臀", 101 | 102 | // 八画 103 | "藕藤瞻嚣鳍癞瀑襟璧戳", 104 | 105 | // 九画 106 | "攒孽蘑藻鳖蹭蹬簸簿蟹靡癣羹", 107 | 108 | // 十画 109 | "鬓攘蠕巍鳞糯譬", 110 | 111 | // 十一画 112 | "霹躏髓", 113 | 114 | // 十二画 115 | "蘸镶瓤", 116 | 117 | // 十四画 118 | "矗" 119 | ].join(""); 120 | -------------------------------------------------------------------------------- /tools/zi/infrequent.js: -------------------------------------------------------------------------------- 1 | module.exports = "乂乜亍兀弋彳丫巳孑孓幺亓韦廿卅仄厄曰壬仃仉仂兮刈爻殳卞亢闩讣尹夬爿毋邗戋卉邛艽艿札叵匝丕戊匜劢卟叱叩叻冉氕仨仕仟仡仫伋仞卮氐犰卯刍庀邝邙汀汈忉宄讦讧讪讫尻弗弘阢阡尕弁驭匡耒玎玑戎圩圬圭扦圪圳圹扪圯圮芏芊芨芄芎芑芗亘厍戌夼戍尥尧乩旯曳岌屺凼囝囡钆钇缶氘氖牝伎伛伢仳佤仵伥伧伉伫囟甪汆氽刖夙旮犴刎犷犸舛邬饧冱邡汕汔汲汐汜汝汊忖忏讴讵祁讷聿艮厾阮阪丞妁妃牟纡纣纥纨纩玕玙玚抟抔坜圻坂扺坍抃抉毐芫邯芸芾芰苈苊苣芷芮苋芼苌苁芩芪芴芡芟苄苎苡杌杓杧杞忑孛吾邴酉邳矶奁豕尬忒欤轪轫迓邶忐芈卣邺旰呋呓呔呖呃旸吡町虬呙呗吣吲岍帏岐岈岘岑岚兕囵囫钊钋钌迕氙氚岙佞邱佐伾攸佚佝佟佗伽彷佘佥孚豸坌肟邸奂劬狄狃狁邹饨饩饪饫饬亨庑庋疔疖肓闱闳闵闶羌炀沣沅沄沔沤沌沘沏沚汩汨汭沂汾沨汴汶沆沩沁泐怃忮怄忡忤忾怅忻忪怆忭忸诂诃祀祃诋诌诎诏诐诒屃孜陇阽阼陀陂陉妍妩妪妣妊妗妫妞姒妤邵劭刭甬邰矣纭纰纴纶纻纾玮玡玠玢玥玦甙盂忝匦邽坩垅抨拤拈坫垆抻拃拊坼拎坻坨坭抿拚坳耵耶苷苯苤茏苴苜苒苘茌苻苓茚茆茑苑茓茔茕苠茀苕枥枇杪杳枘枧杵枨枞枋杻杷杼矸矻矽砀刳瓯殁郏轭郅鸢盱昊杲昃咂呸昕昀旻昉炅咔畀虮迪咀呷黾咋呱呤咚咛咄呶呦咝岵岢岿岬岫帙岣峁刿峂迥岷剀帔峄沓囹罔钍钎钏钐钒钔钕钗邾迭迮牦竺迤佶佬佴侑佰侉臾岱侗侃侏侩佻佾侪佼佯侬帛阜侔郈徂郐郄怂籴戗肼朊肽肱肫肭肷剁迩郇狉狙狎狝狍狒咎炙枭饯饳饴冽冼庖疠疝疡兖庚妾於劾炜炖炝炔泔沭泷泸泱泅泗泠泜泺泃泖泫泮沱泯泓泾怙怵怦怛怏怍怩怫怊怿怡宕穸穹宓诓诔诖诘戾诙戽郓祆祎祉诛诜诟诠诣诤诧诨诩鸤戕孢亟陔卺妲妯姗妮帑弩孥驽迦迢迨绀绁绂驵驷驸绉驺绋绌驿骀甾砉耔珏珐珂珑玳珀顸珉珈韨拮垭挝垣垯挞垤赳贲垱拽垌哉垲挢埏郝垍垧垓垟垞挦垠拶茜荙荑贳荛荜茈茼莒茱莛茯荏荇荃荟荀茗茭茨垩茳荥荦荨茛荩荪荫茹荬荭柰栉柯柘栊柩枰栌柙枵柚枳柞柝栀柃柢栎枸柈柁柽剌郚剅酊郦甭砗砑砘砒斫砭砜奎耷虺殂殇殄殆轱轲轳轵轶轷轸轹轺虿毖觇尜哐眄眍郢眇眊昽眈哇咭禺哂咴曷昴昱咦哓哔畎毗呲胄畋畈虼虻咣哕剐郧咻囿咿哌哙哚咯咩咤哝哏哞峙峣罘帧峒峤峋峥峧帡贶贻钘钚钛钡钣钤钨钪钫钬钭钯矧氡氟牯郜秭竽笈笃俦俨俅俪叟垡牮俣俚俜皈禹俑俟逅徇徉舢舣俞弇郗俎卻爰郛瓴胨胩胪胛胂胙胍胗胝朐胫鸨匍狨狯飐飑狩狲訇訄逄昝饷饸饹饻胤孪娈庤弈庥疬疣疥疭疢庠竑彦闼闾闿阂羑迸籼酋兹炳炻炟炽炯烀炷烃洱洹洧洌浃泚浈浉洇洄洙洑洎洫浍洮洵洚洺浏洨浐洴洣浒浔浕洳恸恹恫恺恻恂恪恽宥宬窀扃袆衲衽衿袂祛祜祓祚诮祗祢诰诳鸩昶郡咫弭牁胥陛陟陧姞娅娆姝姽姣姘姹怼羿炱癸矜绔骁骅绗绚彖绛骈耖挈恝珥珙顼珰珽珩珧珣珞琤珲敖恚埔埕埘埚埙挹耆耄捋埒贽垸捃盍莰茝莆莳莴莪莠莓莜莅荼莶莩荽莸荻莘莎莞莨莙鸪莼桔栲栳郴桓桡桎桢桄桤梃栝桕桁桧栒栟桉栩逑逋彧鬲豇酐酎酏逦厝孬砝砹砺砧砷砟砼砥砣硁恧剞砻轼轾辀辁辂鸫趸剕龀鸬虔逍眬唛晟眩眙唝哧哳哽唔晔晁晏晖鸮趵趿畛蚨蚍蚋蚬蚝蚧唢圄哦唣唏盎唑帱崂崃罡罟峨峪觊赅赆钰钲钴钵钷钹钺钼钽钿铀铂铄铈铉铊铋铌铍铎眚氩氤氦毪舐秣盉笄笕笊笫笏俸倩俵倻偌俳俶倬倏恁倭倪俾倜隼隽倞倓倌倥臬皋郫倨衄颀徕舨舫瓞釜奚鬯衾鸰胱胴胭脍脎胲胼朕脒胺鸱玺鱽鸲狴狷猁狳猃狺逖狻桀袅眢饽馀凇栾挛勍亳疳疴疽疸痄痈疱疰痃痂痉衮凋颃恣旆旄旃阃阄阆恙桊敉粑朔郸烜烨烩烊剡郯烬浡涑浯涞涟娑涅涠浞涓涢浥涔浜浠浼浣涘浚悖悚悭悝悃悒悌悢悛宸窅窈剜诹扅诼冢袪袗袢袯祯祧冥诿谀谂谄谇屐屙陬勐奘疍牂蚩陲陴烝姬娠娌娉娟娲娥娴娣娓婀砮哿畚逡剟绠骊绡骋绤绥绦骍绨骎邕烝鸶彗耜焘舂琎琏琇掭揶埴掎埼埯捯焉掳掴埸堌赧捭晢逵埝堋堍掬鸷掊堉捩掮悫埭埽掇掼聃聆聍菁菝萁菥菘堇萘萋勩菽菖萜萸萑菂棻菔菟萏萃菼菏菹菪菅菀萦菰菡梽梵婪梾梏觋桴桷梓棁桫棂啬郾匮敕豉鄄酞酚厣戛硎硭硒硖硗硐硚硇硌鸸瓠匏厩龚殒殓殍赉雩辄堑龁眭唪眦啧晡眺眵眸圊啪喏喵啉勖晞晗啭趼趺啮跄蚶蛄蛎蚰蚺蛊圉蚱蛏蚴鄂啁啕唿啐唼唷啴啖啵啶啷唳啜帻崦帼崮帷崟崤崞崆崛赇赈铑铒铕铗铘铙铚铞铟铠铢铤铥铧铨铩铪铫铬铮铯铰铱铳铴铵铷氪牾鸹稆秾逶笺筇笸笪笮笱笠笥笳笾笞偾鸺偃偕偈偲偬偻皑皎鸻徜舸舻舳舴鸼龛瓻豚脶脞脬脘脲脧匐鱾猗猡猊猞猄猝斛觖猕馗馃馄鸾孰庹庼庾庳痔痍疵翊旌旎袤阇阈阉阊阋阌阍阏羚羝羟粝粕焐烯焓烽焖烷烺焌渍渚淇淅淞渎涿淖挲淏淠涸渑淦淝淬涪淙涫渌淄惬悻悱惝惘悸惟惆惚惇惮寅逭窕谌谏扈皲谑袼裈裉祲谔谕谖谗谙谛谝敝逯艴隋郿隈粜隍隗婧婊婞婳婕娼婢婵胬袈翌恿欸绫骐绮绯骒绲骓绶绹绺绻绾骖缁耠琫琵琶琪瑛琦琥琨靓琰琮琯琬琛琚辇鼋揳堞搽塃揸揠堙趄揾颉塄揿堠耋揄蛰蛩絷塆揞揎摒揆掾葜聒葑葚靰靸葳蒇蒈葺蒉葸萼蓇萩葆葩葶蒌葓蒎萱葖戟葭楮棼椟棹椤棰椑鹀赍椋椁棬楗棣椐鹁覃酤酢酡酦鹂觌硪硷厥殚殛雯辊辋椠辌辍辎斐黹牚睐睑睇睃戢喋嗒喃喱喹晷喈跖跗跞跚跎跏跆蛱蛲蛭蛳蛐蛞蛴蛟蛘蛑畯喁喟斝啾嗖喤喑嗟喽嗞喀喔喙嵘嵖崴遄詈嵎崽嵚嵬嵛翙嵯嵝嵫幄嵋赑铹铻铼铽铿锃锂锆锇锊锎锏锑锒锓锔锕掣矬氰毳毽犊犄犋鹄犍颋嵇稃稂筘筚筜筅筵筌傣傈舄傥傧遑皓皖傩遁徨舾畲弑颌翕釉鹆舜貂腈腓腆腴腑腙腚腱腒鱿鲀鲂鲃颍猢猹猥飓觞觚猸猱飧馇馈馉馊亵脔裒廋斌痣痨痦痞痤痫痧鄌赓竦瓿啻颏鹇阑阒阕粞遒孳焯焜焱鹈湛渫湮湎湝湨湜渭湍湫溲湟溆渝湲溠溇湔湉渲渥湄滁愠惺愦惴愣愀愎愔喾寐谟扉棨扊裢裎裣裥祾祺祼谠禅禄幂谡谥谧塈遐孱弼巽骘媪媛婷巯毵翚皴婺骛缂缃缄彘缇缈缉缌缏缑缒缗骙飨耢瑚瑁瑀瑜瑗瑄瑕遨骜瑙遘韫髡塥塬鄢趔趑摅摁赪塮蜇搋搒搐搛搠摈彀毂搌搦搡蓁戡蓍鄞靳蓐蓦鹋蒽蓓蓊蒯蓟蓑蒺蓠蒟蒡蒹蒴蒗蓂蓥颐蓣楠楂楝楫榀楸椴槌楯榇榈槎榉楦楹椽裘剽甄酮酰酯酩蜃碛碓碚碇碜鹌尴辏辒龃龅龆觜訾粲虞睚嗪睫韪嗷嗉睨睢雎睥嘟嗑嗫嗬嗔嗝戥嗄煦暅暄遢暌跬跶跸跐跣跹跻跤蛸蜎蜊蜍蜉蜣畹嗣嗯嗥嗲嗳嗌嗍嗨嗵罨嵊嵩嵴骰锖锗锘锛锜锝锞锟锢锧锪锫锩锬锱雉氲犏歃稞稗稔筠筢筮筻筲筼筱牒煲鹎敫僇徭愆艄觎毹貊貅貉颔腠腩腼腽腭腧塍媵詹鲅鲆鲇鲈鲉鲊稣鲋鲌鲍鲏鲐鹐飔飕觥遛馌馐鹑亶廒瘃痱痼痿瘐瘁瘅瘆鄘麂裔鄣歆旒雍阖阗阘阙羧豢粳猷煳煜煨煅煊煸煺滟溱溘滠漭滢滇溥溧溽裟溻溷溦滗滫溴滏滃滦溏滂溟滘滍滪愫慑慥慊鲎骞窦窠窣裱褚裼裨裾裰禊谩谪谫媾嫫媲嫒嫔媸缙缜缛辔骝缟缡缢缣骟耥璈瑶瑭瑢獒觏慝嫠韬髦墈摽墟墁撂摞撄翥踅銎摭墉墒榖撖摺綦蔷靺靼鞅靽鞁靿蔌甍蔸蓰蔹蔡蔟蔺戬蕖蔻蓿斡鹕嘏蓼榧槚槛榻榫槜榭槔槁槟槠榷榍僰酽酾酲酶酴酹厮碶碡碣碲磋碹碥劂臧豨殡霆霁辗蜚裴翡龇龈睿夥瞅瞍睽嘞嘈嘌嘎暧暝踌踉跽蜞蜥蜮蜾蝈蜴蜱蜩蜷蜿螂蜢嘘嘡鹗嘣嘤嘚嘛嗾嘧罴罱嶂幛赙罂骷骶鹘锲锴锶锷锸锽锾锵锿镁镂镃镄镅犒箐箦箧箸箨箬箅箪箔箜箢箓毓僖儆僳僭僬劁僦僮魅魃魆睾艋鄱膈膑鲑鲔鲙鲚鲛鲟獐獍飗觫雒夤馑銮塾麽廙瘌瘗瘊瘥瘘瘙廖韶旖膂阚鄯鲞粼粽糁槊鹚熘煽熥潢潆潇漤漕滹漯漶潋潴漪漉漳澉潍慵搴窬窨窭寤肇綮谮褡褙褓褛褊禚谯谰谲暨屣鹛嫣嫱嫖嫦嫚嫘嫜嫪鼐翟瞀鹜骠缥缦缧骢缪缫耦耧瑾璜璀璎璁璋璇璆奭髯髫撷撅赭墦撸鋆撙撺墀聩觐鞑蕙鞒蕈蕨蕤蕞蕺瞢劐蕃蕲蕰赜鼒槿樯槭樗樘槲鹝醌醅靥魇餍磊磔磙磉殣慭霄霈辘龉龊觑瞌瞑嘻嘭噎噶颙暹踔踝踟踬踮踣踯踺踞蝽蝾蝻蝰蝮螋蝓蝣蝼蝤噗嘬颚噍噢噙噜噌噀噔颛幞幡嶓嶙嶝骺骼骸镆镈镉镋镌镍镎镏镑镒镓镔稷箴篑篁篌篆牖儇儋徵磐虢鹞鹟滕鲠鲡鲢鲣鲥鲦鲧鲩鲪鲬橥獗獠觯鹠馓馔麾廛鹡瘛瘼瘢瘠齑鹡羯羰糇遴糌糍糈糅翦鹣熜熵熠澍澌潵潸鲨潲鋈潟潼潽潺潏憬憧寮窳谳褴褫禤谵熨屦勰戮蝥缬缮缯骣畿耩耨耪璞璟靛璠璘聱螯髻髭髹擀熹甏擐擞磬鄹颞蕻鞘黇颟薤薨檠薏蕹薮薜薅樾橛橇樵檎橹橦樽樨橼墼橐翮醛醐醍醚醑觱磺磲赝飙殪霖霏霓錾辚臻遽氅瞥瞟瞠瞰嚄嚆噤暾曈蹀蹅踶踹踵踽蹉蹁螨蟒螈螅螭螗螠噱噬噫噻噼幪罹圜镖镗镘镚镛镝镞镠氇氆憩穑穄篝篚篥簉篦篪盥劓翱魉魈徼歙盦膪螣膦膙鲭鲮鲯鲰鲱鲲鲳鲴鲵鲷鲺鲹鲻獴獭獬邂憝亸鹧廨赟癀瘭瘰廪瘿瘵瘴癃瘳斓麇麈嬴壅羲糗瞥甑燠燔燧燊燏濑濉潞澧澴澹澥澶濂澼憷黉褰寰窸褶禧嬖犟隰嬗鹨翯颡缱缲缳璨璩璐璪螫擤觳罄擢藉薹鞡薷薰藓藁檑檄懋醢翳繄礅磴鹩龋龌豳壑黻瞵瞩嚏嚅蹑蹒蹊蹓蹐螬螵疃螳蟑嚓羁罽罾嶷黜黝髁髀镡镢镤镥镦镧镨镩镪镫罅黏簧簌篾簃篼簏簖簋鼢黛鹪鼾皤魍艚龠繇貘邈貔臌膻臁臆臃鲼鲽鲾鳀鳁鳂鳃鳅鳆鳇鳈鳉鳊獯螽燮鹫襄縻膺癍麋馘懑濡濮濞濠濯蹇謇邃襕襁檗甓擘孺隳嬷蟊鹬鍪鏊鳌鬹鬈鬃瞽鞯鞨鞫鞧鞣藜藠藩鹲檫檵醪蹙礞礓礌燹餮蹩瞿曛颢曜躇鹭蹢蹜蟛蟪蟠蟮嚚鹮黠黟髅髂镬镭镯镱馥簠簟簪簦鼫鼬鼩雠艟臑鳎鳏鳐鳐鳑鹱癔癜癖糨冁瀍瀌鎏懵彝邋鬏攉鞲鞴藿蘧蘅麓醭醮醯礤酃霪霭黼曝嚯蹰蹶蹽蹼蹯蹴蹾蹿蠖蠓蠋蟾蠊巅黢髋髌镲籀籁鳘齁魑艨鼗鳓鳔鳕鳗鳙鳚麒鏖蠃羸瀚瀣瀛襦谶襞骥缵瓒馨蘩蘖蘘醵醴霰颥酆矍曦躅鼍巉黩黥镳镴黧纂鼯犨臜鳜鳝鳟獾瀹瀵孀骧耰瓘鼙醺礴礳颦曩黯鼱鳡鳢癫麝赣夔爝灏禳鐾羼蠡耲耱懿韂鹳糵蘼霾氍饕躔躐髑镵穰鳤饔鬻鬟趱攫攥颧躜鼹鼷癯麟蠲蠹醾躞衢鑫灞襻纛鬣攮囔馕戆蠼爨齉"; -------------------------------------------------------------------------------- /tsconfig-amd.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "./dist/amd/", 5 | "module": "amd", 6 | "target": "ES5" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig-es5.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": "./tsconfig.json", 3 | "compilerOptions": { 4 | "outDir": "dist/es5", 5 | "module": "CommonJS", 6 | "target": "ES5" 7 | } 8 | } 9 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "esModuleInterop": true, 4 | "resolveJsonModule": true, 5 | "declaration": true, 6 | "declarationDir": "lib/types", 7 | "outDir": "lib", 8 | "target": "ES6", 9 | "lib": ["ESNext"], 10 | "module": "ESNext", 11 | "sourceMap": true, 12 | "baseUrl": "./src/", 13 | "jsx": "preserve", 14 | "allowSyntheticDefaultImports": true, 15 | "moduleResolution": "node", 16 | "forceConsistentCasingInFileNames": true, 17 | "noImplicitReturns": true, 18 | "noUnusedLocals": true, 19 | "allowJs": true, 20 | "skipLibCheck": true, 21 | "experimentalDecorators": true, 22 | "strict": true, 23 | "paths": { 24 | "@/*": ["./src/*"], 25 | "@@/*": ["./src/.umi/*"] 26 | } 27 | }, 28 | "include": [ 29 | "src" 30 | ], 31 | "exclude": [ 32 | "node_modules", 33 | "lib" 34 | ] 35 | } 36 | --------------------------------------------------------------------------------