X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/c5f6490e3909ac1e8baa2930a48e794f1992d763..ae6e2afb5370c6c58d63738748ff2c9cc7edc724:/pokedex/db/markdown.py?ds=sidebyside diff --git a/pokedex/db/markdown.py b/pokedex/db/markdown.py index 0bc6971..1ad304c 100644 --- a/pokedex/db/markdown.py +++ b/pokedex/db/markdown.py @@ -5,8 +5,9 @@ The language used is a variation of Markdown and Markdown Extra. There are 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 @@ -31,11 +32,17 @@ class MarkdownString(object): 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( @@ -56,44 +63,45 @@ class MarkdownString(object): """ 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 MoveEffectsProperty(object): +class MoveEffectProperty(object): """Property that wraps move effects. Used like this: - MoveClass.effects = MoveEffectProperty('effect') + MoveClass.effect = MoveEffectProperty('effect') - some_move.effects[lang] # returns a MarkdownString - some_move.effects[lang].as_html # returns a chunk of HTML + some_move.effect # returns a MarkdownString + some_move.effect.as_html # returns a chunk of HTML 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): - return _MoveEffects(self.effect_column, move) + def __get__(self, obj, cls): + prop = getattr(obj.move_effect, self.effect_column) + return _markdownify_effect_text(obj, prop) + +class MoveEffectPropertyMap(MoveEffectProperty): + """Similar to `MoveEffectProperty`, but works on dict-like association + proxies. + """ + 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. @@ -105,6 +113,9 @@ class MarkdownColumn(sqlalchemy.types.TypeDecorator): 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 @@ -112,4 +123,7 @@ class MarkdownColumn(sqlalchemy.types.TypeDecorator): return unicode(value) def process_result_value(self, value, dialect): + if value is None: + return None + return MarkdownString(value)