Skip to content

Commit

Permalink
支持 FFI、Swoole FFI
Browse files Browse the repository at this point in the history
  • Loading branch information
Yurunsoft authored Aug 17, 2020
1 parent 4195a60 commit d75eb0f
Show file tree
Hide file tree
Showing 53 changed files with 2,092 additions and 1,043 deletions.
10 changes: 10 additions & 0 deletions .github/workflows/bin/install-php7.4-mac.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
#!/bin/bash
PHP_VERSION="7.4"
brew install php@$PHP_VERSION;
brew link --force --overwrite [email protected]

php -v
php -m
php-config

curl -o composer.phar https://getcomposer.org/composer-stable.phar && chmod +x composer.phar && sudo mv -f composer.phar /usr/local/bin/composer && composer -V;
59 changes: 59 additions & 0 deletions .github/workflows/bin/install-php7.4-win-x64.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
$vcredist_url="https://aka.ms/vs/16/release/vc_redist.x64.exe"

$php_url="https://windows.php.net/downloads/releases/php-7.4.9-nts-Win32-vc15-x64.zip"

$php_dev_url="https://windows.php.net/downloads/releases/php-devel-pack-7.4.9-nts-Win32-vc15-x64.zip"

$cacert_pem_url="https://curl.haxx.se/ca/cacert.pem"

Invoke-Webrequest $vcredist_url -Outfile "vcredist.exe"

Invoke-Webrequest $php_url -Outfile "php.zip"

Invoke-Webrequest $php_dev_url -Outfile "php_dev.zip"

Invoke-Webrequest $cacert_pem_url -Outfile "C:\cacert.pem"

.\vcredist.exe /Q

Expand-Archive "php.zip" "C:\php"

Expand-Archive "php_dev.zip" "C:\"

[environment]::SetEnvironmentvariable("PHP_DEV_PATH", "C:\php-7.4.9-devel-vc15-x64", "Machine")

(gc C:\php\php.ini-development) -replace ';extension_dir = "ext"', 'extension_dir = "C:\php\ext"' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=ffi', 'extension=ffi' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=curl', 'extension=curl' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=mbstring', 'extension=mbstring' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=openssl', 'extension=openssl' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=pdo_sqlite', 'extension=pdo_sqlite' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';curl.cainfo =', 'curl.cainfo = "C:\cacert.pem"' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';openssl.cafile=', 'openssl.cafile="C:\cacert.pem"' | Out-File C:\php\php.ini -encoding Utf8

$path="C:\php;" + [environment]::GetEnvironmentvariable("PATH")
[environment]::SetEnvironmentvariable("PATH", $path)
[environment]::SetEnvironmentvariable("PATH", $path, "Machine")

php -v
php -m

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=C:\
php -r "unlink('composer-setup.php');"
php -r "file_put_contents('C:\php\composer.bat', 'php C:\composer.phar %*');"

composer -V

Invoke-Webrequest "https://phar.phpunit.de/phpunit-9.phar" -Outfile "C:\phpunit.phar"

php -r "file_put_contents('C:\php\phpunit.bat', 'php C:\phpunit.phar %*');"

phpunit --version
59 changes: 59 additions & 0 deletions .github/workflows/bin/install-php7.4-win-x86.ps1
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
$vcredist_url="https://aka.ms/vs/16/release/vc_redist.x86.exe"

$php_url="https://windows.php.net/downloads/releases/php-7.4.9-nts-Win32-vc15-x86.zip"

$php_dev_url="https://windows.php.net/downloads/releases/php-devel-pack-7.4.9-nts-Win32-vc15-x86.zip"

$cacert_pem_url="https://curl.haxx.se/ca/cacert.pem"

Invoke-Webrequest $vcredist_url -Outfile "vcredist.exe"

Invoke-Webrequest $php_url -Outfile "php.zip"

Invoke-Webrequest $php_dev_url -Outfile "php_dev.zip"

Invoke-Webrequest $cacert_pem_url -Outfile "C:\cacert.pem"

.\vcredist.exe /Q

Expand-Archive "php.zip" "C:\php"

Expand-Archive "php_dev.zip" "C:\"

[environment]::SetEnvironmentvariable("PHP_DEV_PATH", "C:\php-7.4.9-devel-vc15-x86", "Machine")

