diff options
| author | Albert Krewinkel <albert@zeitkraut.de> | 2022-01-28 18:05:49 +0100 |
|---|---|---|
| committer | Albert Krewinkel <albert@zeitkraut.de> | 2022-01-28 18:20:14 +0100 |
| commit | a6fa3df1146f7aee4e3bfa4cf506ab44e38ecb35 (patch) | |
| tree | 5da7601e160156f0bb4424ed4f60f53d6668181d | |
| parent | d36a16a4df5ed54b80dfc1579c339bad24ba6b0c (diff) | |
HTML writer: avoid duplicate "style" attributes on table cells
Fixes: #7871
| -rw-r--r-- | src/Text/Pandoc/CSS.hs | 6 | ||||
| -rw-r--r-- | src/Text/Pandoc/Writers/HTML.hs | 40 | ||||
| -rw-r--r-- | test/command/7871.md | 14 | ||||
| -rw-r--r-- | test/tables/nordics.html4 | 4 | ||||
| -rw-r--r-- | test/tables/nordics.html5 | 4 | ||||
| -rw-r--r-- | test/tables/planets.html4 | 12 | ||||
| -rw-r--r-- | test/tables/planets.html5 | 12 | ||||
| -rw-r--r-- | test/tables/students.html4 | 6 | ||||
| -rw-r--r-- | test/tables/students.html5 | 6 |
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"> |
