git.iko.soy/typeable/pandoc
on master help sign in
RST reader: Made para parser slightly more efficient.
commit4be137509ea98a68dd557b982e5cb7cbad7a3062 authorJohn MacFarlane <jgm@berkeley.edu> dateFri 28 Sep 2012, 00:59 (14 years ago) parentab17faf
1 file changed+19−12
src/Text/Pandoc/Readers/RST.hs+19−12
src/Text/Pandoc/Readers/RST.hs+19−12
@@ -35,7 +35,8 @@ import Text.Pandoc.Shared
3535import Text.Pandoc.Parsing
3636import Text.Pandoc.Options
3737import 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 )
3940import qualified Data.Map as M
4041import Text.Printf ( printf )
4142import Data.Maybe ( catMaybes )
@@ -43,6 +44,7 @@ import Control.Applicative ((<$>), (<$), (<*), (*>))
4344import Text.Pandoc.Builder (Inlines, Blocks, trimInlines, (<>))
4445import qualified Text.Pandoc.Builder as B
4546import Data.Monoid (mconcat, mempty)
47+import Data.Sequence (viewr, ViewR(..))
4648
4749-- | Parse reStructuredText string and return Pandoc document.
4850readRST :: ReaderOptions -- ^ Reader options
@@ -223,16 +225,18 @@ lineBlock = try $ do
223225-- paragraph block
224226--
225227
226−codeBlockStart :: Parser [Char] st Char
227−codeBlockStart = string "::" >> blankline >> blankline
228−
229228-- note: paragraph can end in a :: starting a code block
230229para :: Parser [Char] ParserState Blocks
231230para = try $ do
232− result <- trimInlines . mconcat <$>
233− many1 (notFollowedBy' codeBlockStart >> inline)
234− (lookAhead codeBlockStart >> return (B.para $ result <> B.str ":"))
235− <|> (newline >> blanklines >> return (B.para result))
231+ result <- trimInlines . mconcat <$> many inline
232+ newline
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)
236240
237241plain :: Parser [Char] ParserState Blocks
238242plain = B.plain . trimInlines . mconcat <$> many1 inline
@@ -348,11 +352,14 @@ indentedBlock = try $ do
348352 optional blanklines
349353 return $ unlines lns
350354
355+codeBlockStart :: Parser [Char] st Char
356+codeBlockStart = string "::" >> blankline >> blankline
357+
351358codeBlock :: Parser [Char] st Blocks
352−codeBlock = try $ do
353− codeBlockStart
354− result <- indentedBlock
355− return $ B.codeBlock $ stripTrailingNewlines result
359+codeBlock = try $ codeBlockStart >> codeBlockBody
360+
361+codeBlockBody :: Parser [Char] st Blocks
362+codeBlockBody = try $ B.codeBlock . stripTrailingNewlines <$> indentedBlock
356363
357364-- | The 'code-block' directive (from Sphinx) that allows a language to be
358365-- specified.