git.iko.soy/typeable/pandoc
on master help sign in
More logging-related changes.

Class: * Removed getWarnings, withWarningsToStderr * Added report * Added logOutput to PandocMonad * Make logOutput streaming in PandocIO monad * Properly reverse getLog output Readers: * Replaced use of trace with report DEBUG. TWiki Reader: Put everything inside PandocMonad m. API changes.

commitbc7e846da61bdcd3ce6ef49e9d3e6bf4a0bd1a5d authorJohn MacFarlane <jgm@berkeley.edu> dateSun 22 Jan 2017, 23:49 (10 years ago) parent4e97efe
7 files changed+124−133
pandoc.hs+9−10 src/Text/Pandoc/Class.hs+22−23 src/Text/Pandoc/Readers/HTML.hs+5−9 src/Text/Pandoc/Readers/Markdown.hs+3−7 src/Text/Pandoc/Readers/MediaWiki.hs+3−6 src/Text/Pandoc/Readers/TWiki.hs+78−71 src/Text/Pandoc/Readers/Textile.hs+4−7
pandoc.hs+9−10
@@ -35,8 +35,7 @@ import Text.Pandoc.Builder (setMeta)
3535import Text.Pandoc.PDF (makePDF)
3636import Text.Pandoc.Walk (walk)
3737import Text.Pandoc.Shared ( tabFilter, readDataFileUTF8, readDataFile,
38− safeRead, headerShift, err, warn,
39− openURL )
38+ safeRead, headerShift, err, openURL )
4039import Text.Pandoc.MediaBag ( mediaDirectory, extractMediaBag, MediaBag )
4140import Text.Pandoc.XML ( toEntities )
4241import Text.Pandoc.SelfContained ( makeSelfContained )
@@ -75,7 +74,7 @@ import System.Posix.Terminal (queryTerminal)
7574import System.Posix.IO (stdOutput)
7675#endif
7776import Control.Monad.Trans
78−import Text.Pandoc.Class (withMediaBag, PandocIO, getWarnings)
77+import Text.Pandoc.Class (withMediaBag, PandocIO, getLog, setVerbosity)
7978
8079main :: IO ()
8180main = do
@@ -354,14 +353,14 @@ convertWithOpts opts args = do
354353
355354 let runIO' :: PandocIO a -> IO a
356355 runIO' f = do
357− (res, warnings) <- runIOorExplode $ do
356+ (res, reports) <- runIOorExplode $ do
357+ setVerbosity verbosity
358358 x <- f
359− ws <- getWarnings
360− return (x, ws)
361− when (not (null warnings)) $ do
362− -- TODO make these streaming
363− when (verbosity >= WARNING) $ mapM_ warn warnings
364− when failIfWarnings $
359+ rs <- getLog
360+ return (x, rs)
361+ let isWarning (WARNING, _) = True
362+ isWarning _ = False
363+ when (failIfWarnings && any isWarning reports) $
365364 err 3 "Failing because there were warnings."
366365 return res
367366
src/Text/Pandoc/Class.hs+22−23
@@ -42,7 +42,7 @@ module Text.Pandoc.Class ( PandocMonad(..)
4242 , getZonedTime
4343 , warning
4444 , warningWithPos
45− , getWarnings
45+ , report
4646 , getLog
4747 , setVerbosity
4848 , getMediaBag
@@ -59,7 +59,6 @@ module Text.Pandoc.Class ( PandocMonad(..)
5959 , runIOorExplode
6060 , runPure
6161 , withMediaBag
62− , withWarningsToStderr
6362 ) where
6463
6564import Prelude hiding (readFile)
@@ -69,8 +68,8 @@ import Codec.Archive.Zip (Archive, fromArchive, emptyArchive)
6968import Data.Unique (hashUnique)
7069import qualified Data.Unique as IO (newUnique)
7170import qualified Text.Pandoc.Shared as IO ( readDataFile
72− , warn
7371 , openURL )
72+import qualified Text.Pandoc.UTF8 as UTF8
7473import Text.Pandoc.Compat.Time (UTCTime)
7574import Text.Pandoc.Options (Verbosity(..))
7675import Text.Pandoc.Parsing (ParserT, SourcePos)
@@ -102,10 +101,12 @@ import Control.Monad.RWS (RWST)
102101import Data.Word (Word8)
103102import Data.Default
104103import System.IO.Error
104+import System.IO (stderr)
105105import qualified Data.Map as M
106106import Text.Pandoc.Error
107107import Data.Monoid
108108import Data.Maybe (catMaybes)
109+import Text.Printf (printf)
109110
110111class (Functor m, Applicative m, Monad m, MonadError PandocError m)
111112 => PandocMonad m where
@@ -131,13 +132,7 @@ class (Functor m, Applicative m, Monad m, MonadError PandocError m)
131132 modifyCommonState :: (CommonState -> CommonState) -> m ()
132133 modifyCommonState f = getCommonState >>= putCommonState . f
133134
134− -- Can be overridden when you want log to be written to
135− -- stderr in a streaming fashion
136− report :: Verbosity -> String -> m ()
137− report level msg = do
138− verbosity <- getsCommonState stVerbosity
139− when (level >= verbosity) $
140− modifyCommonState $ \st -> st{ stLog = (level, msg) : stLog st }
135+ logOutput :: Verbosity -> String -> m ()
141136
142137-- Functions defined for all PandocMonad instances
143138
@@ -146,7 +141,7 @@ setVerbosity verbosity =
146141 modifyCommonState $ \st -> st{ stVerbosity = verbosity }
147142
148143getLog :: PandocMonad m => m [(Verbosity, String)]
149−getLog = getsCommonState stLog
144+getLog = reverse <$> getsCommonState stLog
150145
151146warning :: PandocMonad m => String -> m ()
152147warning msg = report WARNING msg
@@ -157,11 +152,13 @@ warningWithPos :: PandocMonad m
157152 -> ParserT s st m ()
158153warningWithPos pos msg = lift $ warning $ msg ++ " " ++ show pos
159154
160−-- TODO get rid of this?
161−getWarnings :: PandocMonad m => m [String]
162−getWarnings = do
163− logs <- getLog
164− return [s | (WARNING, s) <- logs]
155+report :: PandocMonad m => Verbosity -> String -> m ()
156+report level msg = do
157+ verbosity <- getsCommonState stVerbosity
158+ when (level <= verbosity) $ do
159+ logOutput verbosity msg
160+ unless (level == DEBUG) $
161+ modifyCommonState $ \st -> st{ stLog = (level, msg) : stLog st }
165162
166163setMediaBag :: PandocMonad m => MediaBag -> m ()
167164setMediaBag mb = modifyCommonState $
@@ -255,12 +252,6 @@ runIO ma = flip evalStateT def $ runExceptT $ unPandocIO ma
255252withMediaBag :: PandocMonad m => m a -> m (a, MediaBag)
256253withMediaBag ma = ((,)) <$> ma <*> getMediaBag
257254
258−withWarningsToStderr :: PandocIO a -> PandocIO a
259−withWarningsToStderr f = do
260− x <- f
261− getWarnings >>= mapM_ IO.warn
262− return x
263−
264255runIOorExplode :: PandocIO a -> IO a
265256runIOorExplode ma = runIO ma >>= handleError
266257
@@ -309,7 +300,8 @@ instance PandocMonad PandocIO where
309300 Left _ -> throwError $ PandocFileReadError fp
310301 getCommonState = PandocIO $ lift get
311302 putCommonState x = PandocIO $ lift $ put x
312−
303+ logOutput level msg =
304+ liftIO $ UTF8.hPutStrLn stderr $ printf "%-7s %s" (show level) msg
313305
314306-- | Specialized version of parseURIReference that disallows
315307-- single-letter schemes. Reason: these are usually windows absolute
@@ -508,6 +500,8 @@ instance PandocMonad PandocPure where
508500 getCommonState = PandocPure $ lift $ get
509501 putCommonState x = PandocPure $ lift $ put x
510502
503+ logOutput _level _msg = return ()
504+
511505instance PandocMonad m => PandocMonad (ParserT s st m) where
512506 lookupEnv = lift . lookupEnv
513507 getCurrentTime = lift getCurrentTime
@@ -522,6 +516,7 @@ instance PandocMonad m => PandocMonad (ParserT s st m) where
522516 getModificationTime = lift . getModificationTime
523517 getCommonState = lift getCommonState
524518 putCommonState = lift . putCommonState
519+ logOutput lvl = lift . logOutput lvl
525520
526521instance PandocMonad m => PandocMonad (ReaderT r m) where
527522 lookupEnv = lift . lookupEnv
@@ -537,6 +532,7 @@ instance PandocMonad m => PandocMonad (ReaderT r m) where
537532 getModificationTime = lift . getModificationTime
538533 getCommonState = lift getCommonState
539534 putCommonState = lift . putCommonState
535+ logOutput lvl = lift . logOutput lvl
540536
541537instance (PandocMonad m, Monoid w) => PandocMonad (WriterT w m) where
542538 lookupEnv = lift . lookupEnv
@@ -552,6 +548,7 @@ instance (PandocMonad m, Monoid w) => PandocMonad (WriterT w m) where
552548 getModificationTime = lift . getModificationTime
553549 getCommonState = lift getCommonState
554550 putCommonState = lift . putCommonState
551+ logOutput lvl = lift . report lvl
555552
556553instance (PandocMonad m, Monoid w) => PandocMonad (RWST r w st m) where
557554 lookupEnv = lift . lookupEnv
@@ -567,6 +564,7 @@ instance (PandocMonad m, Monoid w) => PandocMonad (RWST r w st m) where
567564 getModificationTime = lift . getModificationTime
568565 getCommonState = lift getCommonState
569566 putCommonState = lift . putCommonState
567+ logOutput lvl = lift . logOutput lvl
570568
571569instance PandocMonad m => PandocMonad (StateT st m) where
572570 lookupEnv = lift . lookupEnv
@@ -582,4 +580,5 @@ instance PandocMonad m => PandocMonad (StateT st m) where
582580 getModificationTime = lift . getModificationTime
583581 getCommonState = lift getCommonState
584582 putCommonState = lift . putCommonState
583+ logOutput lvl = lift . logOutput lvl
585584
src/Text/Pandoc/Readers/HTML.hs+5−9
@@ -45,7 +45,7 @@ import qualified Text.Pandoc.Builder as B
4545import Text.Pandoc.Builder (Blocks, Inlines, trimInlines, HasMeta(..))
4646import Text.Pandoc.Shared ( extractSpaces, renderTags', addMetaField
4747 , escapeURI, safeRead )
48−import Text.Pandoc.Options (ReaderOptions(readerParseRaw, readerVerbosity),
48+import Text.Pandoc.Options (ReaderOptions(readerParseRaw),
4949 Verbosity(..), Extension (Ext_epub_html_exts,
5050 Ext_native_divs, Ext_native_spans))
5151import Text.Pandoc.Parsing hiding ((<|>))
@@ -54,12 +54,11 @@ import qualified Data.Map as M
5454import Data.Maybe ( fromMaybe, isJust)
5555import Data.List ( intercalate, isInfixOf, isPrefixOf )
5656import Data.Char ( isDigit )
57−import Control.Monad ( guard, when, mzero, void, unless )
57+import Control.Monad ( guard, mzero, void, unless )
5858import Control.Arrow ((***))
5959import Control.Applicative ( (<|>) )
6060import Data.Monoid (First (..))
6161import Text.Printf (printf)
62−import Debug.Trace (trace)
6362import Text.TeXMath (readMathML, writeTeX)
6463import Data.Default (Default (..), def)
6564import Control.Monad.Reader (ask, asks, local, ReaderT, runReaderT, lift)
@@ -69,7 +68,7 @@ import Data.Monoid ((<>))
6968import Text.Parsec.Error
7069import qualified Data.Set as Set
7170import Text.Pandoc.Error
72−import Text.Pandoc.Class (PandocMonad)
71+import Text.Pandoc.Class (PandocMonad, report)
7372import Control.Monad.Except (throwError)
7473
7574
@@ -96,8 +95,6 @@ readHtml opts inp = do
9695 case result of
9796 Right doc -> return doc
9897 Left err -> throwError $ PandocParseError $ getError err
99−
100− where
10198
10299replaceNotes :: PandocMonad m => [Block] -> TagParser m [Block]
103100replaceNotes = walkM replaceNotes'
@@ -160,7 +157,6 @@ pHead = pInTags "head" $ pTitle <|> pMetaTag <|> pBaseTag <|> (mempty <$ pAnyTag
160157
161158block :: PandocMonad m => TagParser m Blocks
162159block = do
163− tr <- (== DEBUG) <$> getOption readerVerbosity
164160 pos <- getPosition
165161 res <- choice
166162 [ eSection
@@ -181,8 +177,8 @@ block = do
181177 , pPlain
182178 , pRawHtmlBlock
183179 ]
184− when tr $ trace (printf "line %d: %s" (sourceLine pos)
185− (take 60 $ show $ B.toList res)) (return ())
180+ report DEBUG $ printf "line %d: %s"
181+ (sourceLine pos) (take 60 $ show $ B.toList res)
186182 return res
187183
188184namespaces :: PandocMonad m => [(String, TagParser m Inlines)]
src/Text/Pandoc/Readers/Markdown.hs+3−7
@@ -62,11 +62,10 @@ import Control.Monad
6262import System.FilePath (takeExtension, addExtension)
6363import Text.HTML.TagSoup
6464import Text.Printf (printf)
65−import Debug.Trace (trace)
6665import Data.Monoid ((<>))
6766import Control.Monad.Trans (lift)
6867import Control.Monad.Except (throwError, catchError)
69−import Text.Pandoc.Class (PandocMonad)
68+import Text.Pandoc.Class (PandocMonad, report)
7069import qualified Text.Pandoc.Class as P
7170
7271type MarkdownParser m = ParserT [Char] ParserState m
@@ -490,7 +489,6 @@ parseBlocks = mconcat <$> manyTill block eof
490489
491490block :: PandocMonad m => MarkdownParser m (F Blocks)
492491block = do
493− tr <- (== DEBUG) <$> getOption readerVerbosity
494492 pos <- getPosition
495493 res <- choice [ mempty <$ blanklines
496494 , codeBlockFenced
@@ -517,10 +515,8 @@ block = do
517515 , para
518516 , plain
519517 ] <?> "block"
520− when tr $ do
521− st <- getState
522− trace (printf "line %d: %s" (sourceLine pos)
523− (take 60 $ show $ B.toList $ runF res st)) (return ())
518+ report DEBUG $ printf "line %d: %s" (sourceLine pos)
519+ (take 60 $ show $ B.toList $ runF res defaultParserState)
524520 return res
525521
526522--
src/Text/Pandoc/Readers/MediaWiki.hs+3−6
@@ -56,9 +56,8 @@ import qualified Data.Set as Set
5656import Data.Char (isDigit, isSpace)
5757import Data.Maybe (fromMaybe)
5858import Text.Printf (printf)
59−import Debug.Trace (trace)
6059import Control.Monad.Except (throwError)
61−import Text.Pandoc.Class (PandocMonad)
60+import Text.Pandoc.Class (PandocMonad, report)
6261
6362-- | Read mediawiki from an input string and return a Pandoc document.
6463readMediaWiki :: PandocMonad m
@@ -194,7 +193,6 @@ parseMediaWiki = do
194193
195194block :: PandocMonad m => MWParser m Blocks
196195block = do
197− tr <- (== DEBUG) <$> getOption readerVerbosity
198196 pos <- getPosition
199197 res <- mempty <$ skipMany1 blankline
200198 <|> table
@@ -208,9 +206,8 @@ block = do
208206 <|> blockTag
209207 <|> (B.rawBlock "mediawiki" <$> template)
210208 <|> para
211− when tr $
212− trace (printf "line %d: %s" (sourceLine pos)
213− (take 60 $ show $ B.toList res)) (return ())
209+ report DEBUG $ printf "line %d: %s" (sourceLine pos)
210+ (take 60 $ show $ B.toList res)
214211 return res
215212
216213para :: PandocMonad m => MWParser m Blocks
src/Text/Pandoc/Readers/TWiki.hs+78−71
@@ -39,39 +39,38 @@ import Text.Pandoc.Parsing hiding (enclosed, macro, nested)
3939import Text.Pandoc.Readers.HTML (htmlTag, isCommentTag)
4040import Control.Monad
4141import Text.Printf (printf)
42−import Debug.Trace (trace)
4342import Text.Pandoc.XML (fromEntities)
4443import Data.Maybe (fromMaybe)
4544import Text.HTML.TagSoup
4645import Data.Char (isAlphaNum)
4746import qualified Data.Foldable as F
4847import Control.Monad.Except (throwError)
49−import Text.Pandoc.Class (PandocMonad)
48+import Text.Pandoc.Class (PandocMonad, report)
5049
5150-- | Read twiki from an input string and return a Pandoc document.
5251readTWiki :: PandocMonad m
5352 => ReaderOptions
5453 -> String
5554 -> m Pandoc
56−readTWiki opts s =
57− case (readWith parseTWiki) def{ stateOptions = opts } (s ++ "\n\n") of
55+readTWiki opts s = do
56+ res <- readWithM parseTWiki def{ stateOptions = opts } (s ++ "\n\n")
57+ case res of
5858 Left e -> throwError e
5959 Right d -> return d
6060
61−
62−type TWParser = Parser [Char] ParserState
61+type TWParser = ParserT [Char] ParserState
6362
6463--
6564-- utility functions
6665--
6766
68−tryMsg :: String -> TWParser a -> TWParser a
67+tryMsg :: String -> TWParser m a -> TWParser m a
6968tryMsg msg p = try p <?> msg
7069
71−skip :: TWParser a -> TWParser ()
70+skip :: TWParser m a -> TWParser m ()
7271skip parser = parser >> return ()
7372
74−nested :: TWParser a -> TWParser a
73+nested :: PandocMonad m => TWParser m a -> TWParser m a
7574nested p = do
7675 nestlevel <- stateMaxNestingLevel <$> getState
7776 guard $ nestlevel > 0
@@ -80,7 +79,7 @@ nested p = do
8079 updateState $ \st -> st{ stateMaxNestingLevel = nestlevel }
8180 return res
8281
83−htmlElement :: String -> TWParser (Attr, String)
82+htmlElement :: PandocMonad m => String -> TWParser m (Attr, String)
8483htmlElement tag = tryMsg tag $ do
8584 (TagOpen _ attr, _) <- htmlTag (~== TagOpen tag [])
8685 content <- manyTill anyChar (endtag <|> endofinput)
@@ -97,7 +96,8 @@ htmlAttrToPandoc attrs = (ident, classes, keyvals)
9796 classes = maybe [] words $ lookup "class" attrs
9897 keyvals = [(k,v) | (k,v) <- attrs, k /= "id" && k /= "class"]
9998
100−parseHtmlContentWithAttrs :: String -> TWParser a -> TWParser (Attr, [a])
99+parseHtmlContentWithAttrs :: PandocMonad m
100+ => String -> TWParser m a -> TWParser m (Attr, [a])
101101parseHtmlContentWithAttrs tag parser = do
102102 (attr, content) <- htmlElement tag
103103 parsedContent <- try $ parseContent content
@@ -106,14 +106,14 @@ parseHtmlContentWithAttrs tag parser = do
106106 parseContent = parseFromString $ nested $ manyTill parser endOfContent
107107 endOfContent = try $ skipMany blankline >> skipSpaces >> eof
108108
109−parseHtmlContent :: String -> TWParser a -> TWParser [a]
109+parseHtmlContent :: PandocMonad m => String -> TWParser m a -> TWParser m [a]
110110parseHtmlContent tag p = parseHtmlContentWithAttrs tag p >>= return . snd
111111
112112--
113113-- main parser
114114--
115115
116−parseTWiki :: TWParser Pandoc
116+parseTWiki :: PandocMonad m => TWParser m Pandoc
117117parseTWiki = do
118118 bs <- mconcat <$> many block
119119 spaces
@@ -125,20 +125,18 @@ parseTWiki = do
125125-- block parsers
126126--
127127
128−block :: TWParser B.Blocks
128+block :: PandocMonad m => TWParser m B.Blocks
129129block = do
130− tr <- (== DEBUG) <$> getOption readerVerbosity
131130 pos <- getPosition
132131 res <- mempty <$ skipMany1 blankline
133132 <|> blockElements
134133 <|> para
135134 skipMany blankline
136− when tr $
137− trace (printf "line %d: %s" (sourceLine pos)
138− (take 60 $ show $ B.toList res)) (return ())
135+ report DEBUG $ printf "line %d: %s" (sourceLine pos)
136+ (take 60 $ show $ B.toList res)
139137 return res
140138
141−blockElements :: TWParser B.Blocks
139+blockElements :: PandocMonad m => TWParser m B.Blocks
142140blockElements = choice [ separator
143141 , header
144142 , verbatim
@@ -149,10 +147,10 @@ blockElements = choice [ separator
149147 , noautolink
150148 ]
151149
152−separator :: TWParser B.Blocks
150+separator :: PandocMonad m => TWParser m B.Blocks
153151separator = tryMsg "separator" $ string "---" >> newline >> return B.horizontalRule
154152
155−header :: TWParser B.Blocks
153+header :: PandocMonad m => TWParser m B.Blocks
156154header = tryMsg "header" $ do
157155 string "---"
158156 level <- many1 (char '+') >>= return . length
@@ -163,43 +161,45 @@ header = tryMsg "header" $ do
163161 attr <- registerHeader ("", classes, []) content
164162 return $ B.headerWith attr level $ content
165163
166−verbatim :: TWParser B.Blocks
164+verbatim :: PandocMonad m => TWParser m B.Blocks
167165verbatim = (htmlElement "verbatim" <|> htmlElement "pre")
168166 >>= return . (uncurry B.codeBlockWith)
169167
170−literal :: TWParser B.Blocks
168+literal :: PandocMonad m => TWParser m B.Blocks
171169literal = htmlElement "literal" >>= return . rawBlock
172170 where
173171 format (_, _, kvs) = fromMaybe "html" $ lookup "format" kvs
174172 rawBlock (attrs, content) = B.rawBlock (format attrs) content
175173
176−list :: String -> TWParser B.Blocks
174+list :: PandocMonad m => String -> TWParser m B.Blocks
177175list prefix = choice [ bulletList prefix
178176 , orderedList prefix
179177 , definitionList prefix]
180178
181−definitionList :: String -> TWParser B.Blocks
179+definitionList :: PandocMonad m => String -> TWParser m B.Blocks
182180definitionList prefix = tryMsg "definitionList" $ do
183181 indent <- lookAhead $ string prefix *> (many1 $ string " ") <* string "$ "
184182 elements <- many $ parseDefinitionListItem (prefix ++ concat indent)
185183 return $ B.definitionList elements
186184 where
187− parseDefinitionListItem :: String -> TWParser (B.Inlines, [B.Blocks])
185+ parseDefinitionListItem :: PandocMonad m
186+ => String -> TWParser m (B.Inlines, [B.Blocks])
188187 parseDefinitionListItem indent = do
189188 string (indent ++ "$ ") >> skipSpaces
190189 term <- many1Till inline $ string ": "
191190 line <- listItemLine indent $ string "$ "
192191 return $ (mconcat term, [line])
193192
194−bulletList :: String -> TWParser B.Blocks
193+bulletList :: PandocMonad m => String -> TWParser m B.Blocks
195194bulletList prefix = tryMsg "bulletList" $
196195 parseList prefix (char '*') (char ' ')
197196
198−orderedList :: String -> TWParser B.Blocks
197+orderedList :: PandocMonad m => String -> TWParser m B.Blocks
199198orderedList prefix = tryMsg "orderedList" $
200199 parseList prefix (oneOf "1iIaA") (string ". ")
201200
202−parseList :: String -> TWParser Char -> TWParser a -> TWParser B.Blocks
201+parseList :: PandocMonad m
202+ => String -> TWParser m Char -> TWParser m a -> TWParser m B.Blocks
203203parseList prefix marker delim = do
204204 (indent, style) <- lookAhead $ string prefix *> listStyle <* delim
205205 blocks <- many $ parseListItem (prefix ++ indent) (char style <* delim)
@@ -216,10 +216,12 @@ parseList prefix marker delim = do
216216 style <- marker
217217 return (concat indent, style)
218218
219−parseListItem :: Show a => String -> TWParser a -> TWParser B.Blocks
219+parseListItem :: (PandocMonad m, Show a)
220+ => String -> TWParser m a -> TWParser m B.Blocks
220221parseListItem prefix marker = string prefix >> marker >> listItemLine prefix marker
221222
222−listItemLine :: Show a => String -> TWParser a -> TWParser B.Blocks
223+listItemLine :: (PandocMonad m, Show a)
224+ => String -> TWParser m a -> TWParser m B.Blocks
223225listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
224226 where
225227 lineContent = do
@@ -236,7 +238,7 @@ listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
236238 lastNewline = try $ char '\n' <* eof
237239 newlineBeforeNestedList = try $ char '\n' <* lookAhead nestedList
238240
239−table :: TWParser B.Blocks
241+table :: PandocMonad m => TWParser m B.Blocks
240242table = try $ do
241243 tableHead <- optionMaybe $ many1Till tableParseHeader newline >>= return . unzip
242244 rows <- many1 tableParseRow
@@ -248,7 +250,7 @@ table = try $ do
248250 columns rows = replicate (columCount rows) mempty
249251 columCount rows = length $ head rows
250252
251−tableParseHeader :: TWParser ((Alignment, Double), B.Blocks)
253+tableParseHeader :: PandocMonad m => TWParser m ((Alignment, Double), B.Blocks)
252254tableParseHeader = try $ do
253255 char '|'
254256 leftSpaces <- many spaceChar >>= return . length
@@ -264,27 +266,27 @@ tableParseHeader = try $ do
264266 | left > right = (AlignRight, 0)
265267 | otherwise = (AlignLeft, 0)
266268
267−tableParseRow :: TWParser [B.Blocks]
269+tableParseRow :: PandocMonad m => TWParser m [B.Blocks]
268270tableParseRow = many1Till tableParseColumn newline
269271
270−tableParseColumn :: TWParser B.Blocks
272+tableParseColumn :: PandocMonad m => TWParser m B.Blocks
271273tableParseColumn = char '|' *> skipSpaces *>
272274 tableColumnContent (skipSpaces >> char '|')
273275 <* skipSpaces <* optional tableEndOfRow
274276
275−tableEndOfRow :: TWParser Char
277+tableEndOfRow :: PandocMonad m => TWParser m Char
276278tableEndOfRow = lookAhead (try $ char '|' >> char '\n') >> char '|'
277279
278−tableColumnContent :: TWParser a -> TWParser B.Blocks
280+tableColumnContent :: PandocMonad m => TWParser m a -> TWParser m B.Blocks
279281tableColumnContent end = manyTill content (lookAhead $ try end) >>= return . B.plain . mconcat
280282 where
281283 content = continuation <|> inline
282284 continuation = try $ char '\\' >> newline >> return mempty
283285
284−blockQuote :: TWParser B.Blocks
286+blockQuote :: PandocMonad m => TWParser m B.Blocks
285287blockQuote = parseHtmlContent "blockquote" block >>= return . B.blockQuote . mconcat
286288
287−noautolink :: TWParser B.Blocks
289+noautolink :: PandocMonad m => TWParser m B.Blocks
288290noautolink = do
289291 (_, content) <- htmlElement "noautolink"
290292 st <- getState
@@ -295,7 +297,7 @@ noautolink = do
295297 where
296298 parseContent = parseFromString $ many $ block
297299
298−para :: TWParser B.Blocks
300+para :: PandocMonad m => TWParser m B.Blocks
299301para = many1Till inline endOfParaElement >>= return . result . mconcat
300302 where
301303 endOfParaElement = lookAhead $ endOfInput <|> endOfPara <|> newBlockElement
@@ -311,7 +313,7 @@ para = many1Till inline endOfParaElement >>= return . result . mconcat
311313-- inline parsers
312314--
313315
314−inline :: TWParser B.Inlines
316+inline :: PandocMonad m => TWParser m B.Inlines
315317inline = choice [ whitespace
316318 , br
317319 , macro
@@ -332,36 +334,39 @@ inline = choice [ whitespace
332334 , symbol
333335 ] <?> "inline"
334336
335−whitespace :: TWParser B.Inlines
337+whitespace :: PandocMonad m => TWParser m B.Inlines
336338whitespace = (lb <|> regsp) >>= return
337339 where lb = try $ skipMany spaceChar >> linebreak >> return B.space
338340 regsp = try $ skipMany1 spaceChar >> return B.space
339341
340−br :: TWParser B.Inlines
342+br :: PandocMonad m => TWParser m B.Inlines
341343br = try $ string "%BR%" >> return B.linebreak
342344
343−linebreak :: TWParser B.Inlines
345+linebreak :: PandocMonad m => TWParser m B.Inlines
344346linebreak = newline >> notFollowedBy newline >> (lastNewline <|> innerNewline)
345347 where lastNewline = eof >> return mempty
346348 innerNewline = return B.space
347349
348−between :: (Monoid c) => TWParser a -> TWParser b -> (TWParser b -> TWParser c) -> TWParser c
350+between :: (Monoid c, PandocMonad m)
351+ => TWParser m a -> TWParser m b -> (TWParser m b -> TWParser m c)
352+ -> TWParser m c
349353between start end p =
350354 mconcat <$> try (start >> notFollowedBy whitespace >> many1Till (p end) end)
351355
352−enclosed :: (Monoid b) => TWParser a -> (TWParser a -> TWParser b) -> TWParser b
356+enclosed :: (Monoid b, PandocMonad m)
357+ => TWParser m a -> (TWParser m a -> TWParser m b) -> TWParser m b
353358enclosed sep p = between sep (try $ sep <* endMarker) p
354359 where
355360 endMarker = lookAhead $ skip endSpace <|> skip (oneOf ".,!?:)|") <|> eof
356361 endSpace = (spaceChar <|> newline) >> return B.space
357362
358−macro :: TWParser B.Inlines
363+macro :: PandocMonad m => TWParser m B.Inlines
359364macro = macroWithParameters <|> withoutParameters
360365 where
361366 withoutParameters = enclosed (char '%') (\_ -> macroName) >>= return . emptySpan
362367 emptySpan name = buildSpan name [] mempty
363368
364−macroWithParameters :: TWParser B.Inlines
369+macroWithParameters :: PandocMonad m => TWParser m B.Inlines
365370macroWithParameters = try $ do
366371 char '%'
367372 name <- macroName
@@ -376,13 +381,13 @@ buildSpan className kvs = B.spanWith attrs
376381 additionalClasses = maybe [] words $ lookup "class" kvs
377382 kvsWithoutClasses = [(k,v) | (k,v) <- kvs, k /= "class"]
378383
379−macroName :: TWParser String
384+macroName :: PandocMonad m => TWParser m String
380385macroName = do
381386 first <- letter
382387 rest <- many $ alphaNum <|> char '_'
383388 return (first:rest)
384389
385−attributes :: TWParser (String, [(String, String)])
390+attributes :: PandocMonad m => TWParser m (String, [(String, String)])
386391attributes = char '{' *> spnl *> many (attribute <* spnl) <* char '}' >>=
387392 return . foldr (either mkContent mkKvs) ([], [])
388393 where
@@ -391,7 +396,7 @@ attributes = char '{' *> spnl *> many (attribute <* spnl) <* char '}' >>=
391396 mkContent c (rest, kvs) = (c ++ " " ++ rest, kvs)
392397 mkKvs kv (cont, rest) = (cont, (kv : rest))
393398
394−attribute :: TWParser (Either String (String, String))
399+attribute :: PandocMonad m => TWParser m (Either String (String, String))
395400attribute = withKey <|> withoutKey
396401 where
397402 withKey = try $ do
@@ -405,49 +410,51 @@ attribute = withKey <|> withoutKey
405410 | allowSpaces == True = many1 $ noneOf "}"
406411 | otherwise = many1 $ noneOf " }"
407412
408−nestedInlines :: Show a => TWParser a -> TWParser B.Inlines
413+nestedInlines :: (Show a, PandocMonad m)
414+ => TWParser m a -> TWParser m B.Inlines
409415nestedInlines end = innerSpace <|> nestedInline
410416 where
411417 innerSpace = try $ whitespace <* (notFollowedBy end)
412418 nestedInline = notFollowedBy whitespace >> nested inline
413419
414−strong :: TWParser B.Inlines
420+strong :: PandocMonad m => TWParser m B.Inlines
415421strong = try $ enclosed (char '*') nestedInlines >>= return . B.strong
416422
417−strongHtml :: TWParser B.Inlines
423+strongHtml :: PandocMonad m => TWParser m B.Inlines
418424strongHtml = (parseHtmlContent "strong" inline <|> parseHtmlContent "b" inline)
419425 >>= return . B.strong . mconcat
420426
421−strongAndEmph :: TWParser B.Inlines
427+strongAndEmph :: PandocMonad m => TWParser m B.Inlines
422428strongAndEmph = try $ enclosed (string "__") nestedInlines >>= return . B.emph . B.strong
423429
424−emph :: TWParser B.Inlines
430+emph :: PandocMonad m => TWParser m B.Inlines
425431emph = try $ enclosed (char '_') nestedInlines >>= return . B.emph
426432
427−emphHtml :: TWParser B.Inlines
433+emphHtml :: PandocMonad m => TWParser m B.Inlines
428434emphHtml = (parseHtmlContent "em" inline <|> parseHtmlContent "i" inline)
429435 >>= return . B.emph . mconcat
430436
431−nestedString :: Show a => TWParser a -> TWParser String
437+nestedString :: (Show a, PandocMonad m)
438+ => TWParser m a -> TWParser m String
432439nestedString end = innerSpace <|> (count 1 nonspaceChar)
433440 where
434441 innerSpace = try $ many1 spaceChar <* notFollowedBy end
435442
436−boldCode :: TWParser B.Inlines
443+boldCode :: PandocMonad m => TWParser m B.Inlines
437444boldCode = try $ enclosed (string "==") nestedString >>= return . B.strong . B.code . fromEntities
438445
439−htmlComment :: TWParser B.Inlines
446+htmlComment :: PandocMonad m => TWParser m B.Inlines
440447htmlComment = htmlTag isCommentTag >> return mempty
441448
442−code :: TWParser B.Inlines
449+code :: PandocMonad m => TWParser m B.Inlines
443450code = try $ enclosed (char '=') nestedString >>= return . B.code . fromEntities
444451
445−codeHtml :: TWParser B.Inlines
452+codeHtml :: PandocMonad m => TWParser m B.Inlines
446453codeHtml = do
447454 (attrs, content) <- parseHtmlContentWithAttrs "code" anyChar
448455 return $ B.codeWith attrs $ fromEntities content
449456
450−autoLink :: TWParser B.Inlines
457+autoLink :: PandocMonad m => TWParser m B.Inlines
451458autoLink = try $ do
452459 state <- getState
453460 guard $ stateAllowLinks state
@@ -461,20 +468,20 @@ autoLink = try $ do
461468 | c == '/' = True
462469 | otherwise = isAlphaNum c
463470
464−str :: TWParser B.Inlines
471+str :: PandocMonad m => TWParser m B.Inlines
465472str = (many1 alphaNum <|> count 1 characterReference) >>= return . B.str
466473
467−nop :: TWParser B.Inlines
474+nop :: PandocMonad m => TWParser m B.Inlines
468475nop = try $ (skip exclamation <|> skip nopTag) >> followContent
469476 where
470477 exclamation = char '!'
471478 nopTag = stringAnyCase "<nop>"
472479 followContent = many1 nonspaceChar >>= return . B.str . fromEntities
473480
474−symbol :: TWParser B.Inlines
481+symbol :: PandocMonad m => TWParser m B.Inlines
475482symbol = count 1 nonspaceChar >>= return . B.str
476483
477−smart :: TWParser B.Inlines
484+smart :: PandocMonad m => TWParser m B.Inlines
478485smart = do
479486 guardEnabled Ext_smart
480487 doubleQuoted <|> singleQuoted <|>
@@ -483,14 +490,14 @@ smart = do
483490 , ellipses
484491 ]
485492
486−singleQuoted :: TWParser B.Inlines
493+singleQuoted :: PandocMonad m => TWParser m B.Inlines
487494singleQuoted = try $ do
488495 singleQuoteStart
489496 withQuoteContext InSingleQuote $
490497 many1Till inline singleQuoteEnd >>=
491498 (return . B.singleQuoted . B.trimInlines . mconcat)
492499
493−doubleQuoted :: TWParser B.Inlines
500+doubleQuoted :: PandocMonad m => TWParser m B.Inlines
494501doubleQuoted = try $ do
495502 doubleQuoteStart
496503 contents <- mconcat <$> many (try $ notFollowedBy doubleQuoteEnd >> inline)
@@ -498,7 +505,7 @@ doubleQuoted = try $ do
498505 return (B.doubleQuoted $ B.trimInlines contents))
499506 <|> (return $ (B.str "\8220") B.<> contents)
500507
501−link :: TWParser B.Inlines
508+link :: PandocMonad m => TWParser m B.Inlines
502509link = try $ do
503510 st <- getState
504511 guard $ stateAllowLinks st
@@ -507,7 +514,7 @@ link = try $ do
507514 setState $ st{ stateAllowLinks = True }
508515 return $ B.link url title content
509516
510−linkText :: TWParser (String, String, B.Inlines)
517+linkText :: PandocMonad m => TWParser m (String, String, B.Inlines)
511518linkText = do
512519 string "[["
513520 url <- many1Till anyChar (char ']')
src/Text/Pandoc/Readers/Textile.hs+4−7
@@ -64,11 +64,10 @@ import Text.HTML.TagSoup (fromAttrib, Tag(..))
6464import Text.HTML.TagSoup.Match
6565import Data.List ( intercalate, transpose, intersperse )
6666import Data.Char ( digitToInt, isUpper )
67−import Control.Monad ( guard, liftM, when )
67+import Control.Monad ( guard, liftM )
6868import Data.Monoid ((<>))
6969import Text.Printf
70−import Debug.Trace (trace)
71−import Text.Pandoc.Class (PandocMonad)
70+import Text.Pandoc.Class (PandocMonad, report)
7271import Control.Monad.Except (throwError)
7372
7473-- | Parse a Textile text and return a Pandoc document.
@@ -147,10 +146,8 @@ block :: PandocMonad m => ParserT [Char] ParserState m Blocks
147146block = do
148147 res <- choice blockParsers <?> "block"
149148 pos <- getPosition
150− tr <- (== DEBUG) <$> getOption readerVerbosity
151− when tr $
152− trace (printf "line %d: %s" (sourceLine pos)
153− (take 60 $ show $ B.toList res)) (return ())
149+ report DEBUG $ printf "line %d: %s" (sourceLine pos)
150+ (take 60 $ show $ B.toList res)
154151 return res
155152
156153commentBlock :: PandocMonad m => ParserT [Char] ParserState m Blocks