Source code for neclib.core.formatting.dict_to_html
"""String or rich-text representation of NECLIB data types."""
__all__ = ["html_repr_of_dict"]
import re
from collections import defaultdict
from typing import Any, Dict, List, Optional, Type
[docs]def html_repr_of_dict(
__dict: Dict[Any, Any],
__type: Optional[Type[Any]] = None,
/,
*,
aliases: Optional[Dict[str, str]] = None,
metadata: Optional[Dict[str, Any]] = None,
) -> str:
"""Return a HTML representation of a dictionary.
Parameters
----------
__dict
Dictionary to be represented.
__type
Type of the object, which this dictionary represents.
metadata
Metadata to be included in the representation.
Returns
-------
rich_repr
The HTML representation of the dictionary.
"""
if __type is None:
__type = type(__dict)
if aliases is None:
aliases = {}
if metadata is None:
metadata = {}
pkg = getattr(__type, "__module__", "")
typename = getattr(__type, "__name__", str(__type))
type_repr = f"<span>{f'{pkg}.' if pkg else ''}{typename}</span><hr>"
element_repr = [
f"<tr><td>{k}</td><td><code>{v}</code></td><td>{type(v).__name__}</td></tr>"
for k, v in __dict.items()
]
metadata_repr = [
f"<tr><td>{k}</td><td><code>{v}</code></td><td>{type(v).__name__}</td></tr>"
for k, v in metadata.items()
]
_aliases: Dict[str, List[str]] = defaultdict(list)
# Reverse the aliases to show [Actual Key : Alias Key 1, Alias Key 2] style
# representation
for k, v in aliases.items():
_aliases[v].append(k)
alias_repr = [
f"<tr><td><code>{k}</code></td><td><code>{', '.join(v)}</code></td></tr>"
for k, v in _aliases.items()
]
repr_ = f"""
{type_repr}
<details><summary>{len(element_repr)} elements</summary>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Type</th>
</tr>
</thead>
<tbody>
{''.join(element_repr)}
</tbody>
</table>
</details>
<details><summary>{len(alias_repr)} elements have alias key(s)</summary>
<table>
<thead>
<tr>
<th>Key</th>
<th>Aliases</th>
</tr>
</thead>
<tbody>
{''.join(alias_repr)}
</tbody>
</table>
</details>
<details><summary>{len(metadata_repr)} metadata</summary>
<table>
<thead>
<tr>
<th>Key</th>
<th>Value</th>
<th>Type</th>
</tr>
</thead>
<tbody>
{''.join(metadata_repr)}
</tbody>
</table>
</details>
"""
return re.sub(r"\n\s*", "", repr_) # Remove all newlines and indentation