@@ -37,7 +37,6 @@ import Data.Generics (everywhere, mkT)
3737import Data.List (isSuffixOf, partition)
3838import Data.Maybe (fromMaybe)
3939import Data.Text (Text)
40−import qualified Text.Pandoc.Builder as B
4140import Text.Pandoc.Class (PandocMonad, report)
4241import Text.Pandoc.Definition
4342import Text.Pandoc.Highlighting (languages, languagesByExtension)
@@ -56,38 +55,14 @@ import qualified Text.XML.Light as Xml
5655data JATSVersion = JATS1_1
5756 deriving (Eq, Show)
5857
59−type DB = ReaderT JATSVersion
60−
61−-- | Convert list of authors to a docbook <author> section
62−authorToJATS :: PandocMonad m => WriterOptions -> [Inline] -> DB m B.Inlines
63−authorToJATS opts name' = do
64− name <- render Nothing <$> inlinesToJATS opts name'
65− let colwidth = if writerWrapText opts == WrapAuto
66− then Just $ writerColumns opts
67− else Nothing
68− return $ B.rawInline "docbook" $ render colwidth $
69− if ',' `elem` name
70− then -- last name first
71− let (lastname, rest) = break (==',') name
72− firstname = triml rest in
73− inTagsSimple "firstname" (text $ escapeStringForXML firstname) <>
74− inTagsSimple "surname" (text $ escapeStringForXML lastname)
75− else -- last name last
76− let namewords = words name
77− lengthname = length namewords
78− (firstname, lastname) = case lengthname of
79− 0 -> ("","")
80− 1 -> ("", name)
81− n -> (unwords (take (n-1) namewords), last namewords)
82− in inTagsSimple "firstname" (text $ escapeStringForXML firstname) $$
83− inTagsSimple "surname" (text $ escapeStringForXML lastname)
58+type JATS = ReaderT JATSVersion
8459
8560writeJATS :: PandocMonad m => WriterOptions -> Pandoc -> m Text
8661writeJATS opts d =
8762 runReaderT (docToJATS opts d) JATS1_1
8863
8964-- | Convert Pandoc document to string in JATS format.
90−docToJATS :: PandocMonad m => WriterOptions -> Pandoc -> DB m Text
65+docToJATS :: PandocMonad m => WriterOptions -> Pandoc -> JATS m Text
9166docToJATS opts (Pandoc meta blocks) = do
9267 let isBackBlock (Div ("refs",_,_) _) = True
9368 isBackBlock _ = False
@@ -110,14 +85,12 @@ docToJATS opts (Pandoc meta blocks) = do
11085 TopLevelChapter -> 0
11186 TopLevelSection -> 1
11287 TopLevelDefault -> 1
113− auths' <- mapM (authorToJATS opts) $ docAuthors meta
114− let meta' = B.setMeta "author" auths' meta
11588 metadata <- metaToJSON opts
11689 (fmap (render' . vcat) .
11790 mapM (elementToJATS opts' startLvl) .
11891 hierarchicalize)
11992 (fmap render' . inlinesToJATS opts')
120− meta'
93+ meta
12194 main <- (render' . vcat) <$>
12295 mapM (elementToJATS opts' startLvl) elements
12396 back <- (render' . vcat) <$>
@@ -132,7 +105,7 @@ docToJATS opts (Pandoc meta blocks) = do
132105 Just tpl -> renderTemplate' tpl context
133106
134107-- | Convert an Element to JATS.
135−elementToJATS :: PandocMonad m => WriterOptions -> Int -> Element -> DB m Doc
108+elementToJATS :: PandocMonad m => WriterOptions -> Int -> Element -> JATS m Doc
136109elementToJATS opts _ (Blk block) = blockToJATS opts block
137110elementToJATS opts lvl (Sec _ _num (id',_,kvs) title elements) = do
138111 let idAttr = [("id", writerIdentifierPrefix opts ++ id') | not (null id')]
@@ -144,7 +117,7 @@ elementToJATS opts lvl (Sec _ _num (id',_,kvs) title elements) = do
144117 inTagsSimple "title" title' $$ vcat contents
145118
146119-- | Convert a list of Pandoc blocks to JATS.
147−blocksToJATS :: PandocMonad m => WriterOptions -> [Block] -> DB m Doc
120+blocksToJATS :: PandocMonad m => WriterOptions -> [Block] -> JATS m Doc
148121blocksToJATS opts = fmap vcat . mapM (blockToJATS opts)
149122
150123-- | Auxiliary function to convert Plain block to Para.
@@ -155,13 +128,13 @@ plainToPara x = x
155128-- | Convert a list of pairs of terms and definitions into a list of
156129-- JATS varlistentrys.
157130deflistItemsToJATS :: PandocMonad m
158− => WriterOptions -> [([Inline],[[Block]])] -> DB m Doc
131+ => WriterOptions -> [([Inline],[[Block]])] -> JATS m Doc
159132deflistItemsToJATS opts items =
160133 vcat <$> mapM (uncurry (deflistItemToJATS opts)) items
161134
162135-- | Convert a term and a list of blocks into a JATS varlistentry.
163136deflistItemToJATS :: PandocMonad m
164− => WriterOptions -> [Inline] -> [[Block]] -> DB m Doc
137+ => WriterOptions -> [Inline] -> [[Block]] -> JATS m Doc
165138deflistItemToJATS opts term defs = do
166139 term' <- inlinesToJATS opts term
167140 def' <- blocksToJATS opts $ concatMap (map plainToPara) defs
@@ -171,7 +144,7 @@ deflistItemToJATS opts term defs = do
171144
172145-- | Convert a list of lists of blocks to a list of JATS list items.
173146listItemsToJATS :: PandocMonad m
174− => WriterOptions -> Maybe [String] -> [[Block]] -> DB m Doc
147+ => WriterOptions -> Maybe [String] -> [[Block]] -> JATS m Doc
175148listItemsToJATS opts markers items =
176149 case markers of
177150 Nothing -> vcat <$> mapM (listItemToJATS opts Nothing) items
@@ -179,7 +152,7 @@ listItemsToJATS opts markers items =
179152
180153-- | Convert a list of blocks into a JATS list item.
181154listItemToJATS :: PandocMonad m
182− => WriterOptions -> Maybe String -> [Block] -> DB m Doc
155+ => WriterOptions -> Maybe String -> [Block] -> JATS m Doc
183156listItemToJATS opts mbmarker item = do
184157 contents <- blocksToJATS opts item
185158 return $ inTagsIndented "list-item" $
@@ -187,7 +160,7 @@ listItemToJATS opts mbmarker item = do
187160 $$ contents
188161
189162-- | Convert a Pandoc block element to JATS.
190−blockToJATS :: PandocMonad m => WriterOptions -> Block -> DB m Doc
163+blockToJATS :: PandocMonad m => WriterOptions -> Block -> JATS m Doc
191164blockToJATS _ Null = return empty
192165-- Bibliography reference:
193166blockToJATS opts (Div ('r':'e':'f':'-':_,_,_) [Para lst]) =
@@ -311,7 +284,7 @@ tableRowToJATS :: PandocMonad m
311284 => WriterOptions
312285 -> Bool
313286 -> [[Block]]
314− -> DB m Doc
287+ -> JATS m Doc
315288tableRowToJATS opts isHeader cols =
316289 (inTagsIndented "tr" . vcat) <$> mapM (tableItemToJATS opts isHeader) cols
317290
@@ -319,17 +292,17 @@ tableItemToJATS :: PandocMonad m
319292 => WriterOptions
320293 -> Bool
321294 -> [Block]
322− -> DB m Doc
295+ -> JATS m Doc
323296tableItemToJATS opts isHeader item =
324297 (inTags True (if isHeader then "th" else "td") [] . vcat) <$>
325298 mapM (blockToJATS opts) item
326299
327300-- | Convert a list of inline elements to JATS.
328−inlinesToJATS :: PandocMonad m => WriterOptions -> [Inline] -> DB m Doc
301+inlinesToJATS :: PandocMonad m => WriterOptions -> [Inline] -> JATS m Doc
329302inlinesToJATS opts lst = hcat <$> mapM (inlineToJATS opts) lst
330303
331304-- | Convert an inline element to JATS.
332−inlineToJATS :: PandocMonad m => WriterOptions -> Inline -> DB m Doc
305+inlineToJATS :: PandocMonad m => WriterOptions -> Inline -> JATS m Doc
333306inlineToJATS _ (Str str) = return $ text $ escapeStringForXML str
334307inlineToJATS opts (Emph lst) =
335308 inTagsSimple "italic" <$> inlinesToJATS opts lst