わさっきhb

大学(教育研究)とか ,親馬鹿とか,和歌山とか,とか,とか.

KWIC表示のbookmarklet

使い方

Firefoxでのみ動作確認をしています.

  1. 上のリンクのうち,利用したいものについて,右クリックをします.「このリンクをブックマーク(L)」を選び,ブックマークに入れます.
  2. メニューで,「ブックマーク(B)」のあと,今ブックマークしたものを右クリックし,「プロパティ(I)」を選びます.URLの欄の先頭,「http://takehikom?」を取り除き,保存のボタンを押します.
  3. 検索したいページを開き,マウスで領域指定をします(Ctrl+Aで,すべてを選択してもかまいません).
  4. メニューのブックマークから,先ほどブックマークしたものを選択します.
  5. 別のウィンドウまたはタブが作られ,検索結果がKWIC (Keyword In Context)の形式で,すなわち検索文字を中心としてその前後(文脈)が分かるように,表示されます.

“「。」で検索”と“「.」で検索”は,文末および文頭*1の表現を見るためのものです.“「順」で検索”の使用例は,別エントリとします.

使い方2

上記の1と2を,次の手順に変更してもかまいません.

  1. https://gist.github.com/raw/1304711/8e0f1922a46fa44ab8a72fc74e42e6059d480608/kwic_bookmarklet.htmlにアクセスし,名前をつけてページを保存します.
  2. 保存したファイルを開くと,3つのリンクが表示されます.利用したいものについて,右クリックをします.「このリンクをブックマーク(L)」を選び,ブックマークに入れます.

開発の流れ

bookmarklet作成に先立って,動作確認用のHTMLファイルを作り,その中にボタンを押せば以下の関数を呼び出すよう,HTMLとJavaScriptで記述しました.

function button_kwic() {
  (function(){
    var t = '。', L = t.length, D = '・';
    var w = window, s = w.getSelection().toString(), d = w.open().document;
    var p, q, m = 10;
    for (q = m; q != 0; q--)
      s = D + s + D;
    d.writeln('<pre>');
    while ((p = s.indexOf(t, q)) != -1) {
      var a = s.substr(p - m, L + 2 * m);
      a = a.replace(/[\u0000-\u001F|\u007F]/g, D);
      a = a.replace(/[\u0020-\u007E]/g, '$&_');
      d.writeln(a);
      q = p + 1;
    }
    d.writeln('</pre>');
    d.close();
  })();
}

注意点は:

  • bookmarkletを前提とするので,変数名は1文字にして,この段階からバイト数削減を心がけました.
  • tは検索文字列,Dは代用文字,mは前後の文字数です.tは2文字以上でも問題ありませんが,行をまたいだものは見逃します.
  • 「w = window」について,こうしないコードよりも字数が少なくできます.
  • 例えば「.」を検索して,選択テキストの先頭からm文字に行かないところで発見すると,substrでトラブルが起こりそうなので,あらかじめ,先頭と末尾にDをm回分足しておきました*2
  • forやwhileで「!=」を用いているのは,不等号(「<」「>」)だと,URLエスケープで文字数が増えることを危惧したためです.ただ,ブックマークしたURLを見ると,preタグの前後の不等号シンボルはエンコードされていないようで「!」が「%21」になっちゃってますね….
  • \uを使った正規表現は,正規表現で、渡された文字列に非ASCII文字があるか?のチェック(JavaScript編): プログラマーの雑記帳から学びました.16進4桁はどうも必須で,2桁に減らしたら,パターンマッチに失敗しました.
  • 2つのreplaceの前者は,制御文字*3を代用文字に置き換えます.削除ではなく置換としたおかげで,「.」「。」の検索・表示において,行または段落の終わりの文であるか否かが容易に判断できます.後者は,ASCII文字の直後に「_」を付け,「ASCII文字2バイトで日本語1文字」の表示に対応させています.

bookmarkletの書き方やコード例は,http://www.teria.com/~koseki/memo/bookmarklets/tips.htmlbayashi.jpから,はてなでの公開の方法は,http://d.hatena.ne.jp/moto_maka/20110519/1305746160から,それぞれ学びました.

適用例

昨日付エントリの本文を領域指定し,「.」で検索をすると,結果は以下のようになりました.

づき,目を通しました.・・・・日数教の雑誌
学論究」がありました.いずれも1_冊1_冊は薄
1_冊は薄手の冊子です.棚にあった「数学教育
,研究論文1_件でした.研究論文はぱらぱらと
まさに文系の論文です.「再々々受理日」の記
,びっくりしましたが.・・・・それで宮下論
付論文になるようです.・・・・内容は,現在
たといったところです.「かけ算の順序」は見
は見かけませんでした.・・・・数として,自
もたない数〉とのこと.・・・・少し抜き書き
き書きをしました*_1_.まず〈数は量の抽象〉
いるような出だしです.・・・・結論に近いと
めています(p_._1_0_.原文は箇条書きではな
書きではなく地の文).・・・・ _ _ _ _「数
」とも記されています.・・・・参考文献は全
下氏によるものでした.うち3_つは同誌(算数
8_〜2_0_0_9_年のもの.残り2_つはm_-_a_c_._
となったのでしょうか.・・・・宮下教授や,
を表に出していません.・・・・まあ個人的に
度に思うことにします.・・中島著書・・・・
あるのは,1_万円前後.ちょっと手が出ません
ちょっと手が出ません.・・・・著者名は,乗
中でよく目にしました.[_今井1_9_9_4_]_では
し元ネタとしています.1_6_日で読んだセクシ
,知ることができます.・・・・それで本の中
)_で整理されています.・・・・『数学教育学
7_9_に記載があります.・・・・子どもに回答
9_5_0_0_と思われます.・・・・内容としては
強する記述があります.アレイ(_A_r_r_a_y_)_
8_1_に書かれています.アレイ図そしてデカル
新たな視点を得ました.・・・・ページを戻り
て,言及がありました.・・・・ _ _ _ _これ
考え方が入っています.・・・・もう一つ,様
とのこと(_p_._7_5_)_.「ことばの式」そのも
い知ることができます.・・・・・・・・・・

後半の文章があまり好きでないなあと思っていたのですが,なんと,「ます.」が7文も連続していました.

*1:最初の文の文頭は,表示されませんが.

*2:Rubyなら,ループを使わずにs = D * m + s + D * mと書きたいところですが.

*3:Cで言うと,iscntrlが真になる文字です.