NAME xx SYNOPSIS xhtml and xml generation => twice as dirty! USAGE require "xx" include XX::XHTML doc = xhtml_{ html_{ head_{ title_{ " go xx! " } } body_{ " one more and it would be illegal " } } } puts doc INSTALL harp:~ > gem install "double x" URIS http://rubyforge.org/projects/codeforpeople/ hhtp://codeforpeople.com/xx/ DESCRIPTION xx is a library designed to extend ruby objects with html, xhtml, and xml generation methods. the syntax provided by xx aims to make the generation of xml or xhtml as clean looking and natural as ruby itself, while still being entirely robust and safe. the approach taken, that of extending objects, allows natural document generation while preserving access to instance data. in essence it provides ruby objects (including the top level 'main' object) mixin ability to generate various markup views of their data in a way that is correct and elegant. xx is brought to you by the good folks at http://eparklabs.com. SAMPLES <========< samples/a.rb >========> ~ > cat samples/a.rb require "xx" include XX::XHTML # # xx modules extend any object with natural document markup methods. the # special 'tag_name_(attributes){ block }' is a bit odd first but, as you will # see, has many important properties # puts xhtml_{ html_{ head_{ title_{ " go xx! " } } body_{ " one more 'x' and it would be illegal " } } } ~ > ruby samples/a.rb go xx! one more 'x' and it would be illegal <========< samples/b.rb >========> ~ > cat samples/b.rb require "xx" # # xx doesn't name clash # class C include XX::XHTML attr 'body' def initialize @body = 'body' end def to_html xhtml_{ html_{ body_{ body } } } end end puts C.new.to_html ~ > ruby samples/b.rb body <========< samples/c.rb >========> ~ > cat samples/c.rb require "xx" # # no reserved words prohibiting tags - oh, and xml too. also note the # blockless form of tag generation which is also supported # class C include XX::XML attr 'table' def initialize @table = %w( a b c ), %w( 1 2 3 ) end def to_xml xml_{ class_{ self.class } object_id_{ 42 } send_ 'send' exit_ 'exit' table_{ table.each do |row| tr_{ row.each do |cell| td_ cell end } end } } end end puts C.new.to_xml.pretty # auto indentation with 'pretty' ~ > ruby samples/c.rb C42 send exit
a b c
1 2 3
<========< samples/d.rb >========> ~ > cat samples/d.rb require "xx" # # the brackets make it dang easy to bounce on the '%' key (or whatever key # matches braces in your editor) to balance tags. and the phrase '_{' is very # useful for searching huge doccuments for tag generation methods # class C include XX::XML def to_xml xml_{ a_{ b_{ c_{ d_{ e_{ f_{ ' but am i balanced? ' }}}}}}} # vim will tell you! end end puts C.new.to_xml ~ > ruby samples/d.rb but am i balanced? <========< samples/e.rb >========> ~ > cat samples/e.rb require "xx" # # the handy '_' method can bail you out when your tags aren't valid ruby # syntax # include XX::XML puts xml_{ _('mething missing is cool'){ 'but not always the best fit' } } ~ > ruby samples/e.rb but not always the best fit <========< samples/f.rb >========> ~ > cat samples/f.rb require "xx" # # '_' really bails you out for namespaces # module Furniture class Table include XX::XML attr 'legs' def initialize @legs = %w[ 1 2 3 4 ] end def to_xml xml_{ _('furniture:table', 'xmlns:f' => 'http://www.w3schools.com/furniture'){ legs.each{|leg| _('furniture:leg'){ "leg #{ leg }" } } } } end end end # # xml types don't get formatted by default - use pretty for that # puts Furniture::Table.new.to_xml.pretty ~ > ruby samples/f.rb leg 1 leg 2 leg 3 leg 4 <========< samples/g.rb >========> ~ > cat samples/g.rb require "xx" # # there are bunch of shorthand methods - each is 'escaped' via a double # underscore # include XX::XHTML include XX::XML puts xml_{ t__{ 'this is text data' } } puts xml_{ x__{ ' in raw form, nothing is auto-escaped ' } } puts xml_{ h__{ ' entities like & are ignored ' } } puts xml_{ c__{ 'cdata' } } puts xml_{ tag_(a__('k=v, x=y')){ 'a__ is a handy attribute parser' } } puts xml_{ tag_(y__('k: v, a: b')){ 'y__ is too - yaml style' } } ~ > ruby samples/g.rb this is text data in raw form, nothing is auto-escaped entities like & are ignored a__ is a handy attribute parser y__ is too - yaml style HISTORY 2.0.0: - !!!!!!! NOT BACKWARD COMPATIBLE WITH 1.X.X VERSIONS !!!!!!! _ the special method '_' can now be used to generate any tag _(:td, :width => 600, :height => 400){ 'content' } this enables xml namespaces! xml_{ _('furniture:table', 'xmlns:f' => 'http://www.w3schools.com/furniture'){ ... ... ... } } - all the special escaping class of methods have been changed from one to two underscores g_ => g__ ## tag generator, now same as '_' t_ => t__ ## xml text node generator x_ => x__ ## raw xml, no escaping h_ => h__ ## escaped only html entities c_ => c__ ## cdata a_ => a__ ## parse attribute string y_ => y__ ## parse yaml attribute string as you can see, this is consistent with the new '_' tag generation: any method ending with one underscord is a generator. all methods ending in two are special methods. this is the major compatibilty breaker. sorry, but the new method is much more consistent and less typing. - fixed bug with rexml changes in 1.8.5 regarding order of sending doc preamble 0.1.0: - added the "g_" method, which generates any tag ^ g_("anytag", "key" => "value"){ b_{ "bold" } } - added at_ and att_ methods to parse yaml and k=v strings as hashes. at_("src : image.jpg, width : 100%") #=> {"src"=>"image.jpg", "width"=> "100%"} 0.0.0: - initial version AUTHORS dan fitzpatrick ara.t.howard BUGS please send bug reports to /dev/null. patches to addresses above. ;-) LICENSE ePark Labs Public License version 1 Copyright (c) 2005, ePark Labs, Inc. and contributors All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of ePark Labs nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.