2
0
Fork 0
textout/textoutpc/tags/builtin/Text.py

161 lines
4.0 KiB
Python
Raw Normal View History

#!/usr/bin/env python3
2018-01-26 15:52:59 +01:00
from ..base import *
from ...color import get_color
__all__ = ["TextoutTextTag"]
# ---
# Data.
# ---
_big_size = 2.00
_sml_size = 0.75
_fonts = {
"arial": "Arial",
"comic": "Comic MS",
"tahoma": "Tahoma",
"courier": "Courier",
"haettenschweiler": "Haettenschweiler",
"mono": "monospace",
"monospace": "monospace"
}
# ---
# Tag definition.
# ---
class TextoutTextTag(TextoutInlineTag):
""" Main tag for setting text formatting.
Example uses:
[b]Bold text.[/b]
[i]Italic text.[/i]
[u]Underlined text.[/u]
[strike]Striked text.[/strike]
[font=arial]Arial text.[/font]
[arial]Arial text again.[/arial]
[blue]This will be in blue[/blue]
[color=blue]This as well[/color]
[color=rgb(255, 255, 255, 0.4)]BLACKNESS[/color]
[color=hsl(0, 100%, 0.5)]This will be red.[/color]
"""
aliases = ('[b]', '[i]', '[u]', '[s]', '[strike]',
'[monospace]', '[mono]', '[font]', '[color]',
'[size]', '[big]', '[small]',
'[arial]', '[comic]', '[tahoma]', '[courier]',
'[haettenschweiler]', '[red]', '[green]', '[blue]',
'[yellow]', '[maroon]', '[purple]', '[gray]',
'[grey]', '[brown]')
2018-01-16 13:34:11 +01:00
def prepare(self, name, value):
2018-01-22 20:49:30 +01:00
self._bold = False
self._italic = False
self._underline = False
self._strike = False
self._font = None
self._color = None
self._size = None
2018-01-16 13:34:11 +01:00
name = name[1:-1]
if name == "b":
2018-01-22 20:49:30 +01:00
self._bold = True
2018-01-16 13:34:11 +01:00
elif name == "i":
2018-01-22 20:49:30 +01:00
self._italic = True
2018-01-16 13:34:11 +01:00
elif name == "u":
2018-01-22 20:49:30 +01:00
self._underline = True
2018-01-16 13:34:11 +01:00
elif name in ("s", "strike"):
2018-01-22 20:49:30 +01:00
self._strike = True
2018-01-16 13:34:11 +01:00
elif name == "color":
2018-01-22 20:49:30 +01:00
self._color = get_color(value)
2018-01-16 13:34:11 +01:00
elif name == "font":
assert value in _fonts
2018-01-22 20:49:30 +01:00
self._font = value
elif name in ('size', 'big', 'small'):
if name != 'size':
value = name
if value == 'big':
self._size = _big_size
elif value == 'small':
self._size = _sml_size
else:
self._size = round(int(value) / 100.0, 2)
assert 0 < self._size <= 3.0
if self._size == 1.0:
self._size = None
2018-01-16 13:34:11 +01:00
elif name in _fonts:
2018-01-22 20:49:30 +01:00
self._font = value
else:
2018-01-22 20:49:30 +01:00
self._color = get_color(name)
def _get_css(self):
""" Get the `style` CSS classes and properties for HTML output. """
classes, props = [], []
if not self.tweak('obsolete_tags', True):
if self._bold:
props.append('font-weight: bold')
if self._italic:
props.append('font-style: italic')
if self._underline or self._strike:
props.append('text-decoration:{}{}'.format(' underline' \
if self._underline else '', ' line-through' \
if self._strike else ''))
2018-01-22 20:49:30 +01:00
if self._font:
props.append('font-family: ' + self._font)
2018-01-22 20:49:30 +01:00
if self._color:
# `transparent` is at least considered as a special value,
# or at most as an alias to `rgba(0,0,0,0)`.
if self._color[3] == 0.0:
props.append('color: transparent')
else:
# always append the #rgb color: it will be read by older
# browsers if the `rgba()` function isn't supported.
props.append('color: #%02X%02X%02X' % self._color[0:3])
if self._color[3] < 1.0:
props.append('color: rgba({}, {}, {}, {})' \
.format(*self._color))
2018-01-22 20:49:30 +01:00
if self._size:
props.append('font-size: {}em'.format(self._size))
2018-01-22 20:49:30 +01:00
return classes, props
def begin_html(self):
obsoletetags = self.tweak('obsolete_tags', True)
cls, props = self._get_css()
if cls or props:
props = '<span{}{}>'.format(' class="{}"'.format(' '.join(cls)) \
if cls else '', ' style="{}"'.format('; '.join(props)) \
if props else '')
else:
props = ''
return '' \
+ ('', '<b>')[obsoletetags and self._bold] \
+ ('', '<i>')[obsoletetags and self._italic] \
+ ('', '<u>')[obsoletetags and self._underline] \
+ ('', '<strike>')[obsoletetags and self._strike] \
+ props
def end_html(self):
obsoletetags = self.tweak('obsolete_tags', True)
return '' \
+ ('', '</span>')[any(self._get_css())] \
+ ('', '</strike>')[obsoletetags and self._strike] \
+ ('', '</u>')[obsoletetags and self._underline] \
+ ('', '</i>')[obsoletetags and self._italic] \
+ ('', '</b>')[obsoletetags and self._bold]
# End of file.