diff --git a/src/Vervis/Handler/Repo.hs b/src/Vervis/Handler/Repo.hs index ba702c3..35eda19 100644 --- a/src/Vervis/Handler/Repo.hs +++ b/src/Vervis/Handler/Repo.hs @@ -183,7 +183,7 @@ getRepoSource repository user repo ref dir = do parent = init dir (base, ext) = breakExt name mediaType = chooseMediaType parent base ext () () - in renderSource mediaType (blobGetContent b) + in renderSourceBL mediaType (blobGetContent b) Right (v, mr) -> return $ Right (map mkrow v, mr) let parent = if null dir then [] else init dir dirs = zip parent (tail $ inits parent) diff --git a/src/Vervis/Handler/Ticket.hs b/src/Vervis/Handler/Ticket.hs index 6853def..397f903 100644 --- a/src/Vervis/Handler/Ticket.hs +++ b/src/Vervis/Handler/Ticket.hs @@ -41,12 +41,14 @@ import Yesod.Form.Functions (runFormPost) import Yesod.Form.Types (FormResult (..)) import Yesod.Persist.Core (runDB, get404, getBy404) -import qualified Data.Text as T (intercalate, pack) +import qualified Data.Text as T (filter, intercalate, pack) import qualified Database.Esqueleto as E ((==.)) import Vervis.Form.Ticket import Vervis.Foundation +import Vervis.MediaType (MediaType (Markdown)) import Vervis.Model +import Vervis.Render (renderSourceT) import Vervis.Settings (widgetFile) getTicketsR :: Text -> Text -> Handler Html @@ -116,6 +118,7 @@ getTicketR shar proj num = do get404 $ personIdent person' else return author return (author, closer, ticket) + let desc = renderSourceT Markdown $ T.filter (/= '\r') $ ticketDesc ticket defaultLayout $ do setTitle $ toHtml $ T.intercalate " :: " [shar, proj, "Tickets", T.pack ('#' : show num)] diff --git a/src/Vervis/Readme.hs b/src/Vervis/Readme.hs index 6a59599..ed4816d 100644 --- a/src/Vervis/Readme.hs +++ b/src/Vervis/Readme.hs @@ -34,7 +34,7 @@ import System.FilePath (isExtSeparator) import Vervis.Foundation (Widget) import Vervis.MediaType (chooseMediaType) -import Vervis.Render (renderSource) +import Vervis.Render (renderSourceBL) import Text.FilePath.Local (breakExt) -- | Check if the given filename should be considered as README file. Assumes @@ -65,4 +65,4 @@ renderReadme :: [Text] -> Text -> ByteString -> Widget renderReadme dir name content = let (base, ext) = breakExt name mediaType = chooseMediaType dir base ext () () - in renderSource mediaType content + in renderSourceBL mediaType content diff --git a/src/Vervis/Render.hs b/src/Vervis/Render.hs index 97d78f4..4a2f2ba 100644 --- a/src/Vervis/Render.hs +++ b/src/Vervis/Render.hs @@ -37,9 +37,8 @@ -- (4) Not implemented -- (5) Not implmented module Vervis.Render - ( --renderPlain - --, renderHighlight - renderSource + ( renderSourceT + , renderSourceBL ) where @@ -62,8 +61,10 @@ import Text.Pandoc.Readers.Markdown import Text.Pandoc.Writers.HTML import Yesod.Core.Widget (whamlet, toWidget) +import qualified Data.ByteString as B import qualified Data.ByteString.Lazy as BL import qualified Data.Text as T +import qualified Data.Text.Encoding as TE import qualified Data.Text.Encoding.Error as TE import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TLE @@ -72,24 +73,6 @@ import qualified Text.Highlighter.Lexers.Haskell as L.Haskell import Vervis.Foundation (Widget) import Vervis.MediaType (MediaType (..)) -renderPlain :: BL.ByteString -> Widget -renderPlain content = - [whamlet| -
-            #{TLE.decodeUtf8With TE.lenientDecode content}
-    |]
-
-{-renderHighlight
-    :: FilePath -> BL.ByteString -> Either (Maybe Lexer) (Lexer, Widget)
-renderHighlight name content =
-    case lexerFromFilename name of
-        Nothing    -> Left Nothing
-        Just lexer ->
-            case runLexer lexer $ BL.toStrict content of
-                Left err     -> Left $ Just lexer
-                Right tokens -> Right (lexer, toWidget $ format True tokens)
--}
-
 -- * File uploads and wiki attachments
 -- * Wiki pages
 -- * READMEs
