diff --git a/mwparserfromhell/nodes/html_entity.py b/mwparserfromhell/nodes/html_entity.py index 7aa5034..b849fee 100644 --- a/mwparserfromhell/nodes/html_entity.py +++ b/mwparserfromhell/nodes/html_entity.py @@ -27,8 +27,10 @@ from mwparserfromhell.nodes import Node __all__ = ["HTMLEntity"] class HTMLEntity(Node): - def __init__(self, value, named, hexadecimal=False): + def __init__(self, value, named=None, hexadecimal=False): self._value = value + if named is None: # Try to guess whether or not the entity is named + named = False if isinstance(value, int) else True self._named = named self._hexadecimal = hexadecimal diff --git a/mwparserfromhell/nodes/template.py b/mwparserfromhell/nodes/template.py index 1880680..6a439e2 100644 --- a/mwparserfromhell/nodes/template.py +++ b/mwparserfromhell/nodes/template.py @@ -20,7 +20,7 @@ # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. -from mwparserfromhell.nodes import Node +from mwparserfromhell.nodes import HTMLEntity, Node from mwparserfromhell.nodes.extras import Parameter from mwparserfromhell.utils import parse_anything @@ -41,8 +41,14 @@ class Template(Node): else: return "{{" + unicode(self.name) + "}}" + def _surface_escape(self, code, char): + replacement = HTMLEntity(value=ord(char)) + for node in code.filter_text(recursive=False): + if char in node: + code.replace(node, node.replace(char, replacement)) + def _blank_param_value(self, value): # TODO - pass + pass # MAKE VALUE CONTAIN ABSOLUTELY TWO TEXT NODES: FIRST IS SPACING BEFORE CHUNK AND SECOND IS SPACING AFTER CHUNK @property def name(self): @@ -68,30 +74,31 @@ class Template(Node): def add(self, name, value, showkey=None): name, value = parse_anything(name), parse_anything(value) - surface_text = value.filter_text(recursive=False) - for node in surface_text: - value.replace(node, node.replace("|", "|")) + self._surface_escape(value, "|") + + if self.has_param(name): + self.remove(name, keep_field=True) + existing = self.get(name) + if showkey is None: # Infer showkey from current value + showkey = existing.showkey + if not showkey: + self._surface_escape(value, "=") + nodes = existing.value.nodes + existing.value = parse_anything([nodes[0], value, nodes[1]]) + return existing if showkey is None: - if any(["=" in node for node in surface_text]): - showkey = True + try: + int(name) + except ValueError: + showkey = False else: - try: - int(name) - except ValueError: - showkey = False - else: - showkey = True - elif not showkey: - for node in surface_text: - value.replace(node, node.replace("=", "|")) - - if self.has_param(name): - self.remove_param(name, keep_field=True) - existing = self.get_param(name).value - self.get_param(name).value = value # CONFORM TO FORMATTING? - else: - self.params.append(Parameter(name, value, showkey)) # CONFORM TO FORMATTING CONVENTIONS? + showkey = True + if not showkey: + self._surface_escape(value, "=") + param = Parameter(name, value, showkey) # CONFORM TO FORMATTING CONVENTIONS? + self.params.append(param) + return param def remove(self, name, keep_field=False): # DON'T MESS UP NUMBERING WITH show_key = False AND keep_field = False name = name.strip() if isinstance(name, basestring) else unicode(name) diff --git a/mwparserfromhell/utils.py b/mwparserfromhell/utils.py index 52878cc..9357d45 100644 --- a/mwparserfromhell/utils.py +++ b/mwparserfromhell/utils.py @@ -24,17 +24,17 @@ import mwparserfromhell from mwparserfromhell.nodes import Node def parse_anything(value): - Wikicode = mwparserfromhell.wikicode.Wikicode - if isinstance(value, Wikicode): + wikicode = mwparserfromhell.wikicode.Wikicode + if isinstance(value, wikicode): return value if isinstance(value, Node): - return Wikicode([value]) + return wikicode([value]) if isinstance(value, basestring): return mwparserfromhell.parse(value) if isinstance(value, int): return mwparserfromhell.parse(unicode(value)) if value is None: - return Wikicode([]) + return wikicode([]) try: nodelist = [] for item in value: @@ -42,4 +42,4 @@ def parse_anything(value): except TypeError: error = "Needs string, Node, Wikicode, int, None, or iterable of these, but got {0}: {1}" raise ValueError(error.format(type(value), value)) - return Wikicode(nodelist) + return wikicode(nodelist) diff --git a/mwparserfromhell/wikicode.py b/mwparserfromhell/wikicode.py index 5f81e23..e133fec 100644 --- a/mwparserfromhell/wikicode.py +++ b/mwparserfromhell/wikicode.py @@ -134,7 +134,7 @@ class Wikicode(StringMixIn): raise ValueError("Cannot coerce multiple nodes into one index") if index >= len(self.nodes) or -1 * index > len(self.nodes): raise IndexError("List assignment index out of range") - self.nodex.pop(index) + self.nodes.pop(index) if nodes: self.nodes[index] = nodes[0]