return f"<multipart/{self.subtype}> 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(
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"')
cmds.flush()
extensions = extensions.split(",") if extensions else []
- tree = converter(maildraft, extensions=extensions)
+ with open(maildraft, "r") as draft_f:
+ tree = converter(
+ draft_f.read(), pathlib.Path(maildraft), extensions=extensions
+ )
mimetree = MIMETreeDFWalker(debug=debug_walk)
# tree now:
if item.cid:
cmds.push(f"<edit-content-id>\\Ca\\Ck{item.cid}<enter>")
- if item.desc:
- cmds.push(f"<edit-description>\\Ca\\Ck{item.desc}<enter>")
elif isinstance(item, Multipart):
# This node has children, but we already visited them (see
elif item.subtype == "multilingual":
cmds.push("<group-multilingual>")
- # Again, if there is a description, we might just as well:
- if item.desc:
- cmds.push(f"<edit-description>\\Ca\\Ck{item.desc}<enter>")
-
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"<edit-description>\\Ca\\Ck{item.desc}<enter>")
+
# 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: