feat: idiom

This commit is contained in:
tackchen 2020-05-29 21:21:13 +08:00
parent 1145a9e927
commit 9710504754
15 changed files with 1393 additions and 56 deletions

1
helper/count.json Normal file
View File

@ -0,0 +1 @@
[0.09999999999999432,4.099999999999994,0.09999999999999432,8.099999999999994,8.400000000000006,8.200000000000003,8.099999999999994,8.200000000000003,8.099999999999994,8.200000000000003,8.099999999999994,8.200000000000003,8.400000000000006,8.299999999999997,8.400000000000006,13.099999999999994,13.400000000000006,19.200000000000003,19.400000000000006,14.200000000000003,14.400000000000006,1.0999999999999943,15.200000000000003,1.0999999999999943,1.2000000000000028,1.2999999999999972,1.4000000000000057,9.200000000000003,9.299999999999997,15.200000000000003,9.299999999999997,9.400000000000006,14.099999999999994,14.299999999999997,14.400000000000006,20.099999999999994,20.400000000000006,15.099999999999994,15.299999999999997,15.400000000000006,29.099999999999994,13.099999999999994,13.299999999999997]

1
helper/idiom.new.json Normal file

File diff suppressed because one or more lines are too long

84
helper/idiom.range.js Normal file
View File

@ -0,0 +1,84 @@
// 用于根据 idiom.json 生成拼音范围
const dict = require('../src/plugin/idiom/idiom.json').slice(0, 1000);
const cnchar = require('../src/plugin/all/index');
const fs = require('fs');
const {initToneCodes, getCharCode} = require('../src/plugin/idiom/tone');
initToneCodes(cnchar);
let stack = [];
let json = {};
let last = 0;
function main () {
for (let i = 0; i < dict.length; i++) {
let spell = cnchar.spell(dict[i], 'array', 'low', 'tone')[0];
if (!cnchar._.isCnChar(spell)) {
let sum = 0;
spell.split('').forEach((s) => {
sum += getCharCode(s, true) - 97;
});
if (sum !== last) {
stack.push(sum);
}
last = sum;
}
}
fs.writeFileSync('./helper/count.json', JSON.stringify(stack), 'utf8');
};
const TYPE = {
MORE: 1, // 大于
LESS: 2, // 小于
EVEN: 3, // 等于
ERROR: -1
};
function compareSpell (_spell, target, tone) {
for (let i = 0; i < _spell.length; i++) {
if (!target[i]) { // 中值与目标值前面拼音一样,但是中长度大于目标 说明 中 > 目标
return TYPE.MORE;
}
let code = getCharCode(_spell[i], tone);
if (code > target[i]) { // 中值 > 目标
return TYPE.MORE;
} else if (code < target[i]) { // 中值 < 目标
return TYPE.LESS;
}
}
if (_spell.length === target.length) {
return TYPE.EVEN;
}
return TYPE.LESS; // 中值与目标值前面拼音一样,但是中长度小于目标 说明 中 < 目标
}
main();
// const spell = require('./spell.json');
// let keys = Object.keys(spell);
// let arr = [];
// for (let i = 1; i < keys.length - 1; i++) {
// let cur = keys[i].charCodeAt();
// let prev = keys[i - 1].charCodeAt();
// let next = keys[i + 1].charCodeAt();
// let d = Math.abs(cur - prev);
// if (cur < prev || cur > next || !(d <= 1 || (cur === 106 && d <= 2) || (cur === 119 && d <= 3))) {
// arr.push(keys[i]);
// keys.splice(i, 1);
// i--;
// }
// }
// arr.forEach((item) => {
// delete spell[item];
// });
// fs.writeFileSync('./helper/spell2.json', JSON.stringify(spell, null, 4), 'utf8');

387
helper/spell.json Normal file
View File

