| @@ -194,20 +194,30 @@ class Template(Node): | |||||
| return param | return param | ||||
| raise ValueError(name) | raise ValueError(name) | ||||
| def add(self, name, value, showkey=None, force_nonconformity=False): | |||||
| def add(self, name, value, showkey=None, before=None, | |||||
| preserve_spacing=True): | |||||
| """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 parasable by | *name* and *value* can be anything parasable by | ||||
| :py:func:`.utils.parse_anything`; pipes (and equal signs, if | |||||
| appropriate) are automatically escaped from *value* where applicable. | |||||
| :py:func:`.utils.parse_anything`; pipes and equal signs are | |||||
| automatically escaped from *value* when appropriate. | |||||
| If *showkey* is given, this will determine whether or not to show the | If *showkey* is given, this will determine whether or not to show the | ||||
| parameter's name (e.g., ``{{foo|bar}}``'s parameter has a name of | parameter's name (e.g., ``{{foo|bar}}``'s parameter has a name of | ||||
| ``"1"`` but it is hidden); otherwise, we'll make a safe and intelligent | ``"1"`` but it is hidden); otherwise, we'll make a safe and intelligent | ||||
| guess. If *name* is already a parameter, we'll replace its value while | guess. If *name* is already a parameter, we'll replace its value while | ||||
| keeping the same spacing rules unless *force_nonconformity* is | |||||
| ``True``. We will also try to guess the dominant spacing convention | |||||
| when adding a new parameter using :py:meth:`_get_spacing_conventions` | |||||
| unless *force_nonconformity* is ``True``. | |||||
| keeping the same spacing rules. We will also try to guess the dominant | |||||
| spacing convention when adding a new parameter using | |||||
| :py:meth:`_get_spacing_conventions`. | |||||
| If *before* is given (either a :py:class:`~.Parameter` object or a | |||||
| name), then we will place the parameter immediately before this one. | |||||
| Otherwise, it will be added at the end. This is ignored if the | |||||
| parameter already exists. | |||||
| If *preserve_spacing* is ``False``, we will avoid preserving spacing | |||||
| conventions when changing the value of an existing parameter or when | |||||
| adding a new one. | |||||
| """ | """ | ||||
| name, value = parse_anything(name), parse_anything(value) | name, value = parse_anything(name), parse_anything(value) | ||||
| self._surface_escape(value, "|") | self._surface_escape(value, "|") | ||||
| @@ -220,10 +230,10 @@ class Template(Node): | |||||
| self._surface_escape(value, "=") | self._surface_escape(value, "=") | ||||
| existing.showkey = showkey | existing.showkey = showkey | ||||
| nodes = existing.value.nodes | nodes = existing.value.nodes | ||||
| if force_nonconformity: | |||||
| existing.value = value | |||||
| else: | |||||
| if preserve_spacing: | |||||
| existing.value = parse_anything([nodes[0], value, nodes[1]]) | existing.value = parse_anything([nodes[0], value, nodes[1]]) | ||||
| else: | |||||
| existing.value = value | |||||
| return existing | return existing | ||||
| if showkey is None: | if showkey is None: | ||||
| @@ -245,22 +255,11 @@ class Template(Node): | |||||
| if not showkey: | if not showkey: | ||||
| self._surface_escape(value, "=") | self._surface_escape(value, "=") | ||||
| if not force_nonconformity: | |||||
| if preserve_spacing: | |||||
| before_n, after_n = self._get_spacing_conventions(use_names=True) | before_n, after_n = self._get_spacing_conventions(use_names=True) | ||||
| if before_n and after_n: | |||||
| name = parse_anything([before_n, name, after_n]) | |||||
| elif before_n: | |||||
| name = parse_anything([before_n, name]) | |||||
| elif after_n: | |||||
| name = parse_anything([name, after_n]) | |||||
| before_v, after_v = self._get_spacing_conventions(use_names=False) | before_v, after_v = self._get_spacing_conventions(use_names=False) | ||||
| if before_v and after_v: | |||||
| value = parse_anything([before_v, value, after_v]) | |||||
| elif before_v: | |||||
| value = parse_anything([before_v, value]) | |||||
| elif after_v: | |||||
| value = parse_anything([value, after_v]) | |||||
| name = parse_anything([before_n, name, after_n]) | |||||
| value = parse_anything([before_v, value, after_v]) | |||||
| param = Parameter(name, value, showkey) | param = Parameter(name, value, showkey) | ||||
| self.params.append(param) | self.params.append(param) | ||||