|
|
@@ -17,8 +17,11 @@ |
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
|
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
|
|
# SOFTWARE. |
|
|
# SOFTWARE. |
|
|
|
|
|
|
|
|
|
|
|
import sys |
|
|
|
|
|
from pathlib import Path |
|
|
|
|
|
sys.path.append(str(Path(__file__).parent.parent)) |
|
|
from collections import defaultdict |
|
|
from collections import defaultdict |
|
|
|
|
|
from typing import TypedDict |
|
|
import re |
|
|
import re |
|
|
|
|
|
|
|
|
from ._base import Node |
|
|
from ._base import Node |
|
|
@@ -32,7 +35,14 @@ __all__ = ["Template"] |
|
|
FLAGS = re.DOTALL | re.UNICODE |
|
|
FLAGS = re.DOTALL | re.UNICODE |
|
|
# Used to allow None as a valid fallback value |
|
|
# Used to allow None as a valid fallback value |
|
|
_UNSET = object() |
|
|
_UNSET = object() |
|
|
|
|
|
|
|
|
|
|
|
class TemplateParam(TypedDict): |
|
|
|
|
|
"""TypedDict for template.update() method.""" |
|
|
|
|
|
name: any |
|
|
|
|
|
value: any |
|
|
|
|
|
showkey: bool | None = None |
|
|
|
|
|
before: str | None = None |
|
|
|
|
|
after: str | None = None |
|
|
|
|
|
preserve_spacing: bool = True |
|
|
|
|
|
|
|
|
class Template(Node): |
|
|
class Template(Node): |
|
|
"""Represents a template in wikicode, like ``{{foo}}``.""" |
|
|
"""Represents a template in wikicode, like ``{{foo}}``.""" |
|
|
@@ -238,8 +248,14 @@ class Template(Node): |
|
|
return self.get(name) |
|
|
return self.get(name) |
|
|
|
|
|
|
|
|
def add( |
|
|
def add( |
|
|
self, name, value, showkey=None, before=None, after=None, preserve_spacing=True |
|
|
|
|
|
): |
|
|
|
|
|
|
|
|
self, |
|
|
|
|
|
name: any, |
|
|
|
|
|
value: any, |
|
|
|
|
|
showkey: bool | None = None, |
|
|
|
|
|
before: str | None = None, |
|
|
|
|
|
after: str | None = None, |
|
|
|
|
|
preserve_spacing: bool = True |
|
|
|
|
|
) -> Parameter: |
|
|
"""Add a parameter to the template with a given *name* and *value*. |
|
|
"""Add a parameter to the template with a given *name* and *value*. |
|
|
|
|
|
|
|
|
*name* and *value* can be anything parsable by |
|
|
*name* and *value* can be anything parsable by |
|
|
@@ -330,6 +346,23 @@ class Template(Node): |
|
|
self.params.append(param) |
|
|
self.params.append(param) |
|
|
return param |
|
|
return param |
|
|
|
|
|
|
|
|
|
|
|
def update(self, params: list[TemplateParam]): |
|
|
|
|
|
"""Update the template with multiple parameters at once. |
|
|
|
|
|
|
|
|
|
|
|
This method accepts a list of parameter dictionaries, each containing |
|
|
|
|
|
the same arguments as :meth:`add`. It will process each parameter |
|
|
|
|
|
in order using the same logic as :meth:`add`. |
|
|
|
|
|
""" |
|
|
|
|
|
for param in params: |
|
|
|
|
|
self.add( |
|
|
|
|
|
name=param["name"], |
|
|
|
|
|
value=param["value"], |
|
|
|
|
|
showkey=param.get("showkey"), |
|
|
|
|
|
before=param.get("before"), |
|
|
|
|
|
after=param.get("after"), |
|
|
|
|
|
preserve_spacing=param.get("preserve_spacing", True) |
|
|
|
|
|
) |
|
|
|
|
|
|
|
|
def __setitem__(self, name, value): |
|
|
def __setitem__(self, name, value): |
|
|
return self.add(name, value) |
|
|
return self.add(name, value) |
|
|
|
|
|
|
|
|
|