end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

auto_ruby.jsでふりがな(半角カナ)を自動入力

次のurlで紹介されているauto_ruby.js(内部的にprototype.jsを使用してます)は、氏名(漢字)を入力すると、ふりがな(全角かなor全角カナ)を自動入力してくれます。

http://ceo.sourcelab.jp/archives/97
http://d.hatena.ne.jp/a_horuru/20080702/1214997621

携帯電話の電話帳編集にも同様の機能があった気がありますが、私の携帯電話の場合、自動入力されるフリガナは半角カナですが、を半角カナ自動入力に対応させるには、次のようめconvHankakuKana()を追加すれば、よさそうです。

//--------設定--------
var convFlag  = 2;  //モードフラグ ひらがな→0 カタカナ→1 半角カナ→2
var nameField = 'tei_name'; //名前のID
var rubyField = 'tei_name_kana'; //カナのID
//--------------------
function $(e) { return document.getElementById(e); }
var baseVal = "";
var beforeVal = "";

function convHankakuKana(val){
  var retStr = '';
  for(i=0;i<val.length;i++){
    var oneChar = val.charAt(i);
    oneChar = KATAKANA_FULL2HALF[oneChar] || oneChar;
    retStr += oneChar;
  }
  return retStr;
}

var KATAKANA_FULL2HALF =
{'あ':'ア',      'い':'イ',       'う':'ウ',       'え':'エ',       'お':'オ',
'か':'カ',       'き':'キ',       'く':'ク',       'け':'ケ',       'こ':'コ',
'さ':'サ',       'し':'シ',       'す':'ス',       'せ':'セ',       'そ':'ソ',
'た':'タ',       'ち':'チ',       'つ':'ツ',       'て':'テ',       'と':'ト',
'な':'ナ',       'に':'ニ',       'ぬ':'ヌ',       'ね':'ネ',       'の':'ノ',
'は':'ハ',       'ひ':'ヒ',       'ふ':'フ',       'へ':'ヘ',       'ほ':'ホ',
'ま':'マ',       'み':'ミ',       'む':'ム',       'め':'メ',       'も':'モ',
'や':'ヤ',                       'ゆ':'ユ',                       'よ':'ヨ',
'ら':'ラ',       'り':'リ',       'る':'ル',       'れ':'レ',       'ろ':'ロ',
'わ':'ワ',                       'を':'ヲ',
'ん':'ン',
'ぁ':'ァ',       'ぃ':'ィ',       'ぅ':'ゥ',       'ぇ':'ェ',       'ぉ':'ォ',
                                'ッ':'ッ',
'ゃ':'ャ',                       'ゅ':'ュ',                       'ょ':'ョ',
                                'ヴ':'ヴ',
'が':'ガ',      'ぎ':'ギ',      'ぐ':'グ',      'げ':'ゲ',      'ご':'ゴ',
'ざ':'ザ',      'じ':'ジ',      'ず':'ズ',      'ぜ':'ゼ',      'ぞ':'ゾ',
'だ':'ダ',      'ぢ':'ヂ',      'づ':'ヅ',      'で':'デ',      'ど':'ド',
'ば':'バ',      'び':'ビ',      'ぶ':'ブ',      'べ':'ベ',      'ぼ':'ボ',
'ぱ':'パ',      'ぴ':'ピ',      'ぷ':'プ',      'ぺ':'ペ',      'ぽ':'ポ',
'ー':'ー',       ' ':' '};

function setRuby() {
  var newVal = $(nameField).value;
  if (baseVal == newVal){return;}
  if (newVal == "") {
    $(rubyField).value="";
    baseVal = "";
    return;
  }
  var addVal = newVal;
  for(var i=baseVal.length; i>=0; i--) {
    if (newVal.substr(0,i) == baseVal.substr(0,i)) {
      addVal = newVal.substr(i);break;
    }
  }
  baseVal = newVal;
  if (addVal.match(/[^  ぁあ-んァー]/)) return;
  var flg = 0;
  if (addVal.match(/^[あ-ん]$/)) {
    if (beforeVal == addVal) flg = 1;
    beforeVal = addVal;
  }

  if(convFlag == 1){
    addVal = convKana(addVal);
  } else if(convFlag == 2){
    addVal = convHankakuKana(addVal);
  }

  var q = $(rubyField).value.slice(-1 * addVal.length);
  if (flg == 0 && q == addVal) return;
  $(rubyField).value += addVal;
}

function loopTimer(){
  setRuby();
  timer = setTimeout("loopTimer()",30);
}

function convKana(val){
  var c, a = [];
  for(var i=val.length-1;0<=i;i--){
    c = val.charCodeAt(i);
    a[i] = (0x3041 <= c && c <= 0x3096) ? c + 0x0060 : c;
  }
  return String.fromCharCode.apply(null, a);
}

var timer = false;

window.onload = function(){
  loopTimer();
  $(rubyField).onkeyup = setRuby();
}

今のところ、sjisでも動作しています。