テキストエリア内の特殊文字を実体参照に変換するブックマークレット

Posted by
ぴろり
Posted at
2011/12/03 19:31
Trackbacks
関連記事 (0)
Post Comment
コメントできます
Category
開発メモ カテゴリ

 SyntaxHighlighter を導入してからというもの、カラフルに表示されるソースコードにすっかり魅了されてしまい。過去に手抜きをしてコピペしたソースコード部分をせっせと修正しています(´・ω・`) その際、<& などの特殊文字を適切にエスケープする必要があります。こういった特殊文字を変換してくれるページなどもあるんですが、コピペが非常に面倒くさい。というわけで、その場で特殊文字のエスケープを行ってくれるブックマークレットを作ってみました。変換したい部分をマウスで範囲選択し、ブックマークレットをクリックするだけのお手軽仕様です。

このエントリーをはてなブックマークに追加  

 実のところ、テキストエリア内の選択文字列を簡単に実体参照化するブックマークレットで、既に同じ機能を持つブックマークレットが公開されています。変換動作そのものに不満はないのですが、ただ、使って見たところ、変換後にテキストエリアが無条件にトップにスクロールしてしまったり、変換した部分の選択状態が外れたり、と少し使いにくい点がありましたので、これらを改善したブックマークレットを作成しました。

ブックマークレットの解説

javascript:(function () {
    // エンティティ変換用の関数
    function r(s) {
        return s.replace (/([<>&"])/g, function (i,j) {
            return { '<':'&lt;', '>':'&gt;', '"':'&quot;', '&':'&amp;' }[j];
        });
    }

    var ta=document.activeElement,  // 現在アクティブな要素を取得する
        st=ta.scrollTop,            // 現在のスクロール位置を取得
        ss=ta.selectionStart,       // 選択領域の開始位置を取得
        se=ta.selectionEnd,         // 選択領域の終了位置を取得
        v=ta.value,                 // 要素内のテキスト全部を取得
        rv=r (v.slice (ss,se));     // 選択領域に含まれるテキストを r で変換する

    // 要素に変換済みのデータをセットする
    ta.value = v.slice(0, ss) + rv + v.slice(se);
    // 要素のスクロール位置を復元する
    ta.scrollTop = st;
    // 変換された部分に選択領域を設定する
    ta.setSelectionRange (ss, ss + rv.length);
})();

 基本的な実装はオリジナルと全く同じで、スクロール位置の復元と、変換された領域を選択状態に戻す処理を追加しました。
 ちなみに、このブックマークレットを使う前の作業手順はといえば;

  1. 元の記事中の変換したい部分を領域選択
  2. クリップボードにコピー
  3. ブラウザのタブを切り替えて
  4. 変換ツールのページにペースト
  5. 変換ボタンをクリック
  6. 変換された結果を選択
  7. クリップボードにコピー
  8. 元の記事の編集画面のタブに切り替えて
  9. 元の記事にペースト

 それが、ブックマークレットを導入することで;

  1. 元の記事中の変換したい部分を領域選択
  2. ブックマークレットをクリック

 という驚くべき効率化が実現しました!

おまけ

 先のブックマークレットを作っている際に、色々副産物ができたので公開しておきます。記事執筆には Mozilla Firefox を使っているので、Internet Exproler はおまけです。

このエントリーをはてなブックマークに追加  



関連記事/トラックバック

関連記事/トラックバックはまだありません

この記事にトラックバックを送るには?

コメントを投稿する

 
 (必須, 匿名可, 公開, トリップが使えます)
 (必須, 匿名可, 非公開, Gravatar に対応しています)
 (必須)
スパム コメント防止のため「投稿確認」欄に ランダムな数字 CAPTCHAについて を入力してから送信してください。お手数ですがご協力のほど宜しくお願いいたします。