Package elisa :: Package extern :: Package coherence :: Module et
[hide private]
[frames] | no frames]

Source Code for Module elisa.extern.coherence.et

  1  # -*- coding: utf-8 -*- 
  2   
  3  # Licensed under the MIT license 
  4  # http://opensource.org/licenses/mit-license.php 
  5   
  6  # Copyright 2006,2007 Frank Scholz <coherence@beebits.net> 
  7  # 
  8  # a little helper to get the proper ElementTree package 
  9   
 10  import re 
 11   
 12  try: 
 13      import cElementTree as ET 
 14      import elementtree 
 15      #print "we are on CET" 
 16  except ImportError: 
 17      try: 
 18          from elementtree import ElementTree as ET 
 19          import elementtree 
 20          #print "simply using ET" 
 21      except ImportError: 
 22          """ this seems to be necessary with the python2.5 on the Maemo platform """ 
 23          try: 
 24              from xml.etree import cElementTree as ET 
 25              from xml import etree as elementtree 
 26          except ImportError: 
 27              try: 
 28                  from xml.etree import ElementTree as ET 
 29                  from xml import etree as elementtree 
 30              except ImportError: 
 31                  #print "no ElementTree module found, critical error" 
 32                  raise ImportError, "no ElementTree module found, critical error" 
 33   
 34  utf8_escape = re.compile(eval(r'u"[&<>\"]+"')) 
 35  escape = re.compile(eval(r'u"[&<>\"\u0080-\uffff]+"')) 
 36   
37 -def encode_entity(text, pattern=escape):
38 # map reserved and non-ascii characters to numerical entities 39 def escape_entities(m, map=elementtree.ElementTree._escape_map): 40 out = [] 41 append = out.append 42 for char in m.group(): 43 t = map.get(char) 44 if t is None: 45 t = "&#%d;" % ord(char) 46 append(t) 47 return ''.join(out)
48 try: 49 return elementtree.ElementTree._encode(pattern.sub(escape_entities, text), 'ascii') 50 except TypeError: 51 elementtree.ElementTree._raise_serialization_error(text) 52
53 -def new_encode_entity(text, pattern=utf8_escape):
54 # map reserved and non-ascii characters to numerical entities 55 def escape_entities(m, map=elementtree.ElementTree._escape_map): 56 out = [] 57 append = out.append 58 for char in m.group(): 59 t = map.get(char) 60 if t is None: 61 t = "&#%d;" % ord(char) 62 append(t) 63 if type(text) == unicode: 64 return ''.join(out) 65 else: 66 return u''.encode('utf-8').join(out)
67 try: 68 if type(text) == unicode: 69 return elementtree.ElementTree._encode(escape.sub(escape_entities, text), 'ascii') 70 else: 71 return elementtree.ElementTree._encode(utf8_escape.sub(escape_entities, text.decode('utf-8')), 'utf-8') 72 except TypeError: 73 74 elementtree.ElementTree._raise_serialization_error(text) 75 76 elementtree.ElementTree._encode_entity = new_encode_entity 77 78 # it seems there are some ElementTree libs out there 79 # which have the alias XMLParser and some that haven't. 80 # 81 # So we just use the XMLTreeBuilder method for now 82 # if XMLParser isn't available. 83 84 if not hasattr(ET, 'XMLParser'):
85 - def XMLParser(encoding='utf-8'):
86 return ET.XMLTreeBuilder()
87 88 ET.XMLParser = XMLParser 89
90 -def namespace_map_update(namespaces):
91 #try: 92 # from xml.etree import ElementTree 93 #except ImportError: 94 # from elementtree import ElementTree 95 96 elementtree.ElementTree._namespace_map.update(namespaces)
97
98 -class ElementInterface(elementtree.ElementTree._ElementInterface):
99 """ helper class """
100
101 -def indent(elem, level=0):
102 """ generate pretty looking XML, based upon: 103 http://effbot.org/zone/element-lib.htm#prettyprint 104 """ 105 i = "\n" + level*" " 106 if len(elem): 107 if not elem.text or not elem.text.strip(): 108 elem.text = i + " " 109 for elem in elem: 110 indent(elem, level+1) 111 if not elem.tail or not elem.tail.strip(): 112 elem.tail = i 113 if not elem.tail or not elem.tail.strip(): 114 elem.tail = i 115 else: 116 if level and (not elem.tail or not elem.tail.strip()): 117 elem.tail = i
118
119 -def parse_xml(data, encoding="utf-8"):
120 p = ET.XMLParser(encoding=encoding) 121 122 # my version of twisted.web returns page_infos as a dictionary in 123 # the second item of the data list 124 if isinstance(data, (list, tuple)): 125 data, _ = data 126 127 try: 128 data = data.encode(encoding) 129 except UnicodeDecodeError: 130 pass 131 except Exception, error: 132 print "parse_xml encode Exception", error 133 import traceback 134 traceback.print_exc() 135 136 # Guess from who we're getting this? 137 data = data.replace('\x00','') 138 try: 139 p.feed(data) 140 except Exception, error: 141 print "parse_xml feed Exception", error 142 print error, repr(data) 143 return None 144 else: 145 return ET.ElementTree(p.close())
146