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 |