class Octicons::Octicon

def a11y

add some accessibility features to svg
def a11y
  accessible = {}
  if @options[:"aria-label"].nil? && @options["aria-label"].nil?
    accessible[:"aria-hidden"] = "true"
  else
    accessible[:role] = "img"
  end
  accessible
end

def calculate_height(width)

def calculate_height(width)
  (width.to_i * @height) / @width
end

def calculate_width(height)

def calculate_width(height)
  (height.to_i * @width) / @height
end

def classes

prepare the octicon class
def classes
  "octicon octicon-#{@symbol} #{@options[:class]} ".strip
end

def closest_natural_height(natural_heights, height)

def closest_natural_height(natural_heights, height)
  return natural_heights.reduce(natural_heights[0].to_i) do |acc, natural_height|
    natural_height.to_i <= height.to_i ? natural_height.to_i : acc
  end
end

def get_octicon(symbol, options = {})

def get_octicon(symbol, options = {})
  if octicon = Octicons::OCTICON_SYMBOLS[symbol]
    # We're using width as an approximation for height if the height option is not passed in
    height = options[:height] || options[:width] || DEFAULT_HEIGHT
    natural_height = closest_natural_height(octicon["heights"].keys, height)
    return {
      "name" => octicon["name"],
      "keywords" => octicon["keywords"],
      "width" => octicon["heights"][natural_height.to_s]["width"].to_i,
      "height" => natural_height,
      "path" => octicon["heights"][natural_height.to_s]["path"]
    }
  end
end

def html_attributes

def html_attributes
  attrs = ""
  @options.each { |attr, value| attrs += "#{attr}=\"#{value}\" " }
  attrs.strip
end

def initialize(symbol, options = {})

def initialize(symbol, options = {})
  @symbol = symbol.to_s
  if octicon = get_octicon(@symbol, options)
    @path = octicon["path"]
    @width = octicon["width"]
    @height = octicon["height"]
    @keywords = octicon["keywords"]
    @options = options
    @options.merge!({
      class:   classes,
      viewBox: viewbox,
      version: "1.1"
    })
    @options.merge!(size)
    @options.merge!(a11y)
  else
    raise "Couldn't find octicon symbol for #{@symbol.inspect}"
  end
end

def size

determine the height and width of the octicon based on :size option
def size
  size = {
    width:  @width,
    height: @height
  }
  # Specific size
  unless @options[:width].nil? && @options[:height].nil?
    size[:width]  = @options[:width].nil?  ? calculate_width(@options[:height]) : @options[:width]
    size[:height] = @options[:height].nil? ? calculate_height(@options[:width]) : @options[:height]
  end
  size
end

def to_svg

Returns an string representing a tag
def to_svg
  "<svg #{html_attributes}>#{@path}</svg>"
end

def viewbox

def viewbox
  "0 0 #{@width} #{@height}"
end