Skip to content

Commit

Permalink
Update th/td to use style attribute
Browse files Browse the repository at this point in the history
This allows better interoperation with CSS style sheets, as the align
object on the TH is skipped if the css uses 'text-align: inherit' and
the previous 'text-align' is used instead (or the default: left).

Added an override to restore the original `align` behavior
Moved existing tests to the new test infrastructure
Added new tests to test the configuration parameter
Updated documentation to document the configuration parameter.
  • Loading branch information
gaige authored May 5, 2022
1 parent db98a26 commit 659a436
Show file tree
Hide file tree
Showing 8 changed files with 943 additions and 641 deletions.
2 changes: 2 additions & 0 deletions docs/change_log/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,8 @@ title: Change Log
Python-Markdown Change Log
=========================

Under development: version 3.4.0 ([Notes](release-3.4.md)).

May 5, 2022: version 3.3.7 (a bug-fix release).

* Disallow square brackets in reference link ids (#1209).
Expand Down
44 changes: 44 additions & 0 deletions docs/change_log/release-3.4.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
title: Release Notes for v3.4

# Python-Markdown 3.4 Release Notes

Python-Markdown version 3.4 supports Python versions 3.6, 3.7, 3.8, 3.9 and PyPy3.

## Backwards-incompatible changes

### The `table` extension now uses a `style` attribute instead of `align` attribute for alignment.

The [HTML4 spec][spec4] specifically
deprecates the use of the `align` attribute and it does not appear at all in the
[HTML5 spec][spec5]. Therefore, by default, the [table] extension will now use the `style`
attribute (setting just the `text-align` property) in `td` and `th` blocks.

[spec4]: https://www.w3.org/TR/html4/present/graphics.html#h-15.1.2
[spec5]: https://www.w3.org/TR/html53/tabular-data.html#attributes-common-to-td-and-th-elements

The former behavior is available by setting the setting `use_align_attribute` configuration
option to `True` when adding the extension.

For example, to configure the old `align` behavior:

```python
from markdown.extensions.tables import TableExtension

markdown.markdown(src, extensions=[TableExtension(use_align_attribute=True)])
```

In addition, tests were moved to the modern test environment.

## New features

The following new features have been included in the 3.3 release:

* Use `style` attribute in tables for alignment instead of `align` for better CSS
inter-operation. The old behavior is available by setting `use_align_attribute=True` when
adding the extension.

## Bug fixes

The following bug fixes are included in the 3.4 release:


22 changes: 21 additions & 1 deletion docs/extensions/tables.md
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,30 @@ Usage
See [Extensions](index.md) for general extension usage. Use `tables` as the
name of the extension.

This extension does not accept any special configuration options.
See the [Library Reference](../reference.md#extensions) for information about
configuring extensions.

The following options are provided to change the default behavior:

* **`use_align_attribute`**: Set to `True` to use `align` instead of an appropriate `style` attribute

Default: `'False'`


A trivial example:

```python
markdown.markdown(some_text, extensions=['tables'])
```

### Examples

For an example, let us suppose that alignment should be controlled by the legacy `align`
attribute.

```pycon
>>> from markdown.extensions.tables import TableExtension
>>> html = markdown.markdown(text,
... extensions=[TableExtension(use_align_attribute=True)]
... )
```
19 changes: 16 additions & 3 deletions markdown/extensions/tables.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,9 +30,11 @@ class TableProcessor(BlockProcessor):
RE_CODE_PIPES = re.compile(r'(?:(\\\\)|(\\`+)|(`+)|(\\\|)|(\|))')
RE_END_BORDER = re.compile(r'(?<!\\)(?:\\\\)*\|$')

def __init__(self, parser):
def __init__(self, parser, config):
self.border = False
self.separator = ''
self.config = config

super().__init__(parser)

def test(self, parent, block):
Expand Down Expand Up @@ -126,7 +128,10 @@ def _build_row(self, row, parent, align):
except IndexError: # pragma: no cover
c.text = ""
if a:
c.set('align', a)
if self.config['use_align_attribute']:
c.set('align', a)
else:
c.set('style', f'text-align: {a};')

def _split_row(self, row):
""" split a row of text into list of cells. """
Expand Down Expand Up @@ -212,11 +217,19 @@ def _split(self, row):
class TableExtension(Extension):
""" Add tables to Markdown. """

def __init__(self, **kwargs):
self.config = {
'use_align_attribute': [False, 'True to use align attribute instead of style.'],
}

super().__init__(**kwargs)

def extendMarkdown(self, md):
""" Add an instance of TableProcessor to BlockParser. """
if '|' not in md.ESCAPED_CHARS:
md.ESCAPED_CHARS.append('|')
md.parser.blockprocessors.register(TableProcessor(md.parser), 'table', 75)
processor = TableProcessor(md.parser, self.getConfigs())
md.parser.blockprocessors.register(processor, 'table', 75)


def makeExtension(**kwargs): # pragma: no cover
Expand Down
Loading

0 comments on commit 659a436

Please sign in to comment.