Sha256: e928501788e73cbb74aab3c37b740f8432d75f618f43cf16a63c3c709bb7e3ca

Contents?: true

Size: 1.23 KB

Versions: 10

Compression:

Stored size: 1.23 KB

Contents

$:.unshift 'lib'
require 'microformat'

class XOXO < Microformat
  @@parents  = %w[ol ul]
  @@children = %w[li]

  xpath_build =  proc { |element| element.map { |e| "/#{e}" } * ' | '  }
  @@children_xpath = xpath_build[@@children]
  @@parents_xpath  = xpath_build[@@parents]

  def self.find_first(doc)
    find_every(doc).first
  end

  def self.find_every(doc)
    doc.map { |child| build_tree(child) }
  end

  def self.find_occurences(doc)
    @options[:class] ? doc/".xoxo" : doc.search(@@parents_xpath)
  end

  def self.build_tree(child)
    tree = []
    child.search(@@children_xpath) do |element|
      label, branch = nil, nil
      element.children.each do |inner|
        label  ||= build_label(inner) unless container?(inner)
        branch ||= build_tree(inner) if container?(inner)
      end
      tree << (branch ? { label => branch } : label)
    end
    tree
  end

  def self.container?(el)
    el.elem? && @@parents.include?(el.name)
  end

  def self.build_label(node)
    if node.elem?
      label = Label.new(node.inner_html.strip)
      label.url = node['href'] if node.name == 'a'
      label
    elsif node.text? && !node.to_s.strip.empty?
      node.to_s.strip
    end
  end

  class Label < String
    attr_accessor :url
  end
end

Version data entries

10 entries across 10 versions & 2 rubygems

Version Path
calagator-1.0.0 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.9 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.8 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.7 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.6 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.5 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.3 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.2 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
grokus-1.0.0.1 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb
calagator-1.0.0.rc3 vendor/gems/mofo-0.2.8/lib/mofo/xoxo.rb