From d1eb3f6a27c141f90822e001c8331bdf756573d7 Mon Sep 17 00:00:00 2001 From: M66B Date: Mon, 19 Feb 2024 16:06:44 +0100 Subject: [PATCH] Refactoring --- .../eu/faircode/email/FragmentCompose.java | 16 ++------ .../main/java/eu/faircode/email/Markdown.java | 39 +++++++++++++++++++ .../java/eu/faircode/email/MessageHelper.java | 9 +---- 3 files changed, 44 insertions(+), 20 deletions(-) create mode 100644 app/src/main/java/eu/faircode/email/Markdown.java diff --git a/app/src/main/java/eu/faircode/email/FragmentCompose.java b/app/src/main/java/eu/faircode/email/FragmentCompose.java index 91cd7067dc..658508f2bc 100644 --- a/app/src/main/java/eu/faircode/email/FragmentCompose.java +++ b/app/src/main/java/eu/faircode/email/FragmentCompose.java @@ -160,8 +160,6 @@ import org.bouncycastle.operator.RuntimeOperatorException; import org.bouncycastle.operator.jcajce.JcaContentSignerBuilder; import org.bouncycastle.operator.jcajce.JcaDigestCalculatorProviderBuilder; import org.bouncycastle.util.Store; -import org.commonmark.node.Node; -import org.commonmark.renderer.html.HtmlRenderer; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; @@ -6718,16 +6716,8 @@ public class FragmentCompose extends FragmentBase { boolean dirty = false; String body; if (markdown ^ extras.getBoolean("markdown")) { - // Markdown to HTML String text = spanned.toString().replace('\u00a0', ' '); - - Markwon markwon = Markwon.builder(context) - .usePlugin(HtmlPlugin.create()) - .build(); - Node document = markwon.parse(text); - - HtmlRenderer renderer = HtmlRenderer.builder().build(); - String html = renderer.render(document); + String html = Markdown.toHtml(text); Document doc = JsoupEx.parse(html); doc.body().attr("markdown", Boolean.toString(markdown)); @@ -7699,8 +7689,8 @@ public class FragmentCompose extends FragmentBase { Spanned spannedBody; if (markdown) { - // TODO: HTML to Markdown - spannedBody = new SpannableStringBuilder(doc.html()); + String md = Markdown.fromHtml(doc); + spannedBody = new SpannableStringBuilder(md); } else { HtmlHelper.clearAnnotations(doc); // Legacy left-overs diff --git a/app/src/main/java/eu/faircode/email/Markdown.java b/app/src/main/java/eu/faircode/email/Markdown.java new file mode 100644 index 0000000000..0407f3a60c --- /dev/null +++ b/app/src/main/java/eu/faircode/email/Markdown.java @@ -0,0 +1,39 @@ +package eu.faircode.email; + +/* + This file is part of FairEmail. + + FairEmail is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + FairEmail 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 FairEmail. If not, see . + + Copyright 2018-2024 by Marcel Bokhorst (M66B) +*/ + +import org.commonmark.node.Node; +import org.commonmark.parser.Parser; +import org.commonmark.renderer.html.HtmlRenderer; +import org.jsoup.nodes.Document; + +public class Markdown { + static String toHtml(String markdown) { + Parser p = Parser.builder().build(); + Node d = p.parse(markdown); + HtmlRenderer r = HtmlRenderer.builder().build(); + return r.render(d); + } + + static String fromHtml(Document d) { + // TODO: HTML to Markdown + throw new IllegalArgumentException("Not implemented"); + } +} diff --git a/app/src/main/java/eu/faircode/email/MessageHelper.java b/app/src/main/java/eu/faircode/email/MessageHelper.java index f330830705..1a6d73d090 100644 --- a/app/src/main/java/eu/faircode/email/MessageHelper.java +++ b/app/src/main/java/eu/faircode/email/MessageHelper.java @@ -69,8 +69,6 @@ import org.apache.commons.compress.compressors.gzip.GzipCompressorInputStream; import org.bouncycastle.asn1.edec.EdECObjectIdentifiers; import org.bouncycastle.asn1.x509.AlgorithmIdentifier; import org.bouncycastle.asn1.x509.SubjectPublicKeyInfo; -import org.commonmark.parser.Parser; -import org.commonmark.renderer.html.HtmlRenderer; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.nodes.Node; @@ -3995,13 +3993,10 @@ public class MessageHelper { } } else if (h.isMarkdown()) { try { - Parser p = Parser.builder().build(); - org.commonmark.node.Node d = p.parse(result); - HtmlRenderer r = HtmlRenderer.builder().build(); - result = r.render(d); + result = Markdown.toHtml(result); } catch (Throwable ex) { Log.e(ex); - result = HtmlHelper.formatPlainText(Log.formatThrowable(ex)); + result = HtmlHelper.formatPlainText(result); } } else if (h.isPatch()) { result = "
" +