diff -ur o-amrita-1.0.2/lib/amrita/xml.rb amrita-1.0.2/lib/amrita/xml.rb --- o-amrita-1.0.2/lib/amrita/xml.rb 2005-04-01 00:58:59.718350000 -0700 +++ amrita-1.0.2/lib/amrita/xml.rb 2005-04-01 01:57:46.057114611 -0700 @@ -3,13 +3,16 @@ require "rexml/streamlistener" module Amrita + has_uconv = true + begin require 'uconv' rescue LoadError has_uconv = false end - if has_uconv + + if has_uconv case $KCODE when "EUC" def convert(s) @@ -34,12 +37,12 @@ include Amrita include REXML::StreamListener - - def initialize + def initialize(&block) @stack = [ Null ] + @block = block end - def push(element) + def push(element) @stack.unshift element end @@ -57,10 +60,11 @@ end def tag_start(name, attrs) - a = attrs.collect do |key, val| + a = attrs.collect { |key, val| Attr.new(key, convert(val)) - end - push e(name, *a) + } + t = @block.call(e(name, *a)) + push t push Null end @@ -83,23 +87,25 @@ end def doctype(name, pub_sys, long_name, uri) - s = SpecialElement.new('!', - %Q[DOCTYPE #{name} #{pub_sys} #{long_name} #{uri}]) + s = SpecialElement.new('!', %Q[DOCTYPE #{name} #{pub_sys} #{long_name} #{uri}]) push(pop + s) end end module XMLParser def XMLParser.parse_text(text, fname="", lno=0, dummy=nil, &block) - l = Listener.new(&block) + l = Listener.new(&block) REXML::Document.parse_stream(text, l) l.result end def XMLParser.parse_file(fname, dummy=nil, &block) - l = Listener.new(&block) - REXML::Document.parse_stream(File.new(fname), l) + l = Listener.new(&block) + open(fname) { |fh| + REXML::Document.parse_stream(fh, l) + } l.result end end + end