右クリックで「数値参照デコード」

観測気球

収集物の記録書庫 a data archive of collection -- collectible toys

[要旨] ないと困る場面が出てきたので、作ってみました。
[キーワード] javascript,数値参照

« メモ: ランキング その2 | トップページ | Twitter クライアント chirrup 1.90版 ― はてなフォトライフ対応、検索機能追加、などなど »

2008.02.29

右クリックで「数値参照デコード」

ないと困る場面が出てきたので、作ってみました。やっつけで作ったので、ソースはかなり適当ですが、いちおう動作確認済みです。IE7 と IE6 で、そのまま動くと思います。他のブラウザで動かしたい人は、適当に修正して使ってください。

「ないと困る場面」の例
『右クリックで「数値参照デコード」』を使おうとしているところ

以下、ソースコードです。(Version 1.0 のバグを発見。修正した版 Version 1.1 に差し替えました)

<meta http-equiv="Content-type" content="text/html; charset=UTF-8">
<meta http-equiv="Content-Script-Type" content="text/javascript">
<script type="text/javascript" language="JavaScript">

// 「右クリックで 数値参照デコード」
//     written by H.Tsujimura (tsupo at na.rim.or.jp)
//
//     Version 1.1   29 Feb 2008  最後の2文字欠けることがあるバグを修正
//     Version 1.0   28 Feb 2008  最初の版

function setSelection(v) {
    if ( str )
        obj.document.selection.createRange().text = v;
}


function hexNum(c) {
    var n = 0;

    if ( (c >= '0') && (c <= '9') )
        return ( Number(c) );

    if ( (c >= 'A') && (c <= 'F') )
        n = Number(c - 'A') + 10;
    else if ( (c >= 'a') && (c <= 'f') )
        n = Number(c - 'a') + 10;

    return ( n );
}

function decodeNumber(s) {
    var t     = "";
    var len   = s.length;
    var n     = 0;
    var mode  = false;
    var inner = false;

    if ( len <= 3 )
        return ( s );

    for ( i = 0; i < len - 2; i++ ) {
        var c1 = s.charAt(i);
        if ( !inner ) {
            var c2 = s.charAt(i + 1);
            var c3 = s.charAt(i + 2);
            if ( (c1 == '&') && (c2 == '#') ) {
                if ( c3 == 'x' ) {
                    mode = true;
                    i++;
                }
                i++;
                inner = true;
            }

            if ( !inner )
                t += c1;

            continue;
        }

        if ( c1 == ';' ) {
            inner = false;
            mode  = false;
            t += String.fromCharCode(n);
            n = 0;
            continue;
        }

        if ( !mode )
            n = n * 10 + Number(c1);    // 10進数
        else
            n = n * 16 + hexNum(c1);    // 16進数
    }

    if ( i <= len - 2 ) {
        for ( ; i < len; i++ )
            t += s.charAt(i);
    }

    return ( t );
}


obj = external.menuArguments;   // 右クリック時の引数オブジェクト
str = obj.document.selection.createRange().text;  // 選択されている文字列

s = decodeNumber(str);
setSelection(s);
</script>

追記

textarea に対して上記スクリプトを適用したい場合は、contexts の値を 63 (0x0000003f) でレジストリに登録してください。

投稿者: tsupo 2008.02.29 午前 12:35 | 固定リンク | このエントリーをはてなブックマークに追加 | このエントリを del.icio.us に登録 このエントリの del.icio.us での登録状況 | このエントリを Buzzurl に追加このエントリの Buzzurl での登録状況 | このエントリをlivedoorクリップに登録 このエントリのlivedoorクリップでの登録状況 このエントリをlivedoorクリップに登録している人の数 | 酢鶏巡回中

楽天市場


品揃え豊富で安い!NTT-X Store


アマゾンわくわく探検隊

トラックバック

この記事のトラックバックURL:

この記事へのトラックバック一覧です: 右クリックで「数値参照デコード」:

コメント

ワード

ニッセン

fujisan.co.jp

楽天市場