i've been using this

def H _
  # Ruby object-literal syntax as HTML constructors
  case _
  when Hash then
    '<'+(_[:_]||:div).to_s+(_.keys-[:_,:c]).map{|a|
      ' '+a.to_s+'='+"'"+
      _[a].to_s.hsub({"'"=>'%27',
                       '>'=>'%3E',
                       '<'=>'%3C'})+"'"}.join+'>'+
      (_[:c] ? (H _[:c]) : '')+
      (_[:_] == :link ? '' : ('</'+(_[:_]||:div).to_s+'>'))
  when Array then
    _.map{|n|H n}.join
  else
    _.to_s if _
  end
end

class String
  def hsub h; map{|e|h[e]||e} end
end

irb(main):001:0> H ['<!DOCTYPE html>',
       {_: :html,
         c: [{_: :head,
               c: ['<meta charset="utf-8" />',
                   {_: :link, href:'/css/misc/favicon.ico', rel: :icon}]},
             {_: :body, c: {_: :h1, c: 'hello woyld'}}]}]

=> "<!DOCTYPE html><html><head><meta charset=\"utf-8\" /><link 
href='/css/misc/favicon.ico' rel='icon'></head><body><h1>hello 
woyld</h1></body></html>"

linebreaks can be nice for view-source (also, long lines tend to slow down 
text-editors to a crawl, at least emacs on mid 00s thinkpads)

class Array
  def intersperse i
    inject([]){|a,b|a << b << i}[0..-2]
  end
  def cr; intersperse "\n" end
end

irb(main):017:0> puts H %w{dog piglets duck geese galago}.map{|a|{_: :li, c: 
a}}.cr
<li>dog</li>
<li>piglets</li>
<li>duck</li>
<li>geese</li>
<li>galago</li>
=> nil
_______________________________________________
Camping-list mailing list
Camping-list@rubyforge.org
http://rubyforge.org/mailman/listinfo/camping-list

Reply via email to