summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRoman Kuznetsov <roman@kuznero.com>2018-01-07 12:17:04 +0100
committerJasper Van der Jeugt <jaspervdj@gmail.com>2018-01-07 12:17:04 +0100
commit526cd35f418fe14bb0039900a00a0e024686ee34 (patch)
tree64ae258b61d3f9d31dc332bba21a4514d08052b6
parent480da307d22aff8ab3817d1586710c5f4ff6d779 (diff)
downloadhakyll-526cd35f418fe14bb0039900a00a0e024686ee34.tar.gz
Embed feed templates rather than using data-files
-rw-r--r--hakyll.cabal11
-rw-r--r--lib/Hakyll/Web/Feed.hs41
-rw-r--r--lib/Hakyll/Web/Template.hs2
-rw-r--r--lib/Hakyll/Web/Template/Internal.hs1
4 files changed, 36 insertions, 19 deletions
diff --git a/hakyll.cabal b/hakyll.cabal
index 65664f7..4a3dff1 100644
--- a/hakyll.cabal
+++ b/hakyll.cabal
@@ -56,10 +56,6 @@ Data-files:
example/index.html
example/about.rst
example/contact.markdown
- templates/atom-item.xml
- templates/atom.xml
- templates/rss-item.xml
- templates/rss.xml
Extra-source-files:
CHANGELOG.md
@@ -77,6 +73,10 @@ Extra-source-files:
tests/data/strip.html.out
tests/data/template.html
tests/data/template.html.out
+ data/templates/atom-item.xml
+ data/templates/atom.xml
+ data/templates/rss-item.xml
+ data/templates/rss.xml
Source-Repository head
Type: git
@@ -190,7 +190,8 @@ Library
unordered-containers >= 0.2 && < 0.3,
vector >= 0.11 && < 0.13,
yaml >= 0.8.11 && < 0.9,
- optparse-applicative >= 0.12 && < 0.15
+ optparse-applicative >= 0.12 && < 0.15,
+ file-embed >= 0.0.10.1 && < 0.0.11
If flag(previewServer)
Build-depends:
diff --git a/lib/Hakyll/Web/Feed.hs b/lib/Hakyll/Web/Feed.hs
index 6c6fa76..916a2fa 100644
--- a/lib/Hakyll/Web/Feed.hs
+++ b/lib/Hakyll/Web/Feed.hs
@@ -1,3 +1,5 @@
+{-# LANGUAGE TemplateHaskell #-}
+
--------------------------------------------------------------------------------
-- | A Module that allows easy rendering of RSS feeds.
--
@@ -25,7 +27,6 @@ module Hakyll.Web.Feed
--------------------------------------------------------------------------------
import Hakyll.Core.Compiler
-import Hakyll.Core.Compiler.Internal
import Hakyll.Core.Item
import Hakyll.Core.Util.String (replaceAll)
import Hakyll.Web.Template
@@ -34,7 +35,22 @@ import Hakyll.Web.Template.List
--------------------------------------------------------------------------------
-import Paths_hakyll
+import Data.ByteString.Char8 (unpack)
+import Data.FileEmbed (embedFile)
+
+
+--------------------------------------------------------------------------------
+rssTemplate :: String
+rssTemplate = unpack $(embedFile "data/templates/rss.xml")
+
+rssItemTemplate :: String
+rssItemTemplate = unpack $(embedFile "data/templates/rss-item.xml")
+
+atomTemplate :: String
+atomTemplate = unpack $(embedFile "data/templates/atom.xml")
+
+atomItemTemplate :: String
+atomItemTemplate = unpack $(embedFile "data/templates/atom-item.xml")
--------------------------------------------------------------------------------
@@ -55,15 +71,15 @@ data FeedConfiguration = FeedConfiguration
--------------------------------------------------------------------------------
-- | Abstract function to render any feed.
-renderFeed :: FilePath -- ^ Feed template
- -> FilePath -- ^ Item template
+renderFeed :: String -- ^ Default feed template
+ -> String -- ^ Default item template
-> FeedConfiguration -- ^ Feed configuration
-> Context String -- ^ Context for the items
-> [Item String] -- ^ Input items
-> Compiler (Item String) -- ^ Resulting item
-renderFeed feedPath itemPath config itemContext items = do
- feedTpl <- loadTemplate feedPath
- itemTpl <- loadTemplate itemPath
+renderFeed defFeed defItem config itemContext items = do
+ feedTpl <- readTemplateFile defFeed
+ itemTpl <- readTemplateFile defItem
protectedItems <- mapM (applyFilter protectCDATA) items
body <- makeItem =<< applyTemplateList itemTpl itemContext' protectedItems
@@ -73,10 +89,6 @@ renderFeed feedPath itemPath config itemContext items = do
applyFilter tr str = return $ fmap tr str
protectCDATA :: String -> String
protectCDATA = replaceAll "]]>" (const "]]&gt;")
- -- Auxiliary: load a template from a datafile
- loadTemplate path = do
- file <- compilerUnsafeIO $ getDataFileName path
- unsafeReadTemplateFile file
itemContext' = mconcat
[ itemContext
@@ -105,6 +117,9 @@ renderFeed feedPath itemPath config itemContext items = do
ListField _ _ -> fail "Hakyll.Web.Feed.renderFeed: Internal error"
StringField s -> return s
+ readTemplateFile :: String -> Compiler Template
+ readTemplateFile value = pure $ template $ readTemplateElems value
+
--------------------------------------------------------------------------------
-- | Render an RSS feed with a number of items.
@@ -113,7 +128,7 @@ renderRss :: FeedConfiguration -- ^ Feed configuration
-> [Item String] -- ^ Feed items
-> Compiler (Item String) -- ^ Resulting feed
renderRss config context = renderFeed
- "templates/rss.xml" "templates/rss-item.xml" config
+ rssTemplate rssItemTemplate config
(makeItemContext "%a, %d %b %Y %H:%M:%S UT" context)
@@ -124,7 +139,7 @@ renderAtom :: FeedConfiguration -- ^ Feed configuration
-> [Item String] -- ^ Feed items
-> Compiler (Item String) -- ^ Resulting feed
renderAtom config context = renderFeed
- "templates/atom.xml" "templates/atom-item.xml" config
+ atomTemplate atomItemTemplate config
(makeItemContext "%Y-%m-%dT%H:%M:%SZ" context)
diff --git a/lib/Hakyll/Web/Template.hs b/lib/Hakyll/Web/Template.hs
index 2a9684b..a436106 100644
--- a/lib/Hakyll/Web/Template.hs
+++ b/lib/Hakyll/Web/Template.hs
@@ -140,6 +140,8 @@
--
module Hakyll.Web.Template
( Template
+ , template
+ , readTemplateElems
, templateBodyCompiler
, templateCompiler
, applyTemplate
diff --git a/lib/Hakyll/Web/Template/Internal.hs b/lib/Hakyll/Web/Template/Internal.hs
index d0e4d47..154cee6 100644
--- a/lib/Hakyll/Web/Template/Internal.hs
+++ b/lib/Hakyll/Web/Template/Internal.hs
@@ -200,4 +200,3 @@ unsafeReadTemplateFile :: FilePath -> Compiler Template
unsafeReadTemplateFile file = do
tpl <- unsafeCompiler $ readFile file
pure $ template $ readTemplateElemsFile file tpl
-