]>
Commit | Line | Data |
---|---|---|
b4036b9f | 1 | diff -ur o-amrita-1.0.2/lib/amrita/xml.rb amrita-1.0.2/lib/amrita/xml.rb |
2 | --- o-amrita-1.0.2/lib/amrita/xml.rb 2005-04-01 00:58:59.718350000 -0700 | |
3 | +++ amrita-1.0.2/lib/amrita/xml.rb 2005-04-01 01:57:46.057114611 -0700 | |
4 | @@ -3,13 +3,16 @@ | |
5 | require "rexml/streamlistener" | |
6 | ||
7 | module Amrita | |
8 | + | |
9 | has_uconv = true | |
10 | + | |
11 | begin | |
12 | require 'uconv' | |
13 | rescue LoadError | |
14 | has_uconv = false | |
15 | end | |
16 | - if has_uconv | |
17 | + | |
18 | + if has_uconv | |
19 | case $KCODE | |
20 | when "EUC" | |
21 | def convert(s) | |
22 | @@ -34,12 +37,12 @@ | |
23 | include Amrita | |
24 | include REXML::StreamListener | |
25 | ||
26 | - | |
27 | - def initialize | |
28 | + def initialize(&block) | |
29 | @stack = [ Null ] | |
30 | + @block = block | |
31 | end | |
32 | ||
33 | - def push(element) | |
34 | + def push(element) | |
35 | @stack.unshift element | |
36 | end | |
37 | ||
38 | @@ -57,10 +60,11 @@ | |
39 | end | |
40 | ||
41 | def tag_start(name, attrs) | |
42 | - a = attrs.collect do |key, val| | |
43 | + a = attrs.collect { |key, val| | |
44 | Attr.new(key, convert(val)) | |
45 | - end | |
46 | - push e(name, *a) | |
47 | + } | |
48 | + t = @block.call(e(name, *a)) | |
49 | + push t | |
50 | push Null | |
51 | end | |
52 | ||
53 | @@ -83,23 +87,25 @@ | |
54 | end | |
55 | ||
56 | def doctype(name, pub_sys, long_name, uri) | |
57 | - s = SpecialElement.new('!', | |
58 | - %Q[DOCTYPE #{name} #{pub_sys} #{long_name} #{uri}]) | |
59 | + s = SpecialElement.new('!', %Q[DOCTYPE #{name} #{pub_sys} #{long_name} #{uri}]) | |
60 | push(pop + s) | |
61 | end | |
62 | end | |
63 | ||
64 | module XMLParser | |
65 | def XMLParser.parse_text(text, fname="", lno=0, dummy=nil, &block) | |
66 | - l = Listener.new(&block) | |
67 | + l = Listener.new(&block) | |
68 | REXML::Document.parse_stream(text, l) | |
69 | l.result | |
70 | end | |
71 | ||
72 | def XMLParser.parse_file(fname, dummy=nil, &block) | |
73 | - l = Listener.new(&block) | |
74 | - REXML::Document.parse_stream(File.new(fname), l) | |
75 | + l = Listener.new(&block) | |
76 | + open(fname) { |fh| | |
77 | + REXML::Document.parse_stream(fh, l) | |
78 | + } | |
79 | l.result | |
80 | end | |
81 | end | |
82 | + | |
83 | end |