@ +-- element if the @needsWrap@ predicate evaluates to @True@. wrappedBlocksToJATS :: PandocMonad m => (Block -> Bool) -> WriterOptions @@ -275,8 +312,12 @@ blockToJATS opts (Para lst) = inTagsSimple "p" <$> inlinesToJATS opts lst blockToJATS opts (LineBlock lns) = blockToJATS opts $ linesToPara lns -blockToJATS opts (BlockQuote blocks) = - inTagsIndented "disp-quote" <$> blocksToJATS opts blocks +blockToJATS opts (BlockQuote blocks) = do + tagSet <- ask + let blocksToJats' = if tagSet == TagSetArticleAuthoring + then wrappedBlocksToJATS (not . isPara) + else blocksToJATS + inTagsIndented "disp-quote" <$> blocksToJats' opts blocks blockToJATS _ (CodeBlock a str) = return $ inTags False tag attr (flush (text (T.unpack $ escapeStringForXML str))) where (lang, attr) = codeAttr a @@ -287,14 +328,20 @@ blockToJATS opts (BulletList lst) = listItemsToJATS opts Nothing lst blockToJATS _ (OrderedList _ []) = return empty blockToJATS opts (OrderedList (start, numstyle, delimstyle) items) = do - let listType = case numstyle of - DefaultStyle -> "order" - Decimal -> "order" - Example -> "order" - UpperAlpha -> "alpha-upper" - LowerAlpha -> "alpha-lower" - UpperRoman -> "roman-upper" - LowerRoman -> "roman-lower" + tagSet <- ask + let listType = + -- The Article Authoring tag set doesn't allow a more specific + -- @list-type@ attribute than "order". + if tagSet == TagSetArticleAuthoring + then "order" + else case numstyle of + DefaultStyle -> "order" + Decimal -> "order" + Example -> "order" + UpperAlpha -> "alpha-upper" + LowerAlpha -> "alpha-lower" + UpperRoman -> "roman-upper" + LowerRoman -> "roman-lower" let simpleList = start == 1 && (delimstyle == DefaultDelim || delimstyle == Period) let markers = if simpleList @@ -407,17 +454,22 @@ inlineToJATS opts SoftBreak | writerWrapText opts == WrapPreserve = return cr | otherwise = return space inlineToJATS opts (Note contents) = do - notes <- gets jatsNotes - let notenum = case notes of - (n, _):_ -> n + 1 - [] -> 1 - thenote <- inTags True "fn" [("id","fn" <> tshow notenum)] - <$> wrappedBlocksToJATS (not . isPara) opts - (walk demoteHeaderAndRefs contents) - modify $ \st -> st{ jatsNotes = (notenum, thenote) : notes } - return $ inTags False "xref" [("ref-type", "fn"), - ("rid", "fn" <> tshow notenum)] - $ text (show notenum) + tagSet <- ask + -- Footnotes must occur inline when using the Article Authoring tag set. + if tagSet == TagSetArticleAuthoring + then inTagsIndented "fn" <$> wrappedBlocksToJATS (not . isPara) opts contents + else do + notes <- gets jatsNotes + let notenum = case notes of + (n, _):_ -> n + 1 + [] -> 1 + thenote <- inTags True "fn" [("id","fn" <> tshow notenum)] + <$> wrappedBlocksToJATS (not . isPara) opts + (walk demoteHeaderAndRefs contents) + modify $ \st -> st{ jatsNotes = (notenum, thenote) : notes } + return $ inTags False "xref" [("ref-type", "fn"), + ("rid", "fn" <> tshow notenum)] + $ text (show notenum) inlineToJATS opts (Cite _ lst) = -- TODO revisit this after examining the jats.csl pipeline inlinesToJATS opts lst @@ -444,16 +496,22 @@ inlineToJATS _ (Math t str) = do let tagtype = case t of DisplayMath -> "disp-formula" InlineMath -> "inline-formula" - let rawtex = inTagsSimple "tex-math" - $ text " - literal str <> - text "]]>" - return $ inTagsSimple tagtype $ - case res of - Right r -> inTagsSimple "alternatives" $ - cr <> rawtex $$ - text (Xml.ppcElement conf $ fixNS r) - Left _ -> rawtex + + let rawtex = text " literal str <> text "]]>" + let texMath = inTagsSimple "tex-math" rawtex + + tagSet <- ask + return . inTagsSimple tagtype $ + case res of + Right r -> let mathMl = text (Xml.ppcElement conf $ fixNS r) + -- tex-math is unsupported in Article Authoring tag set + in if tagSet == TagSetArticleAuthoring + then mathMl + else inTagsSimple "alternatives" $ + cr <> texMath $$ mathMl + Left _ -> if tagSet /= TagSetArticleAuthoring + then texMath + else rawtex inlineToJATS _ (Link _attr [Str t] (T.stripPrefix "mailto:" -> Just email, _)) | escapeURI t == email = return $ inTagsSimple "email" $ literal (escapeStringForXML email) diff --git a/test/Tests/Old.hs b/test/Tests/Old.hs index 3543cdbb3..2851db5d4 100644 --- a/test/Tests/Old.hs +++ b/test/Tests/Old.hs @@ -94,7 +94,14 @@ tests pandocPath = [ testGroup "writer" $ writerTests' "docbook5" ] , testGroup "jats" - [ testGroup "writer" $ writerTests' "jats" + [ testGroup "writer" + [ testGroup "jats_archiving" $ + writerTests' "jats_archiving" + , testGroup "jats_articleauthoring" $ + writerTests' "jats_articleauthoring" + , testGroup "jats_publishing" $ + writerTests' "jats_publishing" + ] , test' "reader" ["-r", "jats", "-w", "native", "-s"] "jats-reader.xml" "jats-reader.native" ] diff --git a/test/Tests/Writers/JATS.hs b/test/Tests/Writers/JATS.hs index 6de058701..7d98f979b 100644 --- a/test/Tests/Writers/JATS.hs +++ b/test/Tests/Writers/JATS.hs @@ -11,7 +11,14 @@ import Text.Pandoc.Arbitrary () import Text.Pandoc.Builder jats :: (ToPandoc a) => a -> String -jats = unpack . purely (writeJATS def{ writerWrapText = WrapNone }) . toPandoc +jats = unpack + . purely (writeJATS def{ writerWrapText = WrapNone }) + . toPandoc + +jatsArticleAuthoring :: (ToPandoc a) => a -> String +jatsArticleAuthoring = unpack + . purely (writeJatsArticleAuthoring def{ writerWrapText = WrapNone }) + . toPandoc {- "my test" =: X =?> Y @@ -47,6 +54,13 @@ tests = [ testGroup "inline code" , testGroup "inlines" [ "Emphasis" =: emph "emphasized" =?> "
test footnote
Simple table with caption:
+Demonstration of simple table syntax.
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Simple table without caption:
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Simple table indented two spaces:
+Demonstration of simple table syntax.
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Multiline table with caption:
+Here’s the caption. It may span multiple lines.
+Centered Header | +Left Aligned | +Right Aligned | +Default aligned | +
---|---|---|---|
First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
Multiline table without caption:
+Centered Header | +Left Aligned | +Right Aligned | +Default aligned | +
---|---|---|---|
First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
Table without column headers:
+12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Multiline table without column headers:
+First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
Simple table with caption:
+Demonstration of simple table syntax.
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Simple table without caption:
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Simple table indented two spaces:
+Demonstration of simple table syntax.
+Right | +Left | +Center | +Default | +
---|---|---|---|
12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Multiline table with caption:
+Here’s the caption. It may span multiple lines.
+Centered Header | +Left Aligned | +Right Aligned | +Default aligned | +
---|---|---|---|
First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
Multiline table without caption:
+Centered Header | +Left Aligned | +Right Aligned | +Default aligned | +
---|---|---|---|
First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
Table without column headers:
+12 | +12 | +12 | +12 | +
123 | +123 | +123 | +123 | +
1 | +1 | +1 | +1 | +
Multiline table without column headers:
+First | +row | +12.0 | +Example of a row that spans multiple lines. | +
Second | +row | +5.0 | +Here’s another one. Note the blank line between rows. | +
This is a set of tests for pandoc. Most of them are adapted from John +Gruber’s markdown test suite.
+with no blank line
+with no blank line
+Here’s a regular paragraph.
+In Markdown 1.0.0 and earlier. Version 8. This line turns into a list + item. Because a hard-wrapped line in the middle of a paragraph looked like a + list item.
+Here’s one with a bullet. * criminey.
+There should be a hard line break + here.
+E-mail style:
+This is a block quote. It is pretty short.
+Code in a block quote:
+
+
A list:
+
+ item one item two
+
+
Nested block quotes:
+
+ nested
+ nested
This should not be a block quote: 2 > 1.
+And a following paragraph.
+Code:
+And:
+Asterisks tight:
+asterisk 1
+asterisk 2
+asterisk 3
+Asterisks loose:
+asterisk 1
+asterisk 2
+asterisk 3
+Pluses tight:
+Plus 1
+Plus 2
+Plus 3
+Pluses loose:
+Plus 1
+Plus 2
+Plus 3
+Minuses tight:
+Minus 1
+Minus 2
+Minus 3
+Minuses loose:
+Minus 1
+Minus 2
+Minus 3
+Tight:
+First
+Second
+Third
+and:
+One
+Two
+Three
+Loose using tabs:
+First
+Second
+Third
+and using spaces:
+One
+Two
+Three
+Multiple paragraphs:
+Item 1, graf one.
+Item 1. graf two. The quick brown fox jumped over the lazy dog’s + back.
+Item 2.
+Item 3.
+Tab
+Tab
+Tab
+Here’s another:
+First
+Second:
+Fee
+Fie
+Foe
+Third
+Same thing but with paragraphs:
+First
+Second:
+Fee
+Fie
+Foe
+Third
+this is a list item indented with tabs
+this is a list item indented with spaces
+this is an example list item indented with tabs
+this is an example list item indented with spaces
+begins with 2
+and now 3
+with a continuation
+sublist with roman numerals, starting with 4
+more items
+a subsublist
+a subsublist
+Nesting:
+Upper Alpha
+Upper Roman.
+Decimal start with 6
+Lower alpha with paren
+Autonumbering:
+Autonumber.
+More.
+Nested.
+Should not be a list item:
+M.A. 2007
+B. Williams
+Tight using spaces:
+red fruit
+orange fruit
+yellow fruit
+Tight using tabs:
+red fruit
+orange fruit
+yellow fruit
+Loose:
+red fruit
+orange fruit
+yellow fruit
+Multiple blocks with italics:
+red fruit
+contains seeds, crisp, pleasant to taste
+orange fruit
+
+
+ orange block quote
Multiple definitions, tight:
+red fruit
+computer
+orange fruit
+bank
+Multiple definitions, loose:
+red fruit
+computer
+orange fruit
+bank
+Blank line after term, indented marker, alternate markers:
+red fruit
+computer
+orange fruit
+
+ sublist sublist
+
+
Simple block on one line:
+foo
+And nested without indentation:
+foo
+bar
+Interpreted markdown in a table:
+This is
And this is
Here’s a simple block:
+foo
+This should be a code block, though:
+As should this:
+Now, nested:
+foo
+This should just be an HTML comment:
+Multiline:
+Code block:
+Just plain comment, with trailing spaces on the line:
+Code:
+Hr’s:
+This is
This is
An
So is
So is
This is code:
This is
Superscripts: abcd a
Subscripts: H2O, H23O, + Hmany of themO.
+These should not be superscripts or subscripts, because of the unescaped + spaces: a^b c^d, a~b c~d.
+“Hello,” said the spider. “‘Shelob’ is my name.”
+‘A’, ‘B’, and ‘C’ are letters.
+‘Oak,’ ‘elm,’ and ‘beech’ are names of trees. So is ‘pine.’
+‘He said, “I want to go.”’ Were you alive in the 70’s?
+Here is some quoted ‘
Some dashes: one—two — three—four — five.
+Dashes between numbers: 5–7, 255–66, 1987–1999.
+Ellipses…and…and….
+Here’s some display math:
+
Here’s one that has a line break in it:
+
These shouldn’t be math:
+To get the famous equation, write
+
$22,000 is a
Shoes ($20) and socks ($5).
+Escaped
Here’s a LaTeX table:
+Here is some unicode:
+I hat: Î
+o umlaut: ö
+section: §
+set membership: ∈
+copyright: ©
+AT&T has an ampersand in their name.
+AT&T is another way to write it.
+This & that.
+4 < 5.
+6 > 5.
+Backslash: \
+Backtick: `
+Asterisk: *
+Underscore: _
+Left brace: {
+Right brace: }
+Left bracket: [
+Right bracket: ]
+Left paren: (
+Right paren: )
+Greater-than: >
+Hash: #
+Period: .
+Bang: !
+Plus: +
+Minus: -
+Just a
+
Foo
+
With
Indented
+
Indented
+
Indented
+
This should [not][] be a link.
+Foo
+
Foo
+
Here’s a
+
Here’s a link with an amersand in the link text:
+
Here’s an
+
Here’s an
+
With an ampersand:
+
In a list?
+It should.
+An e-mail address:
Blockquoted:
+
Auto-links should not occur here:
+
From “Voyage dans la Lune” by Georges Melies (1902):
+lalune
Here is a movie
+
Here is a footnote reference, Here is the footnote. It can go anywhere after the footnote reference.
+ It need not be placed at the end of the document. Here’s the long note. This one contains multiple blocks. Subsequent blocks are indented to show that they belong to the footnote
+ (as with list items).
+ If you want, you can indent every line, but you can also be lazy and
+ just indent the first line of each block. This is
Notes can go in quotes. In quote.
And in list items. In list.
This paragraph should not be part of the note, as it is not indented.
+This is a set of tests for pandoc. Most of them are adapted from John +Gruber’s markdown test suite.
+with no blank line
+with no blank line
+Here’s a regular paragraph.
+In Markdown 1.0.0 and earlier. Version 8. This line turns into a list + item. Because a hard-wrapped line in the middle of a paragraph looked like a + list item.
+Here’s one with a bullet. * criminey.
+There should be a hard line break + here.
+E-mail style:
+This is a block quote. It is pretty short.
+Code in a block quote:
+A list:
+item one
+item two
+Nested block quotes:
+nested
+nested
+This should not be a block quote: 2 > 1.
+And a following paragraph.
+Code:
+And:
+Asterisks tight:
+asterisk 1
+asterisk 2
+asterisk 3
+Asterisks loose:
+asterisk 1
+asterisk 2
+asterisk 3
+Pluses tight:
+Plus 1
+Plus 2
+Plus 3
+Pluses loose:
+Plus 1
+Plus 2
+Plus 3
+Minuses tight:
+Minus 1
+Minus 2
+Minus 3
+Minuses loose:
+Minus 1
+Minus 2
+Minus 3
+Tight:
+First
+Second
+Third
+and:
+One
+Two
+Three
+Loose using tabs:
+First
+Second
+Third
+and using spaces:
+One
+Two
+Three
+Multiple paragraphs:
+Item 1, graf one.
+Item 1. graf two. The quick brown fox jumped over the lazy dog’s + back.
+Item 2.
+Item 3.
+Tab
+Tab
+Tab
+Here’s another:
+First
+Second:
+Fee
+Fie
+Foe
+Third
+Same thing but with paragraphs:
+First
+Second:
+Fee
+Fie
+Foe
+Third
+this is a list item indented with tabs
+this is a list item indented with spaces
+this is an example list item indented with tabs
+this is an example list item indented with spaces
+begins with 2
+and now 3
+with a continuation
+sublist with roman numerals, starting with 4
+more items
+a subsublist
+a subsublist
+Nesting:
+Upper Alpha
+Upper Roman.
+Decimal start with 6
+Lower alpha with paren
+Autonumbering:
+Autonumber.
+More.
+Nested.
+Should not be a list item:
+M.A. 2007
+B. Williams
+Tight using spaces:
+red fruit
+orange fruit
+yellow fruit
+Tight using tabs:
+red fruit
+orange fruit
+yellow fruit
+Loose:
+red fruit
+orange fruit
+yellow fruit
+Multiple blocks with italics:
+red fruit
+contains seeds, crisp, pleasant to taste
+orange fruit
+
+
+ orange block quote
Multiple definitions, tight:
+red fruit
+computer
+orange fruit
+bank
+Multiple definitions, loose:
+red fruit
+computer
+orange fruit
+bank
+Blank line after term, indented marker, alternate markers:
+red fruit
+computer
+orange fruit
+
+ sublist sublist
+
+
Simple block on one line:
+foo
+And nested without indentation:
+foo
+bar
+Interpreted markdown in a table:
+This is
And this is
Here’s a simple block:
+foo
+This should be a code block, though:
+As should this:
+Now, nested:
+foo
+This should just be an HTML comment:
+Multiline:
+Code block:
+Just plain comment, with trailing spaces on the line:
+Code:
+Hr’s:
+This is
This is
An
So is
So is
This is code:
This is
Superscripts: abcd a
Subscripts: H2O, H23O, + Hmany of themO.
+These should not be superscripts or subscripts, because of the unescaped + spaces: a^b c^d, a~b c~d.
+“Hello,” said the spider. “‘Shelob’ is my name.”
+‘A’, ‘B’, and ‘C’ are letters.
+‘Oak,’ ‘elm,’ and ‘beech’ are names of trees. So is ‘pine.’
+‘He said, “I want to go.”’ Were you alive in the 70’s?
+Here is some quoted ‘
Some dashes: one—two — three—four — five.
+Dashes between numbers: 5–7, 255–66, 1987–1999.
+Ellipses…and…and….
+Here’s some display math:
Here’s one that has a line break in it:
+
These shouldn’t be math:
+To get the famous equation, write
+
$22,000 is a
Shoes ($20) and socks ($5).
+Escaped
Here’s a LaTeX table:
+Here is some unicode:
+I hat: Î
+o umlaut: ö
+section: §
+set membership: ∈
+copyright: ©
+AT&T has an ampersand in their name.
+AT&T is another way to write it.
+This & that.
+4 < 5.
+6 > 5.
+Backslash: \
+Backtick: `
+Asterisk: *
+Underscore: _
+Left brace: {
+Right brace: }
+Left bracket: [
+Right bracket: ]
+Left paren: (
+Right paren: )
+Greater-than: >
+Hash: #
+Period: .
+Bang: !
+Plus: +
+Minus: -
+Just a
+
Foo
+
With
Indented
+
Indented
+
Indented
+
This should [not][] be a link.
+Foo
+
Foo
+
Here’s a
+
Here’s a link with an amersand in the link text:
+
Here’s an
+
Here’s an
+
With an ampersand:
+
In a list?
+It should.
+An e-mail address:
Blockquoted:
+
Auto-links should not occur here:
+
From “Voyage dans la Lune” by Georges Melies (1902):
+lalune
Here is a movie
+
Here is a footnote reference,
Notes can go in quotes.
And in list items.
This paragraph should not be part of the note, as it is not indented.
+Here is the footnote. It can go anywhere after the footnote reference. + It need not be placed at the end of the document.
+Here’s the long note. This one contains multiple blocks.
+Subsequent blocks are indented to show that they belong to the footnote + (as with list items).
+
+
If you want, you can indent every line, but you can also be lazy and + just indent the first line of each block.
+This is
In quote.
+In list.
+