X-Git-Url: https://git.madduck.net/etc/neomutt.git/blobdiff_plain/7767b3c3fd519d71c1f90e26c07084ba6b99702d..bf0bab9455ead702b0782cc208ebbd522919c31f:/.config/neomutt/buildmimetree.py diff --git a/.config/neomutt/buildmimetree.py b/.config/neomutt/buildmimetree.py index 2dac39c..d033bda 100755 --- a/.config/neomutt/buildmimetree.py +++ b/.config/neomutt/buildmimetree.py @@ -140,26 +140,29 @@ class Multipart( return f" children={len(self.children)}" -def convert_markdown_to_html(maildraft, *, extensions=None): - draftpath = pathlib.Path(maildraft) - with open(draftpath, "r", encoding="utf-8") as textmarkdown: - text = textmarkdown.read() +def convert_markdown_to_html( + origtext, draftpath, *, filewriter_fn=None, extensions=None +): mdwn = markdown.Markdown(extensions=extensions) + if not filewriter_fn: + + def filewriter_fn(path, content, mode="w", **kwargs): + with open(path, mode, **kwargs) as out_f: + out_f.write(content) - with open(draftpath, "w", encoding="utf-8") as textplain: - textplain.write(text) + filewriter_fn(draftpath, origtext, encoding="utf-8") textpart = Part( "text", "plain", draftpath, "Plain-text version", orig=True ) - html = mdwn.convert(text) + htmltext = mdwn.convert(origtext) + htmlpath = draftpath.with_suffix(".html") - with open( - htmlpath, "w", encoding="utf-8", errors="xmlcharrefreplace" - ) as texthtml: - texthtml.write(html) + filewriter_fn( + htmlpath, htmltext, encoding="utf-8", errors="xmlcharrefreplace" + ) htmlpart = Part("text", "html", htmlpath, "HTML version") logopart = Part( @@ -301,6 +304,8 @@ def do_setup( editor = f"{sys.argv[0]} massage --write-commands-to {temppath}" if extensions: editor = f'{editor} --extensions {",".join(extensions)}' + if debug_commands: + editor = f'{editor} --debug-commands' cmds.cmd('set my_editor="$editor"') cmds.cmd('set my_edit_headers="$edit_headers"') @@ -312,7 +317,8 @@ def do_setup( def do_massage( - maildraft, + draft_f, + draftpath, cmd_f, *, extensions=None, @@ -339,7 +345,7 @@ def do_massage( cmds.flush() extensions = extensions.split(",") if extensions else [] - tree = converter(maildraft, extensions=extensions) + tree = converter(draft_f.read(), draftpath, extensions=extensions) mimetree = MIMETreeDFWalker(debug=debug_walk) @@ -370,8 +376,6 @@ def do_massage( # tree now: if item.cid: cmds.push(f"\\Ca\\Ck{item.cid}") - if item.desc: - cmds.push(f"\\Ca\\Ck{item.desc}") elif isinstance(item, Multipart): # This node has children, but we already visited them (see @@ -385,14 +389,14 @@ def do_massage( elif item.subtype == "multilingual": cmds.push("") - # Again, if there is a description, we might just as well: - if item.desc: - cmds.push(f"\\Ca\\Ck{item.desc}") - else: # We should never get here assert not "is valid part" + # If the item has a description, we might just as well add it + if item.desc: + cmds.push(f"\\Ca\\Ck{item.desc}") + # Finally, if we're at non-root level, tag the new container, # as it might itself be part of a container, to be processed # one level up: @@ -429,9 +433,12 @@ if __name__ == "__main__": do_setup(args.extensions, debug_commands=args.debug_commands) elif args.mode == "massage": - with open(args.cmdpath, "w") as cmd_f: + with open(args.MAILDRAFT, "r") as draft_f, open( + args.cmdpath, "w" + ) as cmd_f: do_massage( - args.MAILDRAFT, + draft_f, + pathlib.Path(args.MAILDRAFT), cmd_f, extensions=args.extensions, debug_commands=args.debug_commands, @@ -443,6 +450,7 @@ if __name__ == "__main__": try: import pytest + from io import StringIO class Tests: @pytest.fixture @@ -589,31 +597,44 @@ try: assert lines[2].endswith(f'{const2},{const1}"') assert lines[4].endswith(const1) - def test_do_massage_basic(self, const1, capsys): - def converter(maildraft, extensions): - return Part("text", "plain", "/dev/null", orig=True) + @pytest.fixture + def string_io(self, const1, text=None): + return StringIO(text or const1) - do_massage(maildraft=const1, cmd_f=sys.stdout, converter=converter) - captured = capsys.readouterr() - assert ( - captured.out.strip() - == """\ - set editor="$my_editor" - set edit_headers="$my_edit_headers" - unset my_editor - unset my_edit_headers - source 'rm -f pytest_internal_file|' - unset my_mdwn_postprocess_cmd_file - """.replace( - " ", "" - ).strip() + def test_do_massage_basic(self, const1, string_io, capsys): + def converter(drafttext, draftpath, extensions): + return Part("text", "plain", draftpath, orig=True) + + do_massage( + draft_f=string_io, + draftpath=const1, + cmd_f=sys.stdout, + converter=converter, ) - def test_do_massage_fulltree(self, const1, basic_mime_tree, capsys): - def converter(maildraft, extensions): + captured = capsys.readouterr() + lines = captured.out.splitlines() + assert '="$my_editor"' in lines.pop(0) + assert '="$my_edit_headers"' in lines.pop(0) + assert "unset my_editor" == lines.pop(0) + assert "unset my_edit_headers" == lines.pop(0) + assert "update-encoding" in lines.pop(0) + assert "source 'rm -f " in lines.pop(0) + assert "unset my_mdwn_postprocess_cmd_file" == lines.pop(0) + + def test_do_massage_fulltree( + self, string_io, const1, basic_mime_tree, capsys + ): + def converter(drafttext, draftpath, extensions): return basic_mime_tree - do_massage(maildraft=const1, cmd_f=sys.stdout, converter=converter) + do_massage( + draft_f=string_io, + draftpath=const1, + cmd_f=sys.stdout, + converter=converter, + ) + captured = capsys.readouterr() lines = captured.out.splitlines()[4:][::-1] assert "Related" in lines.pop()