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