@@ -34,7 +34,8 @@ import Data.Char (ord)
34import Data.List (intercalate, intersperse)
34import Data.List (intercalate, intersperse)
35import Data.Maybe (catMaybes)
35import Data.Maybe (catMaybes)
36import Network.URI (isURI, unEscapeString)
36import Network.URI (isURI, unEscapeString)
37−import Text.Pandoc.Class (PandocMonad)
37+import Text.Pandoc.Class (PandocMonad, report)
38+import Text.Pandoc.Logging
38import Text.Pandoc.Definition
39import Text.Pandoc.Definition
39import Text.Pandoc.ImageSize
40import Text.Pandoc.ImageSize
40import Text.Pandoc.Options
41import Text.Pandoc.Options
@@ -56,14 +57,16 @@ orderedListStyles = cycle "narg"
57-- | Convert Pandoc to ConTeXt.
58-- | Convert Pandoc to ConTeXt.
58writeConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> m String
59writeConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> m String
59−writeConTeXt options document = return $
60+writeConTeXt options document =
60 let defaultWriterState = WriterState { stNextRef = 1
61 let defaultWriterState = WriterState { stNextRef = 1
61 , stOrderedListLevel = 0
62 , stOrderedListLevel = 0
62 , stOptions = options
63 , stOptions = options
64− in evalState (pandocToConTeXt options document) defaultWriterState
65+ in evalStateT (pandocToConTeXt options document) defaultWriterState
67+type WM = StateT WriterState
66−pandocToConTeXt :: WriterOptions -> Pandoc -> State WriterState String
69+pandocToConTeXt :: PandocMonad m => WriterOptions -> Pandoc -> WM m String
67pandocToConTeXt options (Pandoc meta blocks) = do
70pandocToConTeXt options (Pandoc meta blocks) = do
68 let colwidth = if writerWrapText options == WrapAuto
71 let colwidth = if writerWrapText options == WrapAuto
69 then Just $ writerColumns options
72 then Just $ writerColumns options
@@ -142,7 +145,7 @@ toLabel z = concatMap go z
142 | otherwise = [x]
145 | otherwise = [x]
144-- | Convert Elements to ConTeXt
147-- | Convert Elements to ConTeXt
145−elementToConTeXt :: WriterOptions -> Element -> State WriterState Doc
148+elementToConTeXt :: PandocMonad m => WriterOptions -> Element -> WM m Doc
146elementToConTeXt _ (Blk block) = blockToConTeXt block
149elementToConTeXt _ (Blk block) = blockToConTeXt block
147elementToConTeXt opts (Sec level _ attr title' elements) = do
150elementToConTeXt opts (Sec level _ attr title' elements) = do
148 header' <- sectionHeader attr level title'
151 header' <- sectionHeader attr level title'
@@ -150,8 +153,7 @@ elementToConTeXt opts (Sec level _ attr title' elements) = do
150 return $ vcat (header' : innerContents)
153 return $ vcat (header' : innerContents)
152-- | Convert Pandoc block element to ConTeXt.
155-- | Convert Pandoc block element to ConTeXt.
153−blockToConTeXt :: Block
156+blockToConTeXt :: PandocMonad m => Block -> WM m Doc
154− -> State WriterState Doc
155blockToConTeXt Null = return empty
157blockToConTeXt Null = return empty
156blockToConTeXt (Plain lst) = inlineListToConTeXt lst
158blockToConTeXt (Plain lst) = inlineListToConTeXt lst
157-- title beginning with fig: indicates that the image is a figure
159-- title beginning with fig: indicates that the image is a figure
@@ -176,7 +178,9 @@ blockToConTeXt (CodeBlock _ str) =
176 return $ flush ("\\starttyping" <> cr <> text str <> cr <> "\\stoptyping") $$ blankline
178 return $ flush ("\\starttyping" <> cr <> text str <> cr <> "\\stoptyping") $$ blankline
177 -- blankline because \stoptyping can't have anything after it, inc. '}'
179 -- blankline because \stoptyping can't have anything after it, inc. '}'
178blockToConTeXt (RawBlock "context" str) = return $ text str <> blankline
180blockToConTeXt (RawBlock "context" str) = return $ text str <> blankline
179−blockToConTeXt (RawBlock _ _ ) = return empty
181+blockToConTeXt b@(RawBlock _ _ ) = do
182+ report $ BlockNotRendered b
180blockToConTeXt (Div (ident,_,kvs) bs) = do
184blockToConTeXt (Div (ident,_,kvs) bs) = do
181 let align dir txt = "\\startalignment[" <> dir <> "]" $$ txt $$ "\\stopalignment"
185 let align dir txt = "\\startalignment[" <> dir <> "]" $$ txt $$ "\\stopalignment"
182 let wrapRef txt = if null ident
186 let wrapRef txt = if null ident
@@ -262,16 +266,16 @@ blockToConTeXt (Table caption aligns widths heads rows) = do
262 "\\HL" $$ headers $$
266 "\\HL" $$ headers $$
263 vcat rows' $$ "\\HL" $$ "\\stoptable" <> blankline
267 vcat rows' $$ "\\HL" $$ "\\stoptable" <> blankline
265−tableRowToConTeXt :: [[Block]] -> State WriterState Doc
269+tableRowToConTeXt :: PandocMonad m => [[Block]] -> WM m Doc
266tableRowToConTeXt cols = do
270tableRowToConTeXt cols = do
267 cols' <- mapM blockListToConTeXt cols
271 cols' <- mapM blockListToConTeXt cols
268 return $ (vcat (map ("\\NC " <>) cols')) $$ "\\NC\\AR"
272 return $ (vcat (map ("\\NC " <>) cols')) $$ "\\NC\\AR"
270−listItemToConTeXt :: [Block] -> State WriterState Doc
274+listItemToConTeXt :: PandocMonad m => [Block] -> WM m Doc
271listItemToConTeXt list = blockListToConTeXt list >>=
275listItemToConTeXt list = blockListToConTeXt list >>=
272 return . ("\\item" $$) . (nest 2)
276 return . ("\\item" $$) . (nest 2)
274−defListItemToConTeXt :: ([Inline], [[Block]]) -> State WriterState Doc
278+defListItemToConTeXt :: PandocMonad m => ([Inline], [[Block]]) -> WM m Doc
275defListItemToConTeXt (term, defs) = do
279defListItemToConTeXt (term, defs) = do
276 term' <- inlineListToConTeXt term
280 term' <- inlineListToConTeXt term
277 def' <- liftM vsep $ mapM blockListToConTeXt defs
281 def' <- liftM vsep $ mapM blockListToConTeXt defs
@@ -279,12 +283,13 @@ defListItemToConTeXt (term, defs) = do
279 "\\stopdescription" <> blankline
283 "\\stopdescription" <> blankline
281-- | Convert list of block elements to ConTeXt.
285-- | Convert list of block elements to ConTeXt.
282−blockListToConTeXt :: [Block] -> State WriterState Doc
286+blockListToConTeXt :: PandocMonad m => [Block] -> WM m Doc
283blockListToConTeXt lst = liftM vcat $ mapM blockToConTeXt lst
287blockListToConTeXt lst = liftM vcat $ mapM blockToConTeXt lst
285-- | Convert list of inline elements to ConTeXt.
289-- | Convert list of inline elements to ConTeXt.
290+inlineListToConTeXt :: PandocMonad m
286−inlineListToConTeXt :: [Inline] -- ^ Inlines to convert
291+ => [Inline] -- ^ Inlines to convert
287− -> State WriterState Doc
292+ -> WM m Doc
288inlineListToConTeXt lst = liftM hcat $ mapM inlineToConTeXt $ addStruts lst
293inlineListToConTeXt lst = liftM hcat $ mapM inlineToConTeXt $ addStruts lst
289 -- We add a \strut after a line break that precedes a space,
294 -- We add a \strut after a line break that precedes a space,
290 -- or the space gets swallowed
295 -- or the space gets swallowed
@@ -298,8 +303,9 @@ inlineListToConTeXt lst = liftM hcat $ mapM inlineToConTeXt $ addStruts lst
298 isSpacey _ = False
303 isSpacey _ = False
300-- | Convert inline element to ConTeXt
305-- | Convert inline element to ConTeXt
306+inlineToConTeXt :: PandocMonad m
301−inlineToConTeXt :: Inline -- ^ Inline to convert
307+ => Inline -- ^ Inline to convert
302− -> State WriterState Doc
308+ -> WM m Doc
303inlineToConTeXt (Emph lst) = do
309inlineToConTeXt (Emph lst) = do
304 contents <- inlineListToConTeXt lst
310 contents <- inlineListToConTeXt lst
305 return $ braces $ "\\em " <> contents
311 return $ braces $ "\\em " <> contents
@@ -339,7 +345,9 @@ inlineToConTeXt (Math DisplayMath str) =
339 return $ text "\\startformula " <> text str <> text " \\stopformula" <> space
345 return $ text "\\startformula " <> text str <> text " \\stopformula" <> space
340inlineToConTeXt (RawInline "context" str) = return $ text str
346inlineToConTeXt (RawInline "context" str) = return $ text str
341inlineToConTeXt (RawInline "tex" str) = return $ text str
347inlineToConTeXt (RawInline "tex" str) = return $ text str
342−inlineToConTeXt (RawInline _ _) = return empty
348+inlineToConTeXt il@(RawInline _ _) = do
349+ report $ InlineNotRendered il
343inlineToConTeXt (LineBreak) = return $ text "\\crlf" <> cr
351inlineToConTeXt (LineBreak) = return $ text "\\crlf" <> cr
344inlineToConTeXt SoftBreak = do
352inlineToConTeXt SoftBreak = do
345 wrapText <- gets (writerWrapText . stOptions)
353 wrapText <- gets (writerWrapText . stOptions)
@@ -416,10 +424,11 @@ inlineToConTeXt (Span (_,_,kvs) ils) = do
416 fmap (wrapLang . wrapDir) $ inlineListToConTeXt ils
424 fmap (wrapLang . wrapDir) $ inlineListToConTeXt ils
418-- | Craft the section header, inserting the section reference, if supplied.
426-- | Craft the section header, inserting the section reference, if supplied.
419−sectionHeader :: Attr
427+sectionHeader :: PandocMonad m
421 -> [Inline]
430 -> [Inline]
422− -> State WriterState Doc
431+ -> WM m Doc
423sectionHeader (ident,classes,_) hdrLevel lst = do
432sectionHeader (ident,classes,_) hdrLevel lst = do
424 contents <- inlineListToConTeXt lst
433 contents <- inlineListToConTeXt lst
425 st <- get
434 st <- get