@ -0,0 +1,387 @@
{
"a": 1,
"e": 11,
"ai": 21,
"an": 103,
"ang": 245,
"ao": 261,
"ba": 306,
"pa": 352,
"bai": 422,
"bo": 699,
"ban": 730,
"bang": 812,
"bao": 831,
"po": 941,
"bei": 942,
"pi": 1054,
"ben": 1067,
"beng": 1090,
"bi": 1093,
"bian": 1333,
"pian": 1352,
"biao": 1400,
"bie": 1427,
"bin": 1472,
"bing": 1484,
"bu": 1710,
"ca": 2345,
"cai": 2349,
"cen": 2438,
"shen": 2441,
"can": 2445,
"cang": 2522,
"cao": 2563,
"ze": 2611,
"si": 2613,
"ce": 2615,
"ceng": 2623,
"cha": 2632,
"chai": 2660,
"zhai": 2667,
"chan": 2684,
"shan": 2688,
"chang": 2718,
"chao": 2825,
"zhao": 2870,
"che": 2936,
"tian": 2969,
"chen": 2973,
"chuang": 3039,
"cheng": 3041,
"sheng": 3149,
"deng": 3197,
"chi": 3225,
"chong": 3397,
"hui": 3420,
"chou": 3436,
"xiu": 3496,
"chu": 3497,
"chuai": 3721,
"chuan": 3728,
"chui": 3793,
"chun": 3865,
"chuo": 3944,
"ci": 3957,
"cong": 4024,
"cu": 4071,
"cuan": 4091,
"cui": 4097,
"cun": 4123,
"cuo": 4181,
"zuo": 4183,
"da": 4205,
"ta": 4219,
"dai": 4469,
"dan": 4523,
"tan": 4610,
"dang": 4644,
"dao": 4698,
"de": 4847,
"di": 4959,
"dian": 5070,
"diao": 5133,
"tiao": 5199,
"die": 5229,
"zha": 5243,
"ding": 5251,
"diu": 5296,
"dong": 5308,
"du": 5536,
"dou": 5537,
"duo": 5714,
"duan": 5731,
"dui": 5808,
"tun": 5836,
"dun": 5837,
"yi": 5964,
"wu": 5981,
"en": 6032,
"er": 6053,
"fa": 6121,
"fan": 6189,
"fang": 6338,
"fei": 6434,
"fe": 6455,
"fen": 6564,
"feng": 6719,
"fu": 7079,
"fo": 7084,
"gai": 7442,
"ge": 7495,
"gan": 7505,
"gang": 7606,
"gao": 7623,
"ji": 7809,
"gen": 7893,
"geng": 7922,
"gong": 7955,
"gou": 8077,
"gu": 8152,
"hu": 8213,
"yu": 8230,
"he": 8255,
"gua": 8337,
"guai": 8386,
"guan": 8398,
"guang": 8487,
"kui": 8524,
"gui": 8545,
"qiu": 8548,
"gun": 8673,
"guo": 8676,
"hai": 8736,
"han": 8788,
"hang": 8913,
"hao": 8915,
"hei": 9158,
"hen": 9176,
"heng": 9184,
"hong": 9259,
"hou": 9354,
"hua": 9557,
"huai": 9691,
"huan": 9726,
"huang": 9787,
"hun": 10021,
"huo": 10114,
"qi": 10396,
"jia": 10707,
"jie": 10732,
"xia": 10789,
"jian": 10854,
"xian": 11085,
"kan": 11095,
"jiang": 11100,
"qiang": 11131,
"xiang": 11183,
"jiao": 11193,
"jue": 11256,
"jin": 11478,
"jing": 11828,
"jiong": 12058,
"jiu": 12063,
"ju": 12233,
"juan": 12369,
"jun": 12472,
"qun": 12490,
"kai": 12497,
"kang": 12579,
"kao": 12604,
"ke": 12610,
"ken": 12688,
"keng": 12690,
"kong": 12699,
"kou": 12731,
"ku": 12801,
"kua": 12865,
"kuai": 12879,
"kuan": 12894,
"kuang": 12912,
"kun": 12988,
"kuo": 13000,
"la": 13004,
"xi": 13014,
"lai": 13015,
"lan": 13043,
"lang": 13078,
"lao": 13145,
"liao": 13212,
"le": 13213,
"yao": 13246,
"lei": 13261,
"leng": 13310,
"li": 13335,
"lian": 13551,
"liang": 13667,
"lie": 13787,
"lin": 13813,
"ling": 13885,
"liu": 13945,
"long": 14077,
"lou": 14209,
"lu": 14243,
"lü": 14316,
"shuai": 14355,
"luan": 14387,
"lüe": 14435,
"lun": 14451,
"luo": 14481,
"ma": 14525,
"mai": 14591,
"man": 14593,
"mo": 14659,
"wan": 14745,
"mang": 14748,
"mao": 14783,
"mei": 14827,
"men": 14904,
"meng": 14937,
"mi": 14963,
"mian": 15032,
"wen": 15047,
"min": 15049,
"miao": 15117,
"mie": 15153,
"ming": 15195,
"miu": 15372,
"mou": 15379,
"mu": 15497,
"na": 15647,
"nei": 15669,
"nai": 15686,
"nan": 15692,
"nang": 15763,
"nu": 15773,
"nao": 15774,
"ne": 15781,
"ni": 15783,
"neng": 15784,
"nian": 15856,
"nie": 15900,
"niao": 15906,
"ning": 15969,
"niu": 15983,
"nong": 16027,
"nü": 16088,
"nüe": 16101,
"nuan": 16102,
"nuo": 16103,
"ou": 16107,
"pai": 16133,
"pan": 16151,
"pang": 16194,
"pao": 16226,
"pei": 16247,
"pen": 16254,
"peng": 16260,
"piao": 16440,
"pie": 16464,
"pin": 16465,
"ping": 16501,
"pou": 16642,
"pu": 16658,
"qia": 17071,
"qian": 17077,
"qiao": 17459,
"shao": 17530,
"qie": 17531,
"qing": 17567,
"qin": 17572,
"qiong": 17895,
"qu": 18020,
"quan": 18105,
"que": 18171,
"ran": 18225,
"rang": 18244,
"rao": 18259,
"re": 18263,
"ren": 18287,
"reng": 18525,
"ri": 18526,
"rong": 18659,
"rou": 18685,
"ru": 18723,
"ruan": 18895,
"rui": 18905,
"run": 18913,
"ruo": 18939,
"sa": 18945,
"sai": 18959,
"san": 18970,
"sang": 19166,
"sao": 19205,
"se": 19232,
"sen": 19247,
"seng": 19249,
"sha": 19250,
"shai": 19295,
"shang": 19412,
"she": 19519,
"shi": 19985,
"shou": 20552,
"shu": 20662,
"shuo": 20840,
"shua": 20850,
"shuan": 20853,
"shuang": 20854,
"shui": 20877,
"shun": 20961,
"song": 21225,
"sou": 21266,
"su": 21276,
"suan": 21319,
"sui": 21323,
"sun": 21416,
"suo": 21431,
"tai": 21469,
"tang": 21598,
"tao": 21622,
"te": 21694,
"teng": 21696,
"ti": 21703,
"tie": 22009,
"ting": 22048,
"tong": 22073,
"tou": 22283,
"tu": 22380,
"tuan": 22460,
"tui": 22471,
"tuo": 22544,
"wa": 22589,
"wai": 22605,
"wang": 22757,
"wei": 22909,
"weng": 23276,
"wo": 23285,
"xiao": 24381,
"xie": 24527,
"ye": 24533,
"xin": 24582,
"xing": 24827,
"xiong": 24989,
"xu": 25113,
"xuan": 25165,
"xue": 25263,
"xun": 25337,
"ya": 25403,
"yan": 25446,
"yang": 25796,
"yin": 27429,
"ying": 27625,
"yong": 27773,
"you": 27844,
"yuan": 28493,
"yue": 28617,
"yun": 28674,
"za": 28815,
"zai": 28823,
"zan": 28863,
"zang": 28876,
"zao": 28891,
"zei": 28976,
"zen": 28990,
"zeng": 28992,
"zhan": 29023,
"zhang": 29080,
"zhe": 29177,
"zhen": 29215,
"zheng": 29321,
"zhi": 29431,
"zi": 29452,
"zhong": 29807,
"zhou": 30016,
"zhu": 30060,
"zhua": 30257,
"zhuan": 30271,
"zhuang": 30302,
"zhui": 30334,
"zhun": 30392,
"zhuo": 30398,
"zong": 30619,
"zou": 30647,
"zu": 30668,
"zuan": 30698,
"zui": 30720,
"zun": 30755
}

