class HTMLRenderer::Base

Public Class Methods

render(input) click to toggle source
# File lib/html-renderer/base.rb, line 40
def self.render(input)
  new.render(input)
end

Public Instance Methods

render(input) click to toggle source
# File lib/html-renderer/base.rb, line 44
def render(input)
  doc = Oga.parse_html(input)

  state = State.new
  render_children(doc, state)
end

Private Instance Methods

render_children(node, state) click to toggle source
# File lib/html-renderer/base.rb, line 52
def render_children(node, state)

  results = node.children.map do |node|

    case node

    when Oga::XML::Text
      content = node.text
      content.blank? ? normal_text(content) : nil

    when Oga::XML::Element
      case node.name.downcase
      when "a"
        url     = node["href"]
        title   = node["title"]
        name    = node["name"]
        content = render_children(node, state)

        if title.blank? and url.blank? and name.blank?
          content
        elsif name and not url
          anchor(name, title, content)
        else
          link(url, title, content)
        end

      when "img"
        link    = node["src"]
        title   = node["title"]
        content = nil

        image(link, title, content)

      when /^h(\d)$/
        level = $1.to_i
        title = render_children(node, state)
        header(title, level)

      when "i", "strong"
        italic(render_children(node, state))
      when "em", "b"
        emphasis(render_children(node, state))
      when "sup"
        superscript(render_children(node, state))
      when "sub"
        subscript(render_children(node, state))
      when "u"
        underline(render_children(node, state))
      when "br"
        linebreak
      when "hr"
        separator

      when "p", "dl"
        paragraph(render_children(node, state).strip)
      when "div", "option", "dd", "dt"
        div(render_children(node, state))

      # TODO: Pass a complete array to list callbacks (similar to "table")
      when "ul"
        list(render_children(node, state), state.list_order)
      when "ol"
        content = render_children(node, state.with(:list_order => :ordered))
        list(content, state.list_order)
      when "li"
        list_item(render_children(node, state), state.list_order)

      when "code"
        block_code(render_children(node, state), nil)
      when "blockquote"
        block_quote(render_children(node, state))

      when "table"
        header = nil
        rows   = []

        node.css("tr").each do |row|
          if (cells = row.css("th")).any?
            header = cells
          elsif (cells = row.css("td")).any?
            rows << cells
          end
        end

        rows = rows.map do |row|
          row.map do |cell|
            render_children(cell, state)
          end
        end

        if header
          header = header.map do |cell|
            render_children(cell, state)
          end
        end

        table(header, rows)

      when "html", "body", "nav", "span", "form", "label", "input", "button", "section", "fieldset",
           "pre", "menu", "article", "header", "time", "aside", "footer", "nobr", "wbr",
           "table", "tr", "td", "th", "tt", "thead", "tbody", "noscript", "select",
           "address", "center", "small"
        render_children(node, state)

      when "head", "script", "link", "style"
        #
        # don't render anything
        #
      else
        # raise "Unrecognized HTML tag: #{node.name} -> #{node.inspect}"
        $stderr.puts "Unrecognized HTML tag: #{node.name} -> #{node.inspect}"
        render_children(node, state)
      end

    when Oga::XML::Comment, Oga::XML::Cdata

    else
      raise "Unhandled Oga node type: #{node.class}"
    end

  end

  results.join.strip

end