fix(mail): display html emails no longer distorts page
html is filtered once through pandoc, as proposed in #2
This commit is contained in:
parent
8bc3663ee2
commit
b0972bb154
@ -96,7 +96,7 @@ mkMCTable = do
|
|||||||
, sortable Nothing (i18nCell MsgCommSubject) $ \(view resultMail -> Entity k v) ->
|
, sortable Nothing (i18nCell MsgCommSubject) $ \(view resultMail -> Entity k v) ->
|
||||||
let subject = v ^? _sentMailHeaders . _mailHeaders' . _mailHeader' "Subject"
|
let subject = v ^? _sentMailHeaders . _mailHeaders' . _mailHeader' "Subject"
|
||||||
linkWgt = maybe (msg2widget MsgUtilEMail) text2widget subject
|
linkWgt = maybe (msg2widget MsgUtilEMail) text2widget subject
|
||||||
in anchorCellM (MailPlainR <$> encrypt k) linkWgt
|
in anchorCellM (MailHtmlR <$> encrypt k) linkWgt
|
||||||
-- , sortable Nothing (i18nCell MsgCommContent) $ \(view $ resultMail . _entityKey -> k) -> anchorCellM (MailHtmlR <$> encrypt k) (text2widget "html")
|
-- , sortable Nothing (i18nCell MsgCommContent) $ \(view $ resultMail . _entityKey -> k) -> anchorCellM (MailHtmlR <$> encrypt k) (text2widget "html")
|
||||||
-- , sortable Nothing (i18nCell MsgCommSubject) $ \(preview $ resultMail . _entityVal . _sentMailHeaders . _mailHeaders' . _mailHeader' "Subject" -> h) -> cellMaybe textCell h
|
-- , sortable Nothing (i18nCell MsgCommSubject) $ \(preview $ resultMail . _entityVal . _sentMailHeaders . _mailHeaders' . _mailHeader' "Subject" -> h) -> cellMaybe textCell h
|
||||||
]
|
]
|
||||||
@ -219,10 +219,13 @@ handleMailShow hdr prefTypes cusm = do
|
|||||||
<p>
|
<p>
|
||||||
^{part2widget pt}
|
^{part2widget pt}
|
||||||
|]
|
|]
|
||||||
-- Include for Debugging:
|
-- Include for Debugging:
|
||||||
-- ^{jsonWidget (sm ^. _sentMailHeaders)}
|
-- <section>
|
||||||
-- ^{jsonWidget (sentMailContentContent cn)}
|
-- <h2>Debugging
|
||||||
|
-- <p>
|
||||||
|
-- ^{jsonWidget (sm ^. _sentMailHeaders)}
|
||||||
|
-- <p>
|
||||||
|
-- ^{jsonWidget (sentMailContentContent cn)} -- content fields needs decoding of base64 to make sense here
|
||||||
|
|
||||||
selectAlternative :: [ContentType] -> Alternatives -> Maybe Part
|
selectAlternative :: [ContentType] -> Alternatives -> Maybe Part
|
||||||
selectAlternative (fmap decodeUtf8 -> prefTypes) allAlts = aux prefTypes allAlts
|
selectAlternative (fmap decodeUtf8 -> prefTypes) allAlts = aux prefTypes allAlts
|
||||||
@ -255,8 +258,8 @@ part2widget Part{partContent=PartContent (LB.toStrict -> pc), partType=pt, partD
|
|||||||
|]
|
|]
|
||||||
where
|
where
|
||||||
showBody
|
showBody
|
||||||
| pt == decodeUtf8 typePlain = toWidget $ preEscapedToHtml $ plaintextToHtml $ decodeUtf8 pc
|
| pt == decodeUtf8 typePlain = toWidget $ preEscapedToHtml $ plainTextToHtml $ decodeUtf8 pc
|
||||||
| pt == decodeUtf8 typeHtml = toWidget $ preEscapedToHtml $ decodeUtf8 pc -- preEscapedToHtml :: ToMarkup a => a -> Html
|
| pt == decodeUtf8 typeHtml = toWidget $ preEscapedToHtml $ plainHtmlToHtml $ decodeUtf8 pc -- preEscapedToHtml :: ToMarkup a => a -> Html
|
||||||
| pt == decodeUtf8 typeJson =
|
| pt == decodeUtf8 typeJson =
|
||||||
let jw :: Aeson.Value -> Widget = jsonWidget
|
let jw :: Aeson.Value -> Widget = jsonWidget
|
||||||
in either str2widget jw $ Aeson.eitherDecodeStrict' pc
|
in either str2widget jw $ Aeson.eitherDecodeStrict' pc
|
||||||
|
|||||||
@ -9,7 +9,7 @@ module Model.Types.Markup
|
|||||||
, markdownToStoredMarkup
|
, markdownToStoredMarkup
|
||||||
, esqueletoMarkupOutput
|
, esqueletoMarkupOutput
|
||||||
, I18nStoredMarkup
|
, I18nStoredMarkup
|
||||||
, markupIsSmallish
|
, markupIsSmallish
|
||||||
, html2textlines
|
, html2textlines
|
||||||
, isSimilarMarkup
|
, isSimilarMarkup
|
||||||
) where
|
) where
|
||||||
@ -53,7 +53,7 @@ data StoredMarkup = StoredMarkup
|
|||||||
deriving anyclass (Binary, Hashable, NFData)
|
deriving anyclass (Binary, Hashable, NFData)
|
||||||
|
|
||||||
isSimilarMarkup :: StoredMarkup -> StoredMarkup -> Bool
|
isSimilarMarkup :: StoredMarkup -> StoredMarkup -> Bool
|
||||||
isSimilarMarkup StoredMarkup{markupInputFormat=af, markupInput=ai}
|
isSimilarMarkup StoredMarkup{markupInputFormat=af, markupInput=ai}
|
||||||
StoredMarkup{markupInputFormat=bf, markupInput=bi}
|
StoredMarkup{markupInputFormat=bf, markupInput=bi}
|
||||||
= af==bf && ai == bi
|
= af==bf && ai == bi
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ plaintextToStoredMarkup :: Textual t => t -> StoredMarkup
|
|||||||
plaintextToStoredMarkup (repack -> t) = StoredMarkup
|
plaintextToStoredMarkup (repack -> t) = StoredMarkup
|
||||||
{ markupInputFormat = MarkupPlaintext
|
{ markupInputFormat = MarkupPlaintext
|
||||||
, markupInput = t
|
, markupInput = t
|
||||||
, markupOutput = plaintextToHtml $ LT.toStrict t
|
, markupOutput = plainTextToHtml $ LT.toStrict t
|
||||||
}
|
}
|
||||||
preEscapedToStoredMarkup :: Textual t => t -> StoredMarkup
|
preEscapedToStoredMarkup :: Textual t => t -> StoredMarkup
|
||||||
preEscapedToStoredMarkup (repack -> t) = StoredMarkup
|
preEscapedToStoredMarkup (repack -> t) = StoredMarkup
|
||||||
@ -86,8 +86,8 @@ markdownToStoredMarkup :: Textual t => t -> StoredMarkup
|
|||||||
markdownToStoredMarkup (repack -> t) = StoredMarkup
|
markdownToStoredMarkup (repack -> t) = StoredMarkup
|
||||||
{ markupInputFormat = MarkupMarkdown
|
{ markupInputFormat = MarkupMarkdown
|
||||||
, markupInput = t
|
, markupInput = t
|
||||||
, markupOutput = plaintextToHtml $ LT.toStrict t
|
, markupOutput = plainTextToHtml $ LT.toStrict t
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
esqueletoMarkupOutput :: E.SqlExpr (E.Value StoredMarkup) -> E.SqlExpr (E.Value Html)
|
esqueletoMarkupOutput :: E.SqlExpr (E.Value StoredMarkup) -> E.SqlExpr (E.Value Html)
|
||||||
|
|||||||
@ -19,11 +19,16 @@ import qualified Text.Pandoc as P
|
|||||||
markdownToHtml :: Html -> Either P.PandocError Html
|
markdownToHtml :: Html -> Either P.PandocError Html
|
||||||
markdownToHtml html = P.runPure $ P.writeHtml5 htmlWriterOptions =<< P.readMarkdown markdownReaderOptions (toStrict $ renderHtml html)
|
markdownToHtml html = P.runPure $ P.writeHtml5 htmlWriterOptions =<< P.readMarkdown markdownReaderOptions (toStrict $ renderHtml html)
|
||||||
|
|
||||||
plaintextToHtml :: Text -> Html
|
plainTextToHtml :: Text -> Html
|
||||||
plaintextToHtml text = fromRight (toMarkup text) $ P.runPure $
|
plainTextToHtml text = fromRight (toMarkup text) $ P.runPure $
|
||||||
P.writeHtml5 htmlWriterOptions =<< P.readMarkdown markdownReaderOptions text
|
P.writeHtml5 htmlWriterOptions =<< P.readMarkdown markdownReaderOptions text
|
||||||
-- Line below does not work as intended, also see Handler.Utils.Pandoc.plaintextToMarkdownWith which uses this code
|
-- Line below does not work as intended, also see Handler.Utils.Pandoc.plaintextToMarkdownWith which uses this code
|
||||||
-- where pandoc = P.Pandoc mempty [P.Plain [P.Str text]]
|
-- where pandoc = P.Pandoc mempty [P.Plain [P.Str text]]
|
||||||
|
|
||||||
|
plainHtmlToHtml :: Text -> Html
|
||||||
|
plainHtmlToHtml text = fromRight (toMarkup text) $ P.runPure $
|
||||||
|
P.writeHtml5 htmlWriterOptions =<< P.readHtml markdownReaderOptions text
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
htmlReaderOptions, markdownReaderOptions :: P.ReaderOptions
|
htmlReaderOptions, markdownReaderOptions :: P.ReaderOptions
|
||||||
|
|||||||
Reference in New Issue
Block a user