From 3d713e9f2c08dc40e67340b9e6717bb6f6adb20c Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Fri, 22 Jul 2016 16:37:18 +0200 Subject: Fail if template is not parsed until eof This should fix the second problem in #376. --- src/Hakyll/Web/Template/Internal.hs | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/Hakyll/Web/Template/Internal.hs b/src/Hakyll/Web/Template/Internal.hs index 45db2e4..aa8e080 100644 --- a/src/Hakyll/Web/Template/Internal.hs +++ b/src/Hakyll/Web/Template/Internal.hs @@ -120,15 +120,22 @@ instance Binary TemplateExpr where -------------------------------------------------------------------------------- readTemplate :: String -> Template -readTemplate input = case P.parse template "" input of +readTemplate input = case P.parse topLevelTemplate "" input of Left err -> error $ "Cannot parse template: " ++ show err Right t -> t +-------------------------------------------------------------------------------- +topLevelTemplate :: P.Parser Template +topLevelTemplate = Template <$> + P.manyTill templateElement P.eof -------------------------------------------------------------------------------- template :: P.Parser Template -template = Template <$> - (P.many $ chunk <|> escaped <|> conditional <|> for <|> partial <|> expr) +template = Template <$> P.many templateElement + +-------------------------------------------------------------------------------- +templateElement :: P.Parser TemplateElement +templateElement = chunk <|> escaped <|> conditional <|> for <|> partial <|> expr -------------------------------------------------------------------------------- -- cgit v1.2.3 From 871cfd36ddd143f8fad14657e1c1fd80a9e6c66f Mon Sep 17 00:00:00 2001 From: Lorenzo Date: Sat, 23 Jul 2016 12:31:03 +0200 Subject: Include file name in error messages --- src/Hakyll/Web/Feed.hs | 6 +++++- src/Hakyll/Web/Template.hs | 9 ++++++--- src/Hakyll/Web/Template/Internal.hs | 9 ++++++++- 3 files changed, 19 insertions(+), 5 deletions(-) (limited to 'src') diff --git a/src/Hakyll/Web/Feed.hs b/src/Hakyll/Web/Feed.hs index 8598f8a..16b6dc0 100644 --- a/src/Hakyll/Web/Feed.hs +++ b/src/Hakyll/Web/Feed.hs @@ -33,6 +33,7 @@ import Hakyll.Core.Compiler.Internal import Hakyll.Core.Item import Hakyll.Web.Template import Hakyll.Web.Template.Context +import Hakyll.Web.Template.Internal import Hakyll.Web.Template.List @@ -72,7 +73,10 @@ renderFeed feedPath itemPath config itemContext items = do applyTemplate feedTpl feedContext body where -- Auxiliary: load a template from a datafile - loadTemplate = fmap readTemplate . readFile <=< getDataFileName + loadTemplate path = do + file <- getDataFileName path + templ <- readFile file + return $ readTemplateFile file templ itemContext' = mconcat [ itemContext diff --git a/src/Hakyll/Web/Template.hs b/src/Hakyll/Web/Template.hs index 65c4ac9..a662906 100644 --- a/src/Hakyll/Web/Template.hs +++ b/src/Hakyll/Web/Template.hs @@ -147,14 +147,16 @@ import Hakyll.Web.Template.Internal templateBodyCompiler :: Compiler (Item Template) templateBodyCompiler = cached "Hakyll.Web.Template.templateBodyCompiler" $ do item <- getResourceBody - return $ fmap readTemplate item + file <- getResourceFilePath + return $ fmap (readTemplateFile file) item -------------------------------------------------------------------------------- -- | Read complete file contents as a template templateCompiler :: Compiler (Item Template) templateCompiler = cached "Hakyll.Web.Template.templateCompiler" $ do item <- getResourceString - return $ fmap readTemplate item + file <- getResourceFilePath + return $ fmap (readTemplateFile file) item -------------------------------------------------------------------------------- @@ -259,5 +261,6 @@ applyAsTemplate :: Context String -- ^ Context -> Item String -- ^ Item and template -> Compiler (Item String) -- ^ Resulting item applyAsTemplate context item = - let tpl = readTemplate $ itemBody item + let tpl = readTemplateFile file (itemBody item) + file = toFilePath $ itemIdentifier item in applyTemplate tpl context item diff --git a/src/Hakyll/Web/Template/Internal.hs b/src/Hakyll/Web/Template/Internal.hs index aa8e080..a63c40d 100644 --- a/src/Hakyll/Web/Template/Internal.hs +++ b/src/Hakyll/Web/Template/Internal.hs @@ -8,6 +8,7 @@ module Hakyll.Web.Template.Internal , TemplateExpr (..) , TemplateElement (..) , readTemplate + , readTemplateFile ) where @@ -120,10 +121,16 @@ instance Binary TemplateExpr where -------------------------------------------------------------------------------- readTemplate :: String -> Template -readTemplate input = case P.parse topLevelTemplate "" input of +readTemplate = readTemplateFile "{literal}" + + +-------------------------------------------------------------------------------- +readTemplateFile :: FilePath -> String -> Template +readTemplateFile file input = case P.parse topLevelTemplate file input of Left err -> error $ "Cannot parse template: " ++ show err Right t -> t + -------------------------------------------------------------------------------- topLevelTemplate :: P.Parser Template topLevelTemplate = Template <$> -- cgit v1.2.3