# Tagz-4.2.0 - giraffe slayer

**URL:** <https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085>\
**Category:** Ruby\
**Created:** [May 8, 2008, 8:38pm UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085 "2008-05-08T20:38:28Z")\
**Posts on this page:** 8\
**Page:** 1

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 8, 2008, 8:38pm UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/1 "2008-05-08T20:38:28Z")

</div>

NAME

tagz.rb

SYNOPSIS

require Tagz

include Tagz.globally

a\_(:href =\> “/foo”){ “bar” } #=\> [bar](https://www.ruby-forum.com/foo)

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\>23

\<========\< 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/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 8, 2008, 9:47pm UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/2 "2008-05-08T21:47:53Z")

</div>

On 5/8/08, ara howard [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> 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  
> […]  
> like a ninja sword through butter.

It appears Ara has been visited by \_why’s Muse.

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 8, 2008, 10:07pm UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/3 "2008-05-08T22:07:49Z")

</div>

On May 8, 2008, at 1:46 PM, Adam S. wrote:

> It appears Ara has been visited by \_why’s Muse.

more like a small 1 year old girl, awake at 1 am, depriving dad of  
sleep. the effect is the same though 😉

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 9, 2008, 1:31am UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/4 "2008-05-09T01:31:31Z")

</div>

ara howard [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) wrote:

> NAME
> 
> tagz.rb

Has the gem been updated?

Thx - m.

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 9, 2008, 1:50am UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/5 "2008-05-09T01:50:18Z")

</div>

On May 8, 2008, at 5:30 PM, matt neuburg wrote:

> Has the gem been updated?

hmm. it has, but didn’t get pushed up. i’ll do that now - should be  
on rubyforge (but not mirrors) in a few minutes…

thanks for the heads up!

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 9, 2008, 1:55am UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/6 "2008-05-09T01:55:34Z")

</div>

On May 8, 2008, at 5:30 PM, matt neuburg wrote:

> Has the gem been updated?

cfp:~/src/ruby/tagz/tagz-4.2.0 \> curl -s  
‘[http://rubyforge.org/frs/?group\_id=1024&release\_id=21981](http://rubyforge.org/frs/?group_id=1024&release_id=21981)’  
|grep tagz|grep 4.2

[tagz-4.2.0.gem](https://www.ruby-forum.com/frs/download.php/36812/tagz-4.2.0.gem)\</  
td\>9 KB0Any\</  
td\>.gem (RubyGem)

[tagz-4.2.0.tgz](https://www.ruby-forum.com/frs/download.php/36794/tagz-4.2.0.tgz)\</  
td\>13 KB0Any\</  
td\>Source .zip

a @ [http://codeforpeople.com/](http://codeforpeople.com/)

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 9, 2008, 4:22am UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/7 "2008-05-09T04:22:20Z")

</div>

On May 8, 2008, at 12:37 PM, ara howard wrote:

> 

Love the version number, Ara! I fee like my life has meaning now.

Blessings,  
TwP

---

<div class="post-metadata">

**Author:** ![ara\_howard](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/a/d9b06d/32.png) [@ara\_howard](https://www.ruby-forum.com/u/ara_howard)\
**Post date:** [May 10, 2008, 2:47am UTC](https://www.ruby-forum.com/t/tagz-4-2-0-giraffe-slayer/137085/8 "2008-05-10T02:47:48Z")

</div>

-----BEGIN PGP SIGNED MESSAGE-----  
Hash: SHA1

M. Edward (Ed) Borasky wrote:

|  
| Well … if giraffes weren’t endangered before, they are now. 🙂  
|  
| P.S.: My WindowMaker desktop theme is called “Giraffe”.

You obviously need its fork, WidowMaker. 😜

* * *

Phillip G.  
Twitter: [twitter.com/cynicalryan](http://twitter.com/cynicalryan)  
Blog: [http://justarubyist.blogspot.com](http://justarubyist.blogspot.com)

~ “I suppose the secret to happiness is learning to appreciate the  
moment.”

- -Calvin  
-----BEGIN PGP SIGNATURE-----  
Version: GnuPG v1.4.8 (MingW32)  
Comment: Using GnuPG with Mozilla - [http://enigmail.mozdev.org](http://enigmail.mozdev.org)

iEYEARECAAYFAkgkAJ8ACgkQbtAgaoJTgL/ZggCgpkjaphImjgCyLhO/y0IAlkUj  
EeIAnRgZNZlYcj6QWbyWj4EXWX+kXBe0  
=4zhw  
-----END PGP SIGNATURE-----
