mieki256's diary



2005/06/18() [n年前の日記]

#4 [prog][mozilla] JSActionsで文字変換できないものかと試行錯誤中

上手くいきません。うーん。…とりあえず作ってたものをメモ代わりに載せとくか。

やってることは、 ぐらい。

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);
}

以上です。

過去ログ表示

Prev - 2005/06 - Next
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30

カテゴリで表示

検索機能は Namazu for hns で提供されています。(詳細指定/ヘルプ


注意: 現在使用の日記自動生成システムは Version 2.19.6 です。
公開されている日記自動生成システムは Version 2.19.5 です。

Powered by hns-2.19.6, HyperNikkiSystem Project