Compare commits

..

2 Commits

3 changed files with 39 additions and 4 deletions

View File

@ -2,7 +2,7 @@
"name": "pinyindictation",
"author": {"email": "rurik19@yandex.ru", "name": "Юрий Евдокимов"},
"private": true,
"version": "1.1.2",
"version": "1.2.0",
"type": "module",
"scripts": {
"dev": "vite",

View File

@ -1739,4 +1739,31 @@ export const finales: SylPart[] = [
{ tone: 'zuo2' , caption: 'zuó' , num: 2},
{ tone: 'zuo3' , caption: 'zuǒ' , num: 3},
{ tone: 'zuo4' , caption: 'zuò', num: 4 }
];
];
export const notExistedTones = [
'pa3','ta2','na1','ga3','ka2','ha3','ha4','cha3','sha2','za4','sa2','ca2','ca3','ca4','mai1','dai2','tai3',
'nai1','lai1','lai3','gai2','kai2','chai3','chai4','shai2','shai3','zai2','sai2','sai3','ban2','pan3','man1',
'dan2','lan1','gan2','kan2','zhan2','shan2','ran1','ran4','zan3','san2','bang2','pang3','mang1','mang4','dang2',
'gang2','kang3','zhang2','shang2','rang1','zang2','zang3','cang3','cang4','sang2','dao2','gao2','kao2','rao1','sao2',
'me2','me3','me4','de3','de4','te1','te2','te3','ne3','le2','le3','he3','che2','re1','re2','ze1','ze3','ce1','ce2',
'ce3','se1','se2','se3','bei2','pei3','mei1','dei2','dei4','nei1','nei2','gei1','gei2','gei4','hei2','hei3','hei4','shei1',
'shei3','shei4','zei1','zei3','zei4','ben2','pen4','den1','den2','den3','nen1','nen2','nen3','ken1','ken2','hen1','zhen2',
'chen3','ren1','zen1','zen2','zen4','cen3','cen4','sen2','sen3','sen4','deng2','teng1','teng3','teng4','neng1','neng3','neng4',
'leng1','geng2','keng2','keng4','heng3','zheng2','reng3','reng4','zeng2','zeng3','ceng1','ceng3','seng2','seng3','seng4','er1',
'ri1','ri2','ri3','zi2','si2','dia1','dia2','dia4','lia1','lia2','lia4','qia2','xia3','bian2','mian1','dian2','lian1','jian2',
'niang1','niang3','liang1','jiang2','biao2','diao2','niao1','niao2','pie2','pie4','mie2','mie3','die3','die4','tie2','nie3',
'lie2',' lie3','bin2','bin3','min1','min4','nin1','nin4','lin1','jin2','xin2','xin3','bing2','ping3','ping4','ming1','ding2',
'ting4','ning1','jing2','yo2','yo3','yo4','jiong1','jiong2','jiong4','qiong1','qiong3','qiong4','xiong3','xiong4','miu2','miu3',
'diu2','diu3','diu4','jiu2','qiu3','qiu4','xiu2','fo1','fo3','fo4','lo2','lo3','lo4','weng2','dong2','nong1','nong3','long1',
'gong2','kong2','zhong2','rong1','rong4','zong2','cong3','cong4','song2','pou4','mou4','fou1','fou4','dou2','tou3','nou1','nou2',
'nou3','lou1','gou2','kou2','rou1','rou3','zou1','zou2','cou1','cou2','cou3','sou2','mu1','nu1','ku2','ru1','cu3','su3','gua2',
'kua2','hua3','zhua2','zhua4','shua2','shua4','wai2','guai2','kuai2','huai1','huai3','chuai2','shuai2','duan2','tuan3','tuan4',
'nuan1','nuan2','nuan4','luan1','kuan2','kuan4','zhuan2','shuan2','shuan3','ruan1','ruan2','ruan4','zuan2','cuan3','suan2',
'suan3','guang2','zhuang2','zhuang3','shuang2','shuang4','yue2','yue3','nve2','nve3','lve2','lve3','gon1','gon4','nue1','nue2',
'nue3','lue1','lue2','lue3','jue3','que3','dui2','dui3','gui2','zhui2','zhui3','chui3','chui4','shui1','rui1','rui2','rui3',
'zui1','zui2','cui2','dun2','gun2','kun2','zhun2','zhun4','chun4','shun1','shun2','run1','run2','run3','zun2','zun4','sun2',
'sun4','wo2','nuo1','kuo1','kuo2','zhuo3','zhuo4','chuo2','chuo3','shuo2','shuo3','ruo1','ruo3','cuo3','suo2','suo4','nv1','nv2',
'lv1','jun2','qun1','qun3','qun4','xun3','juan2','a2','a3','a4','an2','ang3','ei2','ei3','ei4','en2','en3','o2','o3','ou2',
'hang3'
];

View File

@ -1,4 +1,4 @@
import { finales, initials, tones } from "./pinyin";
import { finales, initials, notExistedTones, tones } from "./pinyin";
import { IState } from "./store";
import { SylPart, Syllable, Tone } from "./types";
import { GetSyllablesByInitAndFin, getRandomArray, toggleSylPart, toggle, included } from "./utils";
@ -32,10 +32,18 @@ interface IToneSelectResult extends IFounds {
toneChecks: number[]
}
const toneAllowedNum = (tonesCheck:number[], toneNumber: number):boolean => included<number>(tonesCheck, toneNumber)
const toneInSyllables = (searchTone:Tone, syllables: Syllable[] ):boolean =>
syllables.some( syl => syl.tones.some( st => st===searchTone.tone ) )
const toneNotExcluded = (searchTone:Tone):boolean => (!notExistedTones.includes(searchTone.tone))
const proceedFounds = ( initiales: SylPart[], finales:SylPart[], tonesCheck:number[], count: number):IFounds=>
{
const foundSyllables:Syllable[] = GetSyllablesByInitAndFin( initiales, finales )
const foundTones = tones.filter( t => foundSyllables.some( syl => syl.tones.some( st => st===t.tone && included<number>(tonesCheck, t.num) ) ) )
const foundTones = tones.filter( t => toneInSyllables(t, foundSyllables))
.filter( t => toneAllowedNum( tonesCheck, t.num) )
.filter( t => toneNotExcluded(t) )
const randomTones = getRandomArray(foundTones, count)
return { foundSyllables, foundTones, randomTones }
}