1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

HTMLタグを超えてキーワードをハイライトするアルゴリズム

Posted at

はじめに

HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを考えました。
:cherry_blossom:
よくあるのはHTMLタグの内側に限定してキーワードをハイライトさせる方法ですが、HTMLタグを超えてキーワードをハイライトさせるには少し工夫が必要です。:thinking:

アルゴリズム

簡単な例とともにアルゴリズムを示します。

HTML
<p>
	<span>今日は</span><span>晴れ。</span>
</p>
<p>明日は?</p>

HTMLタグを超えてキーワード「今日は晴」をハイライトさせたいとします。

ノードの木構造から深さ優先探索でテキストノードの配列pを得ます。

JavaScript
var p = [{text: '今日は', node: C},
         {text: '晴れ。', node: D},
         {text: '明日は?', node: E}];

配列pからプロパティtextを取り出して結合した文字列qを得ます。

JavaScript
var q = '今日は晴れ。明日は?'

文字列qのなかでキーワードが出現するハイライト位置を調べます。

キーワードが「今日は晴」ですので、文字列qの位置0から4文字がハイライト位置です。1

配列pの値を順番に調べることでハイライト位置をノード上の位置rに変換できます。

JavaScript
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)を使用していたのですが、望んでいないキーワードもハイライトされるという悩みがありました。

今回のプログラムは、ハイライトするキーワードを自分で選択できるように改善しました。:heart_eyes:

さいごに

HTMLタグを超えてウェブページのキーワードをハイライトさせるアルゴリズムを解説し、プログラムを公開しました。

このプログラムが多くの方に使われたら嬉しいです。:airplane:

  1. 実際にはキーワードが出現する複数のハイライト位置を得ます。

  2. Chrome拡張機能からブックマークレット(JavaScript)を呼び出す形です。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?