| @@ -29,5 +29,7 @@ class Node(StringMixIn): | |||
| from mwparserfromhell.nodes import extras | |||
| from mwparserfromhell.nodes.text import Text | |||
| from mwparserfromhell.nodes.heading import Heading | |||
| from mwparserfromhell.nodes.html_entity import HTMLEntity | |||
| from mwparserfromhell.nodes.tag import Tag | |||
| from mwparserfromhell.nodes.template import Template | |||
| @@ -20,4 +20,5 @@ | |||
| # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE | |||
| # SOFTWARE. | |||
| from mwparserfromhell.nodes.extras.attribute import Attribute | |||
| from mwparserfromhell.nodes.extras.parameter import Parameter | |||
| @@ -0,0 +1,50 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # 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 | |||
| # SOFTWARE. | |||
| from mwparserfromhell.string_mixin import StringMixIn | |||
| __all__ = ["Attribute"] | |||
| class Attribute(StringMixIn): | |||
| def __init__(self, name, value=None, quoted=True): | |||
| self._name = name | |||
| self._value = value | |||
| self._quoted = quoted | |||
| def __unicode__(self): | |||
| if self.value: | |||
| if self.quoted: | |||
| return unicode(self.name) + '="' + unicode(self.value) + '"' | |||
| return unicode(self.name) + "=" + unicode(self.value) | |||
| return unicode(self.name) | |||
| @property | |||
| def name(self): | |||
| return self._name | |||
| @property | |||
| def value(self): | |||
| return self._value | |||
| @property | |||
| def quoted(self): | |||
| return self._quoted | |||
| @@ -26,7 +26,7 @@ from mwparserfromhell.utils import parse_anything | |||
| __all__ = ["Parameter"] | |||
| class Parameter(StringMixIn): | |||
| def __init__(self, name, value=None, showkey=True): | |||
| def __init__(self, name, value, showkey=True): | |||
| self._name = name | |||
| self._value = value | |||
| self._showkey = showkey | |||
| @@ -0,0 +1,41 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # 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 | |||
| # SOFTWARE. | |||
| from mwparserfromhell.nodes import Node | |||
| __all__ = ["Heading"] | |||
| class Heading(Node): | |||
| def __init__(self, title, level): | |||
| self._title = title | |||
| self._level = level | |||
| def __unicode__(self): | |||
| return ("=" * self.level) + self.title + ("=" * self.level) | |||
| @property | |||
| def title(self): | |||
| return self._title | |||
| @property | |||
| def level(self): | |||
| return self._level | |||
| @@ -0,0 +1,98 @@ | |||
| # -*- coding: utf-8 -*- | |||
| # | |||
| # Copyright (C) 2012 Ben Kurtovic <ben.kurtovic@verizon.net> | |||
| # | |||
| # Permission is hereby granted, free of charge, to any person obtaining a copy | |||
| # of this software and associated documentation files (the "Software"), to deal | |||
| # in the Software without restriction, including without limitation the rights | |||
| # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell | |||
| # copies of the Software, and to permit persons to whom the Software is | |||
| # furnished to do so, subject to the following conditions: | |||
| # | |||
| # The above copyright notice and this permission notice shall be included in | |||
| # all copies or substantial portions of the Software. | |||
| # | |||
| # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR | |||
| # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, | |||
| # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE | |||
| # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER | |||
| # 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 | |||
| # SOFTWARE. | |||
| from mwparserfromhell.nodes import Node | |||
| from mwparserfromhell.nodes.extras import Attribute | |||
| __all__ = ["Tag"] | |||
| class Tag(Node): | |||
| TAG_UNKNOWN = 0 | |||
| TAG_BOLD = 1 | |||
| TAG_ITALIC = 2 | |||
| TAG_REF | |||
| TAG_MISC_HTML = 99 | |||
| TAGS_VISIBLE = [] | |||
| TAGS_INVISIBLE = [] | |||
| def __init__(self, type_, tag, contents, attrs=None, showtag=True, | |||
| self_closing=False, open_padding=0, close_padding=0): | |||
| self._type = type_ | |||
| self._tag = tag | |||
| self._contents = contents | |||
| if attrs: | |||
| self._attrs = attrs | |||
| else: | |||
| self._attrs = [] | |||
| self._showtag = showtag | |||
| self._self_closing = self_closing | |||
| self._open_padding = open_padding | |||
| self._close_padding = close_padding | |||
| def __unicode__(self): | |||
| if not self.showtag: | |||
| raise NotImplementedError() | |||
| result = "<" + unicode(self.tag) | |||
| if self.attrs: | |||
| result += " " + u" ".join([unicode(attr) for attr in self.attrs]) | |||
| if self.self_closing: | |||
| result += " " * self.open_padding + "/>" | |||
| else: | |||
| result += " " * self.open_padding + ">" + unicode(self.contents) | |||
| result += "</" + unicode(self.tag) + " " * self.close_padding + ">" | |||
| return result | |||
| @property | |||
| def type(self): | |||
| return self._type | |||
| @property | |||
| def tag(self): | |||
| return self._tag | |||
| @property | |||
| def contents(self): | |||
| return self._contents | |||
| @property | |||
| def attrs(self): | |||
| return self._attrs | |||
| @property | |||
| def showtag(self): | |||
| return self._showtag | |||
| @property | |||
| def self_closing(self): | |||
| return self._self_closing | |||
| @property | |||
| def open_padding(self): | |||
| return self._open_padding | |||
| @property | |||
| def close_padding(self): | |||
| return self._close_padding | |||
| @@ -22,7 +22,9 @@ | |||
| import re | |||
| from mwparserfromhell.nodes import HTMLEntity, Node, Template, Text | |||
| from mwparserfromhell.nodes import ( | |||
| Heading, HTMLEntity, Node, Tag, Template, Text | |||
| ) | |||
| from mwparserfromhell.string_mixin import StringMixIn | |||
| from mwparserfromhell.utils import parse_anything | |||
| @@ -39,7 +41,22 @@ class Wikicode(StringMixIn): | |||
| def _iterate_over_children(self, node): | |||
| yield (None, node) | |||
| if isinstance(node, Template): | |||
| if isinstance(node, Heading): | |||
| for child in self._get_all_nodes(node.title): | |||
| yield (node.title, child) | |||
| elif isinstance(node, Tag): | |||
| if node.showtag: | |||
| for child in self._get_all_nodes(node.tag): | |||
| yield (node.tag, tag) | |||
| for attr in node.attrs: | |||
| for child in self._get_all_nodes(attr.name): | |||
| yield (attr.name, child) | |||
| if attr.value: | |||
| for child in self._get_all_nodes(attr.value): | |||
| yield (attr.value, child) | |||
| for child in self._get_all_nodes(node.contents): | |||
| yield (node.contents, child) | |||
| elif isinstance(node, Template): | |||
| for child in self._get_all_nodes(node.name): | |||
| yield (node.name, child) | |||
| for param in node.params: | |||
| @@ -103,11 +120,38 @@ class Wikicode(StringMixIn): | |||
| last = lines.pop() | |||
| lines.append(last + " ".join(args)) | |||
| else: | |||
| lines.append(" " * indent + " ".join(args)) | |||
| lines.append(" " * 6 * indent + " ".join(args)) | |||
| for node in code.nodes: | |||
| if isinstance(node, Template): | |||
| write("{{", ) | |||
| if isinstance(node, Heading): | |||
| write("=" * node.level) | |||
| self._get_tree(node.title, lines, marker, indent + 1) | |||
| write("=" * node.level) | |||
| elif isinstance(node, Tag): | |||
| tagnodes = node.tag.nodes | |||
| if (not node.attrs and len(tagnodes) == 1 and | |||
| isinstance(tagnodes[0], Text)): | |||
| write("<" + unicode(tagnodes[0]) + ">") | |||
| else: | |||
| write("<") | |||
| self._get_tree(node.tag, lines, marker, indent + 1) | |||
| for attr in node.attrs: | |||
| self._get_tree(attr.name, lines, marker, indent + 1) | |||
| if not attr.value: | |||
| continue | |||
| write(" = ") | |||
| lines.append(marker) # Continue from this line | |||
| self._get_tree(attr.value, lines, marker, indent + 1) | |||
| write(">") | |||
| self._get_tree(node.contents, lines, marker, indent + 1) | |||
| if len(tagnodes) == 1 and isinstance(tagnodes[0], Text): | |||
| write("</" + unicode(tagnodes[0]) + ">") | |||
| else: | |||
| write("</") | |||
| self._get_tree(node.tag, lines, marker, indent + 1) | |||
| write(">") | |||
| elif isinstance(node, Template): | |||
| write("{{") | |||
| self._get_tree(node.name, lines, marker, indent + 1) | |||
| for param in node.params: | |||
| write(" | ") | |||
| @@ -209,14 +253,20 @@ class Wikicode(StringMixIn): | |||
| def strip_code(self, normalize=True, collapse=True): | |||
| nodes = [] | |||
| for node in self.nodes: | |||
| if isinstance(node, Text): | |||
| nodes.append(node) | |||
| if isinstance(node, Heading): | |||
| nodes.append(child.title) | |||
| elif isinstance(node, HTMLEntity): | |||
| if normalize: | |||
| nodes.append(node.normalize()) | |||
| else: | |||
| nodes.append(node) | |||
| elif isinstance(node, Tag): | |||
| if node.type in node.TAGS_VISIBLE: | |||
| nodes.append(node.contents.strip_code(normalize, collapse)) | |||
| elif isinstance(node, Text): | |||
| nodes.append(node) | |||
| nodes = map(unicode, nodes) | |||
| if collapse: | |||
| stripped = u"".join(nodes).strip("\n") | |||
| while "\n\n\n" in stripped: | |||