1   
 2   
 3   
 4   
 5   
 6   
 7   
 8   
 9   
10   
11   
12   
13   
14   
15   
16   
17   
18   
19   
20   
21  """ 
22  XML canonicalisation methods (for XEP-0116) 
23  """ 
24   
25  from simplexml import ustr 
26   
27 -def c14n(node, is_buggy): 
 28      s = "<" + node.name 
29      if node.namespace: 
30          if not node.parent or node.parent.namespace != node.namespace: 
31              s = s + ' xmlns="%s"' % node.namespace 
32   
33      sorted_attrs = sorted(node.attrs.keys()) 
34      for key in sorted_attrs: 
35          if not is_buggy and key == 'xmlns': 
36              continue 
37          val = ustr(node.attrs[key]) 
38           
39          s = s + ' %s="%s"' % ( key, normalise_attr(val) ) 
40      s = s + ">" 
41      cnt = 0 
42      if node.kids: 
43          for a in node.kids: 
44              if (len(node.data)-1) >= cnt: 
45                  s = s + normalise_text(node.data[cnt]) 
46              s = s + c14n(a, is_buggy) 
47              cnt=cnt+1 
48      if (len(node.data)-1) >= cnt: s = s + normalise_text(node.data[cnt]) 
49      if not node.kids and s.endswith('>'): 
50          s=s[:-1]+' />' 
51      else: 
52          s = s + "</" + node.name + ">" 
53      return s.encode('utf-8') 
 54   
56      return val.replace('&', '&').replace('<', '<').replace('"', '"').replace('\t', '	').replace('\n', '
').replace('\r', '
') 
 57   
59      return val.replace('&', '&').replace('<', '<').replace('>', '>').replace('\r', '
') 
 60