""" Like the standard ![alt text](src.img title_text) image format in Markdown, but with two extra parameters. Usage: ![alt text](src.img title_text href figcapture) href: if not empty, encapsulates image in with the specified url figcapture: if not empty, encapsulates image in a
with the specified figcapture ALL PARAMETERS ARE MANDATORY! Parameters can be encapsulated in double-quotes. Use "" for empty parameter. """ from marko import inline from marko.helpers import MarkoExtension from . import utils class ExtendedImageElement(inline.InlineElement): pattern = r'!\[(.*)\]\(((?:[^"\s\\]|\\.)+|"(?:[^"\\]|\\.)*")\s((?:[^"\s\\]|\\.)+|"(?:[^"\\]|\\.)*")\s((?:[^"\s\\]|\\.)+|"(?:[^"\\]|\\.)*")\s((?:[^"\s\\]|\\.)+|"(?:[^"\\]|\\.)*")\)' parse_children = True def __init__(self, match): self.alt = self.__strip_quotes(match.group(1)) self.src = self.__strip_quotes(match.group(2)) self.title = self.__strip_quotes(match.group(3)) self.href = self.__strip_quotes(match.group(4)) self.figcaption = self.__strip_quotes(match.group(5)) @staticmethod def __strip_quotes(text: str) -> str: if text.startswith('"'): return text[1:-1] return text def __create_image_renderer(filters: list[str]): class ExtendedImageRenderer: FILTERS = filters def render_extended_image_element(self, element): img = f'{element.alt}' if element.href != "": img = f'{img}' if element.figcaption != "": img = f"
{img}
{element.figcaption}
" return img return ExtendedImageRenderer def get_image_renderer(filters: list[str] = None): if filters is None: filters = [] return MarkoExtension( elements=[ExtendedImageElement], renderer_mixins=[__create_image_renderer(filters)] )