@@ -72,7 +72,7 @@ data Chapter = Chapter (Maybe [Int]) [Block]
7272data EPUBMetadata = EPUBMetadata{
7373 epubIdentifier :: [Identifier]
7474 , epubTitle :: [Title]
75− , epubDate :: String
75+ , epubDate :: [Date]
7676 , epubLanguage :: String
7777 , epubCreator :: [Creator]
7878 , epubContributor :: [Creator]
@@ -93,6 +93,11 @@ data Stylesheet = StylesheetPath FilePath
9393 | StylesheetContents String
9494 deriving Show
9595
96+data Date = Date{
97+ dateText :: String
98+ , dateEvent :: Maybe String
99+ } deriving Show
100+
96101data Creator = Creator{
97102 creatorText :: String
98103 , creatorRole :: Maybe String
@@ -159,7 +164,9 @@ getEPUBMetadata opts meta = do
159164 if null (epubDate m)
160165 then do
161166 currentTime <- getCurrentTime
162− return $ m{ epubDate = showDateTimeISO8601 currentTime }
167+ return $ m{ epubDate = [ Date{
168+ dateText = showDateTimeISO8601 currentTime
169+ , dateEvent = Nothing } ] }
163170 else return m
164171 let addAuthor m =
165172 if any (\c -> creatorRole c == Just "aut") $ epubCreator m
@@ -183,8 +190,10 @@ addMetadataFromXML e@(Element (QName name _ (Just "dc")) attrs _ _) md
183190 , titleFileAs = getAttr "file-as"
184191 , titleType = getAttr "type"
185192 } : epubTitle md }
186− | name == "date" = md{ epubDate = fromMaybe "" $ normalizeDate'
187− $ strContent e }
193+ | name == "date" = md{ epubDate =
194+ Date{ dateText = fromMaybe "" $ normalizeDate' $ strContent e
195+ , dateEvent = getAttr "event"
196+ } : epubDate md }
188197 | name == "language" = md{ epubLanguage = strContent e }
189198 | name == "creator" = md{ epubCreator =
190199 Creator{ creatorText = strContent e
@@ -249,6 +258,16 @@ getCreator s meta = getList s meta handleMetaValue
249258 , creatorRole = metaValueToString <$> M.lookup "role" m }
250259 handleMetaValue mv = Creator (metaValueToString mv) Nothing Nothing
251260
261+getDate :: String -> Meta -> [Date]
262+getDate s meta = getList s meta handleMetaValue
263+ where handleMetaValue (MetaMap m) =
264+ Date{ dateText = maybe "" id $
265+ M.lookup "text" m >>= normalizeDate' . metaValueToString
266+ , dateEvent = metaValueToString <$> M.lookup "event" m }
267+ handleMetaValue mv = Date { dateText = maybe ""
268+ id $ normalizeDate' $ metaValueToString mv
269+ , dateEvent = Nothing }
270+
252271simpleList :: String -> Meta -> [String]
253272simpleList s meta =
254273 case lookupMeta s meta of
@@ -278,8 +297,7 @@ metadataFromMeta opts meta = EPUBMetadata{
278297 }
279298 where identifiers = getIdentifier meta
280299 titles = getTitle meta
281− date = fromMaybe "" $
282− (metaValueToString <$> lookupMeta "date" meta) >>= normalizeDate'
300+ date = getDate "date" meta
283301 language = maybe "" metaValueToString $
284302 lookupMeta "language" meta `mplus` lookupMeta "lang" meta
285303 creators = getCreator "creator" meta
@@ -637,7 +655,14 @@ metadataElement version md currentTime =
637655 identifierNodes = withIds "epub-id" toIdentifierNode $
638656 epubIdentifier md
639657 titleNodes = withIds "epub-title" toTitleNode $ epubTitle md
640− dateNodes = dcTag' "date" $ epubDate md
658+ dateNodes = if version == EPUB2
659+ then withIds "epub-date" toDateNode $ epubDate md
660+ else -- epub3 allows only one dc:date
661+ -- http://www.idpf.org/epub/30/spec/epub30-publications.html#sec-opf-dcdate
662+ case epubDate md of
663+ [] -> []
664+ (x:_) -> [dcNode "date" ! [("id","epub-date")]
665+ $ dateText x]
641666 languageNodes = [dcTag "language" $ epubLanguage md]
642667 creatorNodes = withIds "epub-creator" (toCreatorNode "creator") $
643668 epubCreator md
@@ -671,7 +696,7 @@ metadataElement version md currentTime =
671696 (schemeToOnix `fmap` scheme)
672697 toCreatorNode s id' creator
673698 | version == EPUB2 = [dcNode s !
674− ([("id",id')] ++
699+ (("id",id') :
675700 maybe [] (\x -> [("opf:file-as",x)]) (creatorFileAs creator) ++
676701 maybe [] (\x -> [("opf:role",x)])
677702 (creatorRole creator >>= toRelator)) $ creatorText creator]
@@ -685,7 +710,7 @@ metadataElement version md currentTime =
685710 (creatorRole creator >>= toRelator)
686711 toTitleNode id' title
687712 | version == EPUB2 = [dcNode "title" !
688− ([("id",id')] ++
713+ (("id",id') :
689714 maybe [] (\x -> [("opf:file-as",x)]) (titleFileAs title) ++
690715 maybe [] (\x -> [("opf:title-type",x)]) (titleType title)) $
691716 titleText title]
@@ -697,6 +722,10 @@ metadataElement version md currentTime =
697722 maybe [] (\x -> [unode "meta" !
698723 [("refines",'#':id'),("property","title-type")] $ x])
699724 (titleType title)
725+ toDateNode id' date = [dcNode "date" !
726+ (("id",id') :
727+ maybe [] (\x -> [("opf:event",x)]) (dateEvent date)) $
728+ dateText date]
700729 schemeToOnix "ISBN-10" = "02"
701730 schemeToOnix "GTIN-13" = "03"
702731 schemeToOnix "UPC" = "04"