aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/Readers/JATS.hs32
-rw-r--r--test/jats-reader.native2
-rw-r--r--test/jats-reader.xml12
3 files changed, 40 insertions, 6 deletions
diff --git a/src/Text/Pandoc/Readers/JATS.hs b/src/Text/Pandoc/Readers/JATS.hs
index 8c0cb2db5..29c443d86 100644
--- a/src/Text/Pandoc/Readers/JATS.hs
+++ b/src/Text/Pandoc/Readers/JATS.hs
@@ -182,6 +182,7 @@ parseBlock (Elem e) =
"sec" -> gets jatsSectionLevel >>= sect . (+1)
"title" -> return mempty
"title-group" -> checkInMeta getTitle
+ "contrib-group" -> checkInMeta getAuthors
"graphic" -> para <$> getGraphic e
"journal-meta" -> metaBlock
"article-meta" -> metaBlock
@@ -239,7 +240,28 @@ parseBlock (Elem e) =
Just s -> (text ": " <>) <$>
getInlines s
Nothing -> return mempty
- addMeta "title" (tit <> subtit)
+ when (tit /= mempty) $ addMeta "title" tit
+ when (subtit /= mempty) $ addMeta "subtitle" subtit
+
+ getAuthors :: PandocMonad m => JATS m ()
+ getAuthors = do
+ authors <- mapM getContrib $ filterChildren
+ (\x -> named "contrib" x &&
+ attrValue "contrib-type" x == "author") e
+ unless (null authors) $ addMeta "author" authors
+
+ getContrib :: PandocMonad m => Element -> JATS m Inlines
+ getContrib x = do
+ given <- maybe (return mempty) getInlines
+ $ filterElement (named "given-names") x
+ family <- maybe (return mempty) getInlines
+ $ filterElement (named "surname") x
+ if given == mempty && family == mempty
+ then return mempty
+ else if given == mempty || family == mempty
+ then return $ given <> family
+ else return $ given <> space <> family
+ -- TODO institute, etc.
parseTable = do
let isCaption x = named "title" x || named "caption" x
@@ -345,19 +367,19 @@ parseRef e = do
let refPages = refFirstPage <> (if refLastPage == mempty
then mempty
else text "\x2013" <> refLastPage)
- let personGroups' = filterElements (named "person-group") c
+ let personGroups' = filterChildren (named "person-group") c
let getName nm = do
given <- maybe (return mempty) getInlines
- $ filterElement (named "given-names") nm
+ $ filterChild (named "given-names") nm
family <- maybe (return mempty) getInlines
- $ filterElement (named "surname") nm
+ $ filterChild (named "surname") nm
return $ toMetaValue $ Map.fromList [
("given", given)
, ("family", family)
]
personGroups <- mapM (\pg ->
do names <- mapM getName
- (filterElements (named "name") pg)
+ (filterChildren (named "name") pg)
return (attrValue "person-group-type" pg,
toMetaValue names))
personGroups'
diff --git a/test/jats-reader.native b/test/jats-reader.native
index 2bc8b94ce..a7c349149 100644
--- a/test/jats-reader.native
+++ b/test/jats-reader.native
@@ -1,4 +1,4 @@
-Pandoc (Meta {unMeta = fromList [("title",MetaInlines [Str "Pandoc",Space,Str "Test",Space,Str "Suite"])]})
+Pandoc (Meta {unMeta = fromList [("author",MetaList [MetaInlines [Str "John",Space,Str "MacFarlane"]]),("title",MetaInlines [Str "Pandoc",Space,Str "Test",Space,Str "Suite"])]})
[Para [Str "This",Space,Str "is",Space,Str "a",Space,Str "set",Space,Str "of",Space,Str "tests",Space,Str "for",Space,Str "pandoc.",Space,Str "Most",Space,Str "of",Space,Str "them",Space,Str "are",Space,Str "adapted",Space,Str "from",Space,Str "John",SoftBreak,Str "Gruber's",Space,Str "markdown",Space,Str "test",Space,Str "suite."]
,Header 1 ("headers",[],[]) [Str "Headers"]
,Header 2 ("level-2-with-an-embedded-link",[],[]) [Str "Level",Space,Str "2",Space,Str "with",Space,Str "an",SoftBreak,Link ("",[],[]) [Str "embedded",SoftBreak,Str "link"] ("/url","")]
diff --git a/test/jats-reader.xml b/test/jats-reader.xml
index eb06fcc22..f98caa46e 100644
--- a/test/jats-reader.xml
+++ b/test/jats-reader.xml
@@ -14,6 +14,18 @@
<title-group>
<article-title>Pandoc Test Suite</article-title>
</title-group>
+<contrib-group>
+ <contrib contrib-type="author">
+ <name>
+ <surname>MacFarlane</surname>
+ <given-names>John</given-names>
+ </name>
+ <contrib contrib-type="author">
+ <name>
+ <surname>Anonymous</surname>
+ </name>
+ </contrib>
+</contrib-group>
</article-meta>
</front>
<body>