aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers/Docbook.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Writers/Docbook.hs')
-rw-r--r--src/Text/Pandoc/Writers/Docbook.hs78
1 files changed, 43 insertions, 35 deletions
diff --git a/src/Text/Pandoc/Writers/Docbook.hs b/src/Text/Pandoc/Writers/Docbook.hs
index 0fa4a1d98..29fdf965f 100644
--- a/src/Text/Pandoc/Writers/Docbook.hs
+++ b/src/Text/Pandoc/Writers/Docbook.hs
@@ -59,14 +59,14 @@ hierarchicalize (block:rest) =
x -> (Blk x):(hierarchicalize rest)
-- | Convert list of authors to a docbook <author> section
-authorToDocbook :: WriterOptions -> [Char] -> Doc
-authorToDocbook opts name = inTagsIndented opts "author" $
+authorToDocbook :: [Char] -> Doc
+authorToDocbook name = inTagsIndented "author" $
if ',' `elem` name
then -- last name first
let (lastname, rest) = break (==',') name
firstname = removeLeadingSpace rest in
- inTagsSimple opts "firstname" (text $ stringToSGML opts firstname) <>
- inTagsSimple opts "surname" (text $ stringToSGML opts lastname)
+ inTagsSimple "firstname" (text $ stringToSGML firstname) <>
+ inTagsSimple "surname" (text $ stringToSGML lastname)
else -- last name last
let namewords = words name
lengthname = length namewords
@@ -74,8 +74,8 @@ authorToDocbook opts name = inTagsIndented opts "author" $
0 -> ("","")
1 -> ("", name)
n -> (joinWithSep " " (take (n-1) namewords), last namewords) in
- inTagsSimple opts "firstname" (text $ stringToSGML opts firstname) $$
- inTagsSimple opts "surname" (text $ stringToSGML opts lastname)
+ inTagsSimple "firstname" (text $ stringToSGML firstname) $$
+ inTagsSimple "surname" (text $ stringToSGML lastname)
-- | Convert Pandoc document to string in Docbook format.
writeDocbook :: WriterOptions -> Pandoc -> String
@@ -84,22 +84,24 @@ writeDocbook opts (Pandoc (Meta title authors date) blocks) =
then text (writerHeader opts)
else empty
meta = if (writerStandalone opts)
- then inTagsIndented opts "articleinfo" $
- (inTagsSimple opts "title" (inlinesToDocbook opts title)) $$
- (vcat (map (authorToDocbook opts) authors)) $$
- (inTagsSimple opts "date" (text $ stringToSGML opts date))
+ then inTagsIndented "articleinfo" $
+ (inTagsSimple "title" (wrap opts title)) $$
+ (vcat (map authorToDocbook authors)) $$
+ (inTagsSimple "date" (text $ stringToSGML date))
else empty
blocks' = replaceReferenceLinks blocks
(noteBlocks, blocks'') = partition isNoteBlock blocks'
opts' = opts {writerNotes = noteBlocks}
elements = hierarchicalize blocks''
- body = text (writerIncludeBefore opts') <>
+ before = writerIncludeBefore opts'
+ after = writerIncludeAfter opts'
+ body = (if null before then empty else text before) $$
vcat (map (elementToDocbook opts') elements) $$
- text (writerIncludeAfter opts')
+ (if null after then empty else text after)
body' = if writerStandalone opts'
- then inTagsIndented opts "article" (meta $$ body)
+ then inTagsIndented "article" (meta $$ body)
else body in
- render $ head $$ body' <> text "\n"
+ render $ head $$ body' $$ text ""
-- | Convert an Element to Docbook.
elementToDocbook :: WriterOptions -> Element -> Doc
@@ -109,8 +111,8 @@ elementToDocbook opts (Sec title elements) =
let elements' = if null elements
then [Blk (Para [])]
else elements in
- inTagsIndented opts "section" $
- inTagsSimple opts "title" (wrap opts title) $$
+ inTagsIndented "section" $
+ inTagsSimple "title" (wrap opts title) $$
vcat (map (elementToDocbook opts) elements')
-- | Convert a list of Pandoc blocks to Docbook.
@@ -128,7 +130,7 @@ listItemToDocbook opts item =
let plainToPara (Plain x) = Para x
plainToPara y = y in
let item' = map plainToPara item in
- inTagsIndented opts "listitem" (blocksToDocbook opts item')
+ inTagsIndented "listitem" (blocksToDocbook opts item')
-- | Convert a Pandoc block element to Docbook.
blockToDocbook :: WriterOptions -> Block -> Doc
@@ -136,20 +138,20 @@ blockToDocbook opts Blank = text ""
blockToDocbook opts Null = empty
blockToDocbook opts (Plain lst) = wrap opts lst
blockToDocbook opts (Para lst) =
- inTagsIndented opts "para" (wrap opts lst)
+ inTagsIndented "para" (wrap opts lst)
blockToDocbook opts (BlockQuote blocks) =
- inTagsIndented opts "blockquote" (blocksToDocbook opts blocks)
+ inTagsIndented "blockquote" (blocksToDocbook opts blocks)
blockToDocbook opts (CodeBlock str) =
text "<screen>\n" <> text (escapeSGML str) <> text "\n</screen>"
blockToDocbook opts (BulletList lst) =
- inTagsIndented opts "itemizedlist" $ listItemsToDocbook opts lst
+ inTagsIndented "itemizedlist" $ listItemsToDocbook opts lst
blockToDocbook opts (OrderedList lst) =
- inTagsIndented opts "orderedlist" $ listItemsToDocbook opts lst
+ inTagsIndented "orderedlist" $ listItemsToDocbook opts lst
blockToDocbook opts (RawHtml str) = text str -- raw XML block
blockToDocbook opts HorizontalRule = empty -- not semantic
blockToDocbook opts (Note _ _) = empty -- shouldn't occur
blockToDocbook opts (Key _ _) = empty -- shouldn't occur
-blockToDocbook opts _ = inTagsIndented opts "para" (text "Unknown block type")
+blockToDocbook opts _ = inTagsIndented "para" (text "Unknown block type")
-- | Put string in CDATA section
cdata :: String -> Doc
@@ -165,14 +167,20 @@ inlinesToDocbook opts lst = hcat (map (inlineToDocbook opts) lst)
-- | Convert an inline element to Docbook.
inlineToDocbook :: WriterOptions -> Inline -> Doc
-inlineToDocbook opts (Str str) = text $ stringToSGML opts str
+inlineToDocbook opts (Str str) = text $ stringToSGML str
inlineToDocbook opts (Emph lst) =
- inTagsSimple opts "emphasis" (inlinesToDocbook opts lst)
+ inTagsSimple "emphasis" (inlinesToDocbook opts lst)
inlineToDocbook opts (Strong lst) =
- inTags False opts "emphasis" [("role", "strong")]
+ inTags False "emphasis" [("role", "strong")]
(inlinesToDocbook opts lst)
+inlineToDocbook opts (Quoted _ lst) =
+ inTagsSimple "quote" (inlinesToDocbook opts lst)
+inlineToDocbook opts Apostrophe = text "&apos;"
+inlineToDocbook opts Ellipses = text "&hellip;"
+inlineToDocbook opts EmDash = text "&mdash;"
+inlineToDocbook opts EnDash = text "&ndash;"
inlineToDocbook opts (Code str) =
- inTagsSimple opts "literal" $ text (escapeSGML str)
+ inTagsSimple "literal" $ text (escapeSGML str)
inlineToDocbook opts (TeX str) = inlineToDocbook opts (Code str)
inlineToDocbook opts (HtmlInline str) = empty
inlineToDocbook opts LineBreak =
@@ -180,19 +188,19 @@ inlineToDocbook opts LineBreak =
inlineToDocbook opts Space = char ' '
inlineToDocbook opts (Link txt (Src src tit)) =
case (matchRegex (mkRegex "mailto:(.*)") src) of
- Just [addr] -> inTagsSimple opts "email" $ text (escapeSGML addr)
- Nothing -> inTags False opts "ulink" [("url", src)] $
+ Just [addr] -> inTagsSimple "email" $ text (escapeSGML addr)
+ Nothing -> inTags False "ulink" [("url", src)] $
inlinesToDocbook opts txt
inlineToDocbook opts (Link text (Ref ref)) = empty -- shouldn't occur
inlineToDocbook opts (Image alt (Src src tit)) =
let titleDoc = if null tit
then empty
- else inTagsIndented opts "objectinfo" $
- inTagsIndented opts "title"
- (text $ stringToSGML opts tit) in
- inTagsIndented opts "inlinemediaobject" $
- inTagsIndented opts "imageobject" $
- titleDoc $$ selfClosingTag opts "imagedata" [("fileref", src)]
+ else inTagsIndented "objectinfo" $
+ inTagsIndented "title"
+ (text $ stringToSGML tit) in
+ inTagsIndented "inlinemediaobject" $
+ inTagsIndented "imageobject" $
+ titleDoc $$ selfClosingTag "imagedata" [("fileref", src)]
inlineToDocbook opts (Image alternate (Ref ref)) = empty --shouldn't occur
inlineToDocbook opts (NoteRef ref) =
let notes = writerNotes opts
@@ -200,4 +208,4 @@ inlineToDocbook opts (NoteRef ref) =
if null hits
then empty
else let (Note _ contents) = head hits in
- inTagsIndented opts "footnote" $ blocksToDocbook opts contents
+ inTagsIndented "footnote" $ blocksToDocbook opts contents