commit 1fe20bf3f899efe132e6df04d7b77339eb5aa5f0
parent 04139346bab015cea1de082cdd0cc59e476578fe
Author: krasjet
Date: 2020-03-17 08:51Z
include templates to pandoc output
Diffstat:
8 files changed, 90 insertions(+), 9 deletions(-)
diff --git a/karasu.cabal b/karasu.cabal
@@ -4,7 +4,7 @@ cabal-version: >=2.0
--
-- see: https://github.com/sol/hpack
--
--- hash: 1c6146379423834387b558bd03ebccfc375815488f25cfa367445b5a4c94e74c
+-- hash: c09f0ffd457692af0c3349c28016c948186fea57a013b56eb67ed3df480eb53c
name: karasu
version: 0.1.0.0
@@ -31,6 +31,8 @@ library
Karasu.Handlers.ApiPreviewDoc
Karasu.Handlers.Static
Karasu.Models
+ Karasu.Pandoc.Options
+ Karasu.Pandoc.Renderer
Karasu.Server
other-modules:
Paths_karasu
@@ -43,6 +45,7 @@ library
, blaze-html
, bytestring
, directory
+ , doctemplates
, dotenv
, filepath
, monad-logger
@@ -73,6 +76,7 @@ executable karasu
, blaze-html
, bytestring
, directory
+ , doctemplates
, dotenv
, filepath
, karasu
diff --git a/package.yaml b/package.yaml
@@ -18,6 +18,7 @@ dependencies:
- blaze-html
- bytestring
- directory
+- doctemplates
- dotenv
- filepath
- monad-logger
diff --git a/src/Karasu/Handlers/ApiCreateDoc.hs b/src/Karasu/Handlers/ApiCreateDoc.hs
@@ -72,5 +72,5 @@ createDoc docBody = do
docDir <- asks envDocDir
let mdFile = docDir </> dId <.> ".md"
liftIO $ createDirectoryIfMissing True $ takeDirectory mdFile
- liftIO $ TIO.writeFile mdFile $ T.pack $ "# " <> dId <> "\n"
+ liftIO $ TIO.writeFile mdFile $ T.pack $ "---\ntitle: " <> dId <> "\n---"
return "The doc is up. Hooray!"
diff --git a/src/Karasu/Handlers/ApiPreviewDoc.hs b/src/Karasu/Handlers/ApiPreviewDoc.hs
@@ -9,6 +9,7 @@ module Karasu.Handlers.ApiPreviewDoc (PreviewDocApi, previewDoc) where
import Karasu.Database
import Karasu.Handler
import Karasu.Models
+import Karasu.Pandoc.Renderer
import qualified Data.ByteString.Lazy.Char8 as LB8
@@ -20,7 +21,6 @@ import GHC.Generics
import Servant
import Servant.HTML.Blaze
import Text.Blaze.Html
-import Text.Pandoc
data PreviewDocBody = PreviewDocBody {
docId :: DocId,
@@ -48,13 +48,10 @@ previewDoc prevBody = do
Just (Entity _ doc) ->
-- yes, no accessCode doesn't mean no protection
when (docInfoAccCode doc /= accessCode prevBody) $
- throwError err403 { errBody = "Nope, try again." }
+ throwError err403 { errBody = "Access denied. Try again." }
-- now, start rendering the markdown file (TODO lift to a Pandoc package)
let md = markdown prevBody
-
- let out = runPure $ do
- pandoc <- readMarkdown def md
- writeHtml5 def pandoc
+ out <- liftIO $ renderPreview md
case out of
Left err -> throwError err400 { errBody = LB8.pack $ show err }
Right html -> return $ preEscapedToMarkup html
diff --git a/src/Karasu/Pandoc/Options.hs b/src/Karasu/Pandoc/Options.hs
@@ -0,0 +1,15 @@
+-- | Pandoc options
+module Karasu.Pandoc.Options (defKarasuReaderOptions, defKarasuWriterOptions) where
+
+import Text.Pandoc
+
+-- | Default reader options for Karasu
+defKarasuReaderOptions :: ReaderOptions
+defKarasuReaderOptions= def
+ { readerExtensions = enableExtension Ext_smart pandocExtensions }
+
+
+-- | Default writer options for Karasu
+defKarasuWriterOptions :: WriterOptions
+defKarasuWriterOptions = def
+ { writerExtensions = enableExtension Ext_smart pandocExtensions }
diff --git a/src/Karasu/Pandoc/Renderer.hs b/src/Karasu/Pandoc/Renderer.hs
@@ -0,0 +1,26 @@
+{-# LANGUAGE OverloadedStrings #-}
+
+-- | The renderer for markdown -> html conversion
+module Karasu.Pandoc.Renderer (renderPreview) where
+
+import Karasu.Pandoc.Options
+
+import qualified Data.Text as T
+
+import Control.Monad.Except (throwError)
+import Control.Monad.IO.Class (liftIO)
+import Data.Text (Text)
+import System.FilePath ((<.>), (</>))
+import Text.Blaze.Html
+import Text.DocTemplates
+import Text.Pandoc
+
+renderPreview :: Text -> IO (Either PandocError Html)
+renderPreview md = runIO $ do
+ pandoc <- readMarkdown defKarasuReaderOptions md
+ res <- liftIO $ compileTemplateFile $ "templates" </> "preview" <.> "html"
+ case res of
+ Left e -> throwError $ PandocTemplateError (T.pack e)
+ Right template -> do
+ let wOpts = defKarasuWriterOptions { writerTemplate = Just template }
+ writeHtml5 wOpts pandoc
diff --git a/stack.yaml b/stack.yaml
@@ -3,5 +3,20 @@ resolver: lts-14.27
packages:
- .
-extra-deps: []
+# several APIs about templates has changed since 2.7, so we need to use the
+# latest version
+extra-deps:
+- pandoc-2.9.2
+- HsYAML-0.2.1.0
+- doclayout-0.3
+- doctemplates-0.8.1
+- emojis-0.1
+- haddock-library-1.8.0
+- jira-wiki-markup-1.0.0
+- pandoc-types-1.20
+- skylighting-0.8.3.2
+- skylighting-core-0.8.3.2
+- texmath-0.12.0.1
+- regex-pcre-builtin-0.95.1.1.8.43
+- regex-base-0.94.0.0
diff --git a/templates/preview.html b/templates/preview.html
@@ -0,0 +1,23 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<title>$if(pagetitle)$$pagetitle$$else$$title$$endif$</title>
+<meta charset="utf-8" />
+<meta name="viewport" content="width=device-width, initial-scale=1" />
+<meta name="robots" content="noindex" />
+<meta name="referrer" content="no-referrer" />
+<link href="/styles/reset.css" rel="stylesheet" />
+<link href="/styles/doc/main.css" rel="stylesheet" />
+<link href="/fonts/fonts.css" rel="stylesheet" />
+<link href="/styles/doc/syntax.css" rel="stylesheet" />
+</head>
+<body>
+<header>
+<h1>$title$</h1>$if(author)$
+<div class="author sc">by $author$</div>$endif$
+</header>
+<main>
+$body$
+</main>
+</body>
+</html>