git.iko.soy/typeable/pandoc
on master help sign in
LaTeX reader: Small refactoring of table parsing code.

This makes room for doing something with widths.

commit58cfac84f01d86d45e31a02bc40ade8c88f5f7b2 authorJohn MacFarlane <jgm@berkeley.edu> dateThu 1 Jun 2017, 11:34 (9 years ago) parent1e7ba5c
1 file changed+18−16
src/Text/Pandoc/Readers/LaTeX.hs+18−16
src/Text/Pandoc/Readers/LaTeX.hs+18−16
@@ -1434,7 +1434,7 @@ complexNatbibCitation mode = try $ do
14341434
14351435-- tables
14361436
1437−parseAligns :: PandocMonad m => LP m [(String, Alignment, String)]
1437+parseAligns :: PandocMonad m => LP m [(Alignment, (String, String))]
14381438parseAligns = try $ do
14391439 bgroup
14401440 let maybeBar = skipMany $ sp <|> () <$ char '|' <|> () <$ (char '@' >> braced)
@@ -1442,12 +1442,13 @@ parseAligns = try $ do
14421442 let cAlign = AlignCenter <$ char 'c'
14431443 let lAlign = AlignLeft <$ char 'l'
14441444 let rAlign = AlignRight <$ char 'r'
1445− let parAlign = AlignLeft <$ (char 'p' >> braced)
1445+ let parAlign = AlignLeft <$ char 'p'
14461446 -- algins from tabularx
14471447 let xAlign = AlignLeft <$ char 'X'
1448− let mAlign = AlignLeft <$ (char 'm' >> braced)
1449− let bAlign = AlignLeft <$ (char 'b' >> braced)
1450− let alignChar = cAlign <|> lAlign <|> rAlign <|> parAlign <|> xAlign <|> mAlign <|> bAlign
1448+ let mAlign = AlignLeft <$ char 'm'
1449+ let bAlign = AlignLeft <$ char 'b'
1450+ let alignChar = cAlign <|> lAlign <|> rAlign <|> parAlign
1451+ <|> xAlign <|> mAlign <|> bAlign
14511452 let alignPrefix = char '>' >> braced
14521453 let alignSuffix = char '<' >> braced
14531454 let alignSpec = do
@@ -1455,9 +1456,10 @@ parseAligns = try $ do
14551456 pref <- option "" alignPrefix
14561457 spaces
14571458 ch <- alignChar
1459+ _width <- option "" braced -- TODO parse this
14581460 spaces
14591461 suff <- option "" alignSuffix
1460− return (pref, ch, suff)
1462+ return (ch, (pref, suff))
14611463 aligns' <- sepEndBy alignSpec maybeBar
14621464 spaces
14631465 egroup
@@ -1488,11 +1490,11 @@ amp = () <$ try (spaces' *> char '&' <* spaces')
14881490
14891491parseTableRow :: PandocMonad m
14901492 => String -- ^ table environment name
1491− -> Int -- ^ number of columns
1492− -> [String] -- ^ prefixes
1493− -> [String] -- ^ suffixes
1493+ -> [(Alignment, (String, String))] -- ^ colspecs
14941494 -> LP m [Blocks]
1495−parseTableRow envname cols prefixes suffixes = try $ do
1495+parseTableRow envname colspecs = try $ do
1496+ let prefsufs = map snd colspecs
1497+ let cols = length colspecs
14961498 let tableCellRaw = concat <$> many
14971499 (do notFollowedBy amp
14981500 notFollowedBy lbreak
@@ -1505,8 +1507,7 @@ parseTableRow envname cols prefixes suffixes = try $ do
15051507 _ -> bs
15061508 rawcells <- sepBy1 tableCellRaw amp
15071509 guard $ length rawcells == cols
1508− let rawcells' = zipWith3 (\c p s -> p ++ trim c ++ s)
1509− rawcells prefixes suffixes
1510+ let rawcells' = zipWith (\c (p, s) -> p ++ trim c ++ s) rawcells prefsufs
15101511 let tableCell = plainify <$> blocks
15111512 cells' <- mapM (parseFromString' tableCell) rawcells'
15121513 let numcells = length cells'
@@ -1524,17 +1525,17 @@ simpTable :: PandocMonad m => String -> Bool -> LP m Blocks
15241525simpTable envname hasWidthParameter = try $ do
15251526 when hasWidthParameter $ () <$ (spaces' >> tok)
15261527 skipopts
1527− (prefixes, aligns, suffixes) <- unzip3 <$> parseAligns
1528− let cols = length aligns
1528+ colspecs <- parseAligns
1529+ let cols = length colspecs
15291530 optional $ controlSeq "caption" *> skipopts *> setCaption
15301531 optional lbreak
15311532 spaces'
15321533 skipMany hline
15331534 spaces'
1534− header' <- option [] $ try (parseTableRow envname cols prefixes suffixes <*
1535+ header' <- option [] $ try (parseTableRow envname colspecs <*
15351536 lbreak <* many1 hline)
15361537 spaces'
1537− rows <- sepEndBy (parseTableRow envname cols prefixes suffixes)
1538+ rows <- sepEndBy (parseTableRow envname colspecs)
15381539 (lbreak <* optional (skipMany hline))
15391540 spaces'
15401541 optional $ controlSeq "caption" *> skipopts *> setCaption
@@ -1544,6 +1545,7 @@ simpTable envname hasWidthParameter = try $ do
15441545 then replicate cols mempty
15451546 else header'
15461547 lookAhead $ controlSeq "end" -- make sure we're at end
1548+ let (aligns, _) = unzip colspecs
15471549 return $ table mempty (zip aligns (repeat 0)) header'' rows
15481550
15491551removeDoubleQuotes :: String -> String