Added "teasers" support to be used in posts index.

Just add "<!-- teaser_end -->" to separate the teaser and the rest of the article and use "$teaser$" key in the template!

Closes issue #35.
This commit is contained in:
Ivan N. Veselov 2013-05-04 17:24:03 +03:00
parent ca80171caf
commit 2651627189
2 changed files with 33 additions and 1 deletions

View file

@ -4,9 +4,11 @@ module Hakyll.Core.Util.String
( trim
, replaceAll
, splitAll
, needlePrefix
) where
import Data.Char (isSpace)
import Data.List (isPrefixOf)
import Data.Maybe (listToMaybe)
import Text.Regex.TDFA ((=~~))
@ -46,3 +48,21 @@ splitAll pattern = filter (not . null) . splitAll'
Just (o, l) ->
let (before, tmp) = splitAt o src
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.
--
-- 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
where
go [] = []
go xss@(x:xs) | needle `isPrefixOf` xss = []
| otherwise = x : go xs

View file

@ -7,6 +7,7 @@ module Hakyll.Web.Template.Context
, functionField
, defaultContext
, teaserContext
, bodyField
, metadataField
, urlField
@ -40,7 +41,7 @@ import Hakyll.Core.Identifier
import Hakyll.Core.Item
import Hakyll.Core.Metadata
import Hakyll.Core.Provider
import Hakyll.Core.Util.String (splitAll)
import Hakyll.Core.Util.String (splitAll, needlePrefix)
import Hakyll.Web.Html
@ -90,6 +91,17 @@ defaultContext =
titleField "title" `mappend`
missingField
--------------------------------------------------------------------------------
teaserContext :: Snapshot -> Context String
teaserContext snapshot = field "teaser" $ \item ->
(needlePrefix teaserSeparator . itemBody) <$>
loadSnapshot (itemIdentifier item) snapshot
--------------------------------------------------------------------------------
teaserSeparator :: String
teaserSeparator = "<!-- teaser_end -->"
--------------------------------------------------------------------------------
bodyField :: String -> Context String