(gc C:\php\php.ini-development) -replace ';extension_dir = "ext"', 'extension_dir = "C:\php\ext"' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=ffi', 'extension=ffi' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=curl', 'extension=curl' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=mbstring', 'extension=mbstring' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=openssl', 'extension=openssl' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';extension=pdo_sqlite', 'extension=pdo_sqlite' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';curl.cainfo =', 'curl.cainfo = "C:\cacert.pem"' | Out-File C:\php\php.ini -encoding Utf8

(gc C:\php\php.ini) -replace ';openssl.cafile=', 'openssl.cafile="C:\cacert.pem"' | Out-File C:\php\php.ini -encoding Utf8

$path="C:\php;" + [environment]::GetEnvironmentvariable("PATH")
[environment]::SetEnvironmentvariable("PATH", $path)
[environment]::SetEnvironmentvariable("PATH", $path, "Machine")

php -v
php -m

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php composer-setup.php --install-dir=C:\
php -r "unlink('composer-setup.php');"
php -r "file_put_contents('C:\php\composer.bat', 'php C:\composer.phar %*');"

composer -V

Invoke-Webrequest "https://phar.phpunit.de/phpunit-9.phar" -Outfile "C:\phpunit.phar"

php -r "file_put_contents('C:\php\phpunit.bat', 'php C:\phpunit.phar %*');"

phpunit --version
15 changes: 15 additions & 0 deletions .github/workflows/bin/install-php7.4.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#!/bin/bash

add-apt-repository ppa:ondrej/php -y -u

apt-get update

apt install -y php7.4-cli php7.4-bcmath php7.4-curl php7.4-dev hp7.4-mbstring php7.4-zip

php -v
php -m
php-config

curl -o composer.phar https://getcomposer.org/composer-stable.phar && chmod +x composer.phar && sudo mv -f composer.phar /usr/local/bin/composer && composer -V;

phpdismod xdebug
26 changes: 26 additions & 0 deletions .github/workflows/bin/install-swoole4.5.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
#!/bin/bash

swooleVersion="4.5.2"

wget -O swoole.tar.gz https://github.com/swoole/swoole-src/archive/v$swooleVersion.tar.gz

swooleDir="swoole-src-${swooleVersion}"

tar -xzf swoole.tar.gz
rm swoole.tar.gz

cd $swooleDir

phpize && ./configure && make -j && make install

PHP_INI_FILE=$(php -r "echo php_ini_loaded_file();")
if [[ $PHP_INI_FILE == "" ]]; then
PHP_INI_FILE="/usr/local/etc/php/$(php -r "echo (double)PHP_VERSION;")/php.ini";
fi
echo "extension = swoole.so" >> $PHP_INI_FILE

cd ../

rm -rf $swooleDir

php --ri swoole
70 changes: 70 additions & 0 deletions .github/workflows/ffi.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
name: FFI Test

on: [push, pull_request]

jobs:
build-windows-x86:
runs-on: windows-latest

steps:
- uses: actions/checkout@v1

- name: install php
run: |
.\.github/workflows/bin/install-php7.4-win-x86.ps1
- name: ffi test
run: |
[environment]::SetEnvironmentvariable("PATH", $([environment]::GetEnvironmentvariable("PATH", "Machine")))
composer update
phpunit -c ./tests/phpunit.xml
build-windows-x64:
runs-on: windows-latest

steps:
- uses: actions/checkout@v1

- name: install php
run: |
.\.github/workflows/bin/install-php7.4-win-x64.ps1
- name: ffi test
run: |
[environment]::SetEnvironmentvariable("PATH", $([environment]::GetEnvironmentvariable("PATH", "Machine")))
composer update
phpunit -c ./tests/phpunit.xml
build-ubuntu:
runs-on: ubuntu-latest

steps:
- uses: actions/checkout@v1

- name: install php
run: sudo .github/workflows/bin/install-php7.4.sh

- name: install swoole
run: sudo .github/workflows/bin/install-swoole4.5.sh

- name: swoole ffi test
run: |
composer update
composer test
build-macos:
runs-on: macos-latest

steps:
- uses: actions/checkout@v1

- name: install php
run: sudo .github/workflows/bin/install-php7.4-mac.sh

