]>
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:
# Configuration:
# neomuttrc (needs to be a single line):
# macro compose B "\
# Configuration:
# neomuttrc (needs to be a single line):
# macro compose B "\
-# <enter-command> source '$my_confdir/buildmimetree.py setup|'<enter>\
+# <enter-command> source '$my_confdir/buildmimetree.py setup --tempdir $tempdir |'<enter>\
# <enter-command> sourc e \$my_mdwn_postprocess_cmd_file<enter>\
# " "Convert message into a modern MIME tree with inline images"
#
# <enter-command> sourc e \$my_mdwn_postprocess_cmd_file<enter>\
# " "Convert message into a modern MIME tree with inline images"
#
help="Turn on debug logging of commands generated to stderr",
)
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",
help="Turn on debugging to stderr of the MIME tree walk",
)
help="Turn on debugging to stderr of the MIME tree walk",
)
+ parser_massage.add_argument(
+ "--tempdir",
+ default=None,
+ help="Specify temporary directory to use for attachments",
+ )
+
parser_massage.add_argument(
"--extensions",
metavar="EXTENSIONS",
parser_massage.add_argument(
"--extensions",
metavar="EXTENSIONS",
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}" )
)
return relparts
def convert_markdown_to_html(
)
return relparts
def convert_markdown_to_html(
- origtext, draftpath, *, filewriter_fn=filewriter_fn, extensions=None
+ origtext,
+ draftpath,
+ *,
+ filewriter_fn=filewriter_fn,
+ tempdir=None,
+ extensions=None,
):
origtext, htmltext, images = markdown_with_inline_image_support(
origtext, extensions=extensions
):
origtext, htmltext, images = markdown_with_inline_image_support(
origtext, extensions=extensions
"alternative", [textpart, htmlpart], "Group of alternative content"
)
"alternative", [textpart, htmlpart], "Group of alternative content"
)
- imgparts = collect_inline_images(images, filewriter_fn=filewriter_fn)
+ imgparts = collect_inline_images(
+ images, tempdir=tempdir, filewriter_fn=filewriter_fn
+ )
if imgparts:
return Multipart(
"relative", [altpart] + imgparts, "Group of related content"
if imgparts:
return Multipart(
"relative", [altpart] + imgparts, "Group of related content"
- extensions=None, *, out_f=sys.stdout, temppath=None, debug_commands=False
+ extensions=None,
+ *,
+ out_f=sys.stdout,
+ temppath=None,
+ tempdir=None,
+ debug_commands=False,
):
extensions = extensions or []
temppath = temppath or pathlib.Path(
):
extensions = extensions or []
temppath = temppath or pathlib.Path(
- tempfile.mkstemp(prefix="muttmdwn-")[1]
+ tempfile.mkstemp(prefix="muttmdwn-", dir=tempdir )[1]
)
cmds = MuttCommands(out_f, debug=debug_commands)
editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
if extensions:
editor = f'{editor} --extensions {",".join(extensions)}'
)
cmds = MuttCommands(out_f, debug=debug_commands)
editor = f"{sys.argv[0]} massage --write-commands-to {temppath}"
if extensions:
editor = f'{editor} --extensions {",".join(extensions)}'
+ if tempdir:
+ editor = f"{editor} --tempdir {tempdir}"
if debug_commands:
editor = f"{editor} --debug-commands"
if debug_commands:
editor = f"{editor} --debug-commands"
*,
extensions=None,
converter=convert_markdown_to_html,
*,
extensions=None,
converter=convert_markdown_to_html,
debug_commands=False,
debug_walk=False,
):
debug_commands=False,
debug_walk=False,
):
cmds.flush()
extensions = extensions.split(",") if extensions else []
cmds.flush()
extensions = extensions.split(",") if extensions else []
- tree = converter(draft_f.read(), draftpath, extensions=extensions)
+ tree = converter(draft_f.read(), draftpath, tempdir=tempdir, extensions=extensions)
mimetree = MIMETreeDFWalker(debug=debug_walk)
mimetree = MIMETreeDFWalker(debug=debug_walk)
# 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 args.send_message:
raise NotImplementedError()
if args.send_message:
raise NotImplementedError()
- do_setup(args.extensions, debug_commands=args.debug_commands)
+ do_setup(
+ args.extensions,
+ tempdir=args.tempdir,
+ debug_commands=args.debug_commands,
+ )
elif args.mode == "massage":
with open(args.MAILDRAFT, "r") as draft_f, open(
elif args.mode == "massage":
with open(args.MAILDRAFT, "r") as draft_f, open(
pathlib.Path(args.MAILDRAFT),
cmd_f,
extensions=args.extensions,
pathlib.Path(args.MAILDRAFT),
cmd_f,
extensions=args.extensions,
debug_commands=args.debug_commands,
debug_walk=args.debug_walk,
)
debug_commands=args.debug_commands,
debug_walk=args.debug_walk,
)
return StringIO(text or const1)
def test_do_massage_basic(self, const1, string_io, capsys):
return StringIO(text or const1)
def test_do_massage_basic(self, const1, string_io, capsys):
- def converter(drafttext, draftpath, extensions):
+ def converter(drafttext, draftpath, extensions, tempdir ):
return Part("text", "plain", draftpath, orig=True)
do_massage(
return Part("text", "plain", draftpath, orig=True)
do_massage(
def test_do_massage_fulltree(
self, string_io, const1, basic_mime_tree, capsys
):
def test_do_massage_fulltree(
self, string_io, const1, basic_mime_tree, capsys
):
- def converter(drafttext, draftpath, extensions):
+ def converter(drafttext, draftpath, extensions, tempdir ):
return basic_mime_tree
do_massage(
return basic_mime_tree
do_massage(
"AAAABCAAAAAA6fptVAAAACklEQVQI12P4DwABAQEAG7buVgAA"
)
"AAAABCAAAAAA6fptVAAAACklEQVQI12P4DwABAQEAG7buVgAA"
)
def test_markdown_inline_image_processor_base64(self, test_png):
text = f"![1px white inlined]({test_png})"
text, html, images = markdown_with_inline_image_support(text)
def test_markdown_inline_image_processor_base64(self, test_png):
text = f"![1px white inlined]({test_png})"
text, html, images = markdown_with_inline_image_support(text)
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)