Source code for pyiem.htmlgen
"""
Utility functions that generate HTML.
"""
from pyiem.network import Table as NetworkTable
[docs]
def station_select(
network, selected, name, select_all=False, only_online=False
) -> str:
"""Select a station from a given network.
Args:
network (str): IEM Network identifier.
selected (str): The option value to flag as selected.
name (str): The HTML select name attribute.
select_all (bool): Add an option with key of `_ALL`.
only_online (bool): Include stations in the network that are online only,
default is `False`.
Returns
-------
html_string
"""
nt = NetworkTable(network, only_online=only_online)
ar = {}
for sid in nt.sts:
meta = nt.sts[sid]
ab = "" if meta["archive_begin"] is None else meta["archive_begin"]
ae = "now" if meta["archive_end"] is None else meta["archive_end"]
ar[sid] = f"{meta['name']} [{ab} till {ae}]"
if select_all:
ar["_ALL"] = " -- All Sites --"
return make_select(name, selected, ar, cssclass="iemselect2")
[docs]
def make_select(
name,
selected,
data,
jscallback=None,
cssclass=None,
multiple=False,
showvalue=True,
) -> str:
"""Generate a HTML select element.
The trick here is what ``data`` looks like. The basic form is a ``dict``.
You can get ``optgroup`` by having the dictionary keys be additional
lists or dicts.
Args:
name (str): The select name attribute to assign.
selected (mixed): The option value that should be set to selected.
data (dict): The structure to build our select from.
jscallback (str): javascript to place in the ``onChange`` attribute.
cssclass (str): CSS class to assign to the select element.
showvalue (bool): Should option label be prepended by key label.
Returns
-------
html_string
"""
if not isinstance(selected, (list, tuple)):
selected = [selected]
s = '<select name="%s"%s%s%s>\n' % (
name,
(
""
if jscallback is None
else f' onChange="{jscallback}(this.value)"'
),
"" if cssclass is None else f' class="{cssclass}"',
"" if not multiple else " MULTIPLE",
)
for key, val in data.items():
if isinstance(val, (tuple, list)):
val = dict(list(zip(val, val, strict=False)))
if not isinstance(val, dict): # simple
s += '<option value="%s"%s>%s%s</option>\n' % (
key,
' selected="selected"' if key in selected else "",
f"[{key}] " if showvalue else "",
val,
)
continue
s += f'<optgroup label="{key}">\n'
for key2, val2 in val.items():
s += '<option value="%s"%s>%s%s</option>\n' % (
key2,
' selected="selected"' if key2 in selected else "",
f"[{key2}] " if showvalue else "",
val2,
)
s += "</optgroup>\n"
s += "</select>\n"
return s