@@ -3,7 +3,7 @@
3{-# LANGUAGE ViewPatterns #-}
3{-# LANGUAGE ViewPatterns #-}
5 Module : Text.Pandoc.Writers.JATS
5 Module : Text.Pandoc.Writers.JATS
6− Copyright : Copyright (C) 2017-2021 John MacFarlane
6+ Copyright : 2017-2021 John MacFarlane
7 License : GNU GPL, version 2 or above
7 License : GNU GPL, version 2 or above
9 Maintainer : John MacFarlane <jgm@berkeley.edu>
9 Maintainer : John MacFarlane <jgm@berkeley.edu>
@@ -168,13 +168,15 @@ plainToPara x = x
168-- | Convert a list of pairs of terms and definitions into a list of
168-- | Convert a list of pairs of terms and definitions into a list of
169-- JATS varlistentrys.
169-- JATS varlistentrys.
170deflistItemsToJATS :: PandocMonad m
170deflistItemsToJATS :: PandocMonad m
171− => WriterOptions -> [([Inline],[[Block]])] -> JATS m (Doc Text)
172+ -> [([Inline],[[Block]])] -> JATS m (Doc Text)
172deflistItemsToJATS opts items =
173deflistItemsToJATS opts items =
173 vcat <$> mapM (uncurry (deflistItemToJATS opts)) items
174 vcat <$> mapM (uncurry (deflistItemToJATS opts)) items
175-- | Convert a term and a list of blocks into a JATS varlistentry.
176-- | Convert a term and a list of blocks into a JATS varlistentry.
176deflistItemToJATS :: PandocMonad m
177deflistItemToJATS :: PandocMonad m
177− => WriterOptions -> [Inline] -> [[Block]] -> JATS m (Doc Text)
179+ -> [Inline] -> [[Block]] -> JATS m (Doc Text)
178deflistItemToJATS opts term defs = do
180deflistItemToJATS opts term defs = do
179 term' <- inlinesToJATS opts term
181 term' <- inlinesToJATS opts term
180 def' <- wrappedBlocksToJATS (not . isPara)
182 def' <- wrappedBlocksToJATS (not . isPara)
@@ -186,7 +188,8 @@ deflistItemToJATS opts term defs = do
187-- | Convert a list of lists of blocks to a list of JATS list items.
189-- | Convert a list of lists of blocks to a list of JATS list items.
188listItemsToJATS :: PandocMonad m
190listItemsToJATS :: PandocMonad m
189− => WriterOptions -> Maybe [Text] -> [[Block]] -> JATS m (Doc Text)
192+ -> Maybe [Text] -> [[Block]] -> JATS m (Doc Text)
190listItemsToJATS opts markers items =
193listItemsToJATS opts markers items =
191 case markers of
194 case markers of
192 Nothing -> vcat <$> mapM (listItemToJATS opts Nothing) items
195 Nothing -> vcat <$> mapM (listItemToJATS opts Nothing) items
@@ -194,12 +197,13 @@ listItemsToJATS opts markers items =
195-- | Convert a list of blocks into a JATS list item.
198-- | Convert a list of blocks into a JATS list item.
196listItemToJATS :: PandocMonad m
199listItemToJATS :: PandocMonad m
197− => WriterOptions -> Maybe Text -> [Block] -> JATS m (Doc Text)
201+ -> Maybe Text -> [Block] -> JATS m (Doc Text)
198listItemToJATS opts mbmarker item = do
202listItemToJATS opts mbmarker item = do
199 contents <- wrappedBlocksToJATS (not . isParaOrList) opts
203 contents <- wrappedBlocksToJATS (not . isParaOrList) opts
200 (walk demoteHeaderAndRefs item)
204 (walk demoteHeaderAndRefs item)
201 return $ inTagsIndented "list-item" $
205 return $ inTagsIndented "list-item" $
202− maybe empty (\lbl -> inTagsSimple "label" (text $ T.unpack lbl)) mbmarker
206+ maybe empty (inTagsSimple "label" . text . T.unpack) mbmarker
203 $$ contents
207 $$ contents
205imageMimeType :: Text -> [(Text, Text)] -> (Text, Text)
209imageMimeType :: Text -> [(Text, Text)] -> (Text, Text)
@@ -247,7 +251,9 @@ blockToJATS opts (Div (id',"section":_,kvs) (Header _lvl _ ils : xs)) = do
247 return $ inTags True "sec" attribs $
251 return $ inTags True "sec" attribs $
248 inTagsSimple "title" title' $$ contents
252 inTagsSimple "title" title' $$ contents
249-- Bibliography reference:
253-- Bibliography reference:
250−blockToJATS opts (Div (T.stripPrefix "ref-" -> Just _,_,_) [Para lst]) =
254+blockToJATS opts (Div (ident,_,_) [Para lst]) | "ref-" `T.isPrefixOf` ident =
255+ inTags True "ref" [("id", ident)] .
256+ inTagsSimple "mixed-citation" <$>
251 inlinesToJATS opts lst
257 inlinesToJATS opts lst
252blockToJATS opts (Div ("refs",_,_) xs) = do
258blockToJATS opts (Div ("refs",_,_) xs) = do
253 contents <- blocksToJATS opts xs
259 contents <- blocksToJATS opts xs
@@ -470,10 +476,13 @@ inlineToJATS _ (Link _attr [Str t] (T.stripPrefix "mailto:" -> Just email, _))
470 | escapeURI t == email =
476 | escapeURI t == email =
471 return $ inTagsSimple "email" $ literal (escapeStringForXML email)
477 return $ inTagsSimple "email" $ literal (escapeStringForXML email)
472inlineToJATS opts (Link (ident,_,kvs) txt (T.uncons -> Just ('#', src), _)) = do
478inlineToJATS opts (Link (ident,_,kvs) txt (T.uncons -> Just ('#', src), _)) = do
473− let attr = [("id", ident) | not (T.null ident)] ++
480+ [ [("id", ident) | not (T.null ident)]
474− [("alt", stringify txt) | not (null txt)] ++
481+ , [("alt", stringify txt) | not (null txt)]
475− [("rid", src)] ++
482+ , [("rid", src)]
476− [(k,v) | (k,v) <- kvs, k `elem` ["ref-type", "specific-use"]]
483+ , [(k,v) | (k,v) <- kvs, k `elem` ["ref-type", "specific-use"]]
484+ , [("ref-type", "bibr") | "ref-" `T.isPrefixOf` src]
477 if null txt
486 if null txt
478 then return $ selfClosingTag "xref" attr
487 then return $ selfClosingTag "xref" attr
@@ -529,7 +538,7 @@ demoteHeaderAndRefs (Div ("refs",cls,kvs) bs) =
529demoteHeaderAndRefs x = x
538demoteHeaderAndRefs x = x
531parseDate :: Text -> Maybe Day
540parseDate :: Text -> Maybe Day
532−parseDate s = msum (map (\fs -> parsetimeWith fs $ T.unpack s) formats) :: Maybe Day
541+parseDate s = msum (map (`parsetimeWith` T.unpack s) formats)
533 where parsetimeWith = parseTimeM True defaultTimeLocale
542 where parsetimeWith = parseTimeM True defaultTimeLocale
534 formats = ["%x","%m/%d/%Y", "%D","%F", "%d %b %Y",
543 formats = ["%x","%m/%d/%Y", "%D","%F", "%d %b %Y",
535 "%e %B %Y", "%b. %e, %Y", "%B %e, %Y",
544 "%e %B %Y", "%b. %e, %Y", "%B %e, %Y",