From e30f7695ab30708d86e3e80cf40ec5f8d209b65e Mon Sep 17 00:00:00 2001 From: Evgeny Poberezkin <2769109+epoberezkin@users.noreply.github.com> Date: Wed, 2 Aug 2023 16:22:20 +0100 Subject: [PATCH] core, ios: fix markdown (#2837) --- .../Views/Chat/ChatItem/MsgContentView.swift | 2 +- src/Simplex/Chat/Markdown.hs | 14 ++++++++++---- tests/MarkdownTests.hs | 2 ++ 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift index ab916db9ad..3ac908bb78 100644 --- a/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift +++ b/apps/ios/Shared/Views/Chat/ChatItem/MsgContentView.swift @@ -87,7 +87,7 @@ struct MsgContentView: View { func messageText(_ text: String, _ formattedText: [FormattedText]?, _ sender: String?, icon: String? = nil, preview: Bool = false) -> Text { let s = text var res: Text - if let ft = formattedText, ft.count > 0 { + if let ft = formattedText, ft.count > 0 && ft.count <= 200 { res = formatText(ft[0], preview) var i = 1 while i < ft.count { diff --git a/src/Simplex/Chat/Markdown.hs b/src/Simplex/Chat/Markdown.hs index 1393831630..d18f28db31 100644 --- a/src/Simplex/Chat/Markdown.hs +++ b/src/Simplex/Chat/Markdown.hs @@ -17,7 +17,7 @@ import qualified Data.Attoparsec.Text as A import Data.Char (isDigit) import Data.Either (fromRight) import Data.Functor (($>)) -import Data.List (intercalate) +import Data.List (intercalate, foldl') import Data.List.NonEmpty (NonEmpty) import qualified Data.List.NonEmpty as L import Data.Maybe (fromMaybe, isNothing) @@ -124,9 +124,15 @@ unmarked :: Text -> Markdown unmarked = Markdown Nothing parseMaybeMarkdownList :: Text -> Maybe MarkdownList -parseMaybeMarkdownList s = - let m = intercalate ["\n"] . map (markdownToList . parseMarkdown) $ T.lines s - in if all (isNothing . format) m then Nothing else Just m +parseMaybeMarkdownList s + | all (isNothing . format) ml = Nothing + | otherwise = Just . reverse $ foldl' acc [] ml + where + ml = intercalate ["\n"] . map (markdownToList . parseMarkdown) $ T.lines s + acc [] m = [m] + acc ms@(FormattedText f t : ms') ft@(FormattedText f' t') + | f == f' = FormattedText f (t <> t') : ms' + | otherwise = ft : ms parseMarkdownList :: Text -> MarkdownList parseMarkdownList = markdownToList . parseMarkdown diff --git a/tests/MarkdownTests.hs b/tests/MarkdownTests.hs index 487fe651ed..837849d7e4 100644 --- a/tests/MarkdownTests.hs +++ b/tests/MarkdownTests.hs @@ -204,5 +204,7 @@ multilineMarkdownList :: Spec multilineMarkdownList = describe "multiline markdown" do it "correct markdown" do parseMaybeMarkdownList "http://simplex.chat\nhttp://app.simplex.chat" `shouldBe` Just [uri' "http://simplex.chat", "\n", uri' "http://app.simplex.chat"] + it "combines the same formats" do + parseMaybeMarkdownList "http://simplex.chat\ntext 1\ntext 2\nhttp://app.simplex.chat" `shouldBe` Just [uri' "http://simplex.chat", "\ntext 1\ntext 2\n", uri' "http://app.simplex.chat"] it "no markdown" do parseMaybeMarkdownList "not a\nmarkdown" `shouldBe` Nothing