docs for each at http://daringfireball.net/projects/markdown/ and
http://michelf.com/projects/php-markdown/extra/ respectively.
-Pokédex links are represented with the extended syntax `[name]{type}`, e.g.,
-`[Eevee]{pokemon}`. The actual code that parses these is in spline-pokedex.
+Pokédex links are represented with the syntax `[text]{type:identifier}`, e.g.,
+`[Eevee]{pokemon:eevee}`. The actual code that parses these is in
+spline-pokedex.
"""
from __future__ import absolute_import
def __unicode__(self):
return self.source_text
+ def __str__(self):
+ return unicode(self.source_text).encode()
+
+ def __html__(self):
+ return self.as_html
+
@property
def as_html(self):
"""Returns the string as HTML4."""
- if self._as_html:
+ if self._as_html is not None:
return self._as_html
md = markdown.Markdown(
"""
return self.source_text
+def _markdownify_effect_text(move, effect_text):
+ effect_text = effect_text.replace(
+ u'$effect_chance',
+ unicode(move.effect_chance),
+ )
-class _MoveEffects(object):
- def __init__(self, effect_column, move):
- self.effect_column = effect_column
- self.move = move
-
- def __contains__(self, lang):
- return lang in self.move.move_effect.prose
-
- def __getitem__(self, lang):
- try:
- effect_text = getattr(self.move.move_effect.prose[lang], self.effect_column)
- except AttributeError:
- return None
- effect_text = effect_text.replace(
- u'$effect_chance',
- unicode(self.move.effect_chance),
- )
-
- return MarkdownString(effect_text)
+ return MarkdownString(effect_text)
class MoveEffectProperty(object):
- """Property that wraps a move effect. Used like this:
+ """Property that wraps move effects. Used like this:
MoveClass.effect = MoveEffectProperty('effect')
This class also performs simple substitution on the effect, replacing
`$effect_chance` with the move's actual effect chance.
+
+ Use `MoveEffectPropertyMap` for dict-like association proxies.
"""
def __init__(self, effect_column):
self.effect_column = effect_column
- def __get__(self, move, move_class):
- if move is None:
- # Don't crash with getattr on the class
- return NotImplemented
- return _MoveEffects(self.effect_column, move)['en']
-
-class MoveEffectsProperty(object):
- """Property that wraps move effects. Used like this:
-
- MoveClass.effects = MoveEffectProperty('effect')
-
- some_move.effects[lang] # returns a MarkdownString
- some_move.effects[lang].as_html # returns a chunk of HTML
+ def __get__(self, obj, cls):
+ prop = getattr(obj.move_effect, self.effect_column)
+ return _markdownify_effect_text(obj, prop)
- This class also performs simple substitution on the effect, replacing
- `$effect_chance` with the move's actual effect chance.
+class MoveEffectPropertyMap(MoveEffectProperty):
+ """Similar to `MoveEffectProperty`, but works on dict-like association
+ proxies.
"""
-
- def __init__(self, effect_column):
- self.effect_column = effect_column
-
- def __get__(self, move, move_class):
- return _MoveEffects(self.effect_column, move)
+ def __get__(self, obj, cls):
+ prop = getattr(obj.move_effect, self.effect_column)
+ newdict = dict(prop)
+ for key in newdict:
+ newdict[key] = _markdownify_effect_text(obj, newdict[key])
+ return newdict
class MarkdownColumn(sqlalchemy.types.TypeDecorator):
"""Generic SQLAlchemy column type for Markdown text.
impl = sqlalchemy.types.Unicode
def process_bind_param(self, value, dialect):
+ if value is None:
+ return None
+
if not isinstance(value, basestring):
# Can't assign, e.g., MarkdownString objects yet
raise NotImplementedError
return unicode(value)
def process_result_value(self, value, dialect):
+ if value is None:
+ return None
+
return MarkdownString(value)