diff options
| author | John MacFarlane <jgm@berkeley.edu> | 2023-09-04 16:31:26 -0700 |
|---|---|---|
| committer | John MacFarlane <jgm@berkeley.edu> | 2023-09-04 16:55:47 -0700 |
| commit | aca36563c9dc3eff03ca03a907d0565ec62575a9 (patch) | |
| tree | 2b72a054954d66dbe5bbbe02dad85d8b23f3e0e9 | |
| parent | a267b83bc83b8d1a46c38dbe7e88f153e1d7664d (diff) | |
JATS reader: fix conversion of date to ISO 8601 format.
See #8865.
| -rw-r--r-- | src/Text/Pandoc/Readers/JATS.hs | 29 |
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 |
