module SvgHeartsYou::Helpers

Public Instance Methods

svg_inline(filename, options={}) click to toggle source
# File lib/svg_hearts_you/helpers.rb, line 37
def svg_inline(filename, options={})
  # Add .svg extension if missing
  filename += '.svg' unless filename.end_with?('.svg')

  svg_file = SvgHeartsYou::find_svg_file(filename)

  doc = Nokogiri::HTML::DocumentFragment.parse(svg_file)
  svg = doc.at_css 'svg'

  # Attributes are added after
  options.each do |key, value|
    svg[key.to_s] = value
  end

  stringify(svg)
end
svg_symbol(filename, options={}) { |attributes| ... } click to toggle source
# File lib/svg_hearts_you/helpers.rb, line 54
def svg_symbol(filename, options={})
  folder_mode = options.delete(:folder)

  if folder_mode
    folders = [*filename]
    read_files = []

    folders.each do |folder_name|
      read_files += SvgHeartsYou::svgs_for_folder(folder_name)
    end

    symbols = read_files.map do |file|
      doc = Nokogiri::HTML::DocumentFragment.parse(file[:file])
      { node: doc.at_css('svg'), filename: file[:filename] }
    end
  else
    files = [*filename]
    symbols = files.map do |file|
      svg_file = SvgHeartsYou::find_svg_file(file)
      doc = Nokogiri::HTML::DocumentFragment.parse(svg_file)
      { node: doc.at_css('svg'), filename: file }
    end
  end

  doc = Nokogiri::HTML::DocumentFragment.parse('')
  wrapper_svg = Nokogiri::XML::Node.new 'svg', doc

  wrapper_svg['version'] = '1.1'
  wrapper_svg['xmlns'] = 'http://www.w3.org/2000/svg'
  wrapper_svg['style'] = 'display: none;'

  symbols.each do |symbol|
    node = symbol[:node]

    # Convert
    node.name = 'symbol'
    node['id'] = symbol[:filename].chomp('.svg')

    # add `each` items here
    if options[:each]
      options[:each].each do |key, value|
        node[key.to_s] = value
      end
    end

    %w(version xmlns xmlns:xlink).each do |attr|
      node.delete attr
    end

    if block_given?
      attributes = {}
      node.entries.each do |item|
        attributes[item[0].to_sym] = item[1]
      end

      # Allow each symbol to be configured if block given
      yield(attributes)

      attributes.each do |key, value|
        node[key.to_s] = value
      end
    end

    wrapper_svg.add_child(node)
  end

  options.delete(:each)

  # Put remaining options on parent svg tag
  options.each do |key, value|
    wrapper_svg[key.to_s] = value
  end

  stringify(wrapper_svg)
end
svg_use(id, options={}) click to toggle source
# File lib/svg_hearts_you/helpers.rb, line 130
    def svg_use(id, options={})
      # Strip .svg extension if necessary
      id.gsub!(/\.svg\z/, '')

      # Add hash symbol to beginning if necessary
      id = '#' + id unless id.include?('#')

      doc = Nokogiri::HTML::DocumentFragment.parse <<-YAYUSE
      <svg version="1.1" xmlns="http://www.w3.org/2000/svg">
        <use xlink:href="#{id}">
      </svg>
      YAYUSE

      svg = doc.at_css 'svg'

      # TODO allow for the title and desc stuff
      options.delete :title
      options.delete :desc

      options.each do |key, value|
        svg[key.to_s] = value
      end

      stringify(svg)
    end

Private Instance Methods

stringify(node) click to toggle source
# File lib/svg_hearts_you/helpers.rb, line 157
def stringify(node)
  str = node.to_html
  str = str.html_safe if str.respond_to? :html_safe
  str
end