Implemented rst as_text, for showing short move effects outside the Web.

This commit is contained in:
Eevee 2010-03-13 18:49:09 -08:00
parent e0aeb771b2
commit 47f5953457

View file

@ -41,6 +41,7 @@ import docutils.nodes
from docutils.parsers.rst import Parser, roles from docutils.parsers.rst import Parser, roles
import docutils.utils import docutils.utils
from docutils.writers.html4css1 import Writer as HTMLWriter from docutils.writers.html4css1 import Writer as HTMLWriter
from docutils.writers import UnfilteredWriter
import sqlalchemy.types import sqlalchemy.types
@ -54,6 +55,53 @@ class HTMLFragmentWriter(HTMLWriter):
subs = self.interpolation_dict() subs = self.interpolation_dict()
return subs['body'] return subs['body']
class TextishTranslator(docutils.nodes.SparseNodeVisitor):
"""A simple translator that tries to return plain text that still captures
the spirit of the original (basic) formatting.
This will probably not be useful for anything complicated; it's only meant
for extremely simple text.
"""
def __init__(self, document):
self.document = document
self.translated = u''
def visit_Text(self, node):
"""Text is left alone."""
self.translated += node.astext()
def depart_paragraph(self, node):
"""Append a blank line after a paragraph, unless it's the last of its
siblings.
"""
if not node.parent:
return
# Loop over siblings. If we see a sibling after we see this node, then
# append the blank line
seen_node = False
for sibling in node.parent:
if sibling is node:
seen_node = True
continue
if seen_node:
self.translated += u'\n\n'
return
class TextishWriter(UnfilteredWriter):
"""Translates reST back into plain text, aka more reST. Difference is that
custom roles are handled, so you get "50% chance" instead of junk.
"""
def translate(self):
visitor = TextishTranslator(self.document)
self.document.walkabout(visitor)
self.output = visitor.translated
class UnicodeOutput(Output): class UnicodeOutput(Output):
"""reST Unicode output. The distribution only has a StringOutput, and I """reST Unicode output. The distribution only has a StringOutput, and I
want me some Unicode. want me some Unicode.
@ -147,6 +195,16 @@ class RstString(object):
writer = HTMLFragmentWriter() writer = HTMLFragmentWriter()
return writer.write(document, destination) return writer.write(document, destination)
@property
def as_text(self):
"""Returns the string mostly unchanged, save for our custom roles."""
document = self.rest_document
destination = UnicodeOutput()
writer = TextishWriter()
return writer.write(document, destination)
class MoveEffectProperty(object): class MoveEffectProperty(object):
"""Property that wraps a move effect. Used like this: """Property that wraps a move effect. Used like this: