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

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

Parameters:

  • entry (Hash)

    'term' と任意の 'pattern' を持つ辞書エントリ

Returns:

  • (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))