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];

}