From: Vladimír Vondruš Date: Mon, 29 Jan 2018 19:49:14 +0000 (+0100) Subject: doxygen: don't die on XML parse error. X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~cjwatson/git?a=commitdiff_plain;h=f22b5cafa93c3b4136e423f94a636bd4b6f0cbbb;p=blog.git doxygen: don't die on XML parse error. Doxygen is able to highlight PNGs as C++ code. It's amazing, of course, but the result is a terrible mess (of course). So let's have another drink and ignore those *amazing things*. --- diff --git a/doxygen/dox2html5.py b/doxygen/dox2html5.py index 93176e85..a921cc4f 100755 --- a/doxygen/dox2html5.py +++ b/doxygen/dox2html5.py @@ -1147,7 +1147,12 @@ def parse_define(state: State, element: ET.Element): def extract_metadata(state: State, xml): logging.debug("Extracting metadata from {}".format(os.path.basename(xml))) - tree = ET.parse(xml) + try: + tree = ET.parse(xml) + except ET.ParseError as e: + logging.error("{}: XML parse error, skipping: {}".format(os.path.basename(xml), e)) + return + root = tree.getroot() # We need just list of all example files in correct order, nothing else @@ -1281,7 +1286,12 @@ def parse_xml(state: State, xml: str): logging.debug("Parsing {}".format(state.current)) - tree = ET.parse(xml) + try: + tree = ET.parse(xml) + except ET.ParseError as e: + logging.error("{}: XML parse error, skipping: {}".format(state.current, e)) + return + root = tree.getroot() assert root.tag == 'doxygen' diff --git a/doxygen/test/contents_parse_error/Doxyfile b/doxygen/test/contents_parse_error/Doxyfile new file mode 100644 index 00000000..8ec4cc49 --- /dev/null +++ b/doxygen/test/contents_parse_error/Doxyfile @@ -0,0 +1 @@ +XML_OUTPUT = diff --git a/doxygen/test/contents_parse_error/broken.xml b/doxygen/test/contents_parse_error/broken.xml new file mode 100644 index 00000000..7d69da77 --- /dev/null +++ b/doxygen/test/contents_parse_error/broken.xml @@ -0,0 +1 @@ +&<><><><> diff --git a/doxygen/test/test_contents.py b/doxygen/test/test_contents.py index 122122c6..831f29fe 100644 --- a/doxygen/test/test_contents.py +++ b/doxygen/test/test_contents.py @@ -28,7 +28,7 @@ import unittest from distutils.version import LooseVersion -from test import IntegrationTestCase, doxygen_version +from test import BaseTestCase, IntegrationTestCase, doxygen_version class Typography(IntegrationTestCase): def __init__(self, *args, **kwargs): @@ -139,3 +139,13 @@ class Custom(IntegrationTestCase): def test_math(self): self.run_dox2html5(wildcard='math.xml') self.assertEqual(*self.actual_expected_contents('math.html')) + +class ParseError(BaseTestCase): + def __init__(self, *args, **kwargs): + super().__init__(__file__, 'parse_error', *args, **kwargs) + + def test(self): + self.run_dox2html5(wildcard='broken.xml') + + # The index file should be generated, no abort + self.assertTrue(os.path.exists(os.path.join(self.path, 'html', 'index.html')))