109 lines
3.1 KiB
JavaScript
109 lines
3.1 KiB
JavaScript
"use strict";
|
|
|
|
const assign = require("object-assign");
|
|
const PINYIN_DICT = require("../data/dict-zi");
|
|
const Pinyin = require("./pinyin");
|
|
let jieba;
|
|
let PHRASES_DICT;
|
|
|
|
class NodePinyin extends Pinyin {
|
|
|
|
// @param {String} hans 要转为拼音的目标字符串(汉字)。
|
|
// @param {Object} options, 可选,用于指定拼音风格,是否启用多音字。
|
|
// @return {Array} 返回的拼音列表。
|
|
convert (hans, options) {
|
|
if(typeof hans !== "string"){
|
|
return [];
|
|
}
|
|
|
|
options = assign({}, Pinyin.DEFAULT_OPTIONS, options);
|
|
let phrases = options && options.segment ? segment(hans) : hans;
|
|
let pys = [];
|
|
let nohans = "";
|
|
|
|
for (let i = 0, firstCharCode, words, l = phrases.length; i < l; i++) {
|
|
|
|
words = phrases[i];
|
|
firstCharCode = words.charCodeAt(0);
|
|
|
|
if(PINYIN_DICT[firstCharCode]){
|
|
|
|
// ends of non-chinese words.
|
|
if(nohans.length > 0){
|
|
pys.push([nohans]);
|
|
nohans = ""; // reset non-chinese words.
|
|
}
|
|
|
|
if (words.length === 1) {
|
|
pys = pys.concat(super.convert(words, options));
|
|
} else {
|
|
pys = pys.concat(this.phrases_pinyin(words, options));
|
|
}
|
|
|
|
} else {
|
|
nohans += words;
|
|
}
|
|
}
|
|
|
|
// 清理最后的非中文字符串。
|
|
if(nohans.length > 0){
|
|
pys.push([nohans]);
|
|
nohans = ""; // reset non-chinese words.
|
|
}
|
|
|
|
return pys;
|
|
}
|
|
|
|
// 词语注音
|
|
// @param {String} phrases, 指定的词组。
|
|
// @param {Object} options, 选项。
|
|
// @return {Array}
|
|
phrases_pinyin(phrases, options) {
|
|
let py = [];
|
|
if (PHRASES_DICT.hasOwnProperty(phrases)){
|
|
//! copy pinyin result.
|
|
PHRASES_DICT[phrases].forEach(function(item, idx){
|
|
py[idx] = [];
|
|
if (options.heteronym){
|
|
item.forEach(function(py_item, py_index){
|
|
py[idx][py_index] = Pinyin.toFixed(py_item, options.style);
|
|
});
|
|
} else {
|
|
py[idx][0] = Pinyin.toFixed(item[0], options.style);
|
|
}
|
|
});
|
|
} else {
|
|
for(let i = 0, l = phrases.length; i < l; i++){
|
|
py = py.concat(super.convert(phrases[i], options));
|
|
}
|
|
}
|
|
return py;
|
|
}
|
|
}
|
|
|
|
function segment(hans) {
|
|
try {
|
|
jieba = jieba || require("nodejieba");
|
|
} catch (ex) {
|
|
console.error();
|
|
console.error(" Segment need nodejieba, please run '$ npm install nodejieba'.");
|
|
console.error(" 分词需要使用 nodejieba 模块,请运行 '$ npm install nodejieba' 并确保安装完成。");
|
|
console.error();
|
|
throw ex;
|
|
}
|
|
// 词语拼音库。
|
|
PHRASES_DICT = PHRASES_DICT || require("../data/phrases-dict");
|
|
return jieba.cutSmall(hans, 4);
|
|
}
|
|
|
|
const pinyin = new NodePinyin(PINYIN_DICT);
|
|
|
|
module.exports = pinyin.convert.bind(pinyin);
|
|
module.exports.compare = pinyin.compare.bind(pinyin);
|
|
module.exports.STYLE_NORMAL = Pinyin.STYLE_NORMAL;
|
|
module.exports.STYLE_TONE = Pinyin.STYLE_TONE;
|
|
module.exports.STYLE_TONE2 = Pinyin.STYLE_TONE2;
|
|
module.exports.STYLE_TO3NE = Pinyin.STYLE_TO3NE;
|
|
module.exports.STYLE_INITIALS = Pinyin.STYLE_INITIALS;
|
|
module.exports.STYLE_FIRST_LETTER = Pinyin.STYLE_FIRST_LETTER;
|