文字列をローマ字表記に変換する その2(怪しいけど、半角カナもじに対応)

var toRoman = (function( ) {

  var roman = {

    '1':'1', '2':'2', '3':'3', '4':'4', '5':'5', '6':'6', '7':'7', '8':'8', '9':'9', '0':'0',
    '!':'!', '”':'"', '#':'#', '$':'$', '%':'%', '&':'&', '’':"'", '(':'(', ')':')', '=':'=',
    '〜':'~', '|':'|', '@':'@', '‘':'`', '+':'+', '*':'*', ';':";", ':':':', '<':'<', '>':'>',
    '、':',', '。':'.', '/':'/', '?':'?', '_':'_', '・':'・', '「':'[', '」':']', '{':'{', '}':'}',
    '¥':'\\', '^':'^',
    
    'ふぁ':'fa', 'ふぃ':'fi', 'ふぇ':'fe', 'ふぉ':'fo',

    'きゃ':'kya', 'きゅ':'kyu', 'きょ':'kyo',
    'しゃ':'sha', 'しゅ':'shu', 'しょ':'sho',
    'ちゃ':'tya', 'ちゅ':'tyu', 'ちょ':'tyo',
    'にゃ':'nya', 'にゅ':'nyu', 'にょ':'nyo',
    'ひゃ':'hya', 'ひゅ':'hyu', 'ひょ':'hyo',
    'みゃ':'mya', 'みゅ':'myu', 'みょ':'myo',
    'りゃ':'rya', 'りゅ':'ryu', 'りょ':'ryo',

    'ふゃ':'fya', 'ふゅ':'fyu', 'ふょ':'fyo',
    'ぴゃ':'pya', 'ぴゅ':'pyu', 'ぴょ':'pyo',
    'びゃ':'bya', 'びゅ':'byu', 'びょ':'byo',
    'ぢゃ':'dya', 'ぢゅ':'dyu', 'ぢょ':'dyo',
    'じゃ':'ja',  'じゅ':'ju',  'じょ':'jo',
    'ぎゃ':'gya', 'ぎゅ':'gyu', 'ぎょ':'gyo',

    'ぱ':'pa', 'ぴ':'pi', 'ぷ':'pu', 'ぺ':'pe', 'ぽ':'po',
    'ば':'ba', 'び':'bi', 'ぶ':'bu', 'べ':'be', 'ぼ':'bo',
    'だ':'da', 'ぢ':'di', 'づ':'du', 'で':'de', 'ど':'do',
    'ざ':'za', 'じ':'zi', 'ず':'zu', 'ぜ':'ze', 'ぞ':'zo',
    'が':'ga', 'ぎ':'gi', 'ぐ':'gu', 'げ':'ge', 'ご':'go',

    'わ':'wa', 'ゐ':'wi', 'う':'wu', 'ゑ':'we', 'を':'wo',
    'ら':'ra', 'り':'ri', 'る':'ru', 'れ':'re', 'ろ':'ro',
    'や':'ya',            'ゆ':'yu',            'よ':'yo',
    'ま':'ma', 'み':'mi', 'む':'mu', 'め':'me', 'も':'mo',
    'は':'ha', 'ひ':'hi', 'ふ':'hu', 'へ':'he', 'ほ':'ho',
    'な':'na', 'に':'ni', 'ぬ':'nu', 'ね':'ne', 'の':'no',
    'た':'ta', 'ち':'ti', 'つ':'tu', 'て':'te', 'と':'to',
    'さ':'sa', 'し':'si', 'す':'su', 'せ':'se', 'そ':'so',
    'か':'ka', 'き':'ki', 'く':'ku', 'け':'ke', 'こ':'ko',
    'あ':'a', 'い':'i', 'う':'u', 'え':'e', 'お':'o',
    'ぁ':'la', 'ぃ':'li', 'ぅ':'lu', 'ぇ':'le', 'ぉ':'lo',

    'ヶ':'ke', 'ヵ':'ka',
    'ん':'n',  'ー':'-', ' ':' ',

//___________

    'ファ':'fa', 'フィ':'fi', 'フェ':'fe', 'フォ':'fo',
    'キャ':'kya', 'キュ':'kyu', 'キョ':'kyo',
    'シャ':'sha', 'シュ':'shu', 'ショ':'sho',
    'チャ':'tya', 'チュ':'tyu', 'チョ':'tyo',
    'ニャ':'nya', 'ニュ':'nyu', 'ニョ':'nyo',
    'ヒャ':'hya', 'ヒュ':'hyu', 'ヒョ':'hyo',
    'ミャ':'mya', 'ミュ':'myu', 'ミョ':'myo',
    'リャ':'rya', 'リュ':'ryu', 'リョ':'ryo',
    'フャ':'fya', 'フュ':'fyu', 'フョ':'fyo',
    'ピャ':'pya', 'ピュ':'pyu', 'ピョ':'pyo',
    'ビャ':'bya', 'ビュ':'byu', 'ビョ':'byo',
    'ヂャ':'dya', 'ヂュ':'dyu', 'ヂョ':'dyo',
    'ジャ':'ja',  'ジュ':'ju',  'ジョ':'jo',
    'ギャ':'gya', 'ギュ':'gyu', 'ギョ':'gyo',
    'パ':'pa', 'ピ':'pi', 'プ':'pu', 'ペ':'pe', 'ポ':'po',
    'バ':'ba', 'ビ':'bi', 'ブ':'bu', 'ベ':'be', 'ボ':'bo',
    'ダ':'da', 'ヂ':'di', 'ヅ':'du', 'デ':'de', 'ド':'do',
    'ザ':'za', 'ジ':'zi', 'ズ':'zu', 'ゼ':'ze', 'ゾ':'zo',
    'ガ':'ga', 'ギ':'gi', 'グ':'gu', 'ゲ':'ge', 'ゴ':'go',
    'ワ':'wa', 'ウィ':'wi', 'ウェ':'we', 'ヲ':'wo',
    'ラ':'ra', 'リ':'ri', 'ル':'ru', 'レ':'re', 'ロ':'ro',
    'ヤ':'ya',           'ユ':'yu',           'ヨ':'yo',
    'マ':'ma', 'ミ':'mi', 'ム':'mu', 'メ':'me', 'モ':'mo',
    'ハ':'ha', 'ヒ':'hi', 'フ':'hu', 'ヘ':'he', 'ホ':'ho',
    'ナ':'na', 'ニ':'ni', 'ヌ':'nu', 'ネ':'ne', 'ノ':'no',
    'タ':'ta', 'チ':'ti', 'ツ':'tu', 'テ':'te', 'ト':'to',
    'サ':'sa', 'シ':'si', 'ス':'su', 'セ':'se', 'ソ':'so',
    'カ':'ka', 'キ':'ki', 'ク':'ku', 'ケ':'ke', 'コ':'ko',
    'ア':'a', 'イ':'i', 'ウ':'u', 'エ':'e', 'オ':'o',
    'ァ':'la', 'ィ':'li', 'ゥ':'lu', 'ェ':'le', 'ォ':'lo',
    'ン':'n',  'ー':'-',  '・':'.', '、':','

  };
  var reg_tu  = /[っッ]([bcdfghijklmnopqrstuvwyz])/gm;
  var reg_xtu = /っ|ッ/gm;

  return function ( str ) {
    var pnt = 0;
    var max = str.length;
    var s, r;
    var txt = '';
    
    while( pnt <= max ) {
      if( r = roman[ str.substring( pnt, pnt + 3 ) ] ) {
        txt += r;
        pnt += 3;
      } else if( r = roman[ str.substring( pnt, pnt + 2 ) ] ) {
        txt += r;
        pnt += 2;
      } else {
        txt += ( r = roman[ s = str.substring( pnt, pnt + 1 ) ] ) ? r: s;
        pnt += 1;
      }
    }
    txt = txt.replace( reg_tu, '$1$1' );
    txt = txt.replace( reg_xtu, 'xtu' );
    return txt;
  };
})();