ASPN ActiveState Programmer Network
ActiveState
/ Home / Perl / PHP / Python / Tcl / XSLT /
/ Safari / My ASPN /
Cookbooks | Documentation | Mailing Lists | Modules | News Feeds | Products | User Groups


Recent Messages
List Archives
About the List
List Leaders
Subscription Options

View Subscriptions
Help

View by Topic
ActiveState
.NET Framework
Open Source
Perl
PHP
Python
Tcl
Web Services
XML & XSLT

View by Category
Database
General
SOAP
System Administration
Tools
User Interfaces
Web Programming
XML Programming


MyASPN >> Mail Archive >> ruby-talk
ruby-talk
Re: [ANN] tagz-4.2.0 - giraffe slayer
by M. Edward Borasky other posts by this author
May 8 2008 7:51PM messages near this date
[ANN] tagz-4.2.0 - giraffe slayer | Re: [ANN] tagz-4.2.0 - giraffe slayer
ara howard wrote:
>  
>  NAME
>  
>    tagz.rb
>  
>  SYNOPSIS
>  
>    require Tagz
>  
>    include Tagz.globally
>  
>    a_(:href => "/foo"){ "bar" }  #=>  <a href="/foo">bar</a>
>  
>  DESCRIPTION
>  
>    tagz.rb is generates html, xml, or any sgml variant like a small ninja
>    running across the backs of a herd of giraffes swatting of heads like a
>    mark-up weedwacker.  weighing in at less than 200 lines of code 
>  tagz.rb adds
>    an html syntax to ruby that is both unobtrusive, safe, and available
>    globally to objects without the need for any builder or superfluous 
>  objects.
>    tagz.rb is designed for applications that generate html to be able to 
>  do so
>    easily in any context without heavyweight syntax or scoping issues, 
>  like a
>    ninja sword through butter.
>  
>  INSTALL
>  
>    gem install tagz
>  
>  HISTORY
>  
>    4.2.0
>      - general lib cleanup
>      - introduction of dual-mixin technique (Tagz.globally)
>      - few small bug fixes
>      - ninja tales
>      - fixed div_{ false }
>  
>  SAMPLES
>  
>    <========< samples/a.rb >========>
>  
>    ~ > cat samples/a.rb
>  
>      #
>      # in the simplest case tagz generates html using a syntax which 
>  safely mixes
>      # in to any object
>      #
>  
>      require 'tagz'
>      include Tagz.globally
>  
>      class GiraffeModel
>        def link
>          a_(:href => "/giraffe/neck/42"){ "whack!" }
>        end
>      end
>  
>      puts GiraffeModel.new.link
>  
>    ~ > ruby samples/a.rb
>  
>      <a href="/giraffe/neck/42">whack!</a>
>  
>  
>    <========< samples/b.rb >========>
>  
>    ~ > cat samples/b.rb
>  
>      #
>      # tagz.rb mixes quite easily with your favourite templating engine, 
>  avoiding
>      # the need for '<% rows.each do |row| %> ... <% row.each do |cell| %> '
>      # madness and other types of logic to be coded in the templating 
>  language,
>      # leaving templating to template engines and logic and looping to 
>  ruby -
>      # unencumbered by extra funky syntax
>      #
>  
>      require 'tagz'
>      include Tagz.globally
>  
>      require 'erb'
>  
>      rows = %w( a b c ), %w( 1 2 3 )
>  
>      template = ERB.new <<-ERB
>        <html>
>          <body>
>            <%=
>  
>              if rows
>  
>                table_{
>                  rows.each do |row|
>                    tr_{
>                      row.each do |cell|
>                        td_{ cell }
>                      end
>                    }
>                  end
>                }
>  
>              end
>  
>            %>
>          </body>
>        </html>
>      ERB
>  
>      puts template.result(binding)
>  
>  
>    ~ > ruby samples/b.rb
>  
>        <html>
>          <body>
>            
>  <table><tr><td>a</td><td>b</td><td>c</td></tr><tr><td>1</td><td>2</td><td>3</td></tr></tab
le>  
>  
>          </body>
>        </html>
>  
>  
>    <========< samples/c.rb >========>
>  
>    ~ > cat samples/c.rb
>  
>      #
>      # once you've learned to generate html using tagz you're primed to 
>  generate
>      # xml too
>      #
>  
>      require 'tagz'
>      include Tagz.globally
>  
>      doc =
>        xml_{
>          giraffe_{ 'large' }
>          ninja_{ 'small' }
>        }
>  
>      puts doc
>  
>    ~ > ruby samples/c.rb
>  
>      <xml><giraffe>large</giraffe><ninja>small</ninja></xml>
>  
>  
>    <========< samples/d.rb >========>
>  
>    ~ > cat samples/d.rb
>  
>      #
>      # tagz.rb doesn't cramp your style, allowing even invalid html to be
>      # generated.  note the use of the 'tagz' method, which can be used 
>  both to
>      # capture output and to append content to the top of the stack.
>      #
>  
>      require 'tagz'
>      include Tagz.globally
>  
>      def header
>        tagz{
>          html_
>            body_(:class => 'ninja-like', :id => 'giraffe-slayer')
>  
>            tagz << "\n<!-- this is the header -->\n"
>        }
>      end
>  
>      def footer
>        tagz{
>          tagz << "\n<!-- this is the footer -->\n"
>  
>          body_
>            html_
>        }
>      end
>  
>      puts header, footer
>  
>    ~ > ruby samples/d.rb
>  
>      <html><body class="ninja-like" id="giraffe-slayer">
>      <!-- this is the header -->
>  
>      <!-- this is the footer -->
>      <body><html>
>  
>  
>    <========< samples/e.rb >========>
>  
>    ~ > cat samples/e.rb
>  
>      #
>      # tagz.rb allows a safer method of mixin which requires any tagz 
>  methods to be
>      # inside a tagz block - tagz generating methods outside a tagz block 
>  will
>      # raise an error if tagz is included this way.  also notice that the 
>  error is
>      # reported from where it was raised - not from the bowels of the the 
>  tagz.rb
>      # lib.
>      #
>  
>      require 'tagz'
>      include Tagz
>  
>      puts tagz{
>       html_{ 'works only in here' }
>      }
>  
>      begin
>        html_{ 'not out here' }
>      rescue Object => e
>        p :backtrace => e.backtrace
>      end
>  
>  
>    ~ > ruby samples/e.rb
>  
>      <html>works only in here</html>
>      {:backtrace=>["samples/e.rb:17"]}
>  
>  
>    <========< samples/f.rb >========>
>  
>    ~ > cat samples/f.rb
>  
>      #
>      # tagz.rb can generate really compact html.  this is great to save 
>  bandwidth
>      # but can sometimes make reading the generated html a bit rough.  of 
>  course
>      # using tidy or the dom inspector in firebug obviates the issue; 
>  nevertheless
>      # it's sometime nice to break things up a little.  you can use 'tagz 
>  << "\n"'
>      # or the special shorthand '__' to accomplish this
>      #
>  
>      require 'tagz'
>      include Tagz.globally
>  
>      p div_{
>        span_{ true }
>        __
>        span_{ false }  # hey ryan, i fixed this ;-)
>        __
>      }
>  
>    ~ > ruby samples/f.rb
>  
>      "<div><span>true</span>\n<span>false</span>\n</div>"
>  
>  
>  
>  enjoy.
>  
>  
>  a @ http://codeforpeople.com/
>  -- 
>  we can deny everything, except that we have the possibility of being 
>  better. simply reflect on that.
>  h.h. the 14th dalai lama
>  
>  
>  
>  
>  

Well ... if giraffes weren't endangered before, they are now. :)

P.S.: My WindowMaker desktop theme is called "Giraffe".
Thread:
Ara Howard
M. Edward Borasky
Phillip Gawlowski
Tim Pease
Adam Shelly
Matt Neuburg
Ara.T.Howard
Ara.T.Howard
Ara.T.Howard

Privacy Policy | Email Opt-out | Feedback | Syndication
© 2004 ActiveState, a division of Sophos All rights reserved