From 7805e02f499e68407c565b614328ba56c62611e4 Mon Sep 17 00:00:00 2001 From: "martin f. krafft" Date: Tue, 21 Nov 2023 14:47:46 +0100 Subject: [PATCH] manage context for blockquote within admonition --- .config/neomutt/buildmimetree.py | 41 +++++++++++++++++++++++++++++--- .config/neomutt/htmlmail.css | 34 +++++++++++++++----------- 2 files changed, 58 insertions(+), 17 deletions(-) diff --git a/.config/neomutt/buildmimetree.py b/.config/neomutt/buildmimetree.py index c541ed1..d1f9eaa 100755 --- a/.config/neomutt/buildmimetree.py +++ b/.config/neomutt/buildmimetree.py @@ -47,6 +47,7 @@ import bs4 import xml.etree.ElementTree as etree import io import enum +from contextlib import contextmanager from collections import namedtuple, OrderedDict from markdown.extensions import Extension from markdown.blockprocessors import BlockProcessor @@ -482,8 +483,12 @@ class QuoteToAdmonitionExtension(Extension): def __init__(self, parser): super().__init__(parser) self._title = None + self._disable = False def test(self, parent, blocks): + if self._disable: + return False + if markdown.util.nearing_recursion_limit(): return False @@ -519,9 +524,16 @@ class QuoteToAdmonitionExtension(Extension): self.parser.parseChunk(admonition, self._title) admonition[0].set("class", "admonition-title") - self.parser.parseChunk( - admonition, "\n".join(self.clean(line) for line in quotelines) - ) + with self.disable(): + self.parser.parseChunk( + admonition, "\n".join(quotelines) + ) + + @contextmanager + def disable(self): + self._disable = True + yield True + self._disable = False @classmethod def clean(klass, line): @@ -2037,6 +2049,29 @@ try: p = quote.p.extract() assert p.contents[1].name == "strong" + @pytest.mark.converter + def test_converter_attribution_to_admonition_with_blockquote( + self, fakepath, fakefilefactory + ): + mailparts = ( + "Regarding whatever", + "> blockquote line1", + "> blockquote line2", + "> ", + "> new para with **bold** text", + ) + with fakefilefactory( + fakepath, content="\n".join(mailparts) + ) as draft_f: + convert_markdown_to_html(draft_f, filefactory=fakefilefactory) + + soup = bs4.BeautifulSoup( + fakefilefactory[fakepath.with_suffix(".html")].read(), + "html.parser", + ) + quote = soup.select_one("div.admonition.quote") + assert quote.blockquote + @pytest.mark.converter def test_converter_attribution_to_admonition_multiple( self, fakepath, fakefilefactory diff --git a/.config/neomutt/htmlmail.css b/.config/neomutt/htmlmail.css index ef23086..7003a34 100644 --- a/.config/neomutt/htmlmail.css +++ b/.config/neomutt/htmlmail.css @@ -29,6 +29,26 @@ body, .signature, #signature { font-family: Lato, Calibri, Tahoma, sans-serif; } margin: 0.5em; } +.block { + padding: 0 0.5em; + margin: 0; + font-style: italic; + border-left: 2px solid #eee; +} +blockquote, .blockquote { + padding: 0 0.5em; + margin: 0; + font-style: italic; + border-left: 2px solid #666; + color: #666; + font-size: 80%; +} + +.admonition blockquote { + font-size: inherit; + border-left: inherit; +} + table, th, td { border-collapse: collapse; border: 1px solid #999; @@ -55,20 +75,6 @@ h6 { font-size: 100%; } a { text-decoration:none; color:#3a5dae; } a:visited { color:#3a5dae; } a:hover { text-decoration:underline; } -.block { - padding: 0 0.5em; - margin: 0; - font-style: italic; - border-left: 2px solid #eee; -} -blockquote { - padding: 0 0.5em; - margin: 0; - font-style: italic; - border-left: 2px solid #666; - color: #666; - font-size: 80%; -} /*.quotelead { margin-bottom: -1em; font-size: 80%; -- 2.39.5