kiss gallryシリーズのpinyn
本論文にはkisy gallryのpinynを収録しています。
主にその中の比較的核心的な設計思想を分解します。
数が多くないので、ベースライブラリに依存しないhttp://gallery.kissyui.com/pinyin/1.0/guide/index.html?spm=0.0.0.0.i7apRd
でもやはりいくつかbad caseがあって、例えばfuシリーズ、オフィシャルgitにフィードバックします。
ピニャン
------- 主に漢字のピンインを変換するのです。
var key = " ".split(""),
pinyin = "AAiAnAngAoBaBaiBanBangBaoBeiBenBengBiBianBiaoBieBinBingBoBuCaCaiCanCangCaoCeCenCengChaChaiChanChangChaoCheChenChengChiChongChouChuChuaiChuanChuangChuiChunChuoCiCongCouCuCuanChuanCuanCuiCunCuoDaDaiDanDangDaoDeDenDengDiDiaDianDiaoDieDingDiuDongDouDuDuanDuiDunDuoEEnEngErFaFanFangFeiFenFengFiaoFoFouFuGaGaiGanGangGaoGeGeiGenGengGongGouGuGuaGuaiGuanGuangGuiGunGuoHaHaiHanHangHaoHeHeiHenHengHoHongHouHuHuaHuaiHuanHuangHuiHunHuoJiJiaJianJiangJiaoJieJinJingJiongJiuJuJuanJueJunKaKaiKanKangKaoKeKenKengKongKouKuKuaKuaiKuanKuangKuiKunKuoLaLaiLanLangLaoLeLeiLengLiLiaLianLiangLiaoLieLinLingLiuLoLongLouLuLvLuanLveLunLuoMMaMaiManMangMaoMeMeiMenMengMiMianMiaoMieMinMingMiuMoMouMeiMuNaNaiNanNangNaoNeNeiNenNNiNianNiangNiaoNieNinNingNiuNongNouNuNvNveNuanNuoOuPaPaiPanPangPaoPeiPenPengPiPianPiaoPiePinPingPoPouPuQiQiaQianQiangQiaoQieQinQingQiongQiuQuQuanQueQunRaRanRangRaoReRenRengRiRongRouRuRuanRuiRunRuoSaSaiSanSangSaoSeShaShaiShanShangShaoSheShenShengShiShouShuShuaShuaiShuanShuangShuiShuoSiSongSouSuSuanSuiSunSuoTaTaiTanTangTaoTeTengTiTianTiaoTieTingTongTouTuTuanTuiTunTuoWaWaiWanWangWeiWenWengWoWuXiXiaXianXiangXiaoXieXinXingXiongXiuXuXuanXueXunYaYanYangYaoYeYenYiYinYingYoYongYouYuYuanYueYunZaZaiZanZangZaoZeZeiZenZengZhaZhaiZhanZhangZhaoZheZhenZhengZhiZhongZhouZhuZhuaZhuaiZhuanZhuangZhuiZhunZhuoZaiZiZongZouZuZuanZuiZunZuo".split(/(?=[A-Z])/g),
cache = {},
keyLen=key.length-1;
核心的なピニinFn方法:
function pinyinFn(w){
//
if(w.length >1){
var ret = '',
i = 0;
for(;i<w.length;i++){
ret += pinyinFn(w.charAt(i));
}
return ret;
}
//
if(!/[\u4e00-\u9fa5]/.test(w)){
return w;
}
//
if(cache[w]){
return cache[w];
}
var begin = 0,
end = keyLen;
//
while(begin <= end){
var middle = Math.floor((begin+end)/2);
if(w.localeCompare(key[middle]) <0){
end = middle-1;
}else{
begin = middle+1;
}
}
return cache[w] = pinyin[end];
}