﻿/* ヘボン式ローマ字変換
  *
  * version 0.01
  *
  * ヘボン式ローマ字については
  http://www.seikatubunka.metro.tokyo.jp/hebon/
  を参照
  */

function Romanize() {
  this.hiraganaMap = {
    "あ": "A", "い": "I", "う": "U", "え": "E", "お": "O",
    "か": "KA", "き": "KI", "く": "KU", "け": "KE", "こ": "KO",
    "さ": "SA", "し": "SHI", "す": "SU", "せ": "SE", "そ": "SO",
    "た": "TA", "ち": "CHI", "つ": "TSU", "て": "TE", "と": "TO",
    "な": "NA", "に": "NI", "ぬ": "NU", "ね": "NE", "の": "NO",
    "は": "HA", "ひ": "HI", "ふ": "FU", "へ": "HE", "ほ": "HO",
    "ま": "MA", "み": "MI", "む": "MU", "め": "ME", "も": "MO",
    "や": "YA", "ゆ": "YU", "よ": "YO",
    "ら": "RA", "り": "RI", "る": "RU", "れ": "RE", "ろ": "RO",
    "わ": "WA", "ゐ": "I", "ゑ": "E", "を": "O", "ん": "N",
    "ぁ": "A", "ぃ": "I", "ぅ": "U", "ぇ": "E", "ぉ": "O",
    "が": "GA", "ぎ": "GI", "ぐ": "GU", "げ": "GE", "ご": "GO",
    "ざ": "ZA", "じ": "JI", "ず": "ZU", "ぜ": "ZE", "ぞ": "ZO",
    "だ": "DA", "ぢ": "JI", "づ": "ZU",
    "で": "DE", "ど": "DO",
    "ば": "BA", "び": "BI", "ぶ": "BU", "べ": "BE", "ぼ": "BO",
    "ぱ": "PA", "ぴ": "PI", "ぷ": "PU", "ぺ": "PE", "ぽ": "PO",
    "きゃ": "KYA", "きゅ": "KYU", "きょ": "KYO",
    "しゃ": "SHA", "しゅ": "SHU", "しょ": "SHO",
    "ちゃ": "CHA", "ちゅ": "CHU", "ちょ": "CHO", "ちぇ": "CHE",
    "にゃ": "NYA", "にゅ": "NYU", "にょ": "NYO",
    "ひゃ": "HYA", "ひゅ": "HYU", "ひょ": "HYO",
    "みゃ": "MYA", "みゅ": "MYU", "みょ": "MYO",
    "りゃ": "RYA", "りゅ": "RYU", "りょ": "RYO",
    "ぎゃ": "GYA", "ぎゅ": "GYU", "ぎょ": "GYO",
    "じゃ": "JA", "じゅ": "JU", "じょ": "JO",
    "びゃ": "BYA", "びゅ": "BYU", "びょ": "BYO",
    "ぴゃ": "PYA", "ぴゅ": "PYU", "ぴょ": "PYO"
    };
  this.katakanaMap = {
  "ア": "A", "イ": "I", "ウ": "U", "エ": "E", "オ": "O",
  "カ": "KA", "キ": "KI", "ク": "KU", "ケ": "KE", "コ": "KO",
  "サ": "SA", "シ": "SHI", "ス": "SU", "セ": "SE", "ソ": "SO",
  "タ": "TA", "チ": "CHI", "ツ": "TSU", "テ": "TE", "ト": "TO",
  "ナ": "NA", "ニ": "NI", "ヌ": "NU", "ネ": "NE", "ノ": "NO",
  "ハ": "HA", "ヒ": "HI", "フ": "FU", "ヘ": "HE", "ホ": "HO",
  "マ": "MA", "ミ": "MI", "ム": "MU", "メ": "ME", "モ": "MO",
  "ヤ": "YA", "ユ": "YU", "ヨ": "YO",
  "ラ": "RA", "リ": "RI", "ル": "RU", "レ": "RE", "ロ": "RO",
  "ワ": "WA", "ヰ": "I", "ヱ": "E", "ヲ": "O", "ン": "N",
  "ァ": "A", "ィ": "I", "ゥ": "U", "ェ": "E", "ォ": "O",
  "ガ": "GA", "ギ": "GI", "グ": "GU", "ゲ": "GE", "ゴ": "GO",
  "ザ": "ZA", "ジ": "JI", "ズ": "ZU", "ゼ": "ZE", "ゾ": "ZO",
  "ダ": "DA", "ヂ": "JI", "ヅ": "ZU", "デ": "DE", "ド": "DO",
  "バ": "BA", "ビ": "BI", "ブ": "BU", "ベ": "BE", "ボ": "BO",
  "パ": "PA", "ピ": "PI", "プ": "PU", "ペ": "PE", "ポ": "PO",
  "キャ": "KYA", "キュ": "KYU", "キョ": "KYO",
  "シャ": "SHA", "シュ": "SHU", "ショ": "SHO",
  "チャ": "CHA", "チュ": "CHU", "チョ": "CHO", "チェ": "CHE",
  "ニャ": "NYA", "ニュ": "NYU", "ニョ": "NYO",
  "ヒャ": "HYA", "ヒュ": "HYU", "ヒョ": "HYO",
  "ミャ": "MYA", "ミュ": "MYU", "ミョ": "MYO",
  "リャ": "RYA", "リュ": "RYU", "リョ": "RYO",
  "ギャ": "GYA", "ギュ": "GYU", "ギョ": "GYO",
  "ジャ": "JA", "ジュ": "JU", "ジョ": "JO",
  "ビャ": "BYA", "ビュ": "BYU", "ビョ": "BYO",
  "ピャ": "PYA", "ピュ": "PYU", "ピョ": "PYO"
  };
}