- name: install swoole
run: sudo .github/workflows/bin/install-swoole4.5.sh

- name: swoole ffi test
run: |
composer update
sudo composer test
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,2 @@
/vendor
/tests/.phpunit.result.cache
4 changes: 0 additions & 4 deletions .travis/composer-no-phpunit.php

This file was deleted.

1 change: 1 addition & 0 deletions .travis/php.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
extension=ffi
30 changes: 18 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,22 +1,12 @@
# ChineseUtil

PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转。

PHP Chinese Tool class, support Chinese pinyin, pinyin participle, simplified and traditional conversion

目前本类库拥有的三个功能,都是在实际开发过程中整理出来的。这次使用的数据不同于以前我开源过汉字转拼音和简繁互转,数据都是从字典网站采集下来的,比以前的数据更加准确。
PHP 中文工具类,支持汉字转拼音、拼音分词、简繁互转、数字转换、金额数字转换。

由于中文的博大精深,字有多音字,简体字和繁体字也有多种对应。并且本类库返回的所有结果,均为包含所有组合的数组。

本类库字典数据总共收录 73925 个汉字,包括:3955 个简体字,1761 个繁体字,68209 个其它汉字。

## 内存占用

类库第一个版本发布开始,群里朋友就展开了激烈的讨论,最大的问题就在于内存占用以及性能问题上。经过我不断尝试几种方案,最终决定设置三种模式,来适应不同用户之间的需求。

我已经尝试过 Redis,速度比 SQLite 慢 3 倍,没有必要加入支持。所以目前来看,SQLite 模式性价比最高!

---
## 模式

### 性能模式 (Memory)

Expand Down Expand Up @@ -44,6 +34,18 @@ PHP Chinese Tool class, support Chinese pinyin, pinyin participle, simplified an

由于精简了数据,一些拼音结果需要经过代码计算处理才可以得出,所以性能较差。

### FFI 模式 (FFI)

需要 PHP >= 7.4 并且启用 FFI 扩展,代码全部由 C++ 开发,性能和内存占用都比 PHP 实现的要好。

> FFI 动态库 C++ 代码:<https://github.com/Yurunsoft/chinese-util-cpp>
### Swoole FFI 模式 (SwooleFFI)

需要 PHP >= 7.4 并且启用 FFI、Swoole 扩展,代码全部由 C++ 开发,性能和内存占用都比 PHP 实现的要好。

不会阻塞 PHP 代码所在线程。

---

