From e24c6e400161a39320c17c5d423d3348980c10c9 Mon Sep 17 00:00:00 2001 From: "E. Seiver" Date: Wed, 17 Jan 2024 19:32:06 -0800 Subject: [PATCH] Template.add `after=` parameter (#315) * +after param to Template.add also updates docstring * Template.add param after test --- src/mwparserfromhell/nodes/template.py | 14 +++++++++++++- tests/test_template.py | 6 ++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/mwparserfromhell/nodes/template.py b/src/mwparserfromhell/nodes/template.py index f8fc30e..75c929f 100644 --- a/src/mwparserfromhell/nodes/template.py +++ b/src/mwparserfromhell/nodes/template.py @@ -237,7 +237,8 @@ class Template(Node): def __getitem__(self, name): return self.get(name) - def add(self, name, value, showkey=None, before=None, preserve_spacing=True): + def add(self, name, value, showkey=None, before=None, after=None, + preserve_spacing=True): """Add a parameter to the template with a given *name* and *value*. *name* and *value* can be anything parsable by @@ -259,6 +260,13 @@ class Template(Node): occurrence. If *before* is not in the template, :exc:`ValueError` is raised. The argument is ignored if *name* is an existing parameter. + If *after* is given (either a :class:`.Parameter` object or a name), + then we will place the parameter immediately after this one. If *after* + is a name and exists multiple times in the template, we will place it + after the last occurrence. If *after* is not in the template, + :exc:`ValueError` is raised. The argument is ignored if *name* is an + existing parameter or if a value is passed to *before*. + If *preserve_spacing* is ``True``, we will try to preserve whitespace conventions around the parameter, whether it is new or we are updating an existing value. It is disabled for parameters with hidden keys, @@ -312,6 +320,10 @@ class Template(Node): if not isinstance(before, Parameter): before = self.get(before) self.params.insert(self.params.index(before), param) + elif after: + if not isinstance(after, Parameter): + after = self.get(after) + self.params.insert(self.params.index(after)+1, param) else: self.params.append(param) return param diff --git a/tests/test_template.py b/tests/test_template.py index abb4e1e..0abaa30 100644 --- a/tests/test_template.py +++ b/tests/test_template.py @@ -334,6 +334,10 @@ def test_add(): node40.add("3", "d") node41.add("3", "d") node42.add("b", "hello") + node43 = Template(wraptext("a"), [pgens("b", "c"), pgens("d", "e"), pgens("f", "g")]) + node44 = Template(wraptext("a"), [pgens("b", "c"), pgens("d", "e"), pgens("f", "g")]) + node43.add("new_param", "value", after="d") + node44.add("new_param", "value", after="f") assert "{{a|b=c|d|e=f}}" == node1 assert "{{a|b=c|d|g}}" == node2 @@ -382,6 +386,8 @@ def test_add(): assert "{{a| b| c|d}}" == node40 assert "{{a|1= b|2= c|3= d}}" == node41 assert "{{a|b=hello \n}}" == node42 + assert "{{a|b=c|d=e|new_param=value|f=g}}" == node43 + assert "{{a|b=c|d=e|f=g|new_param=value}}" == node44 def test_remove():