From c61b67410ac9f30786dd8e5c73cf2a7bbdbcd02c Mon Sep 17 00:00:00 2001
From: Alexander Krotov <ilabdsf@gmail.com>
Date: Fri, 9 Nov 2018 14:19:17 +0300
Subject: Muse reader: add grid tables support

---
 src/Text/Pandoc/Readers/Muse.hs | 33 +++++++++++++++++++++++++++++++--
 1 file changed, 31 insertions(+), 2 deletions(-)

(limited to 'src')

diff --git a/src/Text/Pandoc/Readers/Muse.hs b/src/Text/Pandoc/Readers/Muse.hs
index e3c8392e6..2ddaffabd 100644
--- a/src/Text/Pandoc/Readers/Muse.hs
+++ b/src/Text/Pandoc/Readers/Muse.hs
@@ -32,8 +32,6 @@ Conversion of Muse text to 'Pandoc' document.
 -}
 {-
 TODO:
-- Org tables
-- table.el tables
 - <cite> tag
 -}
 module Text.Pandoc.Readers.Muse (readMuse) where
@@ -335,6 +333,7 @@ blockElements = (mempty <$ blankline)
             <|> playTag
             <|> verseTag
             <|> lineBlock
+            <|> museGridTable
             <|> table
             <|> commentTag
 
@@ -681,6 +680,36 @@ elementsToTable :: [MuseTableElement] -> MuseTable
 elementsToTable = foldr museAppendElement emptyTable
   where emptyTable = MuseTable mempty mempty mempty mempty
 
+museGridPart :: PandocMonad m => MuseParser m Int
+museGridPart = try $ length <$> many1 (char '-') <* char '+'
+
+museGridTableHeader :: PandocMonad m => MuseParser m [Int]
+museGridTableHeader = try $ char '+' *> many1 museGridPart <* manyTill spaceChar eol
+
+museGridTableRow :: PandocMonad m
+                 => Int
+                 -> [Int]
+                 -> MuseParser m (F [Blocks])
+museGridTableRow indent indices = try $ do
+  lns <- many1 $ try (indentWith indent *> museGridTableRawLine indices)
+  let cols = map unlines $ transpose lns
+  indentWith indent *> museGridTableHeader
+  sequence <$> mapM (parseFromString parseBlocks) cols
+
+museGridTableRawLine :: PandocMonad m
+                     => [Int]
+                     -> MuseParser m [String]
+museGridTableRawLine indices =
+  char '|' *> forM indices (\n -> count n anyChar <* char '|') <* manyTill spaceChar eol
+
+museGridTable :: PandocMonad m => MuseParser m (F Blocks)
+museGridTable = try $ do
+  indent <- getIndent
+  indices <- museGridTableHeader
+  fmap rowsToTable . sequence <$> many1 (museGridTableRow indent indices)
+  where rowsToTable rows = B.table mempty attrs [] rows
+                           where attrs = const (AlignDefault, 0.0) <$> transpose rows
+
 -- | Parse a table.
 table :: PandocMonad m => MuseParser m (F Blocks)
 table = try $ fmap (museToPandocTable . elementsToTable) <$> tableElements
-- 
cgit v1.2.3