git.iko.soy/typeable/pandoc
on master help sign in
Muse reader: add grid tables support
c61b674Alexander Krotov
src/Text/Pandoc/Readers/Muse.hs+31−2
@@ -32,8 +32,6 @@ Conversion of Muse text to 'Pandoc' document.
32-}
32-}
33{-
33{-
34TODO:
34TODO:
35−- Org tables
36−- table.el tables
37- <cite> tag
35- <cite> tag
38-}
36-}
39module Text.Pandoc.Readers.Muse (readMuse) where
37module Text.Pandoc.Readers.Muse (readMuse) where
@@ -335,6 +333,7 @@ blockElements = (mempty <$ blankline)
335 <|> playTag
333 <|> playTag
336 <|> verseTag
334 <|> verseTag
337 <|> lineBlock
335 <|> lineBlock
336+ <|> museGridTable
338 <|> table
337 <|> table
339 <|> commentTag
338 <|> commentTag
340
339
@@ -681,6 +680,36 @@ elementsToTable :: [MuseTableElement] -> MuseTable
681elementsToTable = foldr museAppendElement emptyTable
680elementsToTable = foldr museAppendElement emptyTable
682 where emptyTable = MuseTable mempty mempty mempty mempty
681 where emptyTable = MuseTable mempty mempty mempty mempty
683
682
683+museGridPart :: PandocMonad m => MuseParser m Int
684+museGridPart = try $ length <$> many1 (char '-') <* char '+'
685+
686+museGridTableHeader :: PandocMonad m => MuseParser m [Int]
687+museGridTableHeader = try $ char '+' *> many1 museGridPart <* manyTill spaceChar eol
688+
689+museGridTableRow :: PandocMonad m
690+ => Int
691+ -> [Int]
692+ -> MuseParser m (F [Blocks])
693+museGridTableRow indent indices = try $ do
694+ lns <- many1 $ try (indentWith indent *> museGridTableRawLine indices)
695+ let cols = map unlines $ transpose lns
696+ indentWith indent *> museGridTableHeader
697+ sequence <$> mapM (parseFromString parseBlocks) cols
698+
699+museGridTableRawLine :: PandocMonad m
700+ => [Int]
701+ -> MuseParser m [String]
702+museGridTableRawLine indices =
703+ char '|' *> forM indices (\n -> count n anyChar <* char '|') <* manyTill spaceChar eol
704+
705+museGridTable :: PandocMonad m => MuseParser m (F Blocks)
706+museGridTable = try $ do
707+ indent <- getIndent
708+ indices <- museGridTableHeader
709+ fmap rowsToTable . sequence <$> many1 (museGridTableRow indent indices)
710+ where rowsToTable rows = B.table mempty attrs [] rows
711+ where attrs = const (AlignDefault, 0.0) <$> transpose rows
712+
684-- | Parse a table.
713-- | Parse a table.
685table :: PandocMonad m => MuseParser m (F Blocks)
714table :: PandocMonad m => MuseParser m (F Blocks)
686table = try $ fmap (museToPandocTable . elementsToTable) <$> tableElements
715table = try $ fmap (museToPandocTable . elementsToTable) <$> tableElements
test/Tests/Readers/Muse.hs+43
@@ -976,6 +976,49 @@ tests =
976 [[plain "1", plain "2", plain "3"],
976 [[plain "1", plain "2", plain "3"],
977 [plain "4", mempty, plain "6"],
977 [plain "4", mempty, plain "6"],
978 [plain "7", plain "8", plain "9"]]
978 [plain "7", plain "8", plain "9"]]
979+ , "Grid table" =:
980+ T.unlines
981+ [ "+-----+-----+"
982+ , "| foo | bar |"
983+ , "+-----+-----+"
984+ ] =?>
985+ table mempty [(AlignDefault, 0.0), (AlignDefault, 0.0)]
986+ []
987+ [[para "foo", para "bar"]]
988+ , "Grid table inside list" =:
989+ T.unlines
990+ [ " - +-----+-----+"
991+ , " | foo | bar |"
992+ , " +-----+-----+"
993+ ] =?>
994+ bulletList [table mempty [(AlignDefault, 0.0), (AlignDefault, 0.0)]
995+ []
996+ [[para "foo", para "bar"]]]
997+ , "Grid table with two rows" =:
998+ T.unlines
999+ [ "+-----+-----+"
1000+ , "| foo | bar |"
1001+ , "+-----+-----+"
1002+ , "| bat | baz |"
1003+ , "+-----+-----+"
1004+ ] =?>
1005+ table mempty [(AlignDefault, 0.0), (AlignDefault, 0.0)]
1006+ []
1007+ [[para "foo", para "bar"]
1008+ ,[para "bat", para "baz"]]
1009+ , "Grid table inside grid table" =:
1010+ T.unlines
1011+ [ "+-----+"
1012+ , "|+---+|"
1013+ , "||foo||"
1014+ , "|+---+|"
1015+ , "+-----+"
1016+ ] =?>
1017+ table mempty [(AlignDefault, 0.0)]
1018+ []
1019+ [[table mempty [(AlignDefault, 0.0)]
1020+ []
1021+ [[para "foo"]]]]
979 ]
1022 ]
980 , testGroup "Lists"
1023 , testGroup "Lists"
981 [ "Bullet list" =:
1024 [ "Bullet list" =: