pinyin-input-method-engine
Version:
汉语拼音输入法引擎 JavaScript 实现。
77 lines • 2.18 kB
JavaScript
import { YIN_JIE } from '../defined';
/**
* 检查是否可拆分。
* 原则为拆分后的拼音前后都恰好可以组成完整的音节。
* @param letters 拼音字母列表
* @param markIndex 拆分标记索引(不含该索引值)
*/
const checkCanSplit = (letters, markIndex) => {
// 后续已经没有拼音字母
if (markIndex >= letters.length) {
return true;
}
const maxIndex = Math.min(markIndex + 6, letters.length);
let i = markIndex + 1;
while (i <= maxIndex) {
const part = letters.slice(markIndex, i);
if (YIN_JIE.has(part)) {
return true;
}
i++;
}
return false;
};
/**
* 查找下一个所有可能的音节。
* @param letters 拼音字母列表
* @param start 开始索引
* @returns 查找到下一个所有可能的音节
*/
const findNext = (letters, start = 0) => {
if (letters.length === 0 || start >= letters.length) {
return [];
}
const finalRes = [];
const tmpRes = [];
let i = Math.min(start + 6, letters.length);
while (i > start) {
const part = letters.slice(start, i);
if (YIN_JIE.has(part)) {
if (checkCanSplit(letters, i)) {
finalRes.push([part, i]);
}
else {
tmpRes.push([part, i]);
}
}
i--;
}
if (finalRes.length === 0 && tmpRes.length > 0) {
finalRes.push(tmpRes[0]);
}
if (finalRes.length === 0) {
return [[letters[start], start + 1]];
}
return finalRes;
};
/**
* 将拼音字母列表拆分为可能的音节列表。
* @param letters 拼音字母列表
* @param start 开始索引
* @returns 拆分后的音节列表
*/
export const splitAsYinJie = (letters, start = 0) => {
const res = [];
findNext(letters, start).forEach(([part, markIndex]) => {
if (markIndex < letters.length) {
splitAsYinJie(letters, markIndex).forEach(item => {
res.push([part, ...item]);
});
}
else {
res.push([part]);
}
});
return res;
};
//# sourceMappingURL=transform.js.map