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);
}
[ ツッコむ ]
以上です。