packages feed

hakyll-4.16.0.0: lib/Hakyll/Web/Meta/TwitterCard.hs

{- |

Twitter Card metadata, as described at
<https://developer.twitter.com/en/docs/twitter-for-websites/cards/guides/getting-started>.
This feature should be used alongside "Hakyll.Web.Meta.OpenGraph".
The following properties are supported:

+-------------------+----------------------------------------------------+
| @twitter:card@    | __Hardcoded__ card type = @"summary"@.             |
+-------------------+----------------------------------------------------+
| @twitter:creator@ | __Optional__ author's Twitter user name.           |
|                   | Taken from @twitter-creator@ context field, if set.|
+-------------------+----------------------------------------------------+
| @twitter:site@    | __Optional__ publication's Twitter user name.      |
|                   | Taken from @twitter-site@ context field, if set.   |
+-------------------+----------------------------------------------------+

To use, add 'openGraphField' and 'twitterCardField' to the template context:

@
let
  context = 'defaultContext' <> …
  postContext =
    context
    <> 'openGraphField' "opengraph" context
    <> 'twitterCardField' "twitter" context
@

and update the template:

@
\<head>
  \<title>$title$\</title>
  \<link rel="stylesheet" type="text\/css" href="\/css\/default.css" />
  $if(opengraph)$$opengraph$$endif$
  $if(twitter)$$twitter$$endif$
\</head>
@

-}
module Hakyll.Web.Meta.TwitterCard
  ( twitterCardField
  ) where

import Hakyll.Core.Compiler
import Hakyll.Core.Item
import Hakyll.Web.Template
import Hakyll.Web.Template.Context

twitterCardField :: String -> Context String -> Context String
twitterCardField k ctx = functionField k $ \_args i -> do
  template <- twitterCardTemplate
  itemBody <$> applyTemplate template ctx i

twitterCardTemplate :: Compiler Template
twitterCardTemplate = do
  makeItem twitterCardTemplateString >>= compileTemplateItem

twitterCardTemplateString :: String
twitterCardTemplateString =
  "<meta name=\"twitter:card\" content=\"summary\" />\
  \$if(twitter-creator)$<meta name=\"twitter:creator\" content=\"$twitter-creator$\" />$endif$\
  \$if(twitter-site)$<meta name=\"twitter:site\" content=\"$twitter-site$\" />$endif$"