2005/06/18(土) [n年前の日記]
#4 [prog][mozilla] JSActionsで文字変換できないものかと試行錯誤中
上手くいきません。うーん。…とりあえず作ってたものをメモ代わりに載せとくか。
やってることは、
JSActions のバージョンは、2.1.0。文字コードの設定は、Shift_JIS。
やってることは、
- 半角カナ→全角カナに変換
- 全角英数文字を半角英数文字に変換
- 特定の半角記号を全角記号に変換
- 改行コードやタブをスペースに変換
- 行頭・行末のスペースを削除。(trim処理)
JSActions のバージョンは、2.1.0。文字コードの設定は、Shift_JIS。
◎ vbs版変換スクリプト :
動いてるけど、クリップボードからの取得に時々失敗する…。
' クリップボード内の文字列を文字変換してクリップボードへ送り直す ' Last updated: <2005/06/19 02:32:26 +0900> Option Explicit WScript.Sleep(500) with CreateObject("InternetExplorer.Application") .Navigate("about:blank") Do until .Busy = False Or .ReadyState = 4 WScript.Sleep 50 Loop With .Document.ParentWindow.ClipboardData Dim stext stext = .getData("text") If IsNull(stext) = False Then stext = GetOperatedText(stext) .SetData "text",stext Else stext = "クリップボード内のデータが不正です。" End If WScript.Sleep(150) WScript.Echo stext End With .Quit End With ' 文字変換 subroutine Function UserTextConvert(utext,dicsrc,dicdist) Dim c, moji, i, index c = "" For i = 1 To Len(utext) moji = Mid(utext,i,1) index = inStr(dicsrc, moji) If index > 0 Then moji = Mid(dicdist,index,1) c = c & moji Next UserTextConvert = c End Function ' 改行等削除、半角/全角変換 Function GetOperatedText(t) Dim bobj Dim t0,t1,t2,t3,t4,t5,t6,t7,t8 Dim d1a, d1b, src, temp, temp2, newsrc,result Set bobj = CreateObject("basp21") ' t1 = bobj.Kconv(t,1) t1 = t t0 = Replace(t1,vbCrLf, " ") t1 = Replace(t0,vbCr, " ") t0 = Replace(t1,vbLf, " ") t1 = Replace(t0," ", " ") t0 = Replace(t1," ", " ") t1 = Replace(t0,"−", "-") t0 = Trim(t1) src = bobj.HAN2ZEN(t0) bobj.Translate "tr/0-9A-Za-z()/0-9A-Za-z()/k",src,newsrc Set bobj = Nothing d1a = "!""#$%&',.+?/:;" d1b = "!”#$%&’,.+?/:;" result = UserTextConvert(newsrc,d1a,d1b) GetOperatedText = result End Function
◎ JSActions側のvbs変換スクリプト呼び出し :
変換自体はvbs側で行ってる。クリップボードに選択範囲をコピーして、該当vbsスクリプトを呼び出してるだけ。
// selection copy -> zenkaku hankaku convert -> copy // zenkaku hankaku convert ... convhzclip.vbs used. jsa_conv_selection_copy(); function jsa_conv_selection_copy() { var wscriptpath = "C:\\WINDOWS\\system32\\wscript.exe"; var convpath = "C:\\home\\bin\\convhzclip.vbs"; if ( _jsaCScript.context.isTextSelected ) { var str = window.getSelection().toString(); // _jsaCScript.dump("Org text : " + str ); _jsaCScript.setClipBoardString( str ); convpath = _jsaCScript.convertCharCodeTo( convpath, "shift_jis" ); _jsaCScript.exec(wscriptpath, convpath); // var cstr = ""; // for ( var i = 0; i<5000; i++ ) { // cstr = _jsaCScript.getClipBoardString; // if ( str == cstr ) break; // } // // if ( str == cstr ) { // _jsaCScript.popAutoHideAlert( "Clipboard : " + cstr ); // convpath = _jsaCScript.convertCharCodeTo( convpath, "shift_jis" ); // _jsaCScript.exec(wscriptpath, convpath); // } else { // _jsaCScript.popAutoHideAlert( "Error : Can't set clipboard." ); // } } }コメントアウト部分は、クリップボードに正しくコピーされたかどうかチェックするようにしてみた部分。でも、絶対、「ちゃんとコピーされてない」と言われる。うーん。
◎ JSActions側だけで変換処理ができないか模索した版(動かないけど) :
JavaScriptだけで変換できればそれが一番いいのだけど。どうも全角文字の切り出し(?)・比較・置換が失敗してるみたいで…。いわゆる、Webページに付加するJavaScriptのサンプル等からコピペしてやってみたのだけど。何が違うのだろう…。
// selection copy -> zenkaku hankaku convert -> copy jsa_hzconv_selection_copy(); function jsa_hzconv_selection_copy() { if ( _jsaCScript.context.isTextSelected ) { var str = window.getSelection().toString(); var rstr = get_operated_text(str); _jsaCScript.setClipBoardString(rstr); _jsaCScript.popAutoHideAlert(rstr); } } function get_operated_text(s) { var ss; ss = del_spc(s); s = ss.replace(/^\s+|\s+$/g,""); ss = kana_h2z(s); s = conv_z2h(ss); return s; } function conv_z2h(s) { var src = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz− "; var dst = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz- "; return convstr_str(s,src,dst); } function del_spc(s) { s = s.replace(/[\t\r\n]+/g," "); s = s.replace(/ /g," "); return s; } function convstr(ostr,src,dst) { var str = ostr; if ( src.length != dst.length ) { _jsaCScript.dump('Error: src.length != dst.length'); str = 'error'; } else { for(var i = 0; i < src.length; i++){ var srcc = src[i].toString(); var dstc = dst[i].toString(); var srccm = '/'+srcc+'/g'; // _jsaCScript.dump('['+srcc+'] -> ['+dstc+']['+srccm+']') str = str.replace(srccm, dstc); } } _jsaCScript.dump('['+ostr+']['+str+']'); return str; } function convstr_str(ostr,src,dst) { var str = ostr; var mode = 0; var sn = src.length; var dn = dst.length; _jsaCScript.dump('sn='+sn+' dn='+dn); if ( sn == dn ) { mode = 0; } else { if ( sn == (dn * 2) ) { mode = 1; // z2h } else { if ( (sn * 2) == dn ) { mode = 2; // h2z } else { _jsaCScript.dump('Error: src.length != dst.length'); return ostr; } } } _jsaCScript.dump('mode='+mode); switch(mode) { case 1: // z2h for ( var i = 0; i < dn; i++ ) { var srcc = src.substr(i*2,2); var dstc = dst.substr(i,1); _jsaCScript.dump("["+srcc+"] -> ["+dstc+"]"); str = str.replace(srcc, dstc); } break; case 2: // h2z for ( var i = 0; i < sn; i++ ) { var srcc = src.substr(i,1); var dstc = dst.substr(i*2,2); _jsaCScript.dump("["+srcc+"] -> ["+dstc+"]"); str = str.replace(srcc, dstc); } break; default: for ( var i = 0; i < sn; i++ ) { var srcc = src.substr(i,1); var dstc = dst.substr(i,1); _jsaCScript.dump("["+srcc+"] -> ["+dstc+"]"); str = str.replace(srcc, dstc); } break; } _jsaCScript.dump('['+ostr+']['+str+']'); return str; } function matchNum(text, sText) { var n = 0; for (i=0; i<text.length;i++ ) { i = text.indexOf(sText, i); if (i == -1) { break; } else { n++; } } _jsaCScript.dump('['+text+']'+'['+sText+']'+'match='+n); return n; } // hankaku kana -> zenkaku kana // http://www5e.biglobe.ne.jp/~access_r/hp/javascript/js_111.html function kana_h2z(str){ var kana1 = new Array( 'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ', 'ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ', 'パ','ピ','プ','ペ','ポ', 'ヲ', 'ァ','ィ','ゥ','ェ','ォ', 'ャ','ュ','ョ', 'ッ','ー', 'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ', 'サ','シ','ス','セ', 'ソ', 'タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ', 'ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ', 'ヤ','ユ','ヨ', 'ラ','リ','ル','レ','ロ', 'ワ','ン'); var kana2 = new Array( 'ガ','ギ','グ','ゲ','ゴ','ザ','ジ','ズ','ゼ','ゾ', 'ダ','ヂ','ヅ','デ','ド','バ','ビ','ブ','ベ','ボ', 'パ','ピ','プ','ペ','ポ', 'ヲ', 'ァ','ィ','ゥ','ェ','ォ', 'ャ','ュ','ョ', 'ッ','ー', 'ア','イ','ウ','エ','オ','カ','キ','ク','ケ','コ', 'サ','シ','ス','セ', 'ソ\', 'タ','チ','ツ','テ','ト','ナ','ニ','ヌ','ネ','ノ', 'ハ','ヒ','フ','ヘ','ホ','マ','ミ','ム','メ','モ', 'ヤ','ユ','ヨ', 'ラ','リ','ル','レ','ロ', 'ワ','ン'); return convstr(str,kana1,kana2); }
[ ツッコむ ]
以上です。