337
helper/spell2.json Normal file
View File

@ -0,0 +1,337 @@
{
"a": 1,
"ai": 21,
"an": 103,
"ang": 245,
"ao": 261,
"ba": 306,
"bai": 422,
"bo": 699,
"ban": 730,
"bang": 812,
"bao": 831,
"bei": 942,
"ben": 1067,
"beng": 1090,
"bi": 1093,
"bian": 1333,
"biao": 1400,
"bie": 1427,
"bin": 1472,
"bing": 1484,
"bu": 1710,
"ca": 2345,
"cai": 2349,
"cen": 2438,
"can": 2445,
"cang": 2522,
"cao": 2563,
"ce": 2615,
"ceng": 2623,
"cha": 2632,
"chai": 2660,
"chan": 2684,
"chang": 2718,
"chao": 2825,
"che": 2936,
"chen": 2973,
"chuang": 3039,
"cheng": 3041,
"chi": 3225,
"chong": 3397,
"chou": 3436,
"chu": 3497,
"chuai": 3721,
"chuan": 3728,
"chui": 3793,
"chun": 3865,
"chuo": 3944,
"ci": 3957,
"cong": 4024,
"cu": 4071,
"cuan": 4091,
"cui": 4097,
"cun": 4123,
"cuo": 4181,
"da": 4205,
"dai": 4469,
"dan": 4523,
"dang": 4644,
"dao": 4698,
"de": 4847,
"di": 4959,
"dian": 5070,
"diao": 5133,
"die": 5229,
"ding": 5251,
"diu": 5296,
"dong": 5308,
"du": 5536,
"dou": 5537,
"duo": 5714,
"duan": 5731,
"dui": 5808,
"dun": 5837,
"en": 6032,
"er": 6053,
"fa": 6121,
"fan": 6189,
"fang": 6338,
"fei": 6434,
"fe": 6455,
"fen": 6564,
"feng": 6719,
"fu": 7079,
"fo": 7084,
"gai": 7442,
"ge": 7495,
"gan": 7505,
"gang": 7606,
"gao": 7623,
"gen": 7893,
"geng": 7922,
"gong": 7955,
"gou": 8077,
"gu": 8152,
"hu": 8213,
"hai": 8736,
"han": 8788,
"hang": 8913,
"hao": 8915,
"hei": 9158,
"hen": 9176,
"heng": 9184,
"hong": 9259,
"hou": 9354,
"hua": 9557,
"huai": 9691,
"huan": 9726,
"huang": 9787,
"hun": 10021,
"huo": 10114,
"jia": 10707,
"jie": 10732,
"jian": 10854,
"jiang": 11100,
"jiao": 11193,
"jue": 11256,
"jin": 11478,
"jing": 11828,
"jiong": 12058,
"jiu": 12063,
"ju": 12233,
"juan": 12369,
"jun": 12472,
"kai": 12497,
"kang": 12579,
"kao": 12604,
"ke": 12610,
"ken": 12688,
"keng": 12690,
"kong": 12699,
"kou": 12731,
"ku": 12801,
"kua": 12865,
"kuai": 12879,
"kuan": 12894,
"kuang": 12912,
"kun": 12988,
"kuo": 13000,
"la": 13004,
"lai": 13015,
"lan": 13043,
"lang": 13078,
"lao": 13145,
"liao": 13212,
"le": 13213,
"lei": 13261,
"leng": 13310,
"li": 13335,
"lian": 13551,
"liang": 13667,
"lie": 13787,
"lin": 13813,
"ling": 13885,
"liu": 13945,
"long": 14077,
"lou": 14209,
"lu": 14243,
"lü": 14316,
"luan": 14387,
"lüe": 14435,
"lun": 14451,
"luo": 14481,
"ma": 14525,
"mai": 14591,
"man": 14593,
"mo": 14659,
"mang": 14748,
"mao": 14783,
"mei": 14827,
"men": 14904,
"meng": 14937,
"mi": 14963,
"mian": 15032,
"min": 15049,
"miao": 15117,
"mie": 15153,
"ming": 15195,
"miu": 15372,
"mou": 15379,
"mu": 15497,
"na": 15647,
"nei": 15669,
"nai": 15686,
"nan": 15692,
"nang": 15763,
"nu": 15773,
"nao": 15774,
"ne": 15781,
"ni": 15783,
"neng": 15784,
"nian": 15856,
"nie": 15900,
"niao": 15906,
"ning": 15969,
"niu": 15983,
"nong": 16027,
"nü": 16088,
"nüe": 16101,
"nuan": 16102,
"nuo": 16103,
"ou": 16107,
"pai": 16133,
"pan": 16151,
"pang": 16194,
"pao": 16226,
"pei": 16247,
"pen": 16254,
"peng": 16260,
"piao": 16440,
"pie": 16464,
"pin": 16465,
"ping": 16501,
"pou": 16642,
"pu": 16658,
"qia": 17071,
"qian": 17077,
"qiao": 17459,
"qie": 17531,
"qing": 17567,
"qin": 17572,
"qiong": 17895,
"qu": 18020,
"quan": 18105,
"que": 18171,
"ran": 18225,
"rang": 18244,
"rao": 18259,
"re": 18263,
"ren": 18287,
"reng": 18525,
"ri": 18526,
"rong": 18659,
"rou": 18685,
"ru": 18723,
"ruan": 18895,
"rui": 18905,
"run": 18913,
"ruo": 18939,
"sa": 18945,
"sai": 18959,
"san": 18970,
"sang": 19166,
"sao": 19205,
"se": 19232,
"sen": 19247,
"seng": 19249,
"sha": 19250,
"shai": 19295,
"shang": 19412,
"she": 19519,
"shi": 19985,
"shou": 20552,
"shu": 20662,
"shuo": 20840,
"shua": 20850,
"shuan": 20853,
"shuang": 20854,
"shui": 20877,
"shun": 20961,
"song": 21225,
"sou": 21266,
"su": 21276,
"suan": 21319,
"sui": 21323,
"sun": 21416,
"suo": 21431,
"tai": 21469,
"tang": 21598,
"tao": 21622,
"te": 21694,
"teng": 21696,
"ti": 21703,
"tie": 22009,
"ting": 22048,
"tong": 22073,
"tou": 22283,
"tu": 22380,
"tuan": 22460,
"tui": 22471,
"tuo": 22544,
"wa": 22589,
"wai": 22605,
"wang": 22757,
"wei": 22909,
"weng": 23276,
"wo": 23285,
"xiao": 24381,
"xie": 24527,
"xin": 24582,
"xing": 24827,
"xiong": 24989,
"xu": 25113,
"xuan": 25165,
"xue": 25263,
"xun": 25337,
"ya": 25403,
"yan": 25446,
"yang": 25796,
"yin": 27429,
"ying": 27625,
"yong": 27773,
"you": 27844,
"yuan": 28493,
"yue": 28617,
"yun": 28674,
"za": 28815,
"zai": 28823,
"zan": 28863,
"zang": 28876,
"zao": 28891,
"zei": 28976,
"zen": 28990,
"zeng": 28992,
"zhan": 29023,
"zhang": 29080,
"zhe": 29177,
"zhen": 29215,
"zheng": 29321,
"zhi": 29431,
"zi": 29452,
"zhong": 29807,
"zhou": 30016,
"zhu": 30060,
"zhua": 30257,
"zhuan": 30271,
"zhuang": 30302,
"zhui": 30334,
"zhun": 30392,
"zhuo": 30398,
"zong": 30619,
"zou": 30647,
"zu": 30668,
"zuan": 30698,
"zui": 30720,
"zun": 30755
}

