aboutsummaryrefslogtreecommitdiff
path: root/src/Text/Pandoc/Writers/AsciiDoc.hs
diff options
context:
space:
mode:
Diffstat (limited to 'src/Text/Pandoc/Writers/AsciiDoc.hs')
-rw-r--r--src/Text/Pandoc/Writers/AsciiDoc.hs63
1 files changed, 46 insertions, 17 deletions
diff --git a/src/Text/Pandoc/Writers/AsciiDoc.hs b/src/Text/Pandoc/Writers/AsciiDoc.hs
index c67178b7a..76d069828 100644
--- a/src/Text/Pandoc/Writers/AsciiDoc.hs
+++ b/src/Text/Pandoc/Writers/AsciiDoc.hs
@@ -56,12 +56,13 @@ import Text.Pandoc.Shared
import Text.Pandoc.Templates (renderTemplate')
import Text.Pandoc.Writers.Shared
-data WriterState = WriterState { defListMarker :: String
- , orderedListLevel :: Int
- , bulletListLevel :: Int
- , intraword :: Bool
- , autoIds :: Set.Set String
+data WriterState = WriterState { defListMarker :: String
+ , orderedListLevel :: Int
+ , bulletListLevel :: Int
+ , intraword :: Bool
+ , autoIds :: Set.Set String
, asciidoctorVariant :: Bool
+ , inList :: Bool
, hasMath :: Bool
}
@@ -72,6 +73,7 @@ defaultWriterState = WriterState { defListMarker = "::"
, intraword = False
, autoIds = Set.empty
, asciidoctorVariant = False
+ , inList = False
, hasMath = False
}
@@ -268,7 +270,10 @@ blockToAsciiDoc opts (Table caption aligns widths headers rows) = do
return $
caption'' $$ tablespec $$ border $$ head'' $$ body $$ border $$ blankline
blockToAsciiDoc opts (BulletList items) = do
+ inlist <- gets inList
+ modify $ \st -> st{ inList = True }
contents <- mapM (bulletListItemToAsciiDoc opts) items
+ modify $ \st -> st{ inList = inlist }
return $ cat contents <> blankline
blockToAsciiDoc opts (OrderedList (start, sty, _delim) items) = do
let listStyle = case sty of
@@ -280,10 +285,16 @@ blockToAsciiDoc opts (OrderedList (start, sty, _delim) items) = do
let listoptions = case intercalate ", " (listStyle ++ listStart) of
[] -> empty
x -> brackets (text x)
+ inlist <- gets inList
+ modify $ \st -> st{ inList = True }
contents <- mapM (orderedListItemToAsciiDoc opts) items
+ modify $ \st -> st{ inList = inlist }
return $ listoptions $$ cat contents <> blankline
blockToAsciiDoc opts (DefinitionList items) = do
+ inlist <- gets inList
+ modify $ \st -> st{ inList = True }
contents <- mapM (definitionListItemToAsciiDoc opts) items
+ modify $ \st -> st{ inList = inlist }
return $ cat contents <> blankline
blockToAsciiDoc opts (Div (ident,_,_) bs) = do
let identifier = if null ident then empty else "[[" <> text ident <> "]]"
@@ -299,16 +310,31 @@ bulletListItemToAsciiDoc opts blocks = do
contents <- foldM (addBlock opts) empty blocks
modify $ \s -> s{ bulletListLevel = lev }
let marker = text (replicate (lev + 1) '*')
- return $ marker <> text " " <> contents <> cr
+ return $ marker <> text " " <> listBegin blocks <>
+ contents <> cr
addBlock :: PandocMonad m => WriterOptions -> Doc -> Block -> ADW m Doc
-addBlock opts d b | isEmpty d = chomp `fmap` blockToAsciiDoc opts b
-addBlock opts d b@(BulletList _) = do x <- blockToAsciiDoc opts b
- return $ d <> cr <> chomp x
-addBlock opts d b@(OrderedList _ _) = do x <- blockToAsciiDoc opts b
- return $ d <> cr <> chomp x
-addBlock opts d b = do x <- blockToAsciiDoc opts b
- return $ d <> cr <> text "+" <> cr <> chomp x
+addBlock opts d b = do
+ x <- chomp <$> blockToAsciiDoc opts b
+ return $
+ case b of
+ BulletList{} -> d <> cr <> x
+ OrderedList{} -> d <> cr <> x
+ Para (Math DisplayMath _:_) -> d <> cr <> x
+ Plain (Math DisplayMath _:_) -> d <> cr <> x
+ Para{} | isEmpty d -> x
+ Plain{} | isEmpty d -> x
+ _ -> d <> cr <> text "+" <> cr <> x
+
+listBegin :: [Block] -> Doc
+listBegin blocks =
+ case blocks of
+ Para (Math DisplayMath _:_) : _ -> "{blank}"
+ Plain (Math DisplayMath _:_) : _ -> "{blank}"
+ Para _ : _ -> empty
+ Plain _ : _ -> empty
+ _ : _ -> "{blank}"
+ [] -> "{blank}"
-- | Convert ordered list item (a list of blocks) to asciidoc.
orderedListItemToAsciiDoc :: PandocMonad m
@@ -321,7 +347,7 @@ orderedListItemToAsciiDoc opts blocks = do
contents <- foldM (addBlock opts) empty blocks
modify $ \s -> s{ orderedListLevel = lev }
let marker = text (replicate (lev + 1) '.')
- return $ marker <> text " " <> contents <> cr
+ return $ marker <> text " " <> listBegin blocks <> contents <> cr
-- | Convert definition list item (label, list of blocks) to asciidoc.
definitionListItemToAsciiDoc :: PandocMonad m
@@ -437,10 +463,13 @@ inlineToAsciiDoc _ (Math DisplayMath str) = do
let content = if isAsciidoctor
then text str
else "\\[" <> text str <> "\\]"
+ inlist <- gets inList
+ let sepline = if inlist
+ then text "+"
+ else blankline
return $
- blankline <> "[latexmath]" $$ "++++" $$
- content
- $$ "++++" $$ blankline
+ (cr <> sepline) $$ "[latexmath]" $$ "++++" $$
+ content $$ "++++" <> cr
inlineToAsciiDoc _ il@(RawInline f s)
| f == "asciidoc" = return $ text s
| otherwise = do