@@ -39,39 +39,38 @@ import Text.Pandoc.Parsing hiding (enclosed, macro, nested)
39import Text.Pandoc.Readers.HTML (htmlTag, isCommentTag)
39import Text.Pandoc.Readers.HTML (htmlTag, isCommentTag)
40import Control.Monad
40import Control.Monad
41import Text.Printf (printf)
41import Text.Printf (printf)
42−import Debug.Trace (trace)
43import Text.Pandoc.XML (fromEntities)
42import Text.Pandoc.XML (fromEntities)
44import Data.Maybe (fromMaybe)
43import Data.Maybe (fromMaybe)
45import Text.HTML.TagSoup
44import Text.HTML.TagSoup
46import Data.Char (isAlphaNum)
45import Data.Char (isAlphaNum)
47import qualified Data.Foldable as F
46import qualified Data.Foldable as F
48import Control.Monad.Except (throwError)
47import Control.Monad.Except (throwError)
49−import Text.Pandoc.Class (PandocMonad)
48+import Text.Pandoc.Class (PandocMonad, report)
51-- | Read twiki from an input string and return a Pandoc document.
50-- | Read twiki from an input string and return a Pandoc document.
52readTWiki :: PandocMonad m
51readTWiki :: PandocMonad m
53 => ReaderOptions
52 => ReaderOptions
55 -> m Pandoc
54 -> m Pandoc
56−readTWiki opts s =
55+readTWiki opts s = do
57− case (readWith parseTWiki) def{ stateOptions = opts } (s ++ "\n\n") of
56+ res <- readWithM parseTWiki def{ stateOptions = opts } (s ++ "\n\n")
58 Left e -> throwError e
58 Left e -> throwError e
59 Right d -> return d
59 Right d -> return d
62−type TWParser = Parser [Char] ParserState
61+type TWParser = ParserT [Char] ParserState
65-- utility functions
64-- utility functions
68−tryMsg :: String -> TWParser a -> TWParser a
67+tryMsg :: String -> TWParser m a -> TWParser m a
69tryMsg msg p = try p <?> msg
68tryMsg msg p = try p <?> msg
71−skip :: TWParser a -> TWParser ()
70+skip :: TWParser m a -> TWParser m ()
72skip parser = parser >> return ()
71skip parser = parser >> return ()
74−nested :: TWParser a -> TWParser a
73+nested :: PandocMonad m => TWParser m a -> TWParser m a
75nested p = do
74nested p = do
76 nestlevel <- stateMaxNestingLevel <$> getState
75 nestlevel <- stateMaxNestingLevel <$> getState
77 guard $ nestlevel > 0
76 guard $ nestlevel > 0
@@ -80,7 +79,7 @@ nested p = do
80 updateState $ \st -> st{ stateMaxNestingLevel = nestlevel }
79 updateState $ \st -> st{ stateMaxNestingLevel = nestlevel }
81 return res
80 return res
83−htmlElement :: String -> TWParser (Attr, String)
82+htmlElement :: PandocMonad m => String -> TWParser m (Attr, String)
84htmlElement tag = tryMsg tag $ do
83htmlElement tag = tryMsg tag $ do
85 (TagOpen _ attr, _) <- htmlTag (~== TagOpen tag [])
84 (TagOpen _ attr, _) <- htmlTag (~== TagOpen tag [])
86 content <- manyTill anyChar (endtag <|> endofinput)
85 content <- manyTill anyChar (endtag <|> endofinput)
@@ -97,7 +96,8 @@ htmlAttrToPandoc attrs = (ident, classes, keyvals)
97 classes = maybe [] words $ lookup "class" attrs
96 classes = maybe [] words $ lookup "class" attrs
98 keyvals = [(k,v) | (k,v) <- attrs, k /= "id" && k /= "class"]
97 keyvals = [(k,v) | (k,v) <- attrs, k /= "id" && k /= "class"]
99+parseHtmlContentWithAttrs :: PandocMonad m
100−parseHtmlContentWithAttrs :: String -> TWParser a -> TWParser (Attr, [a])
100+ => String -> TWParser m a -> TWParser m (Attr, [a])
101parseHtmlContentWithAttrs tag parser = do
101parseHtmlContentWithAttrs tag parser = do
102 (attr, content) <- htmlElement tag
102 (attr, content) <- htmlElement tag
103 parsedContent <- try $ parseContent content
103 parsedContent <- try $ parseContent content
@@ -106,14 +106,14 @@ parseHtmlContentWithAttrs tag parser = do
106 parseContent = parseFromString $ nested $ manyTill parser endOfContent
106 parseContent = parseFromString $ nested $ manyTill parser endOfContent
107 endOfContent = try $ skipMany blankline >> skipSpaces >> eof
107 endOfContent = try $ skipMany blankline >> skipSpaces >> eof
109−parseHtmlContent :: String -> TWParser a -> TWParser [a]
109+parseHtmlContent :: PandocMonad m => String -> TWParser m a -> TWParser m [a]
110parseHtmlContent tag p = parseHtmlContentWithAttrs tag p >>= return . snd
110parseHtmlContent tag p = parseHtmlContentWithAttrs tag p >>= return . snd
113-- main parser
113-- main parser
116−parseTWiki :: TWParser Pandoc
116+parseTWiki :: PandocMonad m => TWParser m Pandoc
117parseTWiki = do
117parseTWiki = do
118 bs <- mconcat <$> many block
118 bs <- mconcat <$> many block
@@ -125,20 +125,18 @@ parseTWiki = do
125-- block parsers
125-- block parsers
128−block :: TWParser B.Blocks
128+block :: PandocMonad m => TWParser m B.Blocks
129block = do
129block = do
130− tr <- (== DEBUG) <$> getOption readerVerbosity
131 pos <- getPosition
130 pos <- getPosition
132 res <- mempty <$ skipMany1 blankline
131 res <- mempty <$ skipMany1 blankline
133 <|> blockElements
132 <|> blockElements
135 skipMany blankline
134 skipMany blankline
137− trace (printf "line %d: %s" (sourceLine pos)
135+ report DEBUG $ printf "line %d: %s" (sourceLine pos)
138− (take 60 $ show $ B.toList res)) (return ())
136+ (take 60 $ show $ B.toList res)
139 return res
137 return res
141−blockElements :: TWParser B.Blocks
139+blockElements :: PandocMonad m => TWParser m B.Blocks
142blockElements = choice [ separator
140blockElements = choice [ separator
144 , verbatim
142 , verbatim
@@ -149,10 +147,10 @@ blockElements = choice [ separator
149 , noautolink
147 , noautolink
152−separator :: TWParser B.Blocks
150+separator :: PandocMonad m => TWParser m B.Blocks
153separator = tryMsg "separator" $ string "---" >> newline >> return B.horizontalRule
151separator = tryMsg "separator" $ string "---" >> newline >> return B.horizontalRule
155−header :: TWParser B.Blocks
153+header :: PandocMonad m => TWParser m B.Blocks
156header = tryMsg "header" $ do
154header = tryMsg "header" $ do
157 string "---"
155 string "---"
158 level <- many1 (char '+') >>= return . length
156 level <- many1 (char '+') >>= return . length
@@ -163,43 +161,45 @@ header = tryMsg "header" $ do
163 attr <- registerHeader ("", classes, []) content
161 attr <- registerHeader ("", classes, []) content
164 return $ B.headerWith attr level $ content
162 return $ B.headerWith attr level $ content
166−verbatim :: TWParser B.Blocks
164+verbatim :: PandocMonad m => TWParser m B.Blocks
167verbatim = (htmlElement "verbatim" <|> htmlElement "pre")
165verbatim = (htmlElement "verbatim" <|> htmlElement "pre")
168 >>= return . (uncurry B.codeBlockWith)
166 >>= return . (uncurry B.codeBlockWith)
170−literal :: TWParser B.Blocks
168+literal :: PandocMonad m => TWParser m B.Blocks
171literal = htmlElement "literal" >>= return . rawBlock
169literal = htmlElement "literal" >>= return . rawBlock
173 format (_, _, kvs) = fromMaybe "html" $ lookup "format" kvs
171 format (_, _, kvs) = fromMaybe "html" $ lookup "format" kvs
174 rawBlock (attrs, content) = B.rawBlock (format attrs) content
172 rawBlock (attrs, content) = B.rawBlock (format attrs) content
176−list :: String -> TWParser B.Blocks
174+list :: PandocMonad m => String -> TWParser m B.Blocks
177list prefix = choice [ bulletList prefix
175list prefix = choice [ bulletList prefix
178 , orderedList prefix
176 , orderedList prefix
179 , definitionList prefix]
177 , definitionList prefix]
181−definitionList :: String -> TWParser B.Blocks
179+definitionList :: PandocMonad m => String -> TWParser m B.Blocks
182definitionList prefix = tryMsg "definitionList" $ do
180definitionList prefix = tryMsg "definitionList" $ do
183 indent <- lookAhead $ string prefix *> (many1 $ string " ") <* string "$ "
181 indent <- lookAhead $ string prefix *> (many1 $ string " ") <* string "$ "
184 elements <- many $ parseDefinitionListItem (prefix ++ concat indent)
182 elements <- many $ parseDefinitionListItem (prefix ++ concat indent)
185 return $ B.definitionList elements
183 return $ B.definitionList elements
185+ parseDefinitionListItem :: PandocMonad m
187− parseDefinitionListItem :: String -> TWParser (B.Inlines, [B.Blocks])
186+ => String -> TWParser m (B.Inlines, [B.Blocks])
188 parseDefinitionListItem indent = do
187 parseDefinitionListItem indent = do
189 string (indent ++ "$ ") >> skipSpaces
188 string (indent ++ "$ ") >> skipSpaces
190 term <- many1Till inline $ string ": "
189 term <- many1Till inline $ string ": "
191 line <- listItemLine indent $ string "$ "
190 line <- listItemLine indent $ string "$ "
192 return $ (mconcat term, [line])
191 return $ (mconcat term, [line])
194−bulletList :: String -> TWParser B.Blocks
193+bulletList :: PandocMonad m => String -> TWParser m B.Blocks
195bulletList prefix = tryMsg "bulletList" $
194bulletList prefix = tryMsg "bulletList" $
196 parseList prefix (char '*') (char ' ')
195 parseList prefix (char '*') (char ' ')
198−orderedList :: String -> TWParser B.Blocks
197+orderedList :: PandocMonad m => String -> TWParser m B.Blocks
199orderedList prefix = tryMsg "orderedList" $
198orderedList prefix = tryMsg "orderedList" $
200 parseList prefix (oneOf "1iIaA") (string ". ")
199 parseList prefix (oneOf "1iIaA") (string ". ")
201+parseList :: PandocMonad m
202−parseList :: String -> TWParser Char -> TWParser a -> TWParser B.Blocks
202+ => String -> TWParser m Char -> TWParser m a -> TWParser m B.Blocks
203parseList prefix marker delim = do
203parseList prefix marker delim = do
204 (indent, style) <- lookAhead $ string prefix *> listStyle <* delim
204 (indent, style) <- lookAhead $ string prefix *> listStyle <* delim
205 blocks <- many $ parseListItem (prefix ++ indent) (char style <* delim)
205 blocks <- many $ parseListItem (prefix ++ indent) (char style <* delim)
@@ -216,10 +216,12 @@ parseList prefix marker delim = do
216 style <- marker
216 style <- marker
217 return (concat indent, style)
217 return (concat indent, style)
219+parseListItem :: (PandocMonad m, Show a)
219−parseListItem :: Show a => String -> TWParser a -> TWParser B.Blocks
220+ => String -> TWParser m a -> TWParser m B.Blocks
220parseListItem prefix marker = string prefix >> marker >> listItemLine prefix marker
221parseListItem prefix marker = string prefix >> marker >> listItemLine prefix marker
223+listItemLine :: (PandocMonad m, Show a)
222−listItemLine :: Show a => String -> TWParser a -> TWParser B.Blocks
224+ => String -> TWParser m a -> TWParser m B.Blocks
223listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
225listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
225 lineContent = do
227 lineContent = do
@@ -236,7 +238,7 @@ listItemLine prefix marker = lineContent >>= parseContent >>= return . mconcat
236 lastNewline = try $ char '\n' <* eof
238 lastNewline = try $ char '\n' <* eof
237 newlineBeforeNestedList = try $ char '\n' <* lookAhead nestedList
239 newlineBeforeNestedList = try $ char '\n' <* lookAhead nestedList
239−table :: TWParser B.Blocks
241+table :: PandocMonad m => TWParser m B.Blocks
240table = try $ do
242table = try $ do
241 tableHead <- optionMaybe $ many1Till tableParseHeader newline >>= return . unzip
243 tableHead <- optionMaybe $ many1Till tableParseHeader newline >>= return . unzip
242 rows <- many1 tableParseRow
244 rows <- many1 tableParseRow
@@ -248,7 +250,7 @@ table = try $ do
248 columns rows = replicate (columCount rows) mempty
250 columns rows = replicate (columCount rows) mempty
249 columCount rows = length $ head rows
251 columCount rows = length $ head rows
251−tableParseHeader :: TWParser ((Alignment, Double), B.Blocks)
253+tableParseHeader :: PandocMonad m => TWParser m ((Alignment, Double), B.Blocks)
252tableParseHeader = try $ do
254tableParseHeader = try $ do
254 leftSpaces <- many spaceChar >>= return . length
256 leftSpaces <- many spaceChar >>= return . length
@@ -264,27 +266,27 @@ tableParseHeader = try $ do
264 | left > right = (AlignRight, 0)
266 | left > right = (AlignRight, 0)
265 | otherwise = (AlignLeft, 0)
267 | otherwise = (AlignLeft, 0)
267−tableParseRow :: TWParser [B.Blocks]
269+tableParseRow :: PandocMonad m => TWParser m [B.Blocks]
268tableParseRow = many1Till tableParseColumn newline
270tableParseRow = many1Till tableParseColumn newline
270−tableParseColumn :: TWParser B.Blocks
272+tableParseColumn :: PandocMonad m => TWParser m B.Blocks
271tableParseColumn = char '|' *> skipSpaces *>
273tableParseColumn = char '|' *> skipSpaces *>
272 tableColumnContent (skipSpaces >> char '|')
274 tableColumnContent (skipSpaces >> char '|')
273 <* skipSpaces <* optional tableEndOfRow
275 <* skipSpaces <* optional tableEndOfRow
275−tableEndOfRow :: TWParser Char
277+tableEndOfRow :: PandocMonad m => TWParser m Char
276tableEndOfRow = lookAhead (try $ char '|' >> char '\n') >> char '|'
278tableEndOfRow = lookAhead (try $ char '|' >> char '\n') >> char '|'
278−tableColumnContent :: TWParser a -> TWParser B.Blocks
280+tableColumnContent :: PandocMonad m => TWParser m a -> TWParser m B.Blocks
279tableColumnContent end = manyTill content (lookAhead $ try end) >>= return . B.plain . mconcat
281tableColumnContent end = manyTill content (lookAhead $ try end) >>= return . B.plain . mconcat
281 content = continuation <|> inline
283 content = continuation <|> inline
282 continuation = try $ char '\\' >> newline >> return mempty
284 continuation = try $ char '\\' >> newline >> return mempty
284−blockQuote :: TWParser B.Blocks
286+blockQuote :: PandocMonad m => TWParser m B.Blocks
285blockQuote = parseHtmlContent "blockquote" block >>= return . B.blockQuote . mconcat
287blockQuote = parseHtmlContent "blockquote" block >>= return . B.blockQuote . mconcat
287−noautolink :: TWParser B.Blocks
289+noautolink :: PandocMonad m => TWParser m B.Blocks
288noautolink = do
290noautolink = do
289 (_, content) <- htmlElement "noautolink"
291 (_, content) <- htmlElement "noautolink"
290 st <- getState
292 st <- getState
@@ -295,7 +297,7 @@ noautolink = do
296 parseContent = parseFromString $ many $ block
298 parseContent = parseFromString $ many $ block
298−para :: TWParser B.Blocks
300+para :: PandocMonad m => TWParser m B.Blocks
299para = many1Till inline endOfParaElement >>= return . result . mconcat
301para = many1Till inline endOfParaElement >>= return . result . mconcat
301 endOfParaElement = lookAhead $ endOfInput <|> endOfPara <|> newBlockElement
303 endOfParaElement = lookAhead $ endOfInput <|> endOfPara <|> newBlockElement
@@ -311,7 +313,7 @@ para = many1Till inline endOfParaElement >>= return . result . mconcat
311-- inline parsers
313-- inline parsers
314−inline :: TWParser B.Inlines
316+inline :: PandocMonad m => TWParser m B.Inlines
315inline = choice [ whitespace
317inline = choice [ whitespace
@@ -332,36 +334,39 @@ inline = choice [ whitespace
333 ] <?> "inline"
335 ] <?> "inline"
335−whitespace :: TWParser B.Inlines
337+whitespace :: PandocMonad m => TWParser m B.Inlines
336whitespace = (lb <|> regsp) >>= return
338whitespace = (lb <|> regsp) >>= return
337 where lb = try $ skipMany spaceChar >> linebreak >> return B.space
339 where lb = try $ skipMany spaceChar >> linebreak >> return B.space
338 regsp = try $ skipMany1 spaceChar >> return B.space
340 regsp = try $ skipMany1 spaceChar >> return B.space
340−br :: TWParser B.Inlines
342+br :: PandocMonad m => TWParser m B.Inlines
341br = try $ string "%BR%" >> return B.linebreak
343br = try $ string "%BR%" >> return B.linebreak
343−linebreak :: TWParser B.Inlines
345+linebreak :: PandocMonad m => TWParser m B.Inlines
344linebreak = newline >> notFollowedBy newline >> (lastNewline <|> innerNewline)
346linebreak = newline >> notFollowedBy newline >> (lastNewline <|> innerNewline)
345 where lastNewline = eof >> return mempty
347 where lastNewline = eof >> return mempty
346 innerNewline = return B.space
348 innerNewline = return B.space
350+between :: (Monoid c, PandocMonad m)
348−between :: (Monoid c) => TWParser a -> TWParser b -> (TWParser b -> TWParser c) -> TWParser c
351+ => TWParser m a -> TWParser m b -> (TWParser m b -> TWParser m c)
349between start end p =
353between start end p =
350 mconcat <$> try (start >> notFollowedBy whitespace >> many1Till (p end) end)
354 mconcat <$> try (start >> notFollowedBy whitespace >> many1Till (p end) end)
356+enclosed :: (Monoid b, PandocMonad m)
352−enclosed :: (Monoid b) => TWParser a -> (TWParser a -> TWParser b) -> TWParser b
357+ => TWParser m a -> (TWParser m a -> TWParser m b) -> TWParser m b
353enclosed sep p = between sep (try $ sep <* endMarker) p
358enclosed sep p = between sep (try $ sep <* endMarker) p
355 endMarker = lookAhead $ skip endSpace <|> skip (oneOf ".,!?:)|") <|> eof
360 endMarker = lookAhead $ skip endSpace <|> skip (oneOf ".,!?:)|") <|> eof
356 endSpace = (spaceChar <|> newline) >> return B.space
361 endSpace = (spaceChar <|> newline) >> return B.space
358−macro :: TWParser B.Inlines
363+macro :: PandocMonad m => TWParser m B.Inlines
359macro = macroWithParameters <|> withoutParameters
364macro = macroWithParameters <|> withoutParameters
361 withoutParameters = enclosed (char '%') (\_ -> macroName) >>= return . emptySpan
366 withoutParameters = enclosed (char '%') (\_ -> macroName) >>= return . emptySpan
362 emptySpan name = buildSpan name [] mempty
367 emptySpan name = buildSpan name [] mempty
364−macroWithParameters :: TWParser B.Inlines
369+macroWithParameters :: PandocMonad m => TWParser m B.Inlines
365macroWithParameters = try $ do
370macroWithParameters = try $ do
367 name <- macroName
372 name <- macroName
@@ -376,13 +381,13 @@ buildSpan className kvs = B.spanWith attrs
376 additionalClasses = maybe [] words $ lookup "class" kvs
381 additionalClasses = maybe [] words $ lookup "class" kvs
377 kvsWithoutClasses = [(k,v) | (k,v) <- kvs, k /= "class"]
382 kvsWithoutClasses = [(k,v) | (k,v) <- kvs, k /= "class"]
379−macroName :: TWParser String
384+macroName :: PandocMonad m => TWParser m String
380macroName = do
385macroName = do
381 first <- letter
386 first <- letter
382 rest <- many $ alphaNum <|> char '_'
387 rest <- many $ alphaNum <|> char '_'
383 return (first:rest)
388 return (first:rest)
385−attributes :: TWParser (String, [(String, String)])
390+attributes :: PandocMonad m => TWParser m (String, [(String, String)])
386attributes = char '{' *> spnl *> many (attribute <* spnl) <* char '}' >>=
391attributes = char '{' *> spnl *> many (attribute <* spnl) <* char '}' >>=
387 return . foldr (either mkContent mkKvs) ([], [])
392 return . foldr (either mkContent mkKvs) ([], [])
@@ -391,7 +396,7 @@ attributes = char '{' *> spnl *> many (attribute <* spnl) <* char '}' >>=
391 mkContent c (rest, kvs) = (c ++ " " ++ rest, kvs)
396 mkContent c (rest, kvs) = (c ++ " " ++ rest, kvs)
392 mkKvs kv (cont, rest) = (cont, (kv : rest))
397 mkKvs kv (cont, rest) = (cont, (kv : rest))
394−attribute :: TWParser (Either String (String, String))
399+attribute :: PandocMonad m => TWParser m (Either String (String, String))
395attribute = withKey <|> withoutKey
400attribute = withKey <|> withoutKey
397 withKey = try $ do
402 withKey = try $ do
@@ -405,49 +410,51 @@ attribute = withKey <|> withoutKey
405 | allowSpaces == True = many1 $ noneOf "}"
410 | allowSpaces == True = many1 $ noneOf "}"
406 | otherwise = many1 $ noneOf " }"
411 | otherwise = many1 $ noneOf " }"
413+nestedInlines :: (Show a, PandocMonad m)
408−nestedInlines :: Show a => TWParser a -> TWParser B.Inlines
414+ => TWParser m a -> TWParser m B.Inlines
409nestedInlines end = innerSpace <|> nestedInline
415nestedInlines end = innerSpace <|> nestedInline
411 innerSpace = try $ whitespace <* (notFollowedBy end)
417 innerSpace = try $ whitespace <* (notFollowedBy end)
412 nestedInline = notFollowedBy whitespace >> nested inline
418 nestedInline = notFollowedBy whitespace >> nested inline
414−strong :: TWParser B.Inlines
420+strong :: PandocMonad m => TWParser m B.Inlines
415strong = try $ enclosed (char '*') nestedInlines >>= return . B.strong
421strong = try $ enclosed (char '*') nestedInlines >>= return . B.strong
417−strongHtml :: TWParser B.Inlines
423+strongHtml :: PandocMonad m => TWParser m B.Inlines
418strongHtml = (parseHtmlContent "strong" inline <|> parseHtmlContent "b" inline)
424strongHtml = (parseHtmlContent "strong" inline <|> parseHtmlContent "b" inline)
419 >>= return . B.strong . mconcat
425 >>= return . B.strong . mconcat
421−strongAndEmph :: TWParser B.Inlines
427+strongAndEmph :: PandocMonad m => TWParser m B.Inlines
422strongAndEmph = try $ enclosed (string "__") nestedInlines >>= return . B.emph . B.strong
428strongAndEmph = try $ enclosed (string "__") nestedInlines >>= return . B.emph . B.strong
424−emph :: TWParser B.Inlines
430+emph :: PandocMonad m => TWParser m B.Inlines
425emph = try $ enclosed (char '_') nestedInlines >>= return . B.emph
431emph = try $ enclosed (char '_') nestedInlines >>= return . B.emph
427−emphHtml :: TWParser B.Inlines
433+emphHtml :: PandocMonad m => TWParser m B.Inlines
428emphHtml = (parseHtmlContent "em" inline <|> parseHtmlContent "i" inline)
434emphHtml = (parseHtmlContent "em" inline <|> parseHtmlContent "i" inline)
429 >>= return . B.emph . mconcat
435 >>= return . B.emph . mconcat
437+nestedString :: (Show a, PandocMonad m)
431−nestedString :: Show a => TWParser a -> TWParser String
438+ => TWParser m a -> TWParser m String
432nestedString end = innerSpace <|> (count 1 nonspaceChar)
439nestedString end = innerSpace <|> (count 1 nonspaceChar)
434 innerSpace = try $ many1 spaceChar <* notFollowedBy end
441 innerSpace = try $ many1 spaceChar <* notFollowedBy end
436−boldCode :: TWParser B.Inlines
443+boldCode :: PandocMonad m => TWParser m B.Inlines
437boldCode = try $ enclosed (string "==") nestedString >>= return . B.strong . B.code . fromEntities
444boldCode = try $ enclosed (string "==") nestedString >>= return . B.strong . B.code . fromEntities
439−htmlComment :: TWParser B.Inlines
446+htmlComment :: PandocMonad m => TWParser m B.Inlines
440htmlComment = htmlTag isCommentTag >> return mempty
447htmlComment = htmlTag isCommentTag >> return mempty
442−code :: TWParser B.Inlines
449+code :: PandocMonad m => TWParser m B.Inlines
443code = try $ enclosed (char '=') nestedString >>= return . B.code . fromEntities
450code = try $ enclosed (char '=') nestedString >>= return . B.code . fromEntities
445−codeHtml :: TWParser B.Inlines
452+codeHtml :: PandocMonad m => TWParser m B.Inlines
446codeHtml = do
453codeHtml = do
447 (attrs, content) <- parseHtmlContentWithAttrs "code" anyChar
454 (attrs, content) <- parseHtmlContentWithAttrs "code" anyChar
448 return $ B.codeWith attrs $ fromEntities content
455 return $ B.codeWith attrs $ fromEntities content
450−autoLink :: TWParser B.Inlines
457+autoLink :: PandocMonad m => TWParser m B.Inlines
451autoLink = try $ do
458autoLink = try $ do
452 state <- getState
459 state <- getState
453 guard $ stateAllowLinks state
460 guard $ stateAllowLinks state
@@ -461,20 +468,20 @@ autoLink = try $ do
461 | c == '/' = True
468 | c == '/' = True
462 | otherwise = isAlphaNum c
469 | otherwise = isAlphaNum c
464−str :: TWParser B.Inlines
471+str :: PandocMonad m => TWParser m B.Inlines
465str = (many1 alphaNum <|> count 1 characterReference) >>= return . B.str
472str = (many1 alphaNum <|> count 1 characterReference) >>= return . B.str
467−nop :: TWParser B.Inlines
474+nop :: PandocMonad m => TWParser m B.Inlines
468nop = try $ (skip exclamation <|> skip nopTag) >> followContent
475nop = try $ (skip exclamation <|> skip nopTag) >> followContent
470 exclamation = char '!'
477 exclamation = char '!'
471 nopTag = stringAnyCase "<nop>"
478 nopTag = stringAnyCase "<nop>"
472 followContent = many1 nonspaceChar >>= return . B.str . fromEntities
479 followContent = many1 nonspaceChar >>= return . B.str . fromEntities
474−symbol :: TWParser B.Inlines
481+symbol :: PandocMonad m => TWParser m B.Inlines
475symbol = count 1 nonspaceChar >>= return . B.str
482symbol = count 1 nonspaceChar >>= return . B.str
477−smart :: TWParser B.Inlines
484+smart :: PandocMonad m => TWParser m B.Inlines
478smart = do
485smart = do
479 guardEnabled Ext_smart
486 guardEnabled Ext_smart
480 doubleQuoted <|> singleQuoted <|>
487 doubleQuoted <|> singleQuoted <|>
@@ -483,14 +490,14 @@ smart = do
483 , ellipses
490 , ellipses
486−singleQuoted :: TWParser B.Inlines
493+singleQuoted :: PandocMonad m => TWParser m B.Inlines
487singleQuoted = try $ do
494singleQuoted = try $ do
488 singleQuoteStart
495 singleQuoteStart
489 withQuoteContext InSingleQuote $
496 withQuoteContext InSingleQuote $
490 many1Till inline singleQuoteEnd >>=
497 many1Till inline singleQuoteEnd >>=
491 (return . B.singleQuoted . B.trimInlines . mconcat)
498 (return . B.singleQuoted . B.trimInlines . mconcat)
493−doubleQuoted :: TWParser B.Inlines
500+doubleQuoted :: PandocMonad m => TWParser m B.Inlines
494doubleQuoted = try $ do
501doubleQuoted = try $ do
495 doubleQuoteStart
502 doubleQuoteStart
496 contents <- mconcat <$> many (try $ notFollowedBy doubleQuoteEnd >> inline)
503 contents <- mconcat <$> many (try $ notFollowedBy doubleQuoteEnd >> inline)
@@ -498,7 +505,7 @@ doubleQuoted = try $ do
498 return (B.doubleQuoted $ B.trimInlines contents))
505 return (B.doubleQuoted $ B.trimInlines contents))
499 <|> (return $ (B.str "\8220") B.<> contents)
506 <|> (return $ (B.str "\8220") B.<> contents)
501−link :: TWParser B.Inlines
508+link :: PandocMonad m => TWParser m B.Inlines
502link = try $ do
509link = try $ do
503 st <- getState
510 st <- getState
504 guard $ stateAllowLinks st
511 guard $ stateAllowLinks st
@@ -507,7 +514,7 @@ link = try $ do
507 setState $ st{ stateAllowLinks = True }
514 setState $ st{ stateAllowLinks = True }
508 return $ B.link url title content
515 return $ B.link url title content
510−linkText :: TWParser (String, String, B.Inlines)
517+linkText :: PandocMonad m => TWParser m (String, String, B.Inlines)
511linkText = do
518linkText = do
512 string "[["
519 string "[["
513 url <- many1Till anyChar (char ']')
520 url <- many1Till anyChar (char ']')