389
helper/stack.json Normal file
View File

@ -0,0 +1,389 @@
[
"a",
"a",
"e",
"ai",
"an",
"ang",
"ao",
"ba",
"pa",
"bai",
"bo",
"ban",
"bang",
"bao",
"po",
"bei",
"pi",
"ben",
"beng",
"bi",
"bian",
"pian",
"biao",
"bie",
"bin",
"bing",
"bu",
"ca",
"cai",
"cen",
"shen",
"can",
"cang",
"cao",
"ze",
"si",
"ce",
"ceng",
"cha",
"chai",
"zhai",
"chan",
"shan",
"chang",
"chao",
"zhao",
"zhao,cháo",
"che",
"tian",
"chen",
"chuang",
"cheng",
"sheng",
"deng",
"chi",
"chong",
"hui",
"chou",
"xiu",
"chu",
"chuai",
"chuan",
"chui",
"chun",
"chuo",
"ci",
"cong",
"cu",
"cuan",
"cui",
"cun",
"cuo",
"zuo",
"da",
"ta",
"dai",
"dan",
"tan",
"dang",
"dao",
"de",
"di",
"dian",
"diao",
"tiao",
"die",
"zha",
"ding",
"diu",
"dong",
"du",
"dou",
"duo",
"duan",
"dui",
"tun",
"dun",
"yi",
"wu",
"en",
"er",
"fa",
"fan",
"fang",
"fei",
"fe",
"fen",
"feng",
"fu",
"fo",
"gai",
"ge",
"gan",
"gang",
"gao",
"ji",
"gen",
"geng",
"gong",
"gou",
"gu",
"hu",
"yu",
"he",
"gua",
"guai",
"guan",
"guang",
"kui",
"gui",
"qiu",
"gun",
"guo",
"hai",
"han",
"hang",
"hao",
"hei",
"hen",
"heng",
"hong",
"hou",
"hua",
"huai",
"huan",
"huang",
"hun",
"huo",
"qi",
"jia",
"jie",
"xia",
"jian",
"xian",
"kan",
"jiang",
"qiang",
"xiang",
"jiao",
"jue",
"jin",
"jing",
"jiong",
"jiu",
"ju",
"juan",
"jun",
"qun",
"kai",
"kang",
"kao",
"ke",
"ken",
"keng",
"kong",
"kou",
"ku",
"kua",
"kuai",
"kuan",
"kuang",
"kun",
"kuo",
"la",
"xi",
"lai",
"lan",
"lang",
"lao",
"liao",
"le",
"yao",
"lei",
"leng",
"li",
"lian",
"liang",
"lie",
"lin",
"ling",
"liu",
"long",
"lou",
"lu",
"lü",
"shuai",
"luan",
"lüe",
"lun",
"luo",
"ma",
"mai",
"man",
"mo",
"wan",
"mang",
"mao",
"mei",
"men",
"meng",
"mi",
"mian",
"wen",
"min",
"miao",
"mie",
"ming",
"miu",
"mou",
"mu",
"na",
"nei",
"nai",
"nan",
"nang",
"nu",
"nao",
"ne",
"ni",
"neng",
"nian",
"nie",
"niao",
"ning",
"niu",
"nong",
"nü",
"nüe",
"nuan",
"nuo",
"ou",
"pai",
"pan",
"pang",
"pao",
"pei",
"pen",
"peng",
"piao",
"pie",
"pin",
"ping",
"pou",
"pu",
"qia",
"qian",
"qiao",
"shao",
"qie",
"qing",
"qin",
"qiong",
"qu",
"quan",
"que",
"ran",
"rang",
"rao",
"re",
"ren",
"reng",
"ri",
"rong",
"rou",
"ru",
"ruan",
"rui",
"run",
"ruo",
"sa",
"sai",
"san",
"sang",
"sao",
"se",
"sen",
"seng",
"sha",
"shai",
"shang",
"she",
"shi",
"shou",
"shu",
"shuo",
"shua",
"shuan",
"shuang",
"shui",
"shun",
"song",
"sou",
"su",
"suan",
"sui",
"sun",
"suo",
"tai",
"tang",
"tao",
"te",
"teng",
"ti",
"tie",
"ting",
"tong",
"tou",
"tu",
"tuan",
"tui",
"tuo",
"wa",
"wai",
"wang",
"wei",
"weng",
"wo",
"xiao",
"xie",
"ye",
"xin",
"xing",
"xiong",
"xu",
"xuan",
"xue",
"xun",
"ya",
"yan",
"yang",
"yin",
"ying",
"yong",
"you",
"yuan",
"yue",
"yun",
"za",
"zai",
"zan",
"zang",
"zao",
"zei",
"zen",
"zeng",
"zhan",
"zhang",
"zhe",
"zhen",
"zheng",
"zhi",
"zi",
"zhong",
"zhou",
"zhu",
"zhua",
"zhuan",
"zhuang",
"zhui",
"zhun",
"zhuo",
"zong",
"zou",
"zu",
"zuan",
"zui",
"zun"
]

