@@ -307,6 +307,7 @@ parseBlocks = mconcat <$> manyTill block eof
307307
308308block :: Parser [Char] ParserState (F Blocks)
309309block = choice [ codeBlockFenced
310+ , codeBlockBackticks
310311 , guardEnabled Ext_latex_macros *> (mempty <$ macro)
311312 , header
312313 , rawTeXBlock
@@ -379,21 +380,13 @@ indentedLine = indentSpaces >> manyTill anyChar newline >>= return . (++ "\n")
379380
380381blockDelimiter :: (Char -> Bool)
381382 -> Maybe Int
382− -> Parser [Char] ParserState (Int, (String, [String], [(String, String)]), Char)
383+ -> Parser [Char] st Int
383384blockDelimiter f len = try $ do
384385 c <- lookAhead (satisfy f)
385− size <- case len of
386− Just l -> count l (char c) >> many (char c) >> return l
387− Nothing -> count 3 (char c) >> many (char c) >>=
388− return . (+ 3) . length
389− many spaceChar
390− attr <- option ([],[],[]) $ do
391− guardEnabled Ext_fenced_code_attributes
392− attributes -- ~~~ {.ruby}
393− <|> (many1 alphaNum >>= \x ->
394− return ([],[x],[])) -- github variant ```ruby
395− blankline
396− return (size, attr, c)
386+ case len of
387+ Just l -> count l (char c) >> many (char c) >> return l
388+ Nothing -> count 3 (char c) >> many (char c) >>=
389+ return . (+ 3) . length
397390
398391attributes :: Parser [Char] st (String, [String], [(String, String)])
399392attributes = try $ do
@@ -440,11 +433,26 @@ keyValAttr = try $ do
440433codeBlockFenced :: Parser [Char] ParserState (F Blocks)
441434codeBlockFenced = try $ do
442435 guardEnabled Ext_fenced_code_blocks
443− (size, attr, c) <- blockDelimiter (\c -> c == '~' || c == '`') Nothing
444− contents <- manyTill anyLine (blockDelimiter (== c) (Just size))
436+ size <- blockDelimiter (=='~') Nothing
437+ skipMany spaceChar
438+ attr <- option ([],[],[]) $
439+ guardEnabled Ext_fenced_code_attributes >> attributes
440+ blankline
441+ contents <- manyTill anyLine (blockDelimiter (=='~') (Just size))
445442 blanklines
446443 return $ return $ B.codeBlockWith attr $ intercalate "\n" contents
447444
445+codeBlockBackticks :: Parser [Char] ParserState (F Blocks)
446+codeBlockBackticks = try $ do
447+ guardEnabled Ext_backtick_code_blocks
448+ blockDelimiter (=='`') (Just 3)
449+ skipMany spaceChar
450+ cls <- many1 alphaNum
451+ blankline
452+ contents <- manyTill anyLine $ blockDelimiter (=='`') (Just 3)
453+ blanklines
454+ return $ return $ B.codeBlockWith ("",[cls],[]) $ intercalate "\n" contents
455+
448456codeBlockIndented :: Parser [Char] ParserState (F Blocks)
449457codeBlockIndented = do
450458 contents <- many1 (indentedLine <|>