Sha256: ed30fc74d434763e936a5ae0dc3f2ec36e435a8d0c5a6dd1846563ff2a363f4e

Contents?: true

Size: 1.32 KB

Versions: 3

Compression:

Stored size: 1.32 KB

Contents

$:.unshift 'lib'
require 'microformat'

class XOXO < Microformat
  class << self
    PARENTS = %w[ol ul]
    CHILDREN = %w[li]

    xpath_build =  proc { |element| element.map { |e| "/#{e}" } * ' | '  }
    CHILDREN_XPATH = xpath_build.call(CHILDREN)
    PARENTS_XPATH = xpath_build.call(PARENTS)

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

    def find_every(doc)
      tree = []
      doc.each do |child|
        tree << build_tree(child)
      end
      tree
    end

    def find_occurances(doc)
      @options[:class] ? doc/".xoxo" : doc.search(PARENTS_XPATH)
    end

    def build_tree(child)
      tree = []
      child.search(CHILDREN_XPATH) do |element|
        label, branch = nil, nil
        element.children.each do |inner|
          label  ||= build_label(inner) unless inner.elem? && PARENTS.include?(inner.name)
          branch ||= build_tree(inner) if inner.elem? && PARENTS.include?(inner.name)
        end
        tree << (branch ? { label => branch } : label)
      end 
      tree
    end

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

  class Label < String
    attr_accessor :url
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
mofo-0.1.2 lib/mofo/xoxo.rb
mofo-0.1 lib/mofo/xoxo.rb
mofo-0.1.1 lib/mofo/xoxo.rb