1.1 --- a/libxml2dom/macrolib/macrolib.py Sun Apr 08 00:01:29 2007 +0000
1.2 +++ b/libxml2dom/macrolib/macrolib.py Sun Apr 08 00:01:33 2007 +0000
1.3 @@ -499,6 +499,15 @@
1.4 libxml2mod.xmlXPathFreeContext(context)
1.5 return result
1.6
1.7 +# Exceptions.
1.8 +
1.9 +class LSException(Exception):
1.10 +
1.11 + "DOM Level 3 Load/Save exception."
1.12 +
1.13 + PARSE_ERR = 81
1.14 + SERIALIZE_ERR = 82
1.15 +
1.16 # Utility functions.
1.17
1.18 def createDocument(namespaceURI, localName, doctype):
1.19 @@ -512,14 +521,14 @@
1.20 libxml2mod.xmlCreateIntSubset(d, doctype.localName, doctype.publicId, doctype.systemId)
1.21 return d
1.22
1.23 -def parse(stream_or_string, html=0, htmlencoding=None):
1.24 +def parse(stream_or_string, html=0, htmlencoding=None, unfinished=0):
1.25 if hasattr(stream_or_string, "read"):
1.26 stream = stream_or_string
1.27 - return parseString(stream.read(), html, htmlencoding)
1.28 + return parseString(stream.read(), html=html, htmlencoding=htmlencoding, unfinished=unfinished)
1.29 else:
1.30 - return parseFile(stream_or_string, html, htmlencoding)
1.31 + return parseFile(stream_or_string, html=html, htmlencoding=htmlencoding, unfinished=unfinished)
1.32
1.33 -def parseFile(s, html=0, htmlencoding=None):
1.34 +def parseFile(s, html=0, htmlencoding=None, unfinished=0):
1.35 # NOTE: Switching off validation and remote DTD resolution.
1.36 if not html:
1.37 context = libxml2mod.xmlCreateFileParserCtxt(s)
1.38 @@ -527,11 +536,15 @@
1.39 libxml2mod.xmlParserSetValidate(context, 0)
1.40 libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET)
1.41 libxml2mod.xmlParseDocument(context)
1.42 - return libxml2mod.xmlParserGetDoc(context)
1.43 + doc = libxml2mod.xmlParserGetDoc(context)
1.44 + if unfinished or libxml2mod.xmlParserGetWellFormed(context):
1.45 + return doc
1.46 + else:
1.47 + raise LSException(LSException.PARSE_ERR)
1.48 else:
1.49 return libxml2mod.htmlReadFile(s, htmlencoding, HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET)
1.50
1.51 -def parseString(s, html=0, htmlencoding=None):
1.52 +def parseString(s, html=0, htmlencoding=None, unfinished=0):
1.53 # NOTE: Switching off validation and remote DTD resolution.
1.54 if not html:
1.55 context = libxml2mod.xmlCreateMemoryParserCtxt(s, len(s))
1.56 @@ -539,14 +552,18 @@
1.57 libxml2mod.xmlParserSetValidate(context, 0)
1.58 libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET)
1.59 libxml2mod.xmlParseDocument(context)
1.60 - return libxml2mod.xmlParserGetDoc(context)
1.61 + doc = libxml2mod.xmlParserGetDoc(context)
1.62 + if unfinished or libxml2mod.xmlParserGetWellFormed(context):
1.63 + return doc
1.64 + else:
1.65 + raise LSException(LSException.PARSE_ERR)
1.66 else:
1.67 # NOTE: URL given as None.
1.68 html_url = None
1.69 return libxml2mod.htmlReadMemory(s, len(s), html_url, htmlencoding,
1.70 HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING | HTML_PARSE_NONET)
1.71
1.72 -def parseURI(uri, html=0, htmlencoding=None):
1.73 +def parseURI(uri, html=0, htmlencoding=None, unfinished=0):
1.74 # NOTE: Switching off validation and remote DTD resolution.
1.75 if not html:
1.76 context = libxml2mod.xmlCreateURLParserCtxt(uri, 0)
1.77 @@ -554,7 +571,11 @@
1.78 libxml2mod.xmlParserSetValidate(context, 0)
1.79 libxml2mod.xmlCtxtUseOptions(context, XML_PARSE_NOERROR | XML_PARSE_NOWARNING | XML_PARSE_NONET)
1.80 libxml2mod.xmlParseDocument(context)
1.81 - return libxml2mod.xmlParserGetDoc(context)
1.82 + doc = libxml2mod.xmlParserGetDoc(context)
1.83 + if unfinished or libxml2mod.xmlParserGetWellFormed(context):
1.84 + return doc
1.85 + else:
1.86 + raise LSException(LSException.PARSE_ERR)
1.87 else:
1.88 raise NotImplementedError, "parseURI does not yet support HTML"
1.89