@@ -34,6 +34,7 @@ _ support internal links http://www.mediawiki.org/wiki/Help:Links
34_ support external links (partially implemented)
34_ support external links (partially implemented)
35_ support images http://www.mediawiki.org/wiki/Help:Images
35_ support images http://www.mediawiki.org/wiki/Help:Images
36_ support tables http://www.mediawiki.org/wiki/Help:Tables
36_ support tables http://www.mediawiki.org/wiki/Help:Tables
38module Text.Pandoc.Readers.MediaWiki ( readMediaWiki ) where
39module Text.Pandoc.Readers.MediaWiki ( readMediaWiki ) where
@@ -44,7 +45,7 @@ import Text.Pandoc.Options
44import Text.Pandoc.Readers.HTML ( htmlTag, isInlineTag,
45import Text.Pandoc.Readers.HTML ( htmlTag, isInlineTag,
45 isBlockTag, isCommentTag )
46 isBlockTag, isCommentTag )
46import Text.Pandoc.XML ( fromEntities )
47import Text.Pandoc.XML ( fromEntities )
47−import Text.Pandoc.Parsing
48+import Text.Pandoc.Parsing hiding ( nested )
48import Text.Pandoc.Generic ( bottomUp )
49import Text.Pandoc.Generic ( bottomUp )
49import Text.Pandoc.Shared ( stripTrailingNewlines, safeRead )
50import Text.Pandoc.Shared ( stripTrailingNewlines, safeRead )
50import Data.Monoid (mconcat, mempty)
51import Data.Monoid (mconcat, mempty)
@@ -56,17 +57,35 @@ import Data.Sequence (viewl, ViewL(..), (<|))
57-- | Read mediawiki from an input string and return a Pandoc document.
58-- | Read mediawiki from an input string and return a Pandoc document.
58readMediaWiki :: ReaderOptions -- ^ Reader options
59readMediaWiki :: ReaderOptions -- ^ Reader options
59− -> String -- ^ String to parse (assuming @'\n'@ line endings)
60+ -> String -- ^ String to parse (assuming @'\n'@ line endings)
60− -> Pandoc
61+ -> Pandoc
61readMediaWiki opts s =
62readMediaWiki opts s =
62− (readWith parseMediaWiki) def{ stateOptions = opts } (s ++ "\n\n")
63+ case runParser parseMediaWiki MWState{ mwOptions = opts, mwMaxNestingLevel = 4 }
64+ "source" (s ++ "\n") of
65+ Left err' -> error $ "\nError:\n" ++ show err'
66+ Right result -> result
68+data MWState = MWState { mwOptions :: ReaderOptions
69+ , mwMaxNestingLevel :: Int
64−type MWParser = Parser [Char] ParserState
72+type MWParser = Parser [Char] MWState
67-- auxiliary functions
75-- auxiliary functions
78+-- This is used to prevent exponential blowups for things like:
79+-- ''a'''a''a'''a''a'''a''a'''a
80+nested :: MWParser a -> MWParser a
82+ nestlevel <- mwMaxNestingLevel `fmap` getState
83+ guard $ nestlevel > 0
84+ updateState $ \st -> st{ mwMaxNestingLevel = mwMaxNestingLevel st - 1 }
86+ updateState $ \st -> st{ mwMaxNestingLevel = nestlevel }
70specialChars :: [Char]
89specialChars :: [Char]
71specialChars = "'[]<=&*{}"
90specialChars = "'[]<=&*{}"