J
John Carter
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:ocument:arse_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:ocument:arse_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 : (e-mail address removed)
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)
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:ocument:arse_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:ocument:arse_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 : (e-mail address removed)
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)