packages feed

epub-tools-4.0: src/app/EpubTools/EpubName/Format/PubYear.hs

module EpubTools.EpubName.Format.PubYear
  ( extractYear
  , getPubYear
  )
  where

import Control.Applicative (asum)
import Codec.Epub.Data.Metadata (DateValue (..), DateEvent (Created, Date,
  Epub, Issued, Modified), Metadata (metaDates))
import Control.Monad ((<=<))
import qualified Data.Map.Strict as Map
import Text.Regex (matchRegex, mkRegex)

import EpubTools.EpubName.Common
  ( Options (pubYear)
  , PubYear (AnyDate, NoDate, NoModified)
  )
import EpubTools.EpubName.Format.Util (EN, Globals (gMetadata, gOpts), asks)


{- Look for publication date, return "" if none found
-}
getPubYear :: EN String
getPubYear = do
  yearHandling <- asks $ pubYear . gOpts
  let events = case yearHandling of
        AnyDate -> [Issued, Created, Date, Epub, Modified]
        NoModified -> [Issued, Created, Date, Epub]
        NoDate -> []
  datesMap <- asks (metaDates . gMetadata)
  let fs = map (flip Map.lookup $ datesMap) events
  pure . maybe "" ('_' :) . (extractYear <=< asum) $ fs


extractYear :: DateValue -> Maybe String
extractYear (DateValue dateString) =
  case matchRegex (mkRegex "(^| )([0-9]{4})") dateString of
    Just (_ : y : []) -> Just y
    _                 -> Nothing