implement image caption processing
This commit is contained in:
parent
9b4e18d607
commit
064bc8fc84
1 changed files with 46 additions and 2 deletions
|
@ -29,7 +29,46 @@ from zona.log import get_logger
|
||||||
logger = get_logger()
|
logger = get_logger()
|
||||||
|
|
||||||
|
|
||||||
class ZonaLinkProcessor(Treeprocessor):
|
class ZonaImageTreeprocessor(Treeprocessor):
|
||||||
|
"""Implement Zona's image caption rendering."""
|
||||||
|
|
||||||
|
def __init__(self, md: Markdown):
|
||||||
|
super().__init__()
|
||||||
|
self.md: Markdown = md
|
||||||
|
|
||||||
|
@override
|
||||||
|
def run(self, root: etree.Element):
|
||||||
|
for parent in root.iter():
|
||||||
|
for idx, child in enumerate(list(parent)):
|
||||||
|
if (
|
||||||
|
child.tag == "p"
|
||||||
|
and len(child) == 1
|
||||||
|
and child[0].tag == "img"
|
||||||
|
):
|
||||||
|
img = child[0]
|
||||||
|
div = etree.Element(
|
||||||
|
"div", {"class": "image-container"}
|
||||||
|
)
|
||||||
|
div.append(img)
|
||||||
|
title = img.attrib.get("alt", "")
|
||||||
|
if title:
|
||||||
|
raw_caption = self.md.convert(title)
|
||||||
|
caption_html = raw_caption.strip()
|
||||||
|
if caption_html.startswith(
|
||||||
|
"<p>"
|
||||||
|
) and caption_html.endswith("</p>"):
|
||||||
|
caption_html = caption_html[3:-4]
|
||||||
|
caption = etree.Element("small")
|
||||||
|
caption.text = "" # should be rendered
|
||||||
|
caption_html_element = etree.fromstring(
|
||||||
|
f"<span>{caption_html}</span>"
|
||||||
|
)
|
||||||
|
caption.append(caption_html_element)
|
||||||
|
div.append(caption)
|
||||||
|
parent[idx] = div
|
||||||
|
|
||||||
|
|
||||||
|
class ZonaLinkTreeprocessor(Treeprocessor):
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
config: ZonaConfig | None,
|
config: ZonaConfig | None,
|
||||||
|
@ -123,12 +162,17 @@ def md_to_html(
|
||||||
"md_to_html() missing source and ctx when resolve_links is true"
|
"md_to_html() missing source and ctx when resolve_links is true"
|
||||||
)
|
)
|
||||||
md.treeprocessors.register(
|
md.treeprocessors.register(
|
||||||
item=ZonaLinkProcessor(
|
item=ZonaLinkTreeprocessor(
|
||||||
config, resolve_links, source, layout, item_map
|
config, resolve_links, source, layout, item_map
|
||||||
),
|
),
|
||||||
name="zona_links",
|
name="zona_links",
|
||||||
priority=15,
|
priority=15,
|
||||||
)
|
)
|
||||||
|
md.treeprocessors.register(
|
||||||
|
item=ZonaImageTreeprocessor(md),
|
||||||
|
name="zona_images",
|
||||||
|
priority=17,
|
||||||
|
)
|
||||||
return md.convert(content)
|
return md.convert(content)
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue