Class: VivlioStarter::CLI::Guards::ContainerClassCheck

Inherits:
BaseCheck
  • Object
show all
Defined in:
lib/vivlio_starter/cli/guards/container_class_check.rb

Overview

contents/*.md の :::{.class} に未知のクラス名が使われていないかを検出して警告する。

なぜ黙殺されるのか:

`:::{.class}` の div 化には二経路ある。Ruby 前処理(convert_container_blocks)が扱う
のは 6 クラスのみで、残りはすべて組み込み置換ルール(ReplacementRules)の汎用正規表現が
`<div class="$1">` へ置換する。後者はクラス名を一切知らないため、`:::{.notion}` は
無言で `<div class="notion">` になり、CSS が当たらないまま素の段落として組まれる。
著者は完成 PDF を目視するまで気づけない。

なぜ警告(停止しない)なのか:

「CSS を書く前に原稿を先に書く」という順序を妨げないため。

許可リスト: stylesheets/**/*.css のクラスセレクタを自動抽出する。custom.css が 著者の自由記述用に用意されているため「クラスに CSS を書けば自動的に許可される」で 完結する。過剰許可(Prism のトークンクラス等が混ざる)は偽陰性しか生まないため許容する。

Constant Summary collapse

PREPROCESSED_CLASSES =

経路 A(Ruby 前処理)が扱うクラス。convert_container_blocks の 6 クラスに加え、 showcase は ShowcaseTransformer がブロックごと消費して figure.vs-showcase へ 変換するため、CSS に .showcase セレクタが存在しないのが正しい状態。 他は CSS にも存在するが、CSS 側が消えても検証が壊れないよう明示しておく。

%w[
  book-card rotate-table long-table text-right text-center text-left showcase talk
].freeze
CSS_CLASS_SELECTOR =

CSS のクラスセレクタ。小数(0.5em)や nth-child() を拾わないよう直前を除外する。

/(?<![\w.\-])\.([a-zA-Z_][\w-]*)/
MAX_SUGGESTIONS =

提示する修正候補の上限。実データでは 1 件に収まるが、似た名前のクラスが 増えたときに候補が並びすぎないよう蓋をする。

3

Instance Method Summary collapse

Instance Method Details

#validateArray<Violation>

Returns 警告の配列(合格なら空配列).

Returns:

  • (Array<Violation>)

    警告の配列(合格なら空配列)



41
42
43
# File 'lib/vivlio_starter/cli/guards/container_class_check.rb', line 41

def validate
  markdown_files.flat_map { check_file(it) }
end