#!/usr/bin/env ruby require 'rubygems' require 'hpricot' require 'open-uri' doc = open(ARGV[0]) { |f| Hpricot(f) } def tabulate(tabs) ' ' * tabs end def parse_text(text, tabs) text.strip! if text.empty? String.new else text = text.gsub(/[\t ]+/, " ").gsub(/(\r|\n|\r\n)\s*/, "\n#{tabulate(tabs)}") "#{tabulate(tabs)}#{text}\n" end end module Hpricot::Node def to_haml(tabs) parse_text(self.to_s, tabs) end end class Hpricot::Doc def to_haml output = '' children.each { |child| output += child.to_haml(0) } output end end class Hpricot::XMLDecl def to_haml(tabs) "#{tabulate(tabs)}!!! XML\n" end end class Hpricot::DocType def to_haml(tabs) "#{tabulate(tabs)}!!!\n" end end class Hpricot::Comment def to_haml(tabs) "#{tabulate(tabs)}/\n#{parse_text(self.content, tabs + 1)}" end end class Hpricot::Elem def to_haml(tabs) output = "#{tabulate(tabs)}" output += "%#{name}" unless name == 'div' if attributes output += "##{attributes['id']}" if attributes['id'] attributes['class'].split(' ').each { |c| output += ".#{c}" } if attributes['class'] attributes.delete("id") attributes.delete("class") output += attributes.inspect if attributes.length > 0 end output += "/" if children.length == 0 output += "\n" self.children.each do |child| output += child.to_haml(tabs + 1) end output end end puts doc.to_haml