すべてがカナ(かな)になる:更新

以前リリースした、すべてがカナ(かな)になるですが、ボタンを作ったついでに、少々javascriptを修正したので、それについてのエントリーです。

修正した理由は、「すべてがカナになる」と「すべてがかなになる」を一つのページ内で共存させるための修正と、今後つける予定のリセット(元に戻す)ボタンのためです。では、その詳細を。

subetegakananinaru.js ver1.1

もとのsubetegakananinaru.jsのソースは以前のエントリーを見てもらうとして、今回はこのように修正しました。

var changeKANA = changeKANAfunc();
function changeKANAfunc(type){
 // 変換対象
 var body_html = "";
 // XMLHttp通信
 var http = (function(){
  var request_type;
  var browser = navigator.appName;
  if(browser == "Microsoft Internet Explorer"){
   request_type = new ActiveXObject("Microsoft.XMLHTTP");
  }else{
   request_type = new XMLHttpRequest();
  }
   return request_type;
 })();

 // changeKANA関数
 return function(type){

  // bodyタグ内のhtmlタグ取得
  if(body_html == ""){
    body_html = document.getElementsByTagName("body")[0].innerHTML;
  }
  // mecab api へリクエスト設定
  http.open("POST","/labs/mecab/api_kana.php",true);
  // リクエストヘッダ指定
  http.setRequestHeader("content-type","application/x-www-form-urlencoded;charset=UTF-8");
  // mecab api からレスポンスがあった時の処理
  http.onreadystatechange = function(){
   if(http.readyState == 4){
     var xmlObj = http.responseXML;
     var kana = "";
     // 受け取ったxmlから結果を結合
     for(i=0;xmlObj.getElementsByTagName('result')[i];i++){
       kana += xmlObj.getElementsByTagName('result')[i].firstChild.data;
     }
     // bodyタグ内に反映
     document.getElementsByTagName("body")[0].innerHTML = kana;
   }
  };
  // mecab api へのリクエスト実行
  http.send("type="+type+"&str=" + encodeURIComponent(body_html));
 };
};
文字列変換対象の保持

まず、以前の設計だと、一度「カナ」に変換した後に「かな」に変えようとするときに、すべてカタカナになった文字列を、mecab apiに投げていたので、変換の精度が悪く、一部カナが残ったりしていました。

そこで、元の変換対象をずっと保持するように修正する必要がありました。しかし、グローバルな変数を追加するのはイヤだったので、クロージャを使ってみました。

元々はこう書いてました。

var changeKANA = function(type){
  ・・・
 };

changeKANA関数を定義して、それを呼び出していただけです。それをこう変えました。

var changeKANA = changeKANAfunc();
function changeKANAfunc(type){

 // 変換対象の文字列
 var body_html = "";

 ・・・

 // changeKANA関数
 return function(type){

 ・・・

  body_html = kana;
 };
};

まずchangeKANA関数は、changeKANAfunc関数の返り値としています。そして、changeKANAfunc関数の中で保持したい値(変換対象の文字列)を定義しています。

こうすることで、グローバルで定義せずにbody_htmlの値を保持することができます。

ボタン化完了。次はブログパーツ化?

これで、安定したカナ←→かな変換ができるようになったはずw

それにブログパーツ的にも出来そうですし。。。どうしていこうかなー・・・夢広がるなー。

							Tags: [javascript](/tag/javascript), [mecab](/tag/mecab)

		« [centos5でcronエラー:「Missing Dependency」が出てた](/415/centos_missing_dependency_erro)

		[ライフログサービス:オラグーンのPCプレビュー更新](/438/oragoon_pc_preview_update) »

	[画像未復旧: similar.png](http://blog.playispeace.com/img/similar.png) 関連ありそうなエントリー