def do_massage(
maildraft,
- cmdpath,
+ cmd_f,
*,
extensions=None,
converter=convert_markdown_to_html,
# draft, and whatever commands we write to the file given as cmdpath will
# be run by the second source command in the macro definition.
- with open(cmdpath, "w") as cmd_f:
- # Let's start by cleaning up what the setup did (see above), i.e. we
- # restore the $editor and $edit_headers variables, and also unset the
- # variable used to identify the command file we're currently writing
- # to.
- cmds = MuttCommands(cmd_f, debug=debug_commands)
- cmds.cmd('set editor="$my_editor"')
- cmds.cmd('set edit_headers="$my_edit_headers"')
- cmds.cmd("unset my_editor")
- cmds.cmd("unset my_edit_headers")
-
- # let's flush those commands, as there'll be a lot of pushes from now
- # on, which need to be run in reverse order
- cmds.flush()
-
- extensions = extensions.split(",") if extensions else []
- tree = converter(maildraft, extensions=extensions)
-
- mimetree = MIMETreeDFWalker(debug=args.debug_walk)
-
- def visitor_fn(item, stack, *, debugprint=None):
- """
- Visitor function called for every node (part) of the MIME tree,
- depth-first, and responsible for telling NeoMutt how to assemble
- the tree.
- """
- if isinstance(item, Part):
- # We've hit a leaf-node, i.e. an alternative or a related part
- # with actual content.
-
- # If the part is not an original part, i.e. doesn't already
- # exist, we must first add it.
- if not item.orig:
- cmds.push(f"<attach-file>{item.path}<enter>")
- cmds.push("<toggle-unlink><toggle-disposition>")
- if item.cid:
- cmds.push(
- f"<edit-content-id>\\Ca\\Ck{item.cid}<enter>"
- )
-
- # If the item (including the original) comes with a
- # description, then we might just as well update the NeoMutt
- # tree now:
- if item.desc:
- cmds.push(f"<edit-description>\\Ca\\Ck{item.desc}<enter>")
-
- # Finally, tag the entry that we just processed, so that when
- # we're done at this level, as we walk up the stack, the items
- # to be grouped will already be tagged and ready.
- cmds.push("<tag-entry>")
-
- elif isinstance(item, Multipart):
- # This node has children, but we already visited them (see
- # above), and so they have been tagged in NeoMutt's compose
- # window. Now it's just a matter of telling NeoMutt to do the
- # appropriate grouping:
- if item.subtype == "alternative":
- cmds.push("<group-alternatives>")
- elif item.subtype == "relative":
- cmds.push("<group-related>")
- 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>")
-
- # 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:
- if stack:
- cmds.push("<tag-entry>")
-
- else:
- # We should never get here
- assert not "is valid part"
-
- # -----------------
- # End of visitor_fn
-
- # Let's walk the tree and visit every node with our fancy visitor
- # function
- mimetree.walk(tree, visitor_fn=visitor_fn)
-
- # Finally, cleanup. Since we're responsible for removing the temporary
- # file, how's this for a little hack?
- cmds.cmd(f"source 'rm -f {args.cmdpath}|'")
- cmds.cmd("unset my_mdwn_postprocess_cmd_file")
- cmds.flush()
+ # Let's start by cleaning up what the setup did (see above), i.e. we
+ # restore the $editor and $edit_headers variables, and also unset the
+ # variable used to identify the command file we're currently writing
+ # to.
+ cmds = MuttCommands(cmd_f, debug=debug_commands)
+ cmds.cmd('set editor="$my_editor"')
+ cmds.cmd('set edit_headers="$my_edit_headers"')
+ cmds.cmd("unset my_editor")
+ cmds.cmd("unset my_edit_headers")
+
+ # let's flush those commands, as there'll be a lot of pushes from now
+ # on, which need to be run in reverse order
+ cmds.flush()
+
+ extensions = extensions.split(",") if extensions else []
+ tree = converter(maildraft, extensions=extensions)
+
+ mimetree = MIMETreeDFWalker(debug=debug_walk)
+
+ def visitor_fn(item, stack, *, debugprint=None):
+ """
+ Visitor function called for every node (part) of the MIME tree,
+ depth-first, and responsible for telling NeoMutt how to assemble
+ the tree.
+ """
+ if isinstance(item, Part):
+ # We've hit a leaf-node, i.e. an alternative or a related part
+ # with actual content.
+
+ # If the part is not an original part, i.e. doesn't already
+ # exist, we must first add it.
+ if not item.orig:
+ cmds.push(f"<attach-file>{item.path}<enter>")
+ cmds.push("<toggle-unlink><toggle-disposition>")
+ if item.cid:
+ cmds.push(f"<edit-content-id>\\Ca\\Ck{item.cid}<enter>")
+
+ # If the item (including the original) comes with a
+ # description, then we might just as well update the NeoMutt
+ # tree now:
+ 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
+ # above), and so they have been tagged in NeoMutt's compose
+ # window. Now it's just a matter of telling NeoMutt to do the
+ # appropriate grouping:
+ if item.subtype == "alternative":
+ cmds.push("<group-alternatives>")
+ elif item.subtype == "relative":
+ cmds.push("<group-related>")
+ 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"
+
+ # 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:
+ if stack:
+ cmds.push("<tag-entry>")
+
+ # -----------------
+ # End of visitor_fn
+
+ # Let's walk the tree and visit every node with our fancy visitor
+ # function
+ mimetree.walk(tree, visitor_fn=visitor_fn)
+
+ # Finally, cleanup. Since we're responsible for removing the temporary
+ # file, how's this for a little hack?
+ try:
+ filename = cmd_f.name
+ except AttributeError:
+ filename = "pytest_internal_file"
+ cmds.cmd(f"source 'rm -f {filename}|'")
+ cmds.cmd("unset my_mdwn_postprocess_cmd_file")
+ cmds.flush()
# [ CLI ENTRY ] ###############################################################
do_setup(args.extensions, debug_commands=args.debug_commands)
elif args.mode == "massage":
- do_massage(
- args.MAILDRAFT,
- args.cmdpath,
- extensions=args.extensions,
- debug_commands=args.debug_commands,
- debug_walk=args.debug_walk,
- )
+ with open(args.cmdpath, "w") as cmd_f:
+ do_massage(
+ args.MAILDRAFT,
+ cmd_f,
+ extensions=args.extensions,
+ debug_commands=args.debug_commands,
+ debug_walk=args.debug_walk,
+ )
# [ TESTS ] ###################################################################