Module: VivlioStarter::CLI::Units

Defined in:
lib/vivlio_starter/cli/units.rb

Overview

印刷単位の変換定数と長さパーサを一元管理する。 基準は「1 inch = 25.4mm = 72pt」「1Q = 0.25mm」の 2 関係のみで、 他の係数はすべてここから導出する(近似値の直書きを排除するため)。 仕様: page-unit-conversion-spec.md

Constant Summary collapse

MM_PER_INCH =
25.4
PT_PER_INCH =
72.0
MM_PER_PT =

0.3527777…

MM_PER_INCH / PT_PER_INCH
PT_PER_MM =

2.8346456…

PT_PER_INCH / MM_PER_INCH
MM_PER_Q =
0.25
PT_PER_Q =

0.7086614…

MM_PER_Q * PT_PER_MM

Class Method Summary collapse

Class Method Details

.font_size_to_pt(value) ⇒ String?

文字サイズを正規単位 pt の文字列へ変換する。 Q → pt 変換、素の数値 → 'pt' 付与(CSS 不正値の予防)、pt はそのまま。 それ以外(px / em 等)は CSS として有効な可能性があるため素通しする。

Parameters:

  • value (Object)

    文字サイズ(例: '10pt', '24Q', 10.5)

Returns:

  • (String, nil)

    'Xpt' 形式など。value が nil/空なら nil



44
45
46
47
48
49
50
51
52
# File 'lib/vivlio_starter/cli/units.rb', line 44

def font_size_to_pt(value)
  s = value.to_s.strip
  case s
  in '' then nil
  in /\A[\d.]+\s*q\z/i then format_pt(s.to_f * PT_PER_Q)
  in /\A[\d.]+\z/      then format_pt(s.to_f)
  else s
  end
end

.format_pt(value) ⇒ Object

pt 数値を CSS 値文字列へ整形(小数 3 桁丸め。17.0 → '17.0pt')



58
# File 'lib/vivlio_starter/cli/units.rb', line 58

def format_pt(value) = "#{value.to_f.round(3)}pt"

.length_to_mm(value) ⇒ Float?

CSS 長さ文字列を mm の Float へ変換する。 受理: mm / cm / in / pt / Q(大文字小文字不問)、単位なしの数値(mm とみなす)。 解釈できない値(em・% など文脈依存の単位や非数値)は nil を返し、 既定値の選択は呼び出し側に委ねる(黙って 0 扱いにしない)。

Parameters:

  • value (Object)

    CSS 長さ(例: '22mm', '10pt', '88Q', 22)

Returns:

  • (Float, nil)


25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/vivlio_starter/cli/units.rb', line 25

def length_to_mm(value)
  s = value.to_s.strip
  case s
  in '' then nil
  in /\A(-?[\d.]+)\s*mm\z/i then Regexp.last_match(1).to_f
  in /\A(-?[\d.]+)\s*cm\z/i then Regexp.last_match(1).to_f * 10.0
  in /\A(-?[\d.]+)\s*in\z/i then Regexp.last_match(1).to_f * MM_PER_INCH
  in /\A(-?[\d.]+)\s*pt\z/i then Regexp.last_match(1).to_f * MM_PER_PT
  in /\A(-?[\d.]+)\s*q\z/i  then Regexp.last_match(1).to_f * MM_PER_Q
  in /\A-?[\d.]+\z/         then s.to_f
  else nil
  end
end

.pt_value(value) ⇒ Object

pt 文字列から数値部を取り出す('10.5pt' → 10.5、pt 以外は nil)



55
# File 'lib/vivlio_starter/cli/units.rb', line 55

def pt_value(value) = value&.to_s&.strip&.match(/\A([\d.]+)\s*pt\z/i)&.[](1)&.to_f