From 48eaadc57ff45bb44efe9c8da85a1c792c03dc77 Mon Sep 17 00:00:00 2001
From: John MacFarlane <jgm@berkeley.edu>
Date: Sat, 7 Mar 2015 10:40:13 -0800
Subject: [PATCH] Fixed pipe tables -- headerless tables are not allowed.

GFM and PHP Markdown Extra pipe tables require headers.
Previously pandoc allowed pipe tables not to include headers,
and produced headerless pipe tables in Markdown output, but this
was based on a misconception about pipe table syntax. This
commit fixes this.

Note:  If you have been using headerless pipe tables, this may
cause existing tables to break.

Closes #1996.
---
 README                              | 4 ++--
 src/Text/Pandoc/Readers/Markdown.hs | 8 +++-----
 src/Text/Pandoc/Writers/Markdown.hs | 7 ++++++-
 tests/pipe-tables.txt               | 4 +++-
 4 files changed, 14 insertions(+), 9 deletions(-)

diff --git a/README b/README
index ee138ac3d..8c8e8c957 100644
--- a/README
+++ b/README
@@ -1827,8 +1827,8 @@ Pipe tables look like this:
 The syntax is [the same as in PHP markdown extra].  The beginning and
 ending pipe characters are optional, but pipes are required between all
 columns.  The colons indicate column alignment as shown.  The header
-can be omitted, but the horizontal line must still be included, as
-it defines column alignments.
+cannot be omitted.  To simulate a headerless table, include a header
+with blank cells.
 
 Since the pipes indicate column boundaries, columns need not be vertically
 aligned, as they are in the above example.  So, this is a perfectly
diff --git a/src/Text/Pandoc/Readers/Markdown.hs b/src/Text/Pandoc/Readers/Markdown.hs
index 910936b34..fcd18fdc0 100644
--- a/src/Text/Pandoc/Readers/Markdown.hs
+++ b/src/Text/Pandoc/Readers/Markdown.hs
@@ -1287,11 +1287,9 @@ pipeBreak = try $ do
 
 pipeTable :: MarkdownParser ([Alignment], [Double], F [Blocks], F [[Blocks]])
 pipeTable = try $ do
-  (heads,aligns) <- try ( pipeBreak >>= \als ->
-                     return (return $ replicate (length als) mempty, als))
-                  <|> ( pipeTableRow >>= \row -> pipeBreak >>= \als ->
-
-                          return (row, als) )
+  (heads,aligns) <- pipeTableRow >>= \row ->
+                    pipeBreak >>= \als ->
+                    return (row, als)
   lines' <- sequence <$> many1 pipeTableRow
   let widths = replicate (length aligns) 0.0
   return $ (aligns, widths, heads, lines')
diff --git a/src/Text/Pandoc/Writers/Markdown.hs b/src/Text/Pandoc/Writers/Markdown.hs
index 662373209..4ffdb2b36 100644
--- a/src/Text/Pandoc/Writers/Markdown.hs
+++ b/src/Text/Pandoc/Writers/Markdown.hs
@@ -508,7 +508,12 @@ pipeTable headless aligns rawHeaders rawRows = do
                              AlignCenter  -> ':':replicate w '-' ++ ":"
                              AlignRight   -> replicate (w + 1) '-' ++ ":"
                              AlignDefault -> replicate (w + 2) '-'
-  let header = if headless then empty else torow rawHeaders
+  -- note:  pipe tables can't completely lack a
+  -- header; for a headerless table, we need a header of empty cells.
+  -- see jgm/pandoc#1996.
+  let header = if headless
+                  then torow (replicate (length aligns) empty)
+                  else torow rawHeaders
   let border = nowrap $ text "|" <> hcat (intersperse (text "|") $
                         map toborder $ zip aligns widths) <> text "|"
   let body   = vcat $ map torow rawRows
diff --git a/tests/pipe-tables.txt b/tests/pipe-tables.txt
index ee8d54d9f..83debd595 100644
--- a/tests/pipe-tables.txt
+++ b/tests/pipe-tables.txt
@@ -1,7 +1,7 @@
 Simplest table without caption:
 
 | Default1 | Default2 | Default3 | 
-|----------|----------|----------|
+ |----------|----------|----------|
 |12|12|12|
 |123|123|123|
 |1|1|1|
@@ -27,6 +27,7 @@ Simple table without caption:
 
 Headerless table without caption:
 
+|       |      |        |
 |------:|:-----|:------:|
 |12|12|12|
 |123|123|123|
@@ -48,5 +49,6 @@ One-column:
 
 Header-less one-column:
 
+|   |
 |:-:|
 |hi|