]>
git.madduck.net Git - etc/neomutt.git/blobdiff - .config/neomutt/buildmimetree.py
madduck's git repository
Every one of the projects in this repository is available at the canonical
URL git://git.madduck.net/madduck/pub/<projectpath> — see
each project's metadata for the exact URL.
All patches and comments are welcome. Please squash your changes to logical
commits before using git-format-patch and git-send-email to
patches@ git. madduck. net .
If you'd read over the Git project's submission guidelines and adhered to them,
I'd be especially grateful.
SSH access, as well as push access can be individually
arranged .
If you use my repositories frequently, consider adding the following
snippet to ~/.gitconfig and using the third clone URL listed for each
project:
[url "git://git.madduck.net/madduck/"]
insteadOf = madduck:
parser_setup = subp.add_parser("setup", help="Setup phase")
parser_massage = subp.add_parser("massage", help="Massaging phase")
parser_setup = subp.add_parser("setup", help="Setup phase")
parser_massage = subp.add_parser("massage", help="Massaging phase")
- parser_setup.add_argument(
- "--debug-commands",
- action="store_true",
- help="Turn on debug logging of commands generated to stderr",
- )
-
- parser_setup.add_argument(
- "--tempdir",
- default=None,
- help="Specify temporary directory to use for attachments",
- )
-
parser_setup.add_argument(
"--extension",
"-x",
parser_setup.add_argument(
"--extension",
"-x",
)
parser_setup.add_argument(
)
parser_setup.add_argument(
- help="Generate command(s) to send the message after processing ",
+ help="Only build, don't send the message ",
- parser_massage.add_argument(
+ parser_setup.add_argument(
+ "--tempdir",
+ default=None,
+ help="Specify temporary directory to use for attachments",
+ )
+
+ parser_setup.add_argument(
"--debug-commands",
action="store_true",
help="Turn on debug logging of commands generated to stderr",
)
parser_massage.add_argument(
"--debug-commands",
action="store_true",
help="Turn on debug logging of commands generated to stderr",
)
parser_massage.add_argument(
+ "--write-commands-to",
+ metavar="PATH",
+ dest="cmdpath",
+ help="Temporary file path to write commands to",
+ )
+
+ parser_massage.add_argument(
+ "--extensions",
+ metavar="EXTENSIONS",
+ type=str,
+ default="",
+ help="Markdown extension to use (comma-separated list)",
+ )
+
+ parser_massage.add_argument(
+ "--only-build",
- help="Turn on debugging to stderr of the MIME tree walk ",
+ help="Only build, don't send the message ",
)
parser_massage.add_argument(
)
parser_massage.add_argument(
)
parser_massage.add_argument(
)
parser_massage.add_argument(
- "--extensions",
- metavar="EXTENSIONS",
- type=str,
- default="",
- help="Markdown extension to use (comma-separated list)",
+ "--debug-commands",
+ action="store_true",
+ help="Turn on debug logging of commands generated to stderr",
)
parser_massage.add_argument(
)
parser_massage.add_argument(
- "--write-commands-to",
- metavar="PATH",
- dest="cmdpath",
- help="Temporary file path to write commands to",
+ "--debug-walk",
+ action="store_true",
+ help="Turn on debugging to stderr of the MIME tree walk",
)
parser_massage.add_argument(
)
parser_massage.add_argument(
filewriter_fn(path, data.read(), "w+b")
relparts.append(
filewriter_fn(path, data.read(), "w+b")
relparts.append(
- Part(*mimetype.split("/"), path, cid=info.cid, desc=info.desc )
+ Part(*mimetype.split("/"), path, cid=info.cid, desc=f"Image: {info.desc}" )
extensions=None,
*,
out_f=sys.stdout,
extensions=None,
*,
out_f=sys.stdout,
temppath=None,
tempdir=None,
debug_commands=False,
temppath=None,
tempdir=None,
debug_commands=False,
editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
if extensions:
editor = f'{editor} --extensions {",".join(extensions)}'
editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
if extensions:
editor = f'{editor} --extensions {",".join(extensions)}'
+ if only_build:
+ editor = f'{editor} --only-build'
if tempdir:
editor = f"{editor} --tempdir {tempdir}"
if debug_commands:
if tempdir:
editor = f"{editor} --tempdir {tempdir}"
if debug_commands:
*,
extensions=None,
converter=convert_markdown_to_html,
*,
extensions=None,
converter=convert_markdown_to_html,
tempdir=None,
debug_commands=False,
debug_walk=False,
tempdir=None,
debug_commands=False,
debug_walk=False,
depth-first, and responsible for telling NeoMutt how to assemble
the 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 isinstance(item, Part):
# We've hit a leaf-node, i.e. an alternative or a related part
# with actual content.
# information, then we might just as well update the NeoMutt
# tree now:
if item.cid:
# information, then we might just as well update the NeoMutt
# tree now:
if item.cid:
- cmds.push(f"<edit-content-id>\\Ca\\Ck {item.cid}<enter>")
+ cmds.push(f"<edit-content-id>{KILL_LINE} {item.cid}<enter>")
elif isinstance(item, Multipart):
# This node has children, but we already visited them (see
elif isinstance(item, Multipart):
# This node has children, but we already visited them (see
# appropriate grouping:
if item.subtype == "alternative":
cmds.push("<group-alternatives>")
# appropriate grouping:
if item.subtype == "alternative":
cmds.push("<group-alternatives>")
- elif item.subtype == "relative" :
+ elif item.subtype in ("relative", "related") :
cmds.push("<group-related>")
elif item.subtype == "multilingual":
cmds.push("<group-multilingual>")
cmds.push("<group-related>")
elif item.subtype == "multilingual":
cmds.push("<group-multilingual>")
# If the item has a description, we might just as well add it
if item.desc:
# 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>")
+ cmds.push(f"<edit-description>{KILL_LINE} {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
# Finally, if we're at non-root level, tag the new container,
# as it might itself be part of a container, to be processed
# function
mimetree.walk(tree, visitor_fn=visitor_fn)
# function
mimetree.walk(tree, visitor_fn=visitor_fn)
+ if not only_build:
+ cmds.push("<send-message>")
+
# Finally, cleanup. Since we're responsible for removing the temporary
# file, how's this for a little hack?
try:
# Finally, cleanup. Since we're responsible for removing the temporary
# file, how's this for a little hack?
try:
args = parse_cli_args()
if args.mode == "setup":
args = parse_cli_args()
if args.mode == "setup":
- if args.send_message:
- raise NotImplementedError()
-
do_setup(
args.extensions,
do_setup(
args.extensions,
+ only_build=args.only_build,
tempdir=args.tempdir,
debug_commands=args.debug_commands,
)
tempdir=args.tempdir,
debug_commands=args.debug_commands,
)
pathlib.Path(args.MAILDRAFT),
cmd_f,
extensions=args.extensions,
pathlib.Path(args.MAILDRAFT),
cmd_f,
extensions=args.extensions,
+ only_build=args.only_build,
tempdir=args.tempdir,
debug_commands=args.debug_commands,
debug_walk=args.debug_walk,
tempdir=args.tempdir,
debug_commands=args.debug_commands,
debug_walk=args.debug_walk,
assert '="$my_edit_headers"' in lines.pop(0)
assert "unset my_editor" == lines.pop(0)
assert "unset my_edit_headers" == 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 "send-message" in 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)
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)
captured = capsys.readouterr()
lines = captured.out.splitlines()[4:]
captured = capsys.readouterr()
lines = captured.out.splitlines()[4:]
+ assert "send-message" in lines.pop(0)
assert "Related" in lines.pop(0)
assert "group-related" in lines.pop(0)
assert "tag-entry" in lines.pop(0)
assert "Related" in lines.pop(0)
assert "group-related" in lines.pop(0)
assert "tag-entry" in lines.pop(0)
assert tree.children[1].path == written[0]
assert written[1] == request.urlopen(test_png).read()
assert tree.children[1].path == written[0]
assert written[1] == request.urlopen(test_png).read()
- def test_inline_image_collection(self, test_png, const1, const2, fake_filewriter):
- test_images = {
- test_png: InlineImageInfo(
- cid=const1, desc=const2
- )
- }
+ def test_inline_image_collection(
+ self, test_png, const1, const2, fake_filewriter
+ ):
+ test_images = {test_png: InlineImageInfo(cid=const1, desc=const2)}
relparts = collect_inline_images(
test_images, filewriter_fn=fake_filewriter
)
written = fake_filewriter.pop()
relparts = collect_inline_images(
test_images, filewriter_fn=fake_filewriter
)
written = fake_filewriter.pop()
- assert b'PNG' in written[1]
+ assert b"PNG" in written[1]
assert relparts[0].subtype == "png"
assert relparts[0].path == written[0]
assert relparts[0].cid == const1
assert relparts[0].subtype == "png"
assert relparts[0].path == written[0]
assert relparts[0].cid == const1
- assert relparts[0].desc == const2
+ assert relparts[0].desc.endswith(const2)