from .numbers import number_to_scientific_html
from .string import StrPrinter
def _html_clsname(key):
return "chempy_" + key.replace(
'+', 'plus').replace(
'-', 'minus').replace(
'(', 'leftparen').replace(
')', 'rightparen')
_html_semicolon = '; '
[docs]class HTMLPrinter(StrPrinter):
printmethod_attr = '_html'
_default_settings = dict(
StrPrinter._default_settings,
repr_name='html',
Equilibrium_arrow='↔',
Reaction_arrow='→',
Reaction_param_separator=_html_semicolon,
magnitude_fmt=number_to_scientific_html
)
def _print_Substance(self, s, **kwargs):
return s.html_name or s.name
def _print_ReactionSystem(self, rsys, **kwargs):
return super(HTMLPrinter, self)._print_ReactionSystem(rsys, **kwargs).replace('\n', '<br>\n')
[docs]def html(obj, **settings):
return HTMLPrinter(settings).doprint(obj)
[docs]class CSSPrinter(HTMLPrinter):
def _print_Substance(self, s, **kwargs):
key = s.name
name = s.html_name or key
common_sty = 'border-radius: 5pt; padding: 0pt 3pt 0pt 3pt;'
colors = self._get('colors', **kwargs)
if key in colors:
style = 'background-color:#%s; border: 1px solid #%s; %s' % (colors[key] + (common_sty,))
else:
style = common_sty
fmt = '<span class="%s" style="%s">%s</span>'
return fmt % (_html_clsname(key), style, name)
def _tr_id(self, rsys, i):
return 'chempy_%d_%d' % (id(rsys), i)
def _print_ReactionSystem(self, rsys, **kwargs):
sep = '</td><td style="text-align:left;"> '
around = '</td><td style="text-align:center;">', '</td><td style="text-align:left;">'
# cf. https://github.com/jupyter/notebook/issues/2160#issuecomment-352216152
row_template = '<tr class="%s"><td style="text-align:right;">%s</td></tr>'
rows = [row_template % (self._tr_id(rsys, i), s) for i, s in enumerate(map(
lambda r: self._print(r, Reaction_param_separator=sep, Reaction_around_arrow=around),
rsys.rxns
))]
tab_template = '<table class="chempy_ReactionSystem chempy_%d">%s%s</table>'
header = '<tr><th style="text-align:center;" colspan="5">%s</th></tr>' % (rsys.name or '')
return tab_template % (id(rsys), header, '\n\n'.join(rows))
[docs]def css(obj, **settings):
return CSSPrinter(settings).doprint(obj)