Tryag File Manager
Home
-
Turbo Force
Current Path :
/
usr
/
lib
/
python2.4
/
site-packages
/
_xmlplus
/
parsers
/
xmlproc
/
Upload File :
New :
File
Dir
//usr/lib/python2.4/site-packages/_xmlplus/parsers/xmlproc/utils.py
""" Some utilities for use with xmlproc. $Id: utils.py,v 1.7 2002/05/01 09:02:37 loewis Exp $ """ import xmlapp, sys, string, types replace = string.replace if sys.platform[ : 4] == "java": from java.lang import Exception try: from codecs import EncodedFile except ImportError, e: # if we are on Python 1.5 def EncodedFile(file, encoding): return file # --- XMLParseException class XMLParseException(Exception): pass # --- ErrorPrinter class ErrorPrinter(xmlapp.ErrorHandler): """An error handler that prints out warning messages.""" def __init__(self, locator, level = 0, out = sys.stderr): xmlapp.ErrorHandler.__init__(self, locator) self.level = level self.out = out def warning(self,msg): if self.level < 1: self.out.write("WARNING: %s at %s\n" % (msg,self.__get_location())) def error(self,msg): if self.level < 2: self.out.write("ERROR: %s at %s\n" % (msg,self.__get_location())) def fatal(self,msg): self.out.write("ERROR: %s at %s\n" % (msg,self.__get_location())) def __get_location(self): return "%s:%d:%d" % (self.locator.get_current_sysid(), self.locator.get_line(), self.locator.get_column()) # --- ErrorRaiser class ErrorRaiser(xmlapp.ErrorHandler): """An error handler that raises exceptions.""" def __init__(self, locator = None, level = 0): xmlapp.ErrorHandler.__init__(self, locator) self.level = level def warning(self, msg): if self.level < 1: raise XMLParseException(msg) def error(self, msg): if self.level < 2: raise XMLParseException(msg) def fatal(self, msg): raise XMLParseException(msg) # --- ErrorCounter class ErrorCounter(xmlapp.ErrorHandler): """An error handler that counts errors.""" def __init__(self, locator = None): xmlapp.ErrorHandler.__init__(self, locator) self.reset() def reset(self): self.warnings=0 self.errors =0 self.fatals =0 def warning(self,msg): self.warnings=self.warnings+1 def error(self,msg): self.errors=self.errors+1 def fatal(self,msg): self.fatals=self.fatals+1 # --- ESIS document handler class ESISDocHandler(xmlapp.Application): def __init__(self,writer=sys.stdout): self.writer=writer def handle_pi(self,target,data): self.writer.write("?"+target+" "+data+"\n") def handle_start_tag(self,name,amap): self.writer.write("("+name+"\n") for a_name in amap.keys(): self.writer.write("A"+a_name+" "+amap[a_name]+"\n") def handle_end_tag(self,name): self.writer.write(")"+name+"\n") def handle_data(self,data,start_ix,end_ix): self.writer.write("-"+data[start_ix:end_ix]+"\n") # --- XML canonizer class Canonizer(xmlapp.Application): def __init__(self,writer=sys.stdout): self.elem_level=0 self.writer=writer def handle_pi(self,target, remainder): if target!="xml": self.writer.write("<?"+target+" "+remainder+"?>") def handle_start_tag(self,name,amap): self.writer.write("<"+name) a_names=amap.keys() a_names.sort() for a_name in a_names: self.writer.write(" "+a_name+"=\"") self.write_data(amap[a_name]) self.writer.write("\"") self.writer.write(">") self.elem_level=self.elem_level+1 def handle_end_tag(self,name): self.writer.write("</"+name+">") self.elem_level=self.elem_level-1 def handle_ignorable_data(self,data,start_ix,end_ix): self.write_data(data[start_ix:end_ix]) def handle_data(self,data,start_ix,end_ix): if self.elem_level>0: self.write_data(data[start_ix:end_ix]) def write_data(self,data): data=replace(data,"&","&") data=replace(data,"<","<") data=replace(data,"\"",""") data=replace(data,">",">") data=replace(data,chr(9),"	") data=replace(data,chr(10)," ") data=replace(data,chr(13)," ") self.writer.write(data) # --- DocGenerator def escape_content(str): return replace(replace(str, "&", "&"), "<", "<") def escape_attval(str): return replace(replace(replace(str, "&", "&"), "<", "<"), '"', """) class DocGenerator(xmlapp.Application): def __init__(self, out = None): if not out: self.out = EncodedFile(sys.stdout, "utf-8") else: self.out = out def handle_pi(self, target, remainder): self.out.write("<?%s %s?>" % (target, remainder)) def handle_start_tag(self,name,amap): self.out.write("<"+name) for (name, value) in amap.items(): self.out.write(' %s="%s"' % (name, escape_attval(value))) self.out.write(">") def handle_end_tag(self,name): self.out.write("</%s>" % name) def handle_ignorable_data(self,data,start_ix,end_ix): self.out.write(escape_content(data[start_ix:end_ix])) def handle_data(self,data,start_ix,end_ix): self.out.write(escape_content(data[start_ix:end_ix])) # --- DictResolver class DictResolver(xmlapp.PubIdResolver): def __init__(self, mapping = None): if mapping == None: mapping = {} self.mapping = mapping def resolve_pe_pubid(self, pubid, sysid): return self.mapping.get(pubid, sysid) def resolve_doctype_pubid(self, pubid, sysid): return self.mapping.get(pubid, sysid) def resolve_entity_pubid(self, pubid, sysid): return self.mapping.get(pubid, sysid) # --- Location class Location: def __init__(self, locator): self._sysid = locator.get_current_sysid() self._line = locator.get_line() self._column = locator.get_column() def get_sysid(self): return self._sysid def get_line(self): return self._line def get_column(self): return self._column def __str__(self): return "%s:%s:%s" % (self._sysid, self._line, self._column) # --- Various DTD and validation tools def load_dtd(sysid): import dtdparser,xmldtd dp=dtdparser.DTDParser() dtd=xmldtd.CompleteDTD(dp) dp.set_dtd_consumer(dtd) dp.parse_resource(sysid) return dtd def validate_doc(dtd,sysid): import xmlval parser=xmlval.XMLValidator() parser.dtd=dtd # FIXME: what to do if there is a !DOCTYPE? parser.set_error_handler(ErrorPrinter(parser)) parser.parse_resource(sysid) #dtd.rollback_changes()