git.iko.soy/typeable/pandoc
on master help sign in
RST reader: Made para parser slightly more efficient.
4be1375John MacFarlane
src/Text/Pandoc/Readers/RST.hs+19−12
@@ -35,7 +35,8 @@ import Text.Pandoc.Shared
35import Text.Pandoc.Parsing
35import Text.Pandoc.Parsing
36import Text.Pandoc.Options
36import Text.Pandoc.Options
37import Control.Monad ( when, liftM, guard, mzero )
37import Control.Monad ( when, liftM, guard, mzero )
38−import Data.List ( findIndex, intersperse, intercalate, transpose, sort, deleteFirstsBy )
38+import Data.List ( findIndex, intersperse, intercalate,
39+ transpose, sort, deleteFirstsBy, isSuffixOf )
39import qualified Data.Map as M
40import qualified Data.Map as M
40import Text.Printf ( printf )
41import Text.Printf ( printf )
41import Data.Maybe ( catMaybes )
42import Data.Maybe ( catMaybes )
@@ -43,6 +44,7 @@ import Control.Applicative ((<$>), (<$), (<*), (*>))
43import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
44import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
44import qualified Text.Pandoc.Builder as B
45import qualified Text.Pandoc.Builder as B
45import Data.Monoid (mconcat, mempty)
46import Data.Monoid (mconcat, mempty)
47+import Data.Sequence (viewr, ViewR(..))
46
48
47-- | Parse reStructuredText string and return Pandoc document.
49-- | Parse reStructuredText string and return Pandoc document.
48readRST :: ReaderOptions -- ^ Reader options
50readRST :: ReaderOptions -- ^ Reader options
@@ -223,16 +225,18 @@ lineBlock = try $ do
223-- paragraph block
225-- paragraph block
224--
226--
225
227
226−codeBlockStart :: Parser [Char] st Char
227−codeBlockStart = string "::" >> blankline >> blankline
228−
229-- note: paragraph can end in a :: starting a code block
228-- note: paragraph can end in a :: starting a code block
230para :: Parser [Char] ParserState Blocks
229para :: Parser [Char] ParserState Blocks
231para = try $ do
230para = try $ do
232− result <- trimInlines . mconcat <$>
231+ result <- trimInlines . mconcat <$> many inline
233− many1 (notFollowedBy' codeBlockStart >> inline)
232+ newline
234− (lookAhead codeBlockStart >> return (B.para $ result <> B.str ":"))
235− <|> (newline >> blanklines >> return (B.para result))
233+ blanklines
234+ case viewr (B.unMany result) of
235+ ys :> (Str xs) | "::" `isSuffixOf` xs -> do
236+ codeblock <- option mempty codeBlockBody
237+ return $ B.para (B.Many ys <> B.str (take (length xs - 1) xs))
238+ <> codeblock
239+ _ -> return (B.para result)
236
240
237plain :: Parser [Char] ParserState Blocks
241plain :: Parser [Char] ParserState Blocks
238plain = B.plain . trimInlines . mconcat <$> many1 inline
242plain = B.plain . trimInlines . mconcat <$> many1 inline
@@ -348,11 +352,14 @@ indentedBlock = try $ do
348 optional blanklines
352 optional blanklines
349 return $ unlines lns
353 return $ unlines lns
350
354
355+codeBlockStart :: Parser [Char] st Char
356+codeBlockStart = string "::" >> blankline >> blankline
357+
351codeBlock :: Parser [Char] st Blocks
358codeBlock :: Parser [Char] st Blocks
352−codeBlock = try $ do
353− codeBlockStart
359+codeBlock = try $ codeBlockStart >> codeBlockBody
354− result <- indentedBlock
360+
361+codeBlockBody :: Parser [Char] st Blocks
355− return $ B.codeBlock $ stripTrailingNewlines result
362+codeBlockBody = try $ B.codeBlock . stripTrailingNewlines <$> indentedBlock
356
363
357-- | The 'code-block' directive (from Sphinx) that allows a language to be
364-- | The 'code-block' directive (from Sphinx) that allows a language to be
358-- specified.
365-- specified.