import docutils.utils
from docutils.writers.html4css1 import Writer as HTMLWriter
+import sqlalchemy.types
+
### Subclasses of bits of docutils, to munge it into doing what I want
class HTMLFragmentWriter(HTMLWriter):
"""Translates reST to HTML, but only as a fragment. Enclosing <body>,
### Text roles
def generic_role(name, rawtext, text, lineno, inliner, options={}, content=[]):
- node = docutils.nodes.strong(text, rawtext, **options)
+ node = docutils.nodes.emphasis(rawtext, text, **options)
return [node], []
roles.register_local_role('ability', generic_role)
roles.register_local_role('item', generic_role)
roles.register_local_role('move', generic_role)
+roles.register_local_role('type', generic_role)
roles.register_local_role('pokemon', generic_role)
roles.register_local_role('mechanic', generic_role)
class MoveEffectProperty(object):
"""Property that wraps a move effect. Used like this:
- MoveClass.effect = MoveEffectProperty()
+ MoveClass.effect = MoveEffectProperty('effect')
some_move.effect # returns an RstString
some_move.effect.as_html # returns a chunk of HTML
lie and it doesn't yet.
"""
+ def __init__(self, effect_column):
+ self.effect_column = effect_column
+
def __get__(self, move, move_class):
# Attach a function for handling the `data` role
# XXX make this a little more fault-tolerant.. maybe..
newtext = getattr(move, text[5:])
return docutils.nodes.Text(newtext, rawtext)
- return RstString(move.move_effect.effect,
+ return RstString(getattr(move.move_effect, self.effect_column),
document_properties=dict(
_pokedex_handle_data=data_role_func))
+
+class RstTextColumn(sqlalchemy.types.TypeDecorator):
+ """Generic column type for reST text.
+
+ Do NOT use this for move effects! They need to know what move they belong
+ to so they can fill in, e.g., effect chances.
+ """
+ impl = sqlalchemy.types.Unicode
+
+ def process_bind_param(self, value, dialect):
+ return unicode(value)
+
+ def process_result_value(self, value, dialect):
+ return RstString(value)