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 |