diff --git a/gio/gdbus-2.0/codegen/codegen_docbook.py b/gio/gdbus-2.0/codegen/codegen_docbook.py index b7280e306..2bffd61f9 100644 --- a/gio/gdbus-2.0/codegen/codegen_docbook.py +++ b/gio/gdbus-2.0/codegen/codegen_docbook.py @@ -20,6 +20,7 @@ # Author: David Zeuthen import re +import textwrap from os import path from . import utils @@ -340,12 +341,12 @@ class DocbookCodeGenerator: return s def expand_paras(self, s, expandParamsAndConstants): - s = self.expand(s, expandParamsAndConstants).strip() + s = textwrap.dedent(self.expand(s, expandParamsAndConstants)).rstrip() res = [] if not s.startswith(""): res.append("") for line in s.split("\n"): - line = line.strip() + line = line.rstrip() if not line: line = "" res.append(line) diff --git a/gio/gdbus-2.0/codegen/codegen_md.py b/gio/gdbus-2.0/codegen/codegen_md.py index 8a0bed7c2..4644ef6f5 100644 --- a/gio/gdbus-2.0/codegen/codegen_md.py +++ b/gio/gdbus-2.0/codegen/codegen_md.py @@ -7,6 +7,7 @@ import os import re from . import utils +import textwrap # Disable line length warnings as wrapping the templates would be hard # flake8: noqa: E501 @@ -22,8 +23,8 @@ class MdCodeGenerator: def _expand(self, s, expandParamsAndConstants): """Expands parameters and constant literals.""" res = [] - for line in s.split("\n"): - line = line.strip() + for line in textwrap.dedent(s).split("\n"): + line = line.rstrip() if line == "": res.append("") continue diff --git a/gio/gdbus-2.0/codegen/codegen_rst.py b/gio/gdbus-2.0/codegen/codegen_rst.py index 51da2d572..b71347d92 100644 --- a/gio/gdbus-2.0/codegen/codegen_rst.py +++ b/gio/gdbus-2.0/codegen/codegen_rst.py @@ -6,6 +6,7 @@ import os import re from . import utils +import textwrap # Disable line length warnings as wrapping the templates would be hard # flake8: noqa: E501 @@ -21,8 +22,8 @@ class RstCodeGenerator: def _expand(self, s, expandParamsAndConstants): """Expands parameters and constant literals.""" res = [] - for line in s.split("\n"): - line = line.strip() + for line in textwrap.dedent(s).split("\n"): + line = line.rstrip() if line == "": res.append("") continue diff --git a/gio/gdbus-2.0/codegen/parser.py b/gio/gdbus-2.0/codegen/parser.py index cf8ea5229..207e4d3c9 100644 --- a/gio/gdbus-2.0/codegen/parser.py +++ b/gio/gdbus-2.0/codegen/parser.py @@ -20,6 +20,7 @@ # Author: David Zeuthen import xml.parsers.expat +import textwrap from . import dbustypes from .utils import print_error @@ -64,14 +65,12 @@ class DBusXMLParser: def handle_comment(self, data): comment_state = DBusXMLParser.COMMENT_STATE_BEGIN - lines = data.split("\n") + lines = textwrap.dedent(data).split("\n") symbol = "" body = "" in_para = False params = {} for line in lines: - orig_line = line - line = line.lstrip() if comment_state == DBusXMLParser.COMMENT_STATE_BEGIN: if len(line) > 0: colon_index = line.find(": ") @@ -95,7 +94,7 @@ class DBusXMLParser: if not in_para: body += "\n" in_para = True - body += f"{orig_line}\n" + body += f"{line}\n" else: param = line[1:colon_index] docs = line[colon_index + 2 :] @@ -106,12 +105,12 @@ class DBusXMLParser: if not in_para: body += "\n" in_para = True - body += orig_line + "\n" + body += line + "\n" elif comment_state == DBusXMLParser.COMMENT_STATE_BODY: if len(line) > 0: if not in_para: in_para = True - body += orig_line + "\n" + body += line + "\n" else: if in_para: body += "\n" diff --git a/gio/tests/codegen.py b/gio/tests/codegen.py index deaa78fff..9fd4321f3 100644 --- a/gio/tests/codegen.py +++ b/gio/tests/codegen.py @@ -1340,6 +1340,48 @@ G_END_DECLS with open("test-org.project.Bar.Frobnicator.xml", "r") as f: self.assertTrue(ET.parse(f) is not None) + def test_indentation_preservation_in_comments(self): + """Test if the parser preserves relative indentation in XML comments""" + markup_list = """\ +- The mnemonic key activates the object if it is presently enabled onscreen. + This typically corresponds to the underlined letter within the widget. + Example: "n" in a traditional "New..." menu item or the "a" in "Apply" for + a button.""" + + xml_contents = """ + + + + + + + + + + """ + for format, ext in [("rst", "rst"), ("md", "md"), ("docbook", "xml")]: + res = self.runCodegenWithInterface( + xml_contents, f"--generate-{format}", "test" + ) + self.assertFalse(res.err) + self.assertFalse(res.out) + with open(f"test-org.project.Bar.Frobnicator.{ext}", "r") as f: + self.assertIn(markup_list, f.read()) + if __name__ == "__main__": unittest.main(testRunner=taptestrunner.TAPTestRunner())