summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn MacFarlane <jgm@berkeley.edu>2023-09-04 16:31:26 -0700
committerJohn MacFarlane <jgm@berkeley.edu>2023-09-04 16:55:47 -0700
commitaca36563c9dc3eff03ca03a907d0565ec62575a9 (patch)
tree2b72a054954d66dbe5bbbe02dad85d8b23f3e0e9
parenta267b83bc83b8d1a46c38dbe7e88f153e1d7664d (diff)
JATS reader: fix conversion of date to ISO 8601 format.
See #8865.
-rw-r--r--src/Text/Pandoc/Readers/JATS.hs29
1 files changed, 21 insertions, 8 deletions
diff --git a/src/Text/Pandoc/Readers/JATS.hs b/src/Text/Pandoc/Readers/JATS.hs
index af7f4b536..fd90044af 100644
--- a/src/Text/Pandoc/Readers/JATS.hs
+++ b/src/Text/Pandoc/Readers/JATS.hs
@@ -39,6 +39,7 @@ import qualified Data.Set as S (fromList, member)
import Data.Set ((\\))
import Text.Pandoc.Sources (ToSources(..), sourcesToText)
import Safe (headMay)
+import Text.Printf (printf)
type JATS m = StateT JATSState m
@@ -437,16 +438,28 @@ getAbstract e =
getPubDate :: PandocMonad m => Element -> JATS m ()
getPubDate e =
case filterElement (named "pub-date") e of
- Just d -> do
- case maybeAttrValue "iso-8601-date" d of
- Just isod -> addMeta "date" (text isod)
- Nothing -> do
- let yr = strContent <$> filterElement (named "year") d
- let mon = strContent <$> filterElement (named "month") d
- let day = strContent <$> filterElement (named "day") d
- addMeta "date" $ text $ T.intercalate "-" $ catMaybes [yr, mon, day]
+ Just d -> getDate d >>= addMeta "date" . text
Nothing -> pure ()
+-- extract a structured date and create an ISO-8901 string date from it
+getDate :: PandocMonad m => Element -> JATS m Text
+getDate e =
+ case maybeAttrValue "iso-8601-date" e of
+ Just isod -> pure isod
+ Nothing -> do
+ let extractDate :: Element -> Maybe Int
+ extractDate = safeRead . strContent
+ let yr = filterElement (named "year") e >>= extractDate
+ let mon = filterElement (named "month") e >>= extractDate
+ let day = filterElement (named "day") e >>= extractDate
+ let stringDate = strContent <$> filterElement (named "string-date") e
+ pure $
+ case (yr, mon, day) of
+ (Just y, Just m, Just d) -> T.pack $ printf "%04d-%02d-%02d" y m d
+ (Just y, Just m, Nothing) -> T.pack $ printf "%04d-%02d" y m
+ (Just y, Nothing, Nothing) -> T.pack $ printf "%04d" y
+ _ -> fromMaybe mempty stringDate
+
getPermissions :: PandocMonad m => Element -> JATS m ()
getPermissions e = do
copyright <- getCopyright e