aboutsummaryrefslogtreecommitdiffstats
path: root/src/markdownrenderer.h
diff options
context:
space:
mode:
authorDanilo M. <danix@danix.xyz>2026-08-20 18:15:29 +0200
committerDanilo M. <danix@danix.xyz>2026-08-20 18:15:29 +0200
commit4f6d1ecb352ad8bba850ca5611ad4881d113bf52 (patch)
tree3e78b366056f925456a7c43420e8ec45f79cc245 /src/markdownrenderer.h
parentc50bea78e036518ce1a2a3eb899bbb5e305affea (diff)
downloadqtmaildir-4f6d1ecb352ad8bba850ca5611ad4881d113bf52.tar.gz
qtmaildir-4f6d1ecb352ad8bba850ca5611ad4881d113bf52.zip
feat(compose): render markdown bodies with cmark-gfm, item 123
The composer's body is markdown and the text/html part is generated from it. cmark-gfm rather than plain cmark for autolink: under CommonMark a bare URL in a mail body is not a link, and in mail it is expected to be clickable. Three extensions are enabled and tables are deliberately not, since they render badly across mail clients whoever generates them. Raw HTML in the input is suppressed with CMARK_OPT_SAFE: the body is the user's own text, but a body that can inject markup into its own generated HTML part is a sharp edge with no upside. The build needs TWO lookups. Only the core library ships a pkg-config file; libcmark-gfm-extensions has none and is located with find_library, the way notmuch already is. All three extensions live in that second library, so finding only the first produces a build that compiles and silently renders plain CommonMark. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_015muoUo2GdxmBDSp5vjYcbE
Diffstat (limited to 'src/markdownrenderer.h')
-rw-r--r--src/markdownrenderer.h38
1 files changed, 38 insertions, 0 deletions
diff --git a/src/markdownrenderer.h b/src/markdownrenderer.h
new file mode 100644
index 0000000..80c52bf
--- /dev/null
+++ b/src/markdownrenderer.h
@@ -0,0 +1,38 @@
+/*
+ * qtmaildir - a Qt6 mail client for notmuch-indexed Maildirs
+ * Copyright (C) 2026 Danilo M. <danix@danix.xyz>
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License version 2 as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#pragma once
+
+#include <QString>
+
+/// Renders the composer's markdown body into the HTML part's fragment.
+///
+/// A namespace of free functions rather than a class: there is no state, and
+/// keeping it painter-free and widget-free is what lets the extension
+/// configuration be tested on its own. `MessageBuilder` calls this; nothing
+/// else does.
+namespace MarkdownRenderer {
+
+/// The markdown source as an HTML fragment: no <html>, <head> or <body>.
+///
+/// Three extensions are enabled (autolink, strikethrough, tasklist) and
+/// tables are deliberately not. Raw HTML in the input is suppressed by
+/// CMARK_OPT_SAFE.
+QString toHtml(const QString &markdown);
+
+} // namespace MarkdownRenderer