はじめに
HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを考えました。
よくあるのはHTMLタグの内側に限定してキーワードをハイライトさせる方法ですが、HTMLタグを超えてキーワードをハイライトさせるには少し工夫が必要です。
アルゴリズム
簡単な例とともにアルゴリズムを示します。
<p>
<span>今日は</span><span>晴れ。</span>
</p>
<p>明日は?</p>
HTMLタグを超えてキーワード「今日は晴」をハイライトさせたいとします。
ノードの木構造から深さ優先探索でテキストノードの配列p
を得ます。
var p = [{text: '今日は', node: C},
{text: '晴れ。', node: D},
{text: '明日は?', node: E}];
配列p
からプロパティtext
を取り出して結合した文字列q
を得ます。
var q = '今日は晴れ。明日は?'
文字列q
のなかでキーワードが出現するハイライト位置を調べます。
キーワードが「今日は晴」ですので、文字列q
の位置0から4文字がハイライト位置です。1
配列p
の値を順番に調べることでハイライト位置をノード上の位置r
に変換できます。
var r = [{node: C, start: 0, end: 3},
{node: D, start: 0, end: 1}]
大切な点は、文字列q
とテキストノード上の位置が相互変換できることです。
ブックマークレットと拡張機能
作ったものはこちらです。
https://raw.githubusercontent.com/querykuma/HighlightSelection/main/highlight_selection_bookmark.js
https://github.com/querykuma/HighlightSelection
上のブックマークレットとしても下のChrome拡張機能2としても使えます。
(参考)autoHighlighter
自動でキーワード強調表示させるブックマークレット(autoHighlighter)を使用していたのですが、望んでいないキーワードもハイライトされるという悩みがありました。
今回のプログラムは、ハイライトするキーワードを自分で選択できるように改善しました。
さいごに
HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを解説し、プログラムを公開しました。
このプログラムが多くの方に使われたら嬉しいです。