git.iko.soy/typeable/pandoc
on master help sign in
RST reader: Folded code block parsers into directive.
720a7baJohn MacFarlane
src/Text/Pandoc/Readers/RST.hs+15−18
@@ -136,7 +136,6 @@ block = choice [ codeBlock
136 , fieldList
136 , fieldList
137 , imageBlock
137 , imageBlock
138 , figureBlock
138 , figureBlock
139− , customCodeBlock
140 , directive
139 , directive
141 , header
140 , header
142 , hrule
141 , hrule
@@ -234,9 +233,9 @@ para = try $ do
234 blanklines
233 blanklines
235 case viewr (B.unMany result) of
234 case viewr (B.unMany result) of
236 ys :> (Str xs) | "::" `isSuffixOf` xs -> do
235 ys :> (Str xs) | "::" `isSuffixOf` xs -> do
237− codeblock <- option mempty codeBlockBody
236+ raw <- option mempty codeBlockBody
238 return $ B.para (B.Many ys <> B.str (take (length xs - 1) xs))
237 return $ B.para (B.Many ys <> B.str (take (length xs - 1) xs))
239− <> codeblock
238+ <> raw
240 _ -> return (B.para result)
239 _ -> return (B.para result)
241
240
242plain :: RSTParser Blocks
241plain :: RSTParser Blocks
@@ -362,21 +361,6 @@ codeBlock = try $ codeBlockStart >> codeBlockBody
362codeBlockBody :: Parser [Char] st Blocks
361codeBlockBody :: Parser [Char] st Blocks
363codeBlockBody = try $ B.codeBlock . stripTrailingNewlines <$> indentedBlock
362codeBlockBody = try $ B.codeBlock . stripTrailingNewlines <$> indentedBlock
364
363
365−-- | The 'code-block' directive (from Sphinx) that allows a language to be
366−-- specified.
367−customCodeBlock :: Parser [Char] st Blocks
368−customCodeBlock = try $ do
369− string ".. "
370− string "code"
371− optional $ string "-block"
372− string "::"
373− skipSpaces
374− language <- manyTill anyChar newline
375− blanklines
376− result <- indentedBlock
377− return $ B.codeBlockWith ("", ["sourceCode", language], [])
378− $ stripTrailingNewlines result
379−
380figureBlock :: RSTParser Blocks
364figureBlock :: RSTParser Blocks
381figureBlock = try $ do
365figureBlock = try $ do
382 string ".. figure::"
366 string ".. figure::"
@@ -567,6 +551,8 @@ directive = try $ do
567 case trim top of
551 case trim top of
568 "" -> stateRstDefaultRole def
552 "" -> stateRstDefaultRole def
569 role -> role })
553 role -> role })
554+ "code" -> codeblock (lookup "number-lines" fields) (trim top) body
555+ "code-block" -> codeblock (lookup "number-lines" fields) (trim top) body
570 "math" -> return $ B.para $ mconcat $ map B.displayMath
556 "math" -> return $ B.para $ mconcat $ map B.displayMath
571 $ toChunks $ top ++ "\n\n" ++ body
557 $ toChunks $ top ++ "\n\n" ++ body
572 _ -> return mempty
558 _ -> return mempty
@@ -577,6 +563,17 @@ toChunks = dropWhile null
577 . map (trim . unlines)
563 . map (trim . unlines)
578 . splitBy (all (`elem` " \t")) . lines
564 . splitBy (all (`elem` " \t")) . lines
579
565
566+codeblock :: Maybe String -> String -> String -> RSTParser Blocks
567+codeblock numberLines lang body =
568+ return $ B.codeBlockWith attribs $ stripTrailingNewlines body
569+ where attribs = ("", classes, kvs)
570+ classes = "sourceCode" : lang
571+ : maybe [] (\_ -> ["numberLines"]) numberLines
572+ kvs = case numberLines of
573+ Just "" -> []
574+ Nothing -> []
575+ Just n -> [("startFrom",n)]
576+
580---
577---
581--- note block
578--- note block
582---
579---