git.iko.soy/typeable/pandoc
on master help sign in
consolidate simple-table detection (#5524)
d07ed83Mauro Bieg
src/Text/Pandoc/Readers/HTML.hs+2−7
@@ -61,7 +61,7 @@ import Text.Pandoc.Options (
61 extensionEnabled)
61 extensionEnabled)
62import Text.Pandoc.Parsing hiding ((<|>))
62import Text.Pandoc.Parsing hiding ((<|>))
63import Text.Pandoc.Shared (addMetaField, blocksToInlines', crFilter, escapeURI,
63import Text.Pandoc.Shared (addMetaField, blocksToInlines', crFilter, escapeURI,
64− extractSpaces, safeRead, underlineSpan)
64+ extractSpaces, onlySimpleTableCells, safeRead, underlineSpan)
65import Text.Pandoc.Walk
65import Text.Pandoc.Walk
66import Text.Parsec.Error
66import Text.Parsec.Error
67import Text.TeXMath (readMathML, writeTeX)
67import Text.TeXMath (readMathML, writeTeX)
@@ -488,14 +488,9 @@ pTable = try $ do
488 TagClose _ <- pSatisfy (matchTagClose "table")
488 TagClose _ <- pSatisfy (matchTagClose "table")
489 let rows'' = concat rowsLs <> topfoot <> bottomfoot
489 let rows'' = concat rowsLs <> topfoot <> bottomfoot
490 let rows''' = map (map snd) rows''
490 let rows''' = map (map snd) rows''
491− -- let rows''' = map (map snd) rows''
492 -- fail on empty table
491 -- fail on empty table
493 guard $ not $ null head' && null rows'''
492 guard $ not $ null head' && null rows'''
494− let isSinglePlain x = case B.toList x of
493+ let isSimple = onlySimpleTableCells $ fmap B.toList <$> head':rows'''
495− [] -> True
496− [Plain _] -> True
497− _ -> False
498− let isSimple = all isSinglePlain $ concat (head':rows''')
499 let cols = if null head'
494 let cols = if null head'
500 then maximum (map length rows''')
495 then maximum (map length rows''')
501 else length head'
496 else length head'
src/Text/Pandoc/Shared.hs+15
@@ -59,6 +59,7 @@ module Text.Pandoc.Shared (
59 isHeaderBlock,
59 isHeaderBlock,
60 headerShift,
60 headerShift,
61 stripEmptyParagraphs,
61 stripEmptyParagraphs,
62+ onlySimpleTableCells,
62 isTightList,
63 isTightList,
63 taskListItemFromAscii,
64 taskListItemFromAscii,
64 taskListItemToAscii,
65 taskListItemToAscii,
@@ -108,6 +109,7 @@ import Data.List (find, intercalate, intersperse, stripPrefix, sortBy)
108import Data.Ord (comparing)
109import Data.Ord (comparing)
109import qualified Data.Map as M
110import qualified Data.Map as M
110import Data.Maybe (mapMaybe)
111import Data.Maybe (mapMaybe)
112+import Data.Monoid (Any (..))
111import Data.Sequence (ViewL (..), ViewR (..), viewl, viewr)
113import Data.Sequence (ViewL (..), ViewR (..), viewl, viewr)
112import qualified Data.Set as Set
114import qualified Data.Set as Set
113import qualified Data.Text as T
115import qualified Data.Text as T
@@ -571,6 +573,19 @@ stripEmptyParagraphs = walk go
571 isEmptyParagraph (Para []) = True
573 isEmptyParagraph (Para []) = True
572 isEmptyParagraph _ = False
574 isEmptyParagraph _ = False
573
575
576+-- | Detect if table rows contain only cells consisting of a single
577+-- paragraph that has no @LineBreak@.
578+onlySimpleTableCells :: [[TableCell]] -> Bool
579+onlySimpleTableCells = all isSimpleCell . concat
580+ where
581+ isSimpleCell [Plain ils] = not (hasLineBreak ils)
582+ isSimpleCell [Para ils ] = not (hasLineBreak ils)
583+ isSimpleCell [] = True
584+ isSimpleCell _ = False
585+ hasLineBreak = getAny . query isLineBreak
586+ isLineBreak LineBreak = Any True
587+ isLineBreak _ = Any False
588+
574-- | Detect if a list is tight.
589-- | Detect if a list is tight.
575isTightList :: [[Block]] -> Bool
590isTightList :: [[Block]] -> Bool
576isTightList = all firstIsPlain
591isTightList = all firstIsPlain
src/Text/Pandoc/Writers/CommonMark.hs+4−14
@@ -21,17 +21,16 @@ import Control.Monad.State.Strict (State, get, modify, runState)
21import Data.Char (isAscii)
21import Data.Char (isAscii)
22import Data.Foldable (foldrM)
22import Data.Foldable (foldrM)
23import Data.List (transpose)
23import Data.List (transpose)
24−import Data.Monoid (Any (..))
25import Data.Text (Text)
24import Data.Text (Text)
26import qualified Data.Text as T
25import qualified Data.Text as T
27import Network.HTTP (urlEncode)
26import Network.HTTP (urlEncode)
28import Text.Pandoc.Class (PandocMonad)
27import Text.Pandoc.Class (PandocMonad)
29import Text.Pandoc.Definition
28import Text.Pandoc.Definition
30import Text.Pandoc.Options
29import Text.Pandoc.Options
31−import Text.Pandoc.Shared (isTightList, taskListItemToAscii, linesToPara,
30+import Text.Pandoc.Shared (capitalize, isHeaderBlock, isTightList,
32− substitute, capitalize, isHeaderBlock)
31+ linesToPara, onlySimpleTableCells, substitute, taskListItemToAscii)
33import Text.Pandoc.Templates (renderTemplate')
32import Text.Pandoc.Templates (renderTemplate')
34−import Text.Pandoc.Walk (query, walk, walkM)
33+import Text.Pandoc.Walk (walk, walkM)
35import Text.Pandoc.Writers.HTML (writeHtml5String, tagWithAttributes)
34import Text.Pandoc.Writers.HTML (writeHtml5String, tagWithAttributes)
36import Text.Pandoc.Writers.Shared
35import Text.Pandoc.Writers.Shared
37import Text.Pandoc.XML (toHtml5Entities)
36import Text.Pandoc.XML (toHtml5Entities)
@@ -159,16 +158,7 @@ blockToNodes opts (DefinitionList items) ns =
159 dlToBullet (term, xs) =
158 dlToBullet (term, xs) =
160 Para term : concat xs
159 Para term : concat xs
161blockToNodes opts t@(Table capt aligns _widths headers rows) ns = do
160blockToNodes opts t@(Table capt aligns _widths headers rows) ns = do
162− let allcells = concat (headers:rows)
163− let isLineBreak LineBreak = Any True
164− isLineBreak _ = Any False
165− let isPlainOrPara [Para _] = True
166− isPlainOrPara [Plain _] = True
167− isPlainOrPara [] = True
168− isPlainOrPara _ = False
169− let isSimple = all isPlainOrPara allcells &&
170− not ( getAny (query isLineBreak allcells) )
171− if isEnabled Ext_pipe_tables opts && isSimple
161+ if isEnabled Ext_pipe_tables opts && onlySimpleTableCells (headers:rows)
172 then do
162 then do
173 -- We construct a table manually as a CUSTOM_BLOCK, for
163 -- We construct a table manually as a CUSTOM_BLOCK, for
174 -- two reasons: (1) cmark-gfm currently doesn't support
164 -- two reasons: (1) cmark-gfm currently doesn't support
src/Text/Pandoc/Writers/Markdown.hs+1−9
@@ -27,7 +27,6 @@ import Data.List (find, group, intersperse, sortBy, stripPrefix, transpose,
27 isPrefixOf)
27 isPrefixOf)
28import qualified Data.Map as M
28import qualified Data.Map as M
29import Data.Maybe (fromMaybe)
29import Data.Maybe (fromMaybe)
30−import Data.Monoid (Any (..))
31import Data.Ord (comparing)
30import Data.Ord (comparing)
32import qualified Data.Set as Set
31import qualified Data.Set as Set
33import qualified Data.Scientific as Scientific
32import qualified Data.Scientific as Scientific
@@ -574,14 +573,7 @@ blockToMarkdown' opts t@(Table caption aligns widths headers rows) = do
574 let caption'' = if null caption || not (isEnabled Ext_table_captions opts)
573 let caption'' = if null caption || not (isEnabled Ext_table_captions opts)
575 then blankline
574 then blankline
576 else blankline $$ (": " <> caption') $$ blankline
575 else blankline $$ (": " <> caption') $$ blankline
577− let isLineBreak LineBreak = Any True
578− isLineBreak _ = Any False
579− let hasLineBreak = getAny . query isLineBreak
580− let isSimpleCell [Plain ils] = not (hasLineBreak ils)
581− isSimpleCell [Para ils ] = not (hasLineBreak ils)
582− isSimpleCell [] = True
583− isSimpleCell _ = False
584− let hasSimpleCells = all isSimpleCell (concat (headers:rows))
576+ let hasSimpleCells = onlySimpleTableCells $ headers:rows
585 let isSimple = hasSimpleCells && all (==0) widths
577 let isSimple = hasSimpleCells && all (==0) widths
586 let isPlainBlock (Plain _) = True
578 let isPlainBlock (Plain _) = True
587 isPlainBlock _ = False
579 isPlainBlock _ = False
src/Text/Pandoc/Writers/Muse.hs+1−11
@@ -31,7 +31,6 @@ import Control.Monad.State.Strict
31import Data.Char (isAlphaNum, isAsciiLower, isAsciiUpper, isDigit, isSpace)
31import Data.Char (isAlphaNum, isAsciiLower, isAsciiUpper, isDigit, isSpace)
32import Data.Default
32import Data.Default
33import Data.List (intersperse, isInfixOf, transpose)
33import Data.List (intersperse, isInfixOf, transpose)
34−import Data.Monoid (Any (..))
35import qualified Data.Set as Set
34import qualified Data.Set as Set
36import Data.Text (Text)
35import Data.Text (Text)
37import System.FilePath (takeExtension)
36import System.FilePath (takeExtension)
@@ -44,7 +43,6 @@ import Text.Pandoc.Shared
44import Text.Pandoc.Templates (renderTemplate')
43import Text.Pandoc.Templates (renderTemplate')
45import Text.Pandoc.Writers.Math
44import Text.Pandoc.Writers.Math
46import Text.Pandoc.Writers.Shared
45import Text.Pandoc.Writers.Shared
47−import Text.Pandoc.Walk
48
46
49type Notes = [[Block]]
47type Notes = [[Block]]
50
48
@@ -269,15 +267,7 @@ blockToMuse (Table caption aligns widths headers rows) =
269 blocksToDoc opts blocks =
267 blocksToDoc opts blocks =
270 local (\env -> env { envOptions = opts }) $ blockListToMuse blocks
268 local (\env -> env { envOptions = opts }) $ blockListToMuse blocks
271 numcols = maximum (length aligns : length widths : map length (headers:rows))
269 numcols = maximum (length aligns : length widths : map length (headers:rows))
272− hasSimpleCells = all isSimpleCell (concat (headers:rows))
270+ isSimple = onlySimpleTableCells (headers:rows) && all (== 0) widths
273− isLineBreak LineBreak = Any True
274− isLineBreak _ = Any False
275− hasLineBreak = getAny . query isLineBreak
276− isSimple = hasSimpleCells && all (== 0) widths
277− isSimpleCell [Plain ils] = not (hasLineBreak ils)
278− isSimpleCell [Para ils ] = not (hasLineBreak ils)
279− isSimpleCell [] = True
280− isSimpleCell _ = False
281blockToMuse (Div _ bs) = flatBlockListToMuse bs
271blockToMuse (Div _ bs) = flatBlockListToMuse bs
282blockToMuse Null = return empty
272blockToMuse Null = return empty
283
273
test/html-reader.native+1−1
@@ -415,7 +415,7 @@ Pandoc (Meta {unMeta = fromList [("generator",MetaInlines [Str "pandoc"]),("titl
415 ,[Plain [Str "5"]]
415 ,[Plain [Str "5"]]
416 ,[Plain [Str "6"]]]]
416 ,[Plain [Str "6"]]]]
417,HorizontalRule
417,HorizontalRule
418−,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.3333333333333333,0.3333333333333333,0.3333333333333333]
418+,Table [] [AlignDefault,AlignDefault,AlignDefault] [0.0,0.0,0.0]
419 [[Plain [Str "X"]]
419 [[Plain [Str "X"]]
420 ,[Plain [Str "Y"]]
420 ,[Plain [Str "Y"]]
421 ,[Plain [Str "Z"]]]
421 ,[Plain [Str "Z"]]]