if os.path.exists(STYLESHEET):
DEFAULT_CSS += open(STYLESHEET).read()
-HTML_DOCUMENT = '''<!DOCTYPE html>
-<html><head>
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
-<meta charset="utf-8"/>
-<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
-</head><body class="email">
-{htmlbody}
-</body></html>'''
-
-
SIGNATURE_HTML = \
'<div class="signature"><span class="leader">-- </span>{sig}</div>'
+def _preprocess_signature(sig):
+ '''
+ Preprocess the signature before markdown processing.
+ '''
+ return sig
+
def _preprocess_markdown(mdwn):
'''
Preprocess Markdown for handling by the converter.
# text-mode HTML2text converters, and so it's left commented for now.
#ret = re.sub(r'\n>', r' \n>[>]{.quotechar}', ret, flags=re.MULTILINE)
+ # With the autolink_bare_uris extension, we do not need to put links into
+ # angle brackets to have them converted, so let's conserve the brackets
+ # when used around email addresses. Note that this needs a postprocessing
+ # hack because the pandoc autolink converted includes the ambersand
+ # (https://github.com/jgm/pandoc/issues/7398).
+ ret = re.sub(r'<([^@]+@.+\.[^>]+)>', r'<\g<1> -PANDOC_BUG_7398->', ret)
+
return ret
def _convert_with_pandoc(mdwn, inputfmt='markdown', outputfmt='html5',
ext_enabled=None, ext_disabled=None,
- standalone=True, title="HTML E-Mail"):
+ standalone=True, selfcontained=True, title=None):
'''
Invoke pandoc to do the actual conversion of Markdown to HTML5.
'''
args = []
if standalone:
args.append('--standalone')
+ if selfcontained:
+ args.append('--self-contained')
if title:
args.append(f'--metadata=pagetitle:"{title}"')
'''
Postprocess the generated and styled HTML.
'''
+
+ # Preprocessing leaves a sentinel to work around
+ # https://github.com/jgm/pandoc/issues/7398, and so we need to remove it:
+ html = html.replace('</a> -PANDOC_BUG_7398->', '</a>>')
return html
if body:
body = _preprocess_markdown(body)
body = _identify_quotes_for_later(body)
- html = _convert_with_pandoc(body, standalone=False)
+ html = _convert_with_pandoc(body, standalone=True, selfcontained=True,
+ title=None)
+ html = html.replace('<title>Untitled</title>\n','')
html = _reformat_quotes(html)
if sig:
+ sig = _preprocess_signature(sig)
sig = _preprocess_markdown(sig)
- html += SIGNATURE_HTML.format(sig='<br/>'.join(sig.splitlines()))
+ sig = _convert_with_pandoc(sig, standalone=False, selfcontained=False)
+ sig = SIGNATURE_HTML.format(sig='<br/>'.join(sig.splitlines()))
+ eob = html.find('</body>')
+ html = f'{html[:eob]}{sig}\n{html[eob:]}'
- html = HTML_DOCUMENT.format(htmlbody=html)
html = _apply_styling(html)
html = _postprocess_html(html)