Module: Echoes::SvgTransform

Defined in:
lib/echoes/svg_transform.rb

Overview

SVG ‘transform=` attribute parser. Returns an ordered list of `[op_symbol, [args…]]` tuples, or nil for unknown functions / malformed input. Caller applies them left-to-right via CG’s CTM setters (CGContextTranslateCTM, ScaleCTM, RotateCTM, ConcatCTM).

Constant Summary collapse

FN_RE =
/([a-zA-Z]+)\s*\(([^)]*)\)/
NUM_RE =
/-?\d+(?:\.\d+)?(?:[eE][+-]?\d+)?/

Class Method Summary collapse

Class Method Details

.build(name, nums) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/echoes/svg_transform.rb', line 27

def build(name, nums)
  case name
  when 'translate'
    return nil unless (1..2).cover?(nums.size)
    [:translate, [nums[0], nums[1] || 0.0]]
  when 'scale'
    return nil unless (1..2).cover?(nums.size)
    [:scale, [nums[0], nums[1] || nums[0]]]
  when 'rotate'
    return nil unless [1, 3].include?(nums.size)
    deg = nums[0]
    cx, cy = nums.size == 3 ? [nums[1], nums[2]] : [0.0, 0.0]
    [:rotate, [deg, cx, cy]]
  when 'matrix'
    return nil unless nums.size == 6
    [:matrix, nums]
  when 'skewx'
    return nil unless nums.size == 1
    [:skewx, [nums[0]]]
  when 'skewy'
    return nil unless nums.size == 1
    [:skewy, [nums[0]]]
  else
    nil
  end
end

.parse(str) ⇒ Object



14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/echoes/svg_transform.rb', line 14

def parse(str)
  return nil if str.nil? || str.strip.empty?
  ops = []
  str.scan(FN_RE) do |name, body|
    nums = body.scan(NUM_RE).map(&:to_f)
    op = build(name.downcase, nums)
    return nil if op.nil?
    ops << op
  end
  return nil if ops.empty?
  ops
end