import Text.Pandoc.Definition import qualified Data.Map.Strict as Map import Text.Pandoc.JSON import Misc import Control.Monad.Writer import Data.Monoid -- | replaces the @date@ field, which starts in YYYY-MM-DD format, with -- something prettier main :: IO () main = toJSONFilter \(Meta m) -> do (res', mdate) <- run $ Map.alterF reformat' "date" m let res = maybe m (\d -> Map.insert "date-iso" d res') mdate pure $ Meta res type T = WriterT (Alt Maybe MetaValue) IO run :: T a -> IO (a, Maybe MetaValue) run = fmap (fmap getAlt) . runWriterT reformat' :: Maybe MetaValue -> T (Maybe MetaValue) reformat' Nothing = pure Nothing reformat' (Just d) = do tell $ pure d; Just <$> reformat d reformat :: MetaValue -> T MetaValue reformat (toText -> Just txt) = MetaString . showDate <$> parseIsoDate txt reformat d = fail $ "date is\n" <> show d <> "\nwanted a string"