Module: VivlioStarter::CLI::IndexCommands::TermPattern
- Defined in:
- lib/vivlio_starter/cli/index/term_pattern.rb
Overview
辞書エントリ → 照合用 Regexp
Constant Summary collapse
- ASCII_WORD_BEHIND =
辞書の綴りにある前後の
\bは、ASCII の語境界として読み替える。 日本語は語構成文字に数えないので、和語がくっついた形でも語を拾える。 '(?<![A-Za-z0-9_])'- ASCII_WORD_AHEAD =
'(?![A-Za-z0-9_])'
Class Method Summary collapse
-
.ascii_word_boundaries(body) ⇒ Object
前後の
\bを ASCII 限定の先読み・後読みへ置き換える。. - .for(entry) ⇒ Regexp
- .literal(entry) ⇒ Object
Class Method Details
.ascii_word_boundaries(body) ⇒ Object
前後の \b を ASCII 限定の先読み・後読みへ置き換える。
Ruby の \b は日本語を語構成文字として扱うため、/\bCMYK\b/ は
「CMYK版」に当たらない(/\w/ は「あ」に当たらないのに \b は当たる、
という食い違いがある)。英数字の前後へ空白を置く流儀の原稿でも
「JPEG形式」「YAML形式」のような複合はどう書いても生じるため、方針では
防げない——実測で本書の地の文でも 13 語・39 件を取りこぼしていた。
索引は「その語がここに出てくる」ことを伝えるものなので、和語がくっついた
形でも拾うのが正しい。CMYK版 の中の CMYK を拾えば、読者は CMYK を
引いてそのページへ辿り着ける。
英字どうしの食い込み(MATTR の中の TTR)は従来どおり弾く。
辞書には読みやすさのため \b の綴りを残し、意味の解釈だけをここで与える
——このモジュールが綴りの唯一の解釈元なので、既存の辞書を書き換えて回る
必要はない。
67 68 69 |
# File 'lib/vivlio_starter/cli/index/term_pattern.rb', line 67 def ascii_word_boundaries(body) body.sub(/\A\\b/) { ASCII_WORD_BEHIND }.sub(/\\b\z/) { ASCII_WORD_AHEAD } end |
.for(entry) ⇒ Regexp
41 42 43 44 45 46 47 48 49 50 |
# File 'lib/vivlio_starter/cli/index/term_pattern.rb', line 41 def for(entry) raw = entry['pattern'].to_s return literal(entry) if raw.empty? body = raw.start_with?('/') && raw.end_with?('/') ? raw[1...-1] : raw Regexp.new(ascii_word_boundaries(body)) rescue StandardError # 壊れた pattern で走査全体を止めない。完全一致へ落として先へ進む literal(entry) end |
.literal(entry) ⇒ Object
71 |
# File 'lib/vivlio_starter/cli/index/term_pattern.rb', line 71 def literal(entry) = Regexp.new(Regexp.escape(entry['term'].to_s)) |