@@ -31,6 +31,10 @@ class Node(StringMixIn): | |||
def __strip__(self, normalize, collapse): | |||
return None | |||
def __showtree__(self, write, get, mark): | |||
write(unicode(self)) | |||
from mwparserfromhell.nodes import extras | |||
from mwparserfromhell.nodes.text import Text | |||
from mwparserfromhell.nodes.heading import Heading | |||
@@ -40,6 +40,11 @@ class Heading(Node): | |||
def __strip__(self, normalize, collapse): | |||
return self.title | |||
def __showtree__(self, write, get, mark): | |||
write("=" * self.level) | |||
get(self.title) | |||
write("=" * self.level) | |||
@property | |||
def title(self): | |||
return self._title | |||
@@ -20,8 +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.extras import Attribute | |||
from mwparserfromhell.nodes import Node, Text | |||
__all__ = ["Tag"] | |||
@@ -86,7 +85,7 @@ class Tag(Node): | |||
if not self.showtag: | |||
open_, close = self._translate() | |||
if self.self_closing: | |||
return _open | |||
return open_ | |||
else: | |||
return open_ + unicode(self.contents) + close | |||
@@ -104,7 +103,7 @@ class Tag(Node): | |||
yield None, self | |||
if self.showtag: | |||
for child in getter(self.tag): | |||
yield self.tag, tag | |||
yield self.tag, child | |||
for attr in self.attrs: | |||
for child in getter(attr.name): | |||
yield attr.name, child | |||
@@ -119,7 +118,31 @@ class Tag(Node): | |||
return self.contents.strip_code(normalize, collapse) | |||
return None | |||
def translate(self): | |||
def __showtree__(self, write, get, mark): | |||
tagnodes = self.tag.nodes | |||
if (not self.attrs and len(tagnodes) == 1 and | |||
isinstance(tagnodes[0], Text)): | |||
write("<" + unicode(tagnodes[0]) + ">") | |||
else: | |||
write("<") | |||
get(self.tag) | |||
for attr in self.attrs: | |||
get(attr.name) | |||
if not attr.value: | |||
continue | |||
write(" = ") | |||
mark() | |||
get(attr.value) | |||
write(">") | |||
get(self.contents) | |||
if len(tagnodes) == 1 and isinstance(tagnodes[0], Text): | |||
write("</" + unicode(tagnodes[0]) + ">") | |||
else: | |||
write("</") | |||
get(self.tag) | |||
write(">") | |||
def _translate(self): | |||
translations = { | |||
self.TAG_ITALIC: ("''", "''"), | |||
self.TAG_BOLD: ("'''", "'''"), | |||
@@ -57,6 +57,18 @@ class Template(Node): | |||
for child in getter(param.value): | |||
yield param.value, child | |||
def __showtree__(self, write, get, mark): | |||
write("{{") | |||
get(self.name) | |||
for param in self.params: | |||
write(" | ") | |||
mark() | |||
get(param.name) | |||
write(" = ") | |||
mark() | |||
get(param.value) | |||
write("}}") | |||
def _surface_escape(self, code, char): | |||
replacement = HTMLEntity(value=ord(char)) | |||
for node in code.filter_text(recursive=False): | |||
@@ -22,9 +22,7 @@ | |||
import re | |||
from mwparserfromhell.nodes import ( | |||
Heading, HTMLEntity, Node, Tag, Template, Text | |||
) | |||
from mwparserfromhell.nodes import Node, Template, Text | |||
from mwparserfromhell.string_mixin import StringMixIn | |||
from mwparserfromhell.utils import parse_anything | |||
@@ -95,47 +93,10 @@ class Wikicode(StringMixIn): | |||
else: | |||
lines.append(" " * 6 * indent + " ".join(args)) | |||
get = lambda code: self._get_tree(code, lines, marker, indent + 1) | |||
mark = lambda: lines.append(marker) | |||
for node in code.nodes: | |||
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(" | ") | |||
lines.append(marker) # Continue from this line | |||
self._get_tree(param.name, lines, marker, indent + 1) | |||
write(" = ") | |||
lines.append(marker) # Continue from this line | |||
self._get_tree(param.value, lines, marker, indent + 1) | |||
write("}}") | |||
else: | |||
write(unicode(node)) | |||
node.__showtree__(write, get, mark) | |||
return lines | |||
@property | |||