48 lines
1.5 KiB
Haskell
48 lines
1.5 KiB
Haskell
{-# LANGUAGE QuasiQuotes, FlexibleContexts #-}
|
|
|
|
module Formats.Gogen (
|
|
convertFuriganaTitle,
|
|
convertFuriganaTitleHtml,
|
|
gogenCtx,
|
|
) where
|
|
|
|
import Hakyll
|
|
import Debug.Trace (traceId)
|
|
import Data.Maybe (fromMaybe)
|
|
import Text.Regex.PCRE.Heavy (gsub, re)
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- FURIGANA CONVERSION
|
|
|
|
type FuriganaTemplate = String
|
|
|
|
convertTitle = updateFieldWith "title" "???"
|
|
|
|
convertFuriganaTitle :: Item a -> Compiler String
|
|
convertFuriganaTitle = convertTitle replaceFuriganaWithKanji
|
|
|
|
convertFuriganaTitleHtml :: Item a -> Compiler String
|
|
convertFuriganaTitleHtml = convertTitle replaceFuriganaWithHtml
|
|
|
|
updateFieldWith :: String -> String -> (String -> String) -> Item a -> Compiler String
|
|
updateFieldWith field defaultPreviousValue f =
|
|
fmap updateField . getMetadata . itemIdentifier
|
|
where
|
|
updateField :: Metadata -> String
|
|
updateField = traceId . f . fromMaybe defaultPreviousValue . lookupString field
|
|
|
|
replaceFuriganaWithKanji :: FuriganaTemplate -> String
|
|
replaceFuriganaWithKanji = gsub [re|\[(.*?)\]\((.*?)\)|] (\(kanji:kana:_) -> kanji :: String)
|
|
|
|
replaceFuriganaWithHtml :: FuriganaTemplate -> String
|
|
replaceFuriganaWithHtml = between "<ruby>" "</ruby>" . gsub [re|\[(.*?)\]\((.*?)\)|] (\(kanji:kana:_) -> "<rb>" ++ kanji ++"</rb> <rp>(</rp><rt> " ++ kana ++ "</rt><rp>)</rp>" :: String)
|
|
where
|
|
between x y s = x ++ s ++ y
|
|
|
|
gogenCtx :: Context String
|
|
gogenCtx =
|
|
dateField "date" "%Y-%m-%d"
|
|
<> field "titleHtml" convertFuriganaTitleHtml
|
|
<> defaultContext
|
|
|