From f22b5cafa93c3b4136e423f94a636bd4b6f0cbbb Mon Sep 17 00:00:00 2001 From: =?utf8?q?Vladim=C3=ADr=20Vondru=C5=A1?= Date: Mon, 29 Jan 2018 20:49:14 +0100 Subject: [PATCH] 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*. --- doxygen/dox2html5.py | 14 ++++++++++++-- doxygen/test/contents_parse_error/Doxyfile | 1 + doxygen/test/contents_parse_error/broken.xml | 1 + doxygen/test/test_contents.py | 12 +++++++++++- 4 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 doxygen/test/contents_parse_error/Doxyfile create mode 100644 doxygen/test/contents_parse_error/broken.xml 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'))) -- 2.30.2