From f739d7651b383bc01217be38235c6ddc7db38a49 Mon Sep 17 00:00:00 2001 From: Yuriy Evdokimov Date: Thu, 16 Nov 2023 17:49:12 +0500 Subject: [PATCH] =?UTF-8?q?=D0=BD=D0=B5=D0=B8=D1=81=D0=BF=D0=BE=D0=BB?= =?UTF-8?q?=D1=8C=D0=B7=D1=83=D0=B5=D0=BC=D1=8B=D0=B5=20=D1=82=D0=BE=D0=BD?= =?UTF-8?q?=D1=8B=20-=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE=D1=82=D0=BA?= =?UTF-8?q?=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pinyin.ts | 29 ++++++++++++++++++++++++++++- src/reducer.ts | 12 ++++++++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/src/pinyin.ts b/src/pinyin.ts index 8d42d4d..61fbdfb 100644 --- a/src/pinyin.ts +++ b/src/pinyin.ts @@ -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 } - ]; \ No newline at end of file + ]; + + 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' + ]; \ No newline at end of file diff --git a/src/reducer.ts b/src/reducer.ts index 8f5a0ec..8ada886 100644 --- a/src/reducer.ts +++ b/src/reducer.ts @@ -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(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(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 } }