File: exttest.rb

package info (click to toggle)
libxml-parser-ruby 0.6.1-3
  • links: PTS
  • area: main
  • in suites: woody
  • size: 676 kB
  • ctags: 800
  • sloc: ruby: 5,723; ansic: 1,734; xml: 574; makefile: 152
file content (82 lines) | stat: -rwxr-xr-x 1,491 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
#! /usr/local/bin/ruby

require 'xmlextparser'


class TestParser < XML::ExtParser
  def externalParsedEntityDecl(entname, base, sysid, pubid)
    p ["externalParsedEntityDecl", entname, base, sysid, pubid]
  end

  def internalParsedEntityDecl(entname, text)
    p ["internalParsedEntityDecl", entname, text]
  end

  def escapeAttrVal(str)
    ret = ""
    str.scan(/./um) do |c|
      code = c.unpack("U")[0]
      if code == 9 || code == 10 || code == 13
        ret << sprintf("&#x%X;", code)
      elsif c == "&"
        ret << "&amp;"
      elsif c == "\""
        ret << "&quot;"
      elsif c == "<"
        ret << "&lt;"
      else
        ret << c
      end
    end
    ret
  end

  def escapeText(str)
    ret = ""
    str.scan(/./um) do |c|
      code = c.unpack("U")[0]
      if code == 13
        ret << sprintf("&#x%X;", code)
      elsif c == "&"
        ret << "&amp;"
      elsif c == "<"
        ret << "&lt;"
      elsif c == ">"
        ret << "&gt;"
      else
        ret << c
      end
    end
    ret
  end

  def startElement(name, attrs)
    print "<" + name
    attrs.each do |n, v|
      print " " + n + "='" + escapeAttrVal(v) + "'"
    end
    print  ">"
  end

  def endElement(name)
    print "</" + name + ">"
  end

  def character(text)
    print escapeText(text)
  end
end

p = TestParser.new

pos = ARGV[0].rindex("/")
if pos
  p.setBase(ARGV[0][0, pos + 1])
else
  p.setBase("")
end
begin
  p.parse($<.read)
rescue XMLParserError
  p [$!, p.line]
end