File: xmldigest.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 (94 lines) | stat: -rw-r--r-- 2,294 bytes parent folder | download | duplicates (2)
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
83
84
85
86
87
88
89
90
91
92
93
94
## -*- Ruby -*-
## DOMHASH test implementation
## 1999 by yoshidam
##
## Apr 20, 1999 Change for draft-hiroshi-dom-hash-01.txt
##

require 'xmltree'
require 'md5'
require 'uconv'

module XML
  module DOM

    def tou16(str)
      Uconv.u16swap(Uconv.u8tou16(str))
    end

    class Node
      def getDigest(force = false)
        nil
      end
    end

    class Text
      def getDigest(force = false)
        (!force && @digest) ||
           @digest = MD5.new([TEXT_NODE].pack("N") + tou16(nodeValue)).digest
      end
    end

##    class Comment
##      def getDigest(force = false)
##        (!force && @digest) ||
##          @digest = MD5.new([COMMENT_NODE].pack("N") + tou16(data)).digest
##      end
##    end

    class ProcessingInstruction
      def getDigest(force = false)
        (!force && @digest) ||
          @digest = MD5.new([PROCESSING_INSTRUCTION_NODE].pack("N") +
                            tou16(target) + "\0\0" + tou16(data)).digest
      end
    end

    class Attr
      def getDigest(force = false)
        (!force && @digest) ||
          @digest = MD5.new([ATTRIBUTE_NODE].pack("N") +
                            tou16(nodeName) + "\0\0" + tou16(nodeValue)).digest
      end
    end

    class NamedNodeMap
      include Enumerable
    end

    class NodeList
      include Enumerable
    end

    class Element
      def getDigest(force = false)
        return @digest if (!force && @digest)
        attr = attributes
        children = childNodes
        attr_digests = ""
        children_digests = ""
        if attr
          attr_array = attr.sort {|a, b|
            tou16(a.nodeName) <=> tou16(b.nodeName)}
          attr_array.each {|a|
            attr_digests << a.getDigest(force)
          }
        end
        children_num = 0
        children.each {|c|
          next if c.nodeType == COMMENT_NODE
          children_num += 1
          children_digests << c.getDigest(force)
        }
        @digest = MD5.new([ELEMENT_NODE].pack("N") +
                          tou16(nodeName) +
                          "\0\0" +
                          [attr.length].pack("N") +
                          attr_digests +
                          [children_num].pack("N") +
                          children_digests).digest
      end
    end

  end
end