#!/usr/bin/env ruby require File.dirname(__FILE__) + '/../lib/haml' require 'haml/engine' require 'rubygems' require 'hpricot' def tabulate(tabs) ' ' * tabs end TEXT_REGEXP = /^(\s*).*$/ def parse_text(text, tabs) text.strip! if text.empty? String.new else lines = text.split("\n") lines.map do |line| line.strip! "#{tabulate(tabs)}#{'\\' if Haml::Engine::SPECIAL_CHARACTERS.include?(line[0])}#{line}\n" end.join 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 # Must be required after Hpricot mods, # so they're in scope require 'haml/exec' opts = Haml::Exec::HTML2Haml.new(ARGV) opts.parse!