import html
from htbuilder import H, HtmlElement, styles
from htbuilder.units import unit
# Only works in 3.7+: from htbuilder import div, span
div = H.div
span = H.span
# Only works in 3.7+: from htbuilder.units import px, rem, em
px = unit.px
rem = unit.rem
em = unit.em
# Colors from the Streamlit palette.
# These are red-70, orange-70, ..., violet-70, gray-70.
PALETTE = [
"#ff4b4b",
"#ffa421",
"#ffe312",
"#21c354",
"#00d4b1",
"#00c0f2",
"#1c83e1",
"#803df5",
"#808495",
]
OPACITIES = [
"33", "66",
]
def annotation(body, label="", background=None, color=None, **style):
"""
from https://github.com/tvst/st-annotated-text/blob/master/annotated_text/util.py
"""
color_style = {}
if color:
color_style['color'] = color
if not background:
label_sum = sum(ord(c) for c in label)
background_color = PALETTE[label_sum % len(PALETTE)]
background_opacity = OPACITIES[label_sum % len(OPACITIES)]
background = background_color + background_opacity
return (
span(
style=styles(
background=background,
border_radius=rem(0.33),
padding=(rem(0.125), rem(0.5)),
overflow="hidden",
**color_style,
**style,
))(
html.escape(body),
span(
style=styles(
padding_left=rem(0.5),
text_transform="uppercase",
))(
span(
style=styles(
font_size=em(0.67),
opacity=0.5,
))(
html.escape(label),
),
),
)
)
def get_annotated_html(*args):
out = div()
for arg in args:
if isinstance(arg, str):
out(html.escape(arg))
elif isinstance(arg, HtmlElement):
out(arg)
elif isinstance(arg, tuple):
out(annotation(*arg))
elif isinstance(arg,list):
for el in arg:
if isinstance(el, str):
out(html.escape(el))
elif isinstance(el, HtmlElement):
out(el)
elif isinstance(el, tuple):
out(annotation(*el))
else:
raise Exception("Oh noes!")
return str(out)