@@ -20,7 +20,9 @@ import Control.Monad.State
2020import Data.Char (toLower)
2121import Data.Generics (everywhere, mkT)
2222import Data.List (isSuffixOf, partition, isPrefixOf)
23+import qualified Data.Map as M
2324import Data.Maybe (fromMaybe)
25+import Data.Time (toGregorian, Day, parseTimeM, defaultTimeLocale, formatTime)
2426import Data.Text (Text)
2527import Text.Pandoc.Class (PandocMonad, report)
2628import Text.Pandoc.Definition
@@ -88,8 +90,21 @@ docToJATS opts (Pandoc meta blocks) = do
8890 backs <- mapM (elementToJATS opts' startLvl) backElements
8991 let fns = inTagsIndented "fn-group" $ vcat notes
9092 let back = render' $ vcat backs $$ fns
93+ let date = case getField "date" metadata -- an object
94+ `mplus`
95+ (getField "date" metadata >>= parseDate) of
96+ Nothing -> mempty
97+ Just day ->
98+ let (y,m,d) = toGregorian day
99+ in M.insert ("year" :: String) (show y)
100+ $ M.insert "month" (show m)
101+ $ M.insert "day" (show d)
102+ $ M.insert "iso-8601"
103+ (formatTime defaultTimeLocale "%F" day)
104+ $ mempty
91105 let context = defField "body" main
92106 $ defField "back" back
107+ $ resetField ("date" :: String) date
93108 $ defField "mathml" (case writerHTMLMathMethod opts of
94109 MathML -> True
95110 _ -> False) metadata
@@ -505,3 +520,10 @@ demoteHeaderAndRefs (Header _ _ ils) = Para ils
505520demoteHeaderAndRefs (Div ("refs",cls,kvs) bs) =
506521 Div ("",cls,kvs) bs
507522demoteHeaderAndRefs x = x
523+
524+parseDate :: String -> Maybe Day
525+parseDate s = msum (map (\fs -> parsetimeWith fs s) formats) :: Maybe Day
526+ where parsetimeWith = parseTimeM True defaultTimeLocale
527+ formats = ["%x","%m/%d/%Y", "%D","%F", "%d %b %Y",
528+ "%e %B %Y", "%b. %e, %Y", "%B %e, %Y",
529+ "%Y%m%d", "%Y%m", "%Y"]