View File

@ -78,4 +78,8 @@
## 2.1.4
1. 修复cnchar-all及cnchar-draw库在非浏览器环境会报错的bug
2. 修复 draw库和main库在ts环境中引用的异常
2. 修复 draw库和main库在ts环境中引用的异常
## 2.1.5
1. 鸟字增加默认读音
2. 彷徨读音修正

View File

@ -3,7 +3,9 @@ import '../src/plugin/order';
import '../src/plugin/trad';
import '../src/plugin/poly';
import '../src/plugin/idiom';
import cncharDraw from '../src/plugin/draw';
import spell from '../src/main/spell-dict-jian.json';
// import cncharDraw from '../src/plugin/draw';
// import cnchar from '../npm/cnchar';
// import '../npm/order';
@ -22,34 +24,36 @@ console.log(cnchar.spellInfo('lǘ'));
console.log(cnchar.strokeToWord(1));
console.log('美好的地方'.spell('tone'));
cncharDraw('你好', {
type: cncharDraw.TYPE.NORMAL,
el: '#drawArea',
style: {
radicalColor: '#44f',
backgroundColor: '#ccc'
},
animation: {
animateComplete () {
console.log('animateComplete');
},
loopAnimate: true,
autoAnimate: false, // false 时点击出发animate 只能触发一次
// stepByStep: false
},
test: {
onTestStatus (d) {
console.log(d);
}
}
});
cncharDraw('你好', {
type: cncharDraw.TYPE.STROKE,
style: {
radicalColor: '#44f',
backgroundColor: '#eee'
},
});
window.keys = Object.keys(spell);
// cncharDraw('你好', {
// type: cncharDraw.TYPE.NORMAL,
// el: '#drawArea',
// style: {
// radicalColor: '#44f',
// backgroundColor: '#ccc'
// },
// animation: {
// animateComplete () {
// console.log('animateComplete');
// },
// loopAnimate: true,
// autoAnimate: false, // false 时点击出发animate 只能触发一次
// // stepByStep: false
// },
// test: {
// onTestStatus (d) {
// console.log(d);
// }
// }
// });
// cncharDraw('你好', {
// type: cncharDraw.TYPE.STROKE,
// style: {
// radicalColor: '#44f',
// backgroundColor: '#eee'
// },
// });
export default cnchar;

View File

@ -17,5 +17,6 @@
"子": "zǐ",
"脯": "fǔ",
"抹": "mā",
"食": "shí"
"食": "shí",
"鸟": "niǎo"
}

View File

@ -48,7 +48,7 @@
"ge": "1:个9个8戈1仡6各9各8合8圪1纥6疙1咯6虼4阁2革7哥1哿3格7格6胳7胳6鬲7盖8硌9舸3袼1铬4鸽1割1搁7搁6葛7葛8蛤7隔2嗝2塥2歌1搿2膈2镉2骼2饹6",
"ya": "1:丫1牙2疋3轧9亚4伢2压9压6厌6吖6讶4呀6岈2芽2迓4押1哑8哑6垭4娅4砑4鸦1桠1氩4琊2蚜2鸭1崖2涯2痖3揠4雅8雅6睚2衙2呀5",
"shuo": "3:妁4烁4说6朔4铄4硕4搠4蒴4槊4",
"tuo": "2:乇1托1驮7佗7佗6妥3陀2坨2拓9拖1沱2驼2柁2柝4说6砣2鸵2唾4庹3脱1椭3跎2酡2箨4魄9橐2鼍2託1",
"tuo": "2:讬1乇1托1驮7佗7佗6妥3陀2坨2拓9拖1沱2驼2柁2柝4说6砣2鸵2唾4庹3脱1椭3跎2酡2箨4魄9橐2鼍2託1",
"me": "1:么0",
"ye": "1:也3业4叶9曳4爷2邪7页4冶3邺4夜4耶7耶6咽9拽9晔4烨4掖9掖6揶2液4谒4野3铘2椰1腋4噎6靥4",
"xiang": "2:乡1向4芗1享3详2降7响3巷9庠2相9相6项4饷3香1祥2厢1象4湘1缃1翔2葙1飨3像4想3鲞3橡4箱1蟓4襄1骧1镶1",

