Module: VivlioStarter::CLI::Lint::NotationGuard

Defined in:
lib/vivlio_starter/cli/lint/notation_guard.rb

Overview

VFM 記法の中和(lint 系専用)。

Constant Summary collapse

MACHINE_DATA_CONTAINERS =

機械データ(座標・オプション)を本文として持つコンテナ名。 記法を追加するときはここへ 1 語加えればガードが追従する。

%w[showcase].freeze
MACHINE_BLOCK_OPEN =

機械データ・ブロックの開始行(例: :::{.showcase})。 ShowcaseTransformer::BLOCK_PATTERN の開始側と揃える(行末に本文が続く :::{.showcase} foo は同 PATTERN が消費しない=ブロックではないため、 ガードもブロックとして扱わない)。

/\A:::\s*\{\s*\.(?:#{Regexp.union(MACHINE_DATA_CONTAINERS).source})\s*\}[ \t]*\r?\n?\z/
MACHINE_BLOCK_CLOSE =

機械データ・ブロックの終了行(例: :::)。

/\A:::[ \t]*\r?\n?\z/
CONTAINER_MARKER =

コンテナのマーカー行(開始・終了とも)。コロン 3 つ以上+任意の属性ブレースで 行全体が構成されるものだけをマーカーとみなす。

「:::" で始まる行」まで広げてはならない: コメントアウトされたコンテナの閉じ :::--> を空行化すると HTML コメントの --> が消え、コメントが永久に閉じず、 その中身(表・数式)を読んだ textlint が暴走する実害があった(94 章で CPU 99%)。 マーカーでないものはガードの対象外=素のまま textlint へ渡す(現状維持が正しい)。

/\A[ \t]*:{3,}[ \t]*(?:\{[^{}\n]*\})?[ \t]*\r?\n?\z/
FURIGANA =

ふりがな記法 {親文字|ふりがな}

/\{([^{}|]*)\|[^{}]*\}/
CLASS_ATTRIBUTE =

クラス属性記法 {.classname}

/\{\.[-\w]+\}/

Class Method Summary collapse

Class Method Details

.strip_notation(text) ⇒ String

記法を中和したテキストを返す。行数は入力と必ず一致する(I1)。

Parameters:

  • text (String)

    原稿の内容

Returns:

  • (String)

    記法を中和した内容



78
79
80
81
82
83
84
85
86
87
88
89
# File 'lib/vivlio_starter/cli/lint/notation_guard.rb', line 78

def strip_notation(text)
  prose   = prose_lines(text)
  machine = machine_block_lines(text, prose)

  text.each_line.with_index(1).map do |line, lineno|
    if !prose.include?(lineno)          then line          # コード領域は不変
    elsif machine.include?(lineno)      then blank(line)   # G1 機械データ・ブロック
    elsif line.match?(CONTAINER_MARKER) then blank(line)   # G2 コンテナのマーカー行
    else neutralize_inline(line)                           # G3 ふりがな → G4 クラス属性
    end
  end.join
end