git.iko.soy/typeable/pandoc
on master help sign in
Fix indent issue for definition lists
f1f56e8Timothy Humphries
src/Text/Pandoc/Readers/Org.hs+25−14
@@ -828,13 +828,14 @@ list :: OrgParser (F Blocks)
828list = choice [ definitionList, bulletList, orderedList ] <?> "list"
828list = choice [ definitionList, bulletList, orderedList ] <?> "list"
829
829
830definitionList :: OrgParser (F Blocks)
830definitionList :: OrgParser (F Blocks)
831+definitionList = try $ do n <- lookAhead (bulletListStart' Nothing)
831−definitionList = fmap B.definitionList . fmap compactify'DL . sequence
832+ fmap B.definitionList . fmap compactify'DL . sequence
832− <$> many1 (definitionListItem bulletListStart)
833+ <$> many1 (definitionListItem $ bulletListStart' (Just n))
833
834
834bulletList :: OrgParser (F Blocks)
835bulletList :: OrgParser (F Blocks)
835−bulletList = try $ do n <- lookAhead bulletListStart
836+bulletList = try $ do n <- lookAhead (bulletListStart' Nothing)
836 fmap B.bulletList . fmap compactify' . sequence
837 fmap B.bulletList . fmap compactify' . sequence
837− <$> many1 (listItem (bulletListCont n))
838+ <$> many1 (listItem (bulletListStart' $ Just n))
838
839
839orderedList :: OrgParser (F Blocks)
840orderedList :: OrgParser (F Blocks)
840orderedList = fmap B.orderedList . fmap compactify' . sequence
841orderedList = fmap B.orderedList . fmap compactify' . sequence
@@ -846,17 +847,27 @@ genericListStart listMarker = try $
846 (+) <$> (length <$> many spaceChar)
847 (+) <$> (length <$> many spaceChar)
847 <*> (length <$> listMarker <* many1 spaceChar)
848 <*> (length <$> listMarker <* many1 spaceChar)
848
849
849−-- parses bullet list start and returns its length (excl. following whitespace)
850+-- parses bullet list marker. maybe we know the indent level
850bulletListStart :: OrgParser Int
851bulletListStart :: OrgParser Int
851−bulletListStart = genericListStart bulletListMarker
852+bulletListStart = bulletListStart' Nothing
852− where bulletListMarker = pure <$> oneOf "*-+"
853+
853−
854−-- parses bullet list marker at a known indent level
855−bulletListCont :: Int -> OrgParser Int
854+bulletListStart' :: Maybe Int -> OrgParser Int
856−bulletListCont n
855+-- returns length of bulletList prefix, inclusive of marker
856+bulletListStart' Nothing = do ind <- many spaceChar
857+ oneOf bullets
858+ many1 spaceChar
859+ return $ length ind + 1
857− -- Unindented lists are legal, but they can't use '*' bullets
860+ -- Unindented lists are legal, but they can't use '*' bullets
858− | n <= 1 = oneOf "+-" >> return n
861+ -- We return n to maintain compatibility with the generic listItem
859− | otherwise = count (n-1) spaceChar >> oneOf "+-*" >> return n
862+bulletListStart' (Just n) = do count (n-1) spaceChar
863+ oneOf validBullets
864+ many1 spaceChar
865+ return n
866+ where validBullets = if n == 1 then noAsterisks else bullets
867+ noAsterisks = filter (/= '*') bullets
868+
869+bullets :: String
870+bullets = "*+-"
860
871
861orderedListStart :: OrgParser Int
872orderedListStart :: OrgParser Int
862orderedListStart = genericListStart orderedListMarker
873orderedListStart = genericListStart orderedListMarker
tests/Tests/Readers/Org.hs+10
@@ -744,6 +744,16 @@ tests =
744 , ("PCR", [ plain $ spcSep [ "polymerase", "chain", "reaction" ] ])
744 , ("PCR", [ plain $ spcSep [ "polymerase", "chain", "reaction" ] ])
745 ]
745 ]
746
746
747+ , "Definition List With Trailing Header" =:
748+ "- definition :: list\n\
749+ \- cool :: defs\n\
750+ \* header" =?>
751+ mconcat [ definitionList [ ("definition", [plain "list"])
752+ , ("cool", [plain "defs"])
753+ ]
754+ , header 1 "header"
755+ ]
756+
747 , "Loose bullet list" =:
757 , "Loose bullet list" =:
748 unlines [ "- apple"
758 unlines [ "- apple"
749 , ""
759 , ""