@@ -32,8 +32,6 @@ Conversion of Muse text to 'Pandoc' document.
3232-}
3333{-
3434TODO:
35−- Org tables
36−- table.el tables
3735- <cite> tag
3836-}
3937module Text.Pandoc.Readers.Muse (readMuse) where
@@ -335,6 +333,7 @@ blockElements = (mempty <$ blankline)
335333 <|> playTag
336334 <|> verseTag
337335 <|> lineBlock
336+ <|> museGridTable
338337 <|> table
339338 <|> commentTag
340339
@@ -681,6 +680,36 @@ elementsToTable :: [MuseTableElement] -> MuseTable
681680elementsToTable = foldr museAppendElement emptyTable
682681 where emptyTable = MuseTable mempty mempty mempty mempty
683682
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+
684713-- | Parse a table.
685714table :: PandocMonad m => MuseParser m (F Blocks)
686715table = try $ fmap (museToPandocTable . elementsToTable) <$> tableElements