summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/Text/Pandoc/CSS.hs6
-rw-r--r--src/Text/Pandoc/Writers/HTML.hs40
-rw-r--r--test/command/7871.md14
-rw-r--r--test/tables/nordics.html44
-rw-r--r--test/tables/nordics.html54
-rw-r--r--test/tables/planets.html412
-rw-r--r--test/tables/planets.html512
-rw-r--r--test/tables/students.html46
-rw-r--r--test/tables/students.html56
9 files changed, 68 insertions, 36 deletions
diff --git a/src/Text/Pandoc/CSS.hs b/src/Text/Pandoc/CSS.hs
index ab31e3d5b..03065cc9b 100644
--- a/src/Text/Pandoc/CSS.hs
+++ b/src/Text/Pandoc/CSS.hs
@@ -18,6 +18,7 @@ module Text.Pandoc.CSS
)
where
+import Data.Either (fromRight)
import Data.Maybe (mapMaybe, listToMaybe)
import Data.Text (Text, pack)
import Text.Pandoc.Shared (trim)
@@ -37,10 +38,7 @@ styleAttrParser = many1 ruleParser
-- Returns an empty list on failure.
cssAttributes :: Text -> [(Text, Text)]
cssAttributes styleString =
- -- Use Data.Either.fromRight once GHC 8.0 is no longer supported
- case parse styleAttrParser "" styleString of
- Left _ -> []
- Right x -> x
+ fromRight [] $ parse styleAttrParser "" styleString
-- | takes a list of keys/properties and a CSS string and
-- returns the corresponding key-value-pairs.
diff --git a/src/Text/Pandoc/Writers/HTML.hs b/src/Text/Pandoc/Writers/HTML.hs
index 79846736a..b1161fded 100644
--- a/src/Text/Pandoc/Writers/HTML.hs
+++ b/src/Text/Pandoc/Writers/HTML.hs
@@ -44,6 +44,7 @@ import Text.Blaze.Internal (MarkupM (Empty), customLeaf, customParent)
import Text.DocTemplates (FromContext (lookupContext), Context (..))
import Text.Blaze.Html hiding (contents)
import Text.Pandoc.Translations (Term(Abstract))
+import Text.Pandoc.CSS (cssAttributes)
import Text.Pandoc.Definition
import Text.Pandoc.Highlighting (formatHtmlBlock, formatHtmlInline, highlight,
styleToCss)
@@ -1282,29 +1283,48 @@ tableCellToHtml :: PandocMonad m
tableCellToHtml opts ctype colAlign (Cell attr align rowspan colspan item) = do
contents <- blockListToHtml opts item
html5 <- gets stHtml5
+ let (ident, cls, kvs) = attr
let tag' = case ctype of
BodyCell -> H.td
HeaderCell -> H.th
let align' = case align of
AlignDefault -> colAlign
_ -> align
- let alignAttribs = case alignmentToString align' of
- Nothing ->
- mempty
- Just alignStr ->
- if html5
- then A.style (toValue $ "text-align: " <> alignStr <> ";")
- else A.align (toValue alignStr)
- otherAttribs <- attrsToHtml opts attr
+ let kvs' = case alignmentToString align' of
+ Nothing ->
+ kvs
+ Just alignStr ->
+ if html5
+ then addStyle ("text-align", alignStr) kvs
+ else case break ((== "align") . fst) kvs of
+ (_, []) -> ("align", alignStr) : kvs
+ (xs, _:rest) -> xs ++ ("align", alignStr) : rest
+ otherAttribs <- attrsToHtml opts (ident, cls, kvs')
let attribs = mconcat
- $ alignAttribs
- : colspanAttrib colspan
+ $ colspanAttrib colspan
: rowspanAttrib rowspan
: otherAttribs
return $ do
tag' ! attribs $ contents
nl
+-- | Adds a key-value pair to the @style@ attribute.
+addStyle :: (Text, Text) -> [(Text, Text)] -> [(Text, Text)]
+addStyle (key, value) kvs =
+ let cssToStyle = T.intercalate " " . map (\(k, v) -> k <> ": " <> v <> ";")
+ in case break ((== "style") . fst) kvs of
+ (_, []) ->
+ -- no style attribute yet, add new one
+ ("style", cssToStyle [(key, value)]) : kvs
+ (xs, (_,cssStyles):rest) ->
+ -- modify the style attribute
+ xs ++ ("style", cssToStyle modifiedCssStyles) : rest
+ where
+ modifiedCssStyles =
+ case break ((== key) . fst) $ cssAttributes cssStyles of
+ (cssAttribs, []) -> (key, value) : cssAttribs
+ (pre, _:post) -> pre ++ (key, value) : post
+
toListItems :: [Html] -> [Html]
toListItems items = map toListItem items ++ [nl]
diff --git a/test/command/7871.md b/test/command/7871.md
new file mode 100644
index 000000000..94670f32b
--- /dev/null
+++ b/test/command/7871.md
@@ -0,0 +1,14 @@
+```
+% pandoc -f html -t html
+<table>
+<tr><td style="padding-right:4px;text-align:right">a</td></tr>
+</table>
+^D
+<table>
+<tbody>
+<tr class="odd">
+<td style="text-align: right; padding-right: 4px;">a</td>
+</tr>
+</tbody>
+</table>
+```
diff --git a/test/tables/nordics.html4 b/test/tables/nordics.html4
index 841ab03e5..3cc94845c 100644
--- a/test/tables/nordics.html4
+++ b/test/tables/nordics.html4
@@ -51,8 +51,8 @@
<tr id="summary" class="even">
<td align="center">Total</td>
<td align="left"></td>
-<td align="left" id="total-population">27,376,022</td>
-<td align="left" id="total-area">1,258,336</td>
+<td id="total-population" align="left">27,376,022</td>
+<td id="total-area" align="left">1,258,336</td>
</tr>
</tfoot>
diff --git a/test/tables/nordics.html5 b/test/tables/nordics.html5
index 0d639d4ea..dbc13d313 100644
--- a/test/tables/nordics.html5
+++ b/test/tables/nordics.html5
@@ -51,8 +51,8 @@
<tr id="summary" class="even">
<td style="text-align: center;">Total</td>
<td style="text-align: left;"></td>
-<td style="text-align: left;" id="total-population">27,376,022</td>
-<td style="text-align: left;" id="total-area">1,258,336</td>
+<td id="total-population" style="text-align: left;">27,376,022</td>
+<td id="total-area" style="text-align: left;">1,258,336</td>
</tr>
</tfoot>
diff --git a/test/tables/planets.html4 b/test/tables/planets.html4
index 4435571b4..e0cd646d8 100644
--- a/test/tables/planets.html4
+++ b/test/tables/planets.html4
@@ -2,7 +2,7 @@
<caption><p>Data about the planets of our solar system.</p></caption>
<thead>
<tr class="header">
-<th align="center" colspan="2"></th>
+<th colspan="2" align="center"></th>
<th>Name</th>
<th align="right">Mass (10^24kg)</th>
<th align="right">Diameter (km)</th>
@@ -17,7 +17,7 @@
</thead>
<tbody>
<tr class="odd">
-<th align="center" colspan="2" rowspan="4">Terrestrial planets</th>
+<th colspan="2" rowspan="4" align="center">Terrestrial planets</th>
<th>Mercury</th>
<td align="right">0.330</td>
<td align="right">4,879</td>
@@ -66,8 +66,8 @@
<td>The red planet</td>
</tr>
<tr class="odd">
-<th align="center" rowspan="4">Jovian planets</th>
-<th align="center" rowspan="2">Gas giants</th>
+<th rowspan="4" align="center">Jovian planets</th>
+<th rowspan="2" align="center">Gas giants</th>
<th>Jupiter</th>
<td align="right">1898</td>
<td align="right">142,984</td>
@@ -92,7 +92,7 @@
<td></td>
</tr>
<tr class="odd">
-<th align="center" rowspan="2">Ice giants</th>
+<th rowspan="2" align="center">Ice giants</th>
<th>Uranus</th>
<td align="right">86.8</td>
<td align="right">51,118</td>
@@ -117,7 +117,7 @@
<td></td>
</tr>
<tr class="odd">
-<th align="center" colspan="2">Dwarf planets</th>
+<th colspan="2" align="center">Dwarf planets</th>
<th>Pluto</th>
<td align="right">0.0146</td>
<td align="right">2,370</td>
diff --git a/test/tables/planets.html5 b/test/tables/planets.html5
index 1fee985b9..99aa0b04c 100644
--- a/test/tables/planets.html5
+++ b/test/tables/planets.html5
@@ -2,7 +2,7 @@
<caption><p>Data about the planets of our solar system.</p></caption>
<thead>
<tr class="header">
-<th style="text-align: center;" colspan="2"></th>
+<th colspan="2" style="text-align: center;"></th>
<th>Name</th>
<th style="text-align: right;">Mass (10^24kg)</th>
<th style="text-align: right;">Diameter (km)</th>
@@ -17,7 +17,7 @@
</thead>
<tbody>
<tr class="odd">
-<th style="text-align: center;" colspan="2" rowspan="4">Terrestrial planets</th>
+<th colspan="2" rowspan="4" style="text-align: center;">Terrestrial planets</th>
<th>Mercury</th>
<td style="text-align: right;">0.330</td>
<td style="text-align: right;">4,879</td>
@@ -66,8 +66,8 @@
<td>The red planet</td>
</tr>
<tr class="odd">
-<th style="text-align: center;" rowspan="4">Jovian planets</th>
-<th style="text-align: center;" rowspan="2">Gas giants</th>
+<th rowspan="4" style="text-align: center;">Jovian planets</th>
+<th rowspan="2" style="text-align: center;">Gas giants</th>
<th>Jupiter</th>
<td style="text-align: right;">1898</td>
<td style="text-align: right;">142,984</td>
@@ -92,7 +92,7 @@
<td></td>
</tr>
<tr class="odd">
-<th style="text-align: center;" rowspan="2">Ice giants</th>
+<th rowspan="2" style="text-align: center;">Ice giants</th>
<th>Uranus</th>
<td style="text-align: right;">86.8</td>
<td style="text-align: right;">51,118</td>
@@ -117,7 +117,7 @@
<td></td>
</tr>
<tr class="odd">
-<th style="text-align: center;" colspan="2">Dwarf planets</th>
+<th colspan="2" style="text-align: center;">Dwarf planets</th>
<th>Pluto</th>
<td style="text-align: right;">0.0146</td>
<td style="text-align: right;">2,370</td>
diff --git a/test/tables/students.html4 b/test/tables/students.html4
index b02b0aba8..cbfffaa1e 100644
--- a/test/tables/students.html4
+++ b/test/tables/students.html4
@@ -12,7 +12,7 @@
</thead>
<tbody class="souvereign-states">
<tr class="odd">
-<th align="left" colspan="2">Computer Science</th>
+<th colspan="2" align="left">Computer Science</th>
</tr>
<tr class="odd">
@@ -30,7 +30,7 @@
</tbody>
<tbody>
<tr class="odd">
-<th align="left" colspan="2">Russian Literature</th>
+<th colspan="2" align="left">Russian Literature</th>
</tr>
<tr class="odd">
@@ -40,7 +40,7 @@
</tbody>
<tbody>
<tr class="odd">
-<th align="left" colspan="2">Astrophysics</th>
+<th colspan="2" align="left">Astrophysics</th>
</tr>
<tr class="odd">
diff --git a/test/tables/students.html5 b/test/tables/students.html5
index af9e088fb..a7e0127c8 100644
--- a/test/tables/students.html5
+++ b/test/tables/students.html5
@@ -12,7 +12,7 @@
</thead>
<tbody class="souvereign-states">
<tr class="odd">
-<th style="text-align: left;" colspan="2">Computer Science</th>
+<th colspan="2" style="text-align: left;">Computer Science</th>
</tr>
<tr class="odd">
@@ -30,7 +30,7 @@
</tbody>
<tbody>
<tr class="odd">
-<th style="text-align: left;" colspan="2">Russian Literature</th>
+<th colspan="2" style="text-align: left;">Russian Literature</th>
</tr>
<tr class="odd">
@@ -40,7 +40,7 @@
</tbody>
<tbody>
<tr class="odd">
-<th style="text-align: left;" colspan="2">Astrophysics</th>
+<th colspan="2" style="text-align: left;">Astrophysics</th>
</tr>
<tr class="odd">