git.iko.soy/typeable/pandoc
on master help sign in
Markdown reader: attribute parsing improvements.

* Cleaned up parsing code. * '-' in an attribute context = '.unnumbered'. The point of this is to provide a way to specify unnumbered headers in non-English documents.

commitf4629df14adbbcca8b843ce4ae6a9dd6161f6ec6 authorJohn MacFarlane <fiddlosopher@gmail.com> dateSat 2 Mar 2013, 21:08 (14 years ago) parent5b0b21b
1 file changed+15−14
src/Text/Pandoc/Readers/Markdown.hs+15−14
src/Text/Pandoc/Readers/Markdown.hs+15−14
@@ -488,20 +488,16 @@ blockDelimiter f len = try $ do
488488 Nothing -> count 3 (char c) >> many (char c) >>=
489489 return . (+ 3) . length
490490
491−attributes :: MarkdownParser (String, [String], [(String, String)])
491+attributes :: MarkdownParser Attr
492492attributes = try $ do
493493 char '{'
494494 spnl
495495 attrs <- many (attribute >>~ spnl)
496496 char '}'
497− let (ids, classes, keyvals) = unzip3 attrs
498− let firstNonNull [] = ""
499− firstNonNull (x:xs) | not (null x) = x
500− | otherwise = firstNonNull xs
501− return (firstNonNull $ reverse ids, concat classes, concat keyvals)
497+ return $ foldl (\x f -> f x) nullAttr attrs
502498
503−attribute :: MarkdownParser (String, [String], [(String, String)])
504−attribute = identifierAttr <|> classAttr <|> keyValAttr
499+attribute :: MarkdownParser (Attr -> Attr)
500+attribute = identifierAttr <|> classAttr <|> keyValAttr <|> specialAttr
505501
506502identifier :: MarkdownParser String
507503identifier = do
@@ -509,26 +505,31 @@ identifier = do
509505 rest <- many $ alphaNum <|> oneOf "-_:."
510506 return (first:rest)
511507
512−identifierAttr :: MarkdownParser (String, [a], [a1])
508+identifierAttr :: MarkdownParser (Attr -> Attr)
513509identifierAttr = try $ do
514510 char '#'
515511 result <- identifier
516− return (result,[],[])
512+ return $ \(_,cs,kvs) -> (result,cs,kvs)
517513
518−classAttr :: MarkdownParser (String, [String], [a])
514+classAttr :: MarkdownParser (Attr -> Attr)
519515classAttr = try $ do
520516 char '.'
521517 result <- identifier
522− return ("",[result],[])
518+ return $ \(id',cs,kvs) -> (id',cs ++ [result],kvs)
523519
524−keyValAttr :: MarkdownParser (String, [a], [(String, String)])
520+keyValAttr :: MarkdownParser (Attr -> Attr)
525521keyValAttr = try $ do
526522 key <- identifier
527523 char '='
528524 val <- enclosed (char '"') (char '"') litChar
529525 <|> enclosed (char '\'') (char '\'') litChar
530526 <|> many (escapedChar' <|> noneOf " \t\n\r}")
531− return ("",[],[(key,val)])
527+ return $ \(id',cs,kvs) -> (id',cs,kvs ++ [(key,val)])
528+
529+specialAttr :: MarkdownParser (Attr -> Attr)
530+specialAttr = do
531+ char '-'
532+ return $ \(id',cs,kvs) -> (id',cs ++ ["unnumbered"],kvs)
532533
533534codeBlockFenced :: MarkdownParser (F Blocks)
534535codeBlockFenced = try $ do