Romanize.prototype.option = function() {
  if (arguments[0]) {
    for (var i = 0; i < arguments.length; i++) {
      if (arguments[i] == "simple") this.analyzer = true;
      if (arguments[i] == "OH") this.opt = true;
      if (arguments[i] == "nonSpace") this.nonSpace = true;
    }
  }
}
Romanize.prototype.parse = function(str) {
  var s = new GamMo();
  return s.parse(str).join(" ");
}

Romanize.prototype.conv = function(str) {
  var result = "";
  if (this.analyzer) str = this.parse(str);
  if (this.nonSpace) str = str.replace(/\s/g, "");
  str = str.replace(/\s([ゃャゅュょョ])/g, "$1");
  for (var i = 0; i < str.length; i++) {
    var char = str.substr(i, 2);
    if (char.match(/^[ゃャゅュょョ]/)) continue;
    char = char.match(/ちぇ|チェ/) || char.match(/.[ゃャゅュょョ]/) || char.charAt(0);
    result += this.hiraganaMap[char] || this.katakanaMap[char] || char;
    
  }
  /* 撥音 ヘボン式ではB M P の前に N の代わりに M をおく */
  result = result.replace(/N([BMP])/g, "M$1");
  
  // 促音 子音を重ねて示す
     /* チ（CHI）、チャ（CHA）、チュ（CHU）、チョ（CHO）音に限り、
         その前に T を加える。
            （例）発地（ほっち） HOTCHI 八丁（はっちょう）HATCHO */
  result = result.replace(/[っッ](CHI|CHA|CHU|CHO)/g, "T$1");
  result = result.replace(/[っッ]\s?(.)/g, "$1$1");

  // 長音 ヘボン式では長音を表記しない
  result = result.replace(/[-ー]+/g, "");
//  result = result.replace(/([AIUE]){2}/g, "$1");

  // オウ又はオオの長音が含まれる場合、
  // 「 O 」 か 「 OH 」 のいずれかの表記を選択することができる
  if (this.opt) {
    result = result.replace(/(O)[OU]/g, "$1H");
  } else {
    result = result.replace(/(O)[OU]/g, "$1");
  } 
  return result.toLowerCase();
}