View File

@ -4,7 +4,7 @@
"丁七乃乜九了二人亻儿入八冂几凵刀刁力勹匕十厂厶又卜乂",
"万丈三上下丌个丫丸久乇么义乞也习乡亍于亏亡亿兀凡刃勺千卫叉口囗土士夕大女子孑孓寸小尢尸山巛川工己已巳巾干幺广廾弋弓才门飞马与之及",
"不丐丑专中丰丹为乌书予云互亓五井亢什仁仂仃仄仅仆仇仉今介仍从仑仓允元公六兮内冈冗凤凶分切刈劝办勾勿匀化匹区卅升午卞厄厅历友双反壬天太夫夭孔少尤尹尺屯巴币幻廿开引心忆戈户手扎支攴攵文斗斤方无日曰月木欠止歹殳毋比毛氏气水火爪父爻爿片牙牛犬王瓦肀艺见计订讣认讥贝车邓长闩队韦风乏以巨巿冇",
"且丕世丘丙业丛东丝主乍乎乐仔仕他仗付仙仝仞仟仡代令仨仪仫们兄兰冉册写冬冯凸凹出击刊刍功加务劢包匆北匝卉半卟占卡卢卮卯厉去发古句另叨叩只叫召叭叮可台叱史右叵叶号司叹叻叼叽囚四圣处外央夯失头奴奶孕宁它宄对尔尕尻尼左巧市布帅平幼庀弁弗弘归必忉戊戋扑扒打扔斥旦旧未末本札术正母氐民氕永汀汁汇汉灭犯犰玄玉瓜甘生用甩田由甲申电疋白皮皿目矛矢石示礼禾穴立纠艽艾艿节讦讧讨让讪讫训议讯记轧边辽邗邙邛邝钅闪阡阢饥驭鸟龙印戉氹奵",
"且丕世丘丙业丛东丝主乍乎乐仔仕他仗付仙仝仞仟仡代令仨仪仫们兄兰冉册写冬冯凸凹出击刊刍功加务劢包匆北匝卉半卟占卡卢卮卯厉去发古句另叨叩只叫召叭叮可台叱史右叵叶号司叹叻叼叽囚四圣处外央夯失头奴奶孕宁它宄对尔尕尻尼左巧市布帅平幼庀弁弗弘归必忉戊戋扑扒打扔斥旦旧未末本札术正母氐民氕永汀汁汇汉灭犯犰玄玉瓜甘生用甩田由甲申电疋白皮皿目矛矢石示礼禾穴立纠艽艾艿节讦讧讨让讪讫训议讯记轧边辽邗邙邛邝钅闪阡阢饥驭鸟龙印戉氹奵",
"丞丢乒乓乔乩买争亘亚交亥亦产仰仲仳仵件价任份仿企伉伊伍伎伏伐休众优伙会伛伞伟传伢伤伥伦伧伪伫佤充兆先光全共关兴再军农冰冱冲决凫凼刎刑划刖列刘则刚创劣动匈匠匡华协危压厌厍吁吃各吆合吉吊同名后吏吐向吒吓吕吖吗囝回囟因囡团在圩圪圬圭圮圯地圳圹场圾壮夙多夷夸夹夺夼奸她好妁如妃妄妆妇妈字存孙宅宇守安寺寻导尖尘尥尧尽屹屺屿岁岂岌州巡巩帆师年并庄庆延廷异式弛当忏忖忙戌戍戎戏成托扛扣扦执扩扪扫扬收旨早旬旭旮旯曲曳有朱朴朵机朽杀杂权次欢此死毕氖氘氽汆汊汐汔汕汗汛汜汝江池污汤汲灯灰爷牝牟犴犷犸玎玑百祁竹米糸纡红纣纤纥约级纨纩纪纫缶网羊羽老考而耒耳聿肉肋肌臣自至臼舌舛舟艮色芄芊芋芍芎芏芑芒芗芝芨虍虫血行衣西观讲讳讴讵讶讷许讹论讼讽设访诀贞负轨达迁迂迄迅过迈邡邢那邦邪邬钆钇闫闭问闯阪阮阱防阳阴阵阶页饧驮驯驰齐似吸芃邨吋贠孖屾叒玏岀甪",
"两严串丽乱亨亩伯估伲伴伶伸伺伽佃但位低住佐佑体何佗佘余佚佛作佝佞佟你佣佥佧克免兑兕兵况冶冷冻初删判刨利别刭助努劫劬劭励劲劳匣医卣卤即却卵县君吝吞吟吠吡吣否吧吨吩含听吭吮启吱吲吴吵吹吻吼吾呀呃呆呈告呋呐呒呓呔呕呖呗员呙呛呜囤囫园困囱围囵圻址坂均坊坌坍坎坏坐坑块坚坛坜坝坞坟坠声壳奁奂妊妍妒妓妖妗妙妞妣妤妥妨妩妪妫姊姒孚孛孜孝宋完宏寿尬尾尿局屁层岈岍岐岑岔岖岗岘岙岚岛岜希帏帐庇床庋序庐庑库应弃弄弟张形彤彷役彻忌忍忐忑忒志忘忡忤忧忪快忭忮忱忸忻忾怀怃怄怅怆我戒扭扮扯扰扳扶批扼找技抄抉把抑抒抓投抖抗折抚抛抟抠抡抢护报拒拟攸改攻旰旱时旷更杆杈杉杌李杏材村杓杖杜杞束杠条来杨杩极欤步歼每氙氚求汞汨汩汪汰汴汶汹汽汾沁沂沃沅沆沈沉沌沏沐沔沙沛沟没沣沤沥沦沧沩沪泐泛灵灶灸灼灾灿炀牡牢状犹狁狂狃狄狈玖玛甫甬男甸町疔疖疗皂盯矣矶社祀秀私秃究穷系纬纭纯纰纱纲纳纵纶纷纸纹纺纽纾罕羌肓肖肘肚肛肜肝肟肠良芈芘芙芜芟芡芤芥芦芩芪芫芬芭芮芯芰花芳芴芷芸芹芽芾苁苄苇苈苊苋苌苍苎苏苡苣虬补角言证诂诃评诅识诈诉诊诋诌词诎诏译诒谷豆豕豸贡财赤走足身轩轫辛辰迎运近迓返迕还这进远违连迟邑邮邯邰邱邳邴邵邶邸邹邺邻酉里针钉钊钋钌闰闱闲闳间闵闶闷阻阼阽阿陀陂附际陆陇陈陉韧饨饩饪饫饬饭饮驱驳驴鸠鸡麦龟巫囧旸佔飏呎釆佈玙囯沕",
"丧乖乳事些亟享京佩佬佯佰佳佴佶佻佼佾使侃侄侈侉例侍侏侑侔侗供依侠侣侥侦侧侨侩侪侬兔兖其具典冼冽净凭凯函刮到刳制刷券刹刺刻刽刿剀剁剂劾势匦卑卒卓单卖卦卧卷卺厕叁参叔取呢呤呦周呱味呵呶呷呸呻呼命咀咂咄咆咋和咎咏咐咒咔咕咖咙咚咛咝哎囹固国图坡坤坦坨坩坪坫坭坯坳坶坷坻坼垂垃垄垅垆备夜奄奇奈奉奋奔妮妯妲妹妻妾姆始姐姑姓委姗孟孢季孤孥学宓宕宗官宙定宛宜宝实宠审尚居屈屉届岢岣岩岫岬岭岱岳岵岷岸岽岿峁峄帑帔帕帖帘帙帚帛帜幸底庖店庙庚府庞废建弥弦弧弩弪录彼往征徂径忝忠念忽忿态怂怊怍怏怔怕怖怙怛怜怡怦性怩怪怫怯怵怿戕或戗戽戾房所承抨披抬抱抵抹抻押抽抿拂拄担拆拇拈拉拊拌拍拎拐拓拔拖拗拘拙拚招拢拣拥拦拧拨择放斧斩於旺昀昂昃昆昊昌明昏易昔昕昙朊朋服杪杭杯杰杲杳杵杷杼松板构枇枉枋析枕林枘枚果枝枞枢枣枥枧枨枪枫枭柜欣欧武歧殁殴氓氛沓沫沭沮沱沲河沸油治沼沽沾沿泄泅泊泌泓泔法泖泗泞泠泡波泣泥注泪泫泮泯泱泳泷泸泺泻泼泽泾浅炅炉炊炎炒炔炕炖炙炜炝炬爬爸版牦牧物狍狎狐狒狗狙狞玟玢玩玫玮环现瓮瓯甙画甾畀畅疙疚疝疟疠疡的盂盱盲直知矸矽矾矿砀码祆祈祉秆秉穸穹空竺籴线绀绁绂练组绅细织终绉绊绋绌绍绎经绐罔罗者耵耶肃股肢肤肥肩肪肫肭肮肯肱育肴肷肺肼肽肾肿胀胁臾舍艰苑苒苓苔苕苗苘苛苜苞苟苠苤若苦苫苯英苴苷苹苻茁茂范茄茅茆茇茉茌茎茏茑茔茕茚虎虏虮虱表衩衫衬规觅视诓诔试诖诗诘诙诚诛诜话诞诟诠诡询诣诤该详诧诨诩责贤败账货质贩贪贫贬购贮贯转轭轮软轰迢迤迥迦迨迩迪迫迭迮述迳邾郁郄郅郇郊郎郏郐郑郓采金钍钎钏钐钒钓钔钕钗闸闹阜陋陌降限陔陕隶隹雨青非顶顷饯饰饱饲饴驵驶驷驸驹驺驻驼驽驾驿骀鱼鸢鸣黾齿受变弢祎玥旻昇劼昉咘旼劵毑祇叕炘泃佺",

