How does this work for loops? For example this won't work:
<!-- for @i in 0...5 -->
<img src="#{@i}.jpg"/>
<!-- end -->
How would you suggest I achieve this? Perhaps:
<!-- for @i in 0...5
print "<img src='#{@i}.jpg'/>"
end -->
I can quickly see that becoming an escaping nightmare.
I really like the idea but I would want it to be this flexible.
David
John Carter wrote:
> I have just stuck this on..
> http://www.rubygarden.org/ruby?RubyInXML
>
> I like XML.
>
> There is a firm standard, there is a rich toolset to work on it.
>
> I like HTML. It is simply the fastest way to deliver good looking
> documents to the widest audience.
>
> No surprise. I like XHTML it _is_ HTML in XML. I can validate my XHTML
> documents and know that they conform exactly to the standard, and hence
> will render properly on a wide set of browsers.
>
> I love ruby. It is quite the easiest way to program. It has a lovely XML
> API called REXML.
>
> I sometimes need to do spreadsheet sort of things. Basically a document
> that describes my reasoning and findings, supported by numbers.
>
> Long time ago, when I still did Perl, I found by actual trials that I
> was about as fast in Perl as the average guy is using a Spreadsheet.
> Sometimes faster, sometimes slower. But for the next hundred data sets,
> my perl scripts where a thousand times faster.
>
> So I don't do spreadsheets these days, I write ruby scripts.
>
> So I have taken to combining Ruby & HTML. Sometimes via cgi. It works
> for me.
>
> But sometimes I have documents that are more HTML than ruby. So it makes
> sense to write them in HTML, with a bit of Ruby embedded. That's where
> erb and eruby live.
>
> But I don't like erb and eruby's tags. I can't validate my XHTML.
>
> So add REXML and I present a very small script I call rubyexml. Ruby
> Embedded in XML.
>
> #!/usr/bin/ruby -w
>
> require 'rexml/document'
> require 'rexml/streamlistener'
> require 'pp'
>
> # All eval's are evaluated in the context of an instance of this class.
> # Extend this, or add this method to a class of your own.
> class Context
>
> def eval_value( value)
> value.gsub( %r{ \#\{ ( [^\}]+ ) \} }x) do | match|
> instance_eval( $1).to_s
> end
> end
> end
>
>
> # This does the work.
> class Listener
> include REXML::StreamListener
>
> def initialize( context)
> @context = context
> end
>
> def comment( text)
> print @context.instance_eval( text)
> rescue SyntaxError => details
> pp @context
> pp text
> raise "Failed to compile '#{text}' in context : #{details}"
> end
>
> def tag_start(name,attrs)
> print "<",name
> attrs.each_pair do |key, value|
> print " #{key}=\"#{@context.eval_value( value)}\""
> end
> print ">"
> end
>
> def tag_end( name)
> print "</", name, ">"
> end
>
> def text( text)
> print @context.eval_value(text)
> end
>
> def cdata( ctext)
> text( ctext)
> end
> end
>
> # This comes for free from REXML. Stream parse an XML document.
> REXML::Document::parse_stream( REXML::SourceFactory::create_from(
> STDIN), Listener::new( Context.new))
>
>
> So take a chunk of XHTML...
>
> <?xml version="1.0"?>
> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
> "xhtml11.dtd" >
> <html xmlns="HTTP://www.w3.org/TR/xhtml"
> xmlns:xlink="HTTP://www.w3.org/XML/XLink/0.9"
> xml:lang="en" >
> <head>
> <title>
>
> </title>
> </head>
>
> <body>
> <h1>
> The answer to life, the universe and everything is <!-- 44 - 2 -->
> </h1>
>
> <p>
> The following image is <!-- @file_name =
> "pretty_picture.jpg" -->
>
> <img src="#{@file_name}" alt = "#{@file_name.sub(/\.jpg/,'')}"/>
> </p>
> </body>
> </html>
>
> It validates as correct xml against the XHTML DTD.
>
> Feed it through rubyexml and get...
>
> <html xmlns:xlink="HTTP://www.w3.org/XML/XLink/0.9" xml:lang="en"
> xmlns="HTTP://www.w3.org/TR/xhtml">
> <head>
> <title>
>
> </title>
> </head>
>
> <body>
> <h1>
> The answer to life, the universe and everything is 42
> </h1>
>
> <p>
> The following image is pretty_picture.jpg
>
> <img src="pretty_picture.jpg" alt="pretty_picture"></img>
> </p>
> </body>
> </html>
>
> Just so blooming simple.
>
> And if you have a big hairy object that knows all the deeper secrets of
> life, just change rubyexml to...
>
> REXML::Document::parse_stream( REXML::SourceFactory::create_from(
> STDIN), Listener::new( BigHairyObjectThatKnowsTheDeeperSecretsOfLife.new))
>
> And you can refer to all it's instance variables and methods.
>
> It all so blooming simple!
>
>
>
> John Carter Phone : (64)(3) 358 6639
> Tait Electronics Fax : (64)(3) 359 4632
> PO Box 1645 Christchurch Email : john.carter / tait.co.nz
> New Zealand
>
> "At first I hoped that such a technically unsound project would
> collapse but I soon realized it was doomed to success. Almost
> anything in software can be implemented, sold, and even used given
> enough determination. There is nothing a mere scientist can say that
> will stand against the flood of a hundred million dollars. But there
> is one quality that cannot be purchased in this way---and that is
> reliability. The price of reliability is the pursuit of the utmost
> simplicity. It is a price which the very rich find most hard to
> pay." -- C.A.R. Hoare in The Emperor's Old Clothes,
> Turing Award Lecture (27 October 1980)
>
>
>
>
--
David Mitchell
Software Engineer
Telogis