默认情况下,优先使用通用模式,如果环境不支持 PDO 将采用兼容模式。
Expand All @@ -57,6 +59,10 @@ Chinese::setMode('Memory');
Chinese::setMode('SQLite');
// 设为兼容模式
Chinese::setMode('JSON');
// 设为 FFI 模式
Chinese::setMode('FFI');
// 设为Swoole FFI 模式
Chinese::setMode('SwooleFFI');
```

无论何种模式,拼音分词所需数据总是从 JSON 数据中加载。
Expand Down
Binary file added clib/chinese_util-php7.4-x64.dll
Binary file not shown.
Binary file added clib/chinese_util-php7.4-x86.dll
Binary file not shown.
1 change: 1 addition & 0 deletions clib/include.h
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
void init_chinese_util();
Binary file added clib/libchinese_util-php7.4.dylib
Binary file not shown.
Binary file added clib/libchinese_util-php7.4.so
Binary file not shown.
Binary file added clib/libchinese_util-swoole4.5.dylib
Binary file not shown.
Binary file added clib/libchinese_util-swoole4.5.so
Binary file not shown.
1 change: 1 addition & 0 deletions data/pinyinData.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"sound":{"a":{"ab":"a","tone":0},"ā":{"ab":"a","tone":1},"á":{"ab":"a","tone":2},"ǎ":{"ab":"a","tone":3},"à":{"ab":"a","tone":4},"o":{"ab":"o","tone":0},"ō":{"ab":"o","tone":1},"ó":{"ab":"o","tone":2},"ǒ":{"ab":"o","tone":3},"ò":{"ab":"o","tone":4},"e":{"ab":"e","tone":0},"ē":{"ab":"e","tone":1},"é":{"ab":"e","tone":2},"ě":{"ab":"e","tone":3},"è":{"ab":"e","tone":4},"ī":{"ab":"i","tone":1},"í":{"ab":"i","tone":2},"ǐ":{"ab":"i","tone":3},"ì":{"ab":"i","tone":4},"ū":{"ab":"u","tone":1},"ú":{"ab":"u","tone":2},"ǔ":{"ab":"u","tone":3},"ù":{"ab":"u","tone":4},"ü":{"ab":"v","tone":0},"ǖ":{"ab":"v","tone":1},"ǘ":{"ab":"v","tone":2},"ǚ":{"ab":"v","tone":3},"ǜ":{"ab":"v","tone":4}},"split":{"shengmu":["a","o","e","b","p","m","f","d","t","n","l","g","k","h","j","q","x","r","z","c","s","y","w","zh","ch","sh","er","a","o","e","ai","ei","ao","ou"],"yunmu":["i","u","v","a","o","e","ia","ua","uo","ie","ue","ai","ei","ao","ou","an","en","in","un","ui","uai","iao","uan","ang","eng","ing","ong","iong","iang","uang"],"relation":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"b":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true,"a":{"n":{"py":true},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}}},"o":{"py":true},"u":{"py":true,"n":{"py":true}}},"c":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"n":{"py":true,"g":{"py":true}}},"h":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"d":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true,"a":{"py":true,"n":{"py":true},"o":{"py":true}},"e":{"py":true},"n":{"g":{"py":true}},"u":{"py":true}},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"r":{"py":true}},"f":{"a":{"py":true,"n":{"py":true,"g":{"py":true}}},"e":{"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"a":{"o":{"py":true}}},"o":{"py":true,"u":{"py":true}},"u":{"py":true}},"g":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"h":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"j":{"i":{"py":true,"a":{"py":true,"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"n":{"g":{"py":true}}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true}}},"k":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"l":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true,"a":{"py":true,"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"u":{"py":true}},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true},"o":{"py":true}},"v":{"py":true}},"m":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true},"s":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true,"a":{"n":{"py":true},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"u":{"py":true}},"o":{"py":true,"u":{"py":true}},"u":{"py":true}},"n":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true,"a":{"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"u":{"py":true}},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"v":{"py":true,"e":{"py":true}}},"o":{"py":true,"e":{"s":{"py":true}},"u":{"py":true}},"p":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"l":{"py":true}}},"h":{"a":{"s":{"py":true}},"d":{"e":{"n":{"g":{"py":true}}}},"o":{"s":{"py":true}}},"i":{"py":true,"a":{"n":{"py":true},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}}},"o":{"py":true,"u":{"py":true}},"p":{"u":{"n":{"py":true}}},"u":{"py":true}},"q":{"i":{"py":true,"a":{"py":true,"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"n":{"g":{"py":true}}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true}}},"r":{"a":{"py":true,"m":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"s":{"a":{"py":true,"e":{"n":{"g":{"py":true}}},"i":{"py":true},"l":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"n":{"py":true}}},"h":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"o":{"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"t":{"a":{"py":true,"e":{"py":true},"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"g":{"py":true}},"u":{"l":{"py":true}}},"i":{"py":true,"a":{"n":{"py":true},"o":{"py":true}},"e":{"py":true},"n":{"g":{"py":true}}},"o":{"n":{"py":true,"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"u":{"u":{"py":true}},"w":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"e":{"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"o":{"py":true},"u":{"py":true}},"x":{"i":{"py":true,"a":{"py":true,"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"n":{"g":{"py":true}}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true}}},"y":{"a":{"py":true,"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true},"i":{"py":true,"n":{"py":true,"g":{"py":true}}},"o":{"py":true,"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"e":{"py":true},"n":{"py":true}}},"z":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"h":{"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}},"o":{"py":true}},"e":{"py":true,"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"py":true,"i":{"py":true},"n":{"py":true,"g":{"py":true}}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}},"i":{"py":true},"o":{"n":{"g":{"py":true}},"u":{"py":true}},"u":{"py":true,"a":{"n":{"py":true}},"i":{"py":true},"n":{"py":true},"o":{"py":true}}}}}}
1 change: 0 additions & 1 deletion data/pinyinSound.json

This file was deleted.

Loading

0 comments on commit d75eb0f

Please sign in to comment.