@@ -1271,14 +1271,22 @@ gridTableSplitLine :: [Int] -> String -> [String]
12711271gridTableSplitLine indices line = map removeFinalBar $ tail $
12721272 splitStringByIndices (init indices) $ trimr line
12731273
1274−gridPart :: Char -> Parser [Char] st (Int, Int)
1274+gridPart :: Char -> Parser [Char] st ((Int, Int), Alignment)
12751275gridPart ch = do
1276+ leftColon <- option False (True <$ char ':')
12761277 dashes <- many1 (char ch)
1278+ rightColon <- option False (True <$ char ':')
12771279 char '+'
1278− let lengthDashes = length dashes
1279− return (lengthDashes, lengthDashes + 1)
1280−
1281−gridDashedLines :: Char -> Parser [Char] st [(Int,Int)]
1280+ let lengthDashes = length dashes + (if leftColon then 1 else 0) +
1281+ (if rightColon then 1 else 0)
1282+ let alignment = case (leftColon, rightColon) of
1283+ (True, True) -> AlignCenter
1284+ (True, False) -> AlignLeft
1285+ (False, True) -> AlignRight
1286+ (False, False) -> AlignDefault
1287+ return ((lengthDashes, lengthDashes + 1), alignment)
1288+
1289+gridDashedLines :: Char -> Parser [Char] st [((Int, Int), Alignment)]
12821290gridDashedLines ch = try $ char '+' >> many1 (gridPart ch) <* blankline
12831291
12841292removeFinalBar :: String -> String
@@ -1296,19 +1304,17 @@ gridTableHeader headless = try $ do
12961304 optional blanklines
12971305 dashes <- gridDashedLines '-'
12981306 rawContent <- if headless
1299− then return $ repeat ""
1300− else many1
1301− (notFollowedBy (gridTableSep '=') >> char '|' >>
1302− many1Till anyChar newline)
1303− if headless
1304− then return ()
1305− else gridTableSep '=' >> return ()
1306− let lines' = map snd dashes
1307+ then return []
1308+ else many1 (try (char '|' >> anyLine))
1309+ underDashes <- if headless
1310+ then return dashes
1311+ else gridDashedLines '='
1312+ guard $ length dashes == length underDashes
1313+ let lines' = map (snd . fst) underDashes
13071314 let indices = scanl (+) 0 lines'
1308− let aligns = replicate (length lines') AlignDefault
1309− -- RST does not have a notion of alignments
1315+ let aligns = map snd underDashes
13101316 let rawHeads = if headless
1311− then replicate (length dashes) ""
1317+ then replicate (length underDashes) ""
13121318 else map (unlines . map trim) $ transpose
13131319 $ map (gridTableSplitLine indices) rawContent
13141320 heads <- fmap sequence $ mapM (parseFromString parseBlocks . trim) rawHeads
@@ -1317,7 +1323,7 @@ gridTableHeader headless = try $ do
13171323gridTableRawLine :: [Int] -> MarkdownParser [String]
13181324gridTableRawLine indices = do
13191325 char '|'
1320− line <- many1Till anyChar newline
1326+ line <- anyLine
13211327 return (gridTableSplitLine indices line)
13221328
13231329-- | Parse row of grid table.