Class: VivlioStarter::CLI::Guards::ContainerClassCheck
- 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
-
#validate ⇒ Array<Violation>
警告の配列(合格なら空配列).
Instance Method Details
#validate ⇒ Array<Violation>
Returns 警告の配列(合格なら空配列).
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 |