From ff57c2f660d604bc6fcae104e108f8d991a48906 Mon Sep 17 00:00:00 2001 From: Jasper Van der Jeugt Date: Sun, 4 Apr 2010 15:08:59 +0200 Subject: Added fix to allow dashes in pages. Hakyll splits pages into metadata sections by lines starting with `---`. Because of this, thing like Header ------ Some text. will not parse. This commit fixes this, by fixating the length of the the dash pattern -- all dashed lines should contain the same number of dashes. Therefor, you can use something like --- title: Foobar --- Header ------ Some text. --- src/Text/Hakyll/Internal/Page.hs | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) (limited to 'src/Text/Hakyll') diff --git a/src/Text/Hakyll/Internal/Page.hs b/src/Text/Hakyll/Internal/Page.hs index 0ba8983..d3d0ec1 100644 --- a/src/Text/Hakyll/Internal/Page.hs +++ b/src/Text/Hakyll/Internal/Page.hs @@ -8,6 +8,7 @@ import Data.List (isPrefixOf) import Data.Char (isSpace) import Control.Monad.Reader (liftIO) import System.FilePath +import Control.Monad.State (State, evalState, get, put) import Text.Pandoc @@ -53,16 +54,25 @@ getRenderFunction fileType = writeHtmlString writerOptions readOptions _ = readerOptions -- | Split a page into sections. -splitAtDelimiters :: [String] -> [[String]] -splitAtDelimiters [] = [] -splitAtDelimiters ls@(x:xs) - | isDelimiter x = let (content, rest) = break isDelimiter xs - in (x : content) : splitAtDelimiters rest - | otherwise = [ls] +splitAtDelimiters :: [String] -> State (Maybe String) [[String]] +splitAtDelimiters [] = return [] +splitAtDelimiters ls@(x:xs) = do + delimiter <- get + if not (isDelimiter delimiter x) + then return [ls] + else do let proper = takeWhile (== '-') x + (content, rest) = break (isDelimiter $ Just proper) xs + put $ Just proper + rest' <- splitAtDelimiters rest + return $ (x : content) : rest' + where + isDelimiter old = case old of + Nothing -> isPossibleDelimiter + (Just d) -> (== d) . takeWhile (== '-') -- | Check if the given string is a metadata delimiter. -isDelimiter :: String -> Bool -isDelimiter = isPrefixOf "---" +isPossibleDelimiter :: String -> Bool +isPossibleDelimiter = isPrefixOf "---" -- | Read one section of a page. readSection :: (String -> String) -- ^ Render function. @@ -76,7 +86,7 @@ readSection renderFunction isFirst ls | isFirst = readSimpleMetaData (tail ls) | otherwise = body (tail ls) where - isDelimiter' = isDelimiter (head ls) + isDelimiter' = isPossibleDelimiter (head ls) isNamedDelimiter = head ls `matchesRegex` "^----* *[a-zA-Z0-9][a-zA-Z0-9]*" body ls' = [("body", renderFunction $ unlines ls')] @@ -100,7 +110,7 @@ readPageFromFile path = do -- Read file. contents <- liftIO $ readFile path url <- toUrl path - let sections = splitAtDelimiters $ lines contents + let sections = evalState (splitAtDelimiters $ lines contents) Nothing sectionsData = concat $ zipWith ($) sectionFunctions sections context = M.fromList $ ("url", url) : ("path", path) : category ++ sectionsData -- cgit v1.2.3