View File

@ -4,6 +4,11 @@
* 拼音 ['shi', '']
*/
const dict = require('./idiom.json');
const {initToneCodes, getCharCode} = require('./tone');
window.getCharCode = getCharCode;
let _cnchar = null;
let total = dict.length;
let arg = {
char: 'char',
@ -12,7 +17,6 @@ let arg = {
tone: 'tone'
};
let _cnchar = null;
// spell > stroke > char
// spell 和 stroke 仅在 引入cnchar之后才可用
@ -23,25 +27,30 @@ function idiom (...args) {
}
let input = args[0];
args = args.slice(1);
if (!(input instanceof Array || (typeof input === 'number' && args.indexOf(arg.stroke) !== -1))) {
if (args.indexOf(arg.spell) !== -1 && typeof input !== 'string') {
console.warn('idiom spell 模式下仅支持查询首个汉字的拼音');
return;
}
if (!(input instanceof Array || args.indexOf(arg.spell) !== -1 || (typeof input === 'number' && args.indexOf(arg.stroke) !== -1))) {
console.warn('idiom 输入参数仅支持数组 或 stroke模式下的数字');
return;
}
let res = null;
if (!_cnchar) { // 单独使用的idiom 只支持汉字查询方式
checkArg(args, arg.stroke);
checkArg(args, arg.spell);
checkArg(args, arg.tone);
return idiomWithChar(input);
res = idiomWithChar(input);
} else {
_cnchar._.checkArgs('idiom', args);
if (_cnchar._.has(args, arg.spell)) {
return idiomWithSpell(input, _cnchar._.has(args, arg.tone));
res = idiomWithSpell(input, _cnchar._.has(args, arg.tone));
} else if (_cnchar._.has(args, arg.stroke)) {
return idiomWithStroke(input);
res = idiomWithStroke(input);
} else {
return idiomWithChar(input);
res = idiomWithChar(input);
}
}
return res;
}
function idiomWithChar (input) {
@ -50,25 +59,108 @@ function idiomWithChar (input) {
});
}
// needTone是否需要匹配音调
function idiomWithSpell (input, needTone) {
transformSpell(input, needTone);
let args = ['low', 'array'];
if (needTone) {
args.push('tone');
function idiomWithSpell (input, tone) {
let low = 0;
let high = total;
input = input.toLowerCase();
if (tone) {
input = _cnchar._.transformTone(input, 'tone').spell;
}
return dict.filter((item) => {
return compareCommon(input, _cnchar.spell(item, ...args));
let target = input.split('').map(c => getCharCode(c, tone));
let area = step1FindArea(low, high, target, tone);
if (area === TYPE.ERROR) {
return [];
}
let floor = step2FindFloor(area.low, area.mid, target, tone).mid;
let ceil = step3FindCeil(area.mid, area.high, target, tone).mid;
return dict.slice(floor, ceil + 1);
}
const TYPE = {
MORE: 1, // 大于
LESS: 2, // 小于
EVEN: 3, // 等于
ERROR: -1
};
function binarySearch (low, high, condition) {
if (low > high) {
return TYPE.ERROR;
}
let mid = Math.floor((low + high) / 2);
let res = condition(mid);
if (res === TYPE.MORE) {
return binarySearch(low, mid - 1, condition);
} else if (res === TYPE.LESS) {
return binarySearch(mid + 1, high, condition);
} else {
return {low, high, mid};
}
}
function step1FindArea (low, high, target, tone) { // 找到一个区间,该区间包含所有拼音,且中值为该拼音
return binarySearch(low, high, (mid) => {
return compareSpell(mid, target, tone);
});
}
function transformSpell (input, needTone) {
input.forEach((item, i) => {
if (item) {
let info = _cnchar._.transformTone(item, needTone);
input[i] = info.spell;
}
function step2FindFloor (low, high, target, tone) { // 查找下界
return binarySearch(low, high, (mid) => {
return compareBoundary(mid, target, TYPE.MORE, TYPE.LESS, -1, tone);
});
}
function step3FindCeil (low, high, target, tone) { // 查找上界
return binarySearch(low, high, (mid) => {
return compareBoundary(mid, target, TYPE.LESS, TYPE.MORE, 1, tone);
});
}
// typeCenter 朝区域中心的大小type typeSide 朝区域两端的大小type
function compareBoundary (mid, target, typeCenter, typeSide, neighborPlus, tone) {
let res = compareSpell(mid, target, tone);
if (res === typeSide) {
return res;
}
if (res === TYPE.EVEN) {
let neighborIndex = mid + neighborPlus;
if (neighborIndex < 0 || neighbor >= total) {
return TYPE.EVEN;
}
let neighbor = compareSpell(neighborIndex, target, tone); // + 1
if (neighbor === TYPE.EVEN) {
return typeCenter;
} else if (neighbor === typeSide) {
return TYPE.EVEN;
} else {
console.error(neighbor);
throw new Error('idoim Error');
}
}
}
window.dict = dict;
window.compareSpell = compareSpell;
function compareSpell (mid, target, tone) {
let arr = ['low'];
if (tone) {arr.push('tone');}
let _spell = _cnchar.spell(dict[mid][0], ...arr); // 获取成语第一个字的拼音
for (let i = 0; i < _spell.length; i++) {
if (!target[i]) { // 中值与目标值前面拼音一样,但是中长度大于目标 说明 中 > 目标
return TYPE.MORE;
}
let code = getCharCode(_spell[i], tone);
if (code > target[i]) { // 中值 > 目标
return TYPE.MORE;
} else if (code < target[i]) { // 中值 < 目标
return TYPE.LESS;
}
}
if (_spell.length === target.length) {
return TYPE.EVEN;
}
return TYPE.LESS; // 中值与目标值前面拼音一样,但是中长度小于目标 说明 中 < 目标
}
function idiomWithStroke (input) {
if (typeof input === 'number') { // 总笔画数为多少
@ -105,6 +197,7 @@ function checkArg (args, name) {
function setCnchar (cnchar) {
_cnchar = cnchar;
initToneCodes(cnchar);
}
module.exports = {idiom, arg, setCnchar};

File diff suppressed because one or more lines are too long

35
src/plugin/idiom/tone.js Normal file
View File

@ -0,0 +1,35 @@
let _cnchar = null;
let toneCodes = [];
initToneCodes();
function initToneCodes (__cnchar) {
_cnchar = __cnchar;
'aoeiuvn'.split('').forEach(item => {
let code = item.charCodeAt(0);
for (let i = 1; i <= 4; i++) {
toneCodes.push(code + i * 0.1);
}
});
}
function getToneCodes (char) {
let index = _cnchar._.tones.indexOf(char);
if (index === -1) {
return -1;
}
return toneCodes[index];
}
function getCharCode (char, tone = false) {
if (!tone) {
return char.charCodeAt(0);
}
let code = getToneCodes(char);
if (code === -1) {
return char.charCodeAt(0);
}
return code;
}
module.exports = {initToneCodes, getCharCode};

View File

@ -129,7 +129,7 @@
"朝气": "zhāo qì",
"朝夕": "zhāo xī",
"朝霞": "zhāo xiá",
"朝阳": "zhāo,cháo yáng",
"朝阳": "zhāo yáng",
"撤差": "chè chāi",
"沉没": "chén mò",
"沉着": "chén zhuó",
@ -3113,5 +3113,6 @@
"淡妆浓抹": "dàn zhuāng nóng mǒ",
"拘泥": "jū nì",
"飞来横祸": "fēi lái hèng huò",
"蛮横": "mán hèng"
"蛮横": "mán hèng",
"彷徨": "páng huáng"
}