class Svgeez::Elements::SymbolElement

Public Class Methods

new(file_path, file_id) click to toggle source
# File lib/svgeez/elements/symbol_element.rb, line 4
def initialize(file_path, file_id)
  @file_path = file_path
  @file_id = file_id
end

Public Instance Methods

build() click to toggle source
# File lib/svgeez/elements/symbol_element.rb, line 9
def build
  IO.read(@file_path).match(%r{^<svg\s*?(?<attributes>.*?)>(?<content>.*?)</svg>}m) do |matches|
    %(<symbol #{element_attributes(matches[:attributes]).sort.join(' ')}>#{element_contents(matches[:content])}</symbol>)
  end
end

Private Instance Methods

element_attributes(attributes) click to toggle source
# File lib/svgeez/elements/symbol_element.rb, line 17
def element_attributes(attributes)
  attrs = attributes.scan(/(?:viewBox|xmlns:.+?)=".*?"/m)
  id_prefix = @file_id
  id_suffix = File.basename(@file_path, '.svg').gsub(/['"\s]/, '-')
  id_attribute = [id_prefix, id_suffix].reject(&:empty?).join('-')

  attrs << %(id="#{id_attribute}")
end
element_contents(content) click to toggle source
# File lib/svgeez/elements/symbol_element.rb, line 26
def element_contents(content)
  content.scan(/\sid="(.+?)"/).flatten.each do |value|
    uuid = SecureRandom.uuid

    content.gsub!(/\s(id|xlink:href)="(#?#{value})"/m, %( \\1="\\2-#{uuid}"))
    content.gsub!(/\s(clip-path|fill|filter|marker-end|marker-mid|marker-start|mask|stroke)="url\((##{value})\)"/m, %( \\1="url(\\2-#{uuid})"))
  end

  content
end