Only add teaser when <!--more--> is there

This commit is contained in:
Jasper Van der Jeugt 2013-06-17 12:01:22 +02:00
parent 25e15846a2
commit 6814ff2e9b
3 changed files with 40 additions and 27 deletions

View file

@ -1,5 +1,5 @@
--------------------------------------------------------------------------------
-- | Miscellaneous string manipulation functions.
--
module Hakyll.Core.Util.String
( trim
, replaceAll
@ -7,21 +7,24 @@ module Hakyll.Core.Util.String
, needlePrefix
) where
--------------------------------------------------------------------------------
import Data.Char (isSpace)
import Data.List (isPrefixOf)
import Data.Maybe (listToMaybe)
import Text.Regex.TDFA ((=~~))
--------------------------------------------------------------------------------
-- | Trim a string (drop spaces, tabs and newlines at both sides).
--
trim :: String -> String
trim = reverse . trim' . reverse . trim'
where
trim' = dropWhile isSpace
--------------------------------------------------------------------------------
-- | A simple (but inefficient) regex replace funcion
--
replaceAll :: String -- ^ Pattern
-> (String -> String) -- ^ Replacement (called on capture)
-> String -- ^ Source string
@ -35,9 +38,10 @@ replaceAll pattern f source = replaceAll' source
(capture, after) = splitAt l tmp
in before ++ f capture ++ replaceAll' after
--------------------------------------------------------------------------------
-- | A simple regex split function. The resulting list will contain no empty
-- strings.
--
splitAll :: String -- ^ Pattern
-> String -- ^ String to split
-> [String] -- ^ Result
@ -50,19 +54,24 @@ splitAll pattern = filter (not . null) . splitAll'
in before : splitAll' (drop l tmp)
-- | Find the first instance of needle (must be non-empty) in
-- haystack. We return the prefix of haystack before needle is
-- matched.
--------------------------------------------------------------------------------
-- | Find the first instance of needle (must be non-empty) in haystack. We
-- return the prefix of haystack before needle is matched.
--
-- Examples:
-- needlePrefix "cd" "abcde" = "ab"
-- needlePrefix "ab" "abc" = ""
-- needlePrefix "ab" "xxab" = "xx"
-- needlePrefix "a" "xx" = "xx"
--
needlePrefix :: String -> String -> String
needlePrefix needle haystack = go haystack
-- > needlePrefix "cd" "abcde" = "ab"
--
-- > needlePrefix "ab" "abc" = ""
--
-- > needlePrefix "ab" "xxab" = "xx"
--
-- > needlePrefix "a" "xx" = "xx"
needlePrefix :: String -> String -> Maybe String
needlePrefix needle haystack = go [] haystack
where
go [] = []
go xss@(x:xs) | needle `isPrefixOf` xss = []
| otherwise = x : go xs
go _ [] = Nothing
go acc xss@(x:xs)
| needle `isPrefixOf` xss = Just $ reverse acc
| otherwise = go (x : acc) xs

View file

@ -242,9 +242,13 @@ modificationTimeFieldWith locale key fmt = field key $ \i -> do
teaserField :: String -- ^ Key to use
-> Snapshot -- ^ Snapshot to load
-> Context String -- ^ Resulting context
teaserField key snapshot = field key $ \item ->
(needlePrefix teaserSeparator . itemBody) <$>
loadSnapshot (itemIdentifier item) snapshot
teaserField key snapshot = field key $ \item -> do
body <- itemBody <$> loadSnapshot (itemIdentifier item) snapshot
case needlePrefix teaserSeparator body of
Nothing -> fail $
"Hakyll.Web.Template.Context: no teaser defined for " ++
show (itemIdentifier item)
Just t -> return t
--------------------------------------------------------------------------------

View file

@ -30,13 +30,13 @@ tests = testGroup "Hakyll.Core.Util.String.Tests" $ concat
]
, fromAssertions "needlePrefix"
[ "ab" @=? needlePrefix "cd" "abcde"
, "xx" @=? needlePrefix "ab" "xxab"
, "xx" @=? needlePrefix "a" "xx"
, "x" @=? needlePrefix "ab" "xabxab"
, "" @=? needlePrefix "ab" "abc"
, "" @=? needlePrefix "ab" "abab"
, "" @=? needlePrefix "" ""
[ Just "ab" @=? needlePrefix "cd" "abcde"
, Just "xx" @=? needlePrefix "ab" "xxab"
, Nothing @=? needlePrefix "a" "xx"
, Just "x" @=? needlePrefix "ab" "xabxab"
, Just "" @=? needlePrefix "ab" "abc"
, Just "" @=? needlePrefix "ab" "abab"
, Nothing @=? needlePrefix "" ""
]
]