質問: お世話になっております。回答ありがとうございます。 以下のようなマクロは可能でしょうか? EmEditor Professionalでひらがな文をAPIサービスで通常の漢字文章に戻すマクロです。 候補としては ●Yahoo!かな漢字変換API ●mecab-skkserv 変換精度的には遙かにヤフーのほうが良かったのでマクロとしては以下のようなものがいいかと思いました。 1,ひらがな文章を80文字以内の句読点でカンマなどの区切りを入れて分割する。 2,Yahoo!かな漢字変換APIに80文字以内の文章でリクエスト→ 3,Yahoo!かな漢字変換APIから変換したフィールドバックを受け取って蓄積する→これを順に繰り返す 4,最後までリクエストが終わったら、文章を整形して別名で保存して終了 80文字以内、1日5万回まで可能と書かれてましたので2秒間隔なら24時間連続でも回数は超えないと思います。 変換サンプルサイト もし技術的にYahoo!かな漢字変換APIが難がある場合はmecab-skkservでも実現できたら幸いです。 元のひらがなリクエスト例文 Yahoo!かな漢字変換API 「それに、たいしてまけるひとは、おおいので、まけのげんいんをぶんせきすることは、いみが、ある。 ひとつひとつは、つまらないしっぱいでも、あつめるとほうそくせいが、みえてくる。 にほんけいざいは、「ちょうきていたい」に、はいったといわれ、そのげんいんは、「せいさんせいがひくいからだ」とか「いのべーしょんがたりないからだ」といわれる。」 変換済み 「それに、対して負ける人は、多いので、負けの原因を分析することは、意味が、ある 一つ一つは、つまらない失敗でも、集めると法則性が、見えてくる。 日本経済は、「長期停滞」に、入ったといわれ、その原因は、「生産性が低いからだ」とか「イノベーションが足りないからだ」といわれる。」 引用 利用制限 かな漢字変換Web APIは、24時間以内で1つのアプリケーションIDにつき50000件のリクエストが上限となっています。また、1リクエストの最大サイズを10KBに制限しています。詳しくは「利用制限」をご参照ください。 同様の要望はありました。 よろしくお願いいたします。 ありがとうございます。変換テスト用サンプル分です。
回答: 試しに作ってみましたが API出力の変換候補に対する処理は行っていません。一行単位で xmlを保存するだけです。 # エディタのマクロでやるメリットはあまりないと思います。 * マクロ利用法 ・アプリケーションID取得してソースリスト先頭の Appid に設定する 例: [Yahoo! ID連携 v1] アプリケーションの種類 クライアントサイド(Yahoo! ID連携 v1), 利用者情報 個人, アプリケーション名 <適当>, サイトURL <無記入>, アプリケーションの説明 <無記入>, ガイドライン <同意する> ・ 目的のドキュメントを開いてマクロを実行する * 仕様、制限 ・Yahoo の仕様により一行の最大文字数は80文字(ひらがな換算時)まで ・出力はドキュメントのディレクトリにファイル名 Yconv_{行番号}.xml として行単位にレスポンスを保存する (空行は読み飛ばす) 入出力は UTF-8 ``` var Appid = ""; // *** Yahoo APPID *** var XmlName = "Yconv_"; // + 行番号 + ".xml" // デベロッパーネットワークトップ > テキスト解析 > かな漢字変換 // https://developer.yahoo.co.jp/webapi/jlp/jim/v1/conversion.html function yahooApi( str ){ if( Appid == "" ) return ""; var rval = ""; try { var uri = "https://jlp.yahooapis.jp/JIMService/V1/conversion"; uri += "?appid=" + Appid; uri += "&sentence=" + encodeURIComponent( str ); // パーセントエンコード var xhr = new ActiveXObject("Msxml2.ServerXMLHTTP"); xhr.open( "GET", uri, true ); xhr.setRequestHeader( "User-Agent", "Yahoo AppID " + Appid ); // xhr.setProxy( 2, "127.0.0.1:8080", "" ); xhr.send(); for( var rty = 1000; xhr.readyState != 4 && rty > 0; --rty ){ xhr.waitForResponse(100); } if( xhr.readyState == 4 ){ if( xhr.status == 200 ){ rval = xhr.responseText; } } else { xhr.abort(); alert( "Error abort" ); } } catch (e) { alert( "Error( " + e.message + " )" ); } return rval; } // fprint "%0{n}d", val; # int val >= 0 function fpn( val, n ) { var str = ""; if( n > 1 && val < 10 ) str += "0"; if( n > 2 && val < 100 ) str += "0"; if( n > 3 && val < 1000 ) str += "0"; if( n > 4 && val < 10000 ) str += "0"; if( n > 5 && val < 100000 ) str += "0"; if( n > 6 && val < 1000000 ) str += "0"; if( n > 7 && val < 10000000 ) str += "0"; if( n > 8 && val < 100000000 ) str += "0"; return str + val; } /////////////////////////////////////////////////////////////////////////////// // MAIN var fs = new ActiveXObject( "Scripting.FileSystemObject" ); var strPath = document.Path + "\\" + XmlName; var docReadOnly = document.ReadOnly; document.ReadOnly = true; document.selection.StartOfDocument(); var yPos = 1; while( yPos <= document.GetLines() ){ var str = document.GetLine( yPos ); str = str.replace( /^\s+|\s+$/g, "" ); if( str != "" ){ var yconv = yahooApi(str); Sleep( 300 ); if( yconv == "" ) break; // Error var fPath = strPath + fpn( yPos, 8 ) + ".xml"; var fh = fs.OpenTextFile( fPath, 2, true, -1 ); fh.Write( yconv ); fh.Close(); } document.selection.SetActivePoint( eePosLogical, 1, ++yPos ); // 実行状況が分かるようにカーソルを動かす。++yPos; だけでも良い。 } document.selection.StartOfDocument(); document.ReadOnly = docReadOnly; ```