@@ -128,15 +111,22 @@ renderHighlight name content =
 -- * [ ] asciidoc
 -- * [ ] groff manpage
 
-renderHighlight :: Lexer -> BL.ByteString -> Maybe Widget
+renderPlain :: TL.Text -> Widget
+renderPlain content =
+    [whamlet|
+        
+            #{content}
+    |]
+
+renderHighlight :: Lexer -> B.ByteString -> Maybe Widget
 renderHighlight lexer content =
-    case runLexer lexer $ BL.toStrict content of
+    case runLexer lexer content of
         Left err     -> Nothing
         Right tokens -> Just $ toWidget $ format True tokens
 
-renderCode :: Lexer -> BL.ByteString -> Widget
-renderCode lexer content =
-    fromMaybe (renderPlain content) $ renderHighlight lexer content
+renderCode :: Lexer -> TL.Text -> B.ByteString -> Widget
+renderCode lexer contentTL contentB =
+    fromMaybe (renderPlain contentTL) $ renderHighlight lexer contentB
 
 readerOptions :: ReaderOptions
 readerOptions = def
@@ -221,21 +211,31 @@ renderPandoc =
     renderHtml .
     writeHtml writerOptions
 
-renderSource :: MediaType -> BL.ByteString -> Widget
-renderSource mt content =
-    let contentBL = content
+renderSourceT :: MediaType -> T.Text -> Widget
+renderSourceT mt contentT =
+    let contentB = TE.encodeUtf8 contentT
+        contentTL = TL.fromStrict contentT
+        contentS = T.unpack contentT
+    in  renderSource mt contentB contentTL contentS
+
+renderSourceBL :: MediaType -> BL.ByteString -> Widget
+renderSourceBL mt contentBL =
+    let contentB = BL.toStrict contentBL
         contentTL = TLE.decodeUtf8With TE.lenientDecode contentBL
         contentS = TL.unpack contentTL
+    in  renderSource mt contentB contentTL contentS
 
-        mtName = T.pack $ show mt
+renderSource :: MediaType -> B.ByteString -> TL.Text -> String -> Widget
+renderSource mt contentB contentTL contentS =
+    let mtName = T.pack $ show mt
 
         failed e =
             "Failed to parse " <> mtName <> "content: " <> T.pack (show e)
 
         -- Plain text with line numbers
-        plain = renderPlain content
+        plain = renderPlain contentTL
         -- Syntax highlighted source code with line numbers
-        code l = renderCode l content
+        code l = renderCode l contentTL contentB
         -- Rendered document from String source
         docS r =
             case r readerOptions contentS of
@@ -258,23 +258,3 @@ renderSource mt content =
             Haskell   -> code L.Haskell.lexer
             -- * Misc
             _         -> plain
-
-{-renderSource :: FilePath -> BL.ByteString -> Widget
-renderSource name content =
-    let plain = renderPlain content
-    in  case renderHighlight name content of
-            Left Nothing -> do
-                $logDebug $ "No lexer found for " <> pack name
-                plain
-            Left (Just lexer) -> do
-                $logWarn $ sformat
-                    ( "Failed to highlight " % string % " with lexer "
-                    % string
-                    )
-                    name (lName lexer)
-                plain
-            Right (lexer, widget) -> do
-                $logDebug $ sformat
-                    ("Lexed " % string % " with " % string) name (lName lexer)
-                widget
--}
diff --git a/templates/ticket/one.hamlet b/templates/ticket/one.hamlet
index 4e826cc..675a900 100644
--- a/templates/ticket/one.hamlet
+++ b/templates/ticket/one.hamlet
@@ -33,9 +33,4 @@ $# .
 
 

#{ticketTitle ticket} -

- Below is the ticket description. It’s supposed to be rendered as Markdown, - but for now, temporarily, it’s shown here as plain text. - - -

#{ticketDesc ticket}
+^{desc}