Skip to content

ENH: Styler.to_latex conversion from CSS #40731

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 150 commits into from
Jun 16, 2021
Merged
Changes from 1 commit
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
bb501d3
MVP for Styler.to_latex
attack68 Mar 10, 2021
6066449
MVP for Styler.to_latex
attack68 Mar 10, 2021
6e2b788
rules
attack68 Mar 11, 2021
2f74690
hidden columns and index
attack68 Mar 11, 2021
9c9405e
basic cell colors and background colors parsing.
attack68 Mar 11, 2021
a6772e7
basic cell colors and background colors parsing.
attack68 Mar 11, 2021
6505564
basic cell colors and background colors parsing.
attack68 Mar 11, 2021
b25644f
column_format arg input
attack68 Mar 11, 2021
2ba7e02
add file buffer
attack68 Mar 11, 2021
79b978b
optional table wrapping
attack68 Mar 11, 2021
ed8b405
refactor
attack68 Mar 11, 2021
f7d52f4
more flexible table_styles
attack68 Mar 11, 2021
f35c7e1
docs to parse_latex
attack68 Mar 12, 2021
521aee2
auto column_format for numerics
attack68 Mar 13, 2021
849656f
to_latex unit tests
attack68 Mar 13, 2021
cce7285
more unit tests and code bugs removed
attack68 Mar 13, 2021
26edba4
deal with multi col headers
attack68 Mar 13, 2021
3d7c614
deal with sparsification with multirow and multicol
attack68 Mar 13, 2021
e2f0f0c
tests for multirow and multicol
attack68 Mar 13, 2021
3243ed7
comprehensive test
attack68 Mar 13, 2021
0decf2d
refactor
attack68 Mar 13, 2021
c8dc5e5
change -wrap- to --wrap
attack68 Mar 13, 2021
8c58538
remove redundant comments
attack68 Mar 13, 2021
5c9d50a
docs
attack68 Mar 13, 2021
563aef6
docs
attack68 Mar 13, 2021
99abe1c
doc edits
attack68 Mar 14, 2021
5185f27
mypy fix
attack68 Mar 14, 2021
a824f13
docs
attack68 Mar 14, 2021
f6211e8
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Mar 14, 2021
b46a9af
docs
attack68 Mar 14, 2021
7e3c5e1
docs
attack68 Mar 14, 2021
80d3cac
docs
attack68 Mar 14, 2021
9388dec
docs
attack68 Mar 14, 2021
ccac263
check fix
attack68 Mar 14, 2021
de69c21
col format for basic render
attack68 Mar 14, 2021
05f5b34
dependency fix
attack68 Mar 14, 2021
4d98615
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Mar 15, 2021
f036d25
test for multicols and hidden cols combined
attack68 Mar 15, 2021
a9e0ce4
test for hidden columns in a multiindex
attack68 Mar 17, 2021
989278f
better test
attack68 Mar 17, 2021
3a79966
better test
attack68 Mar 17, 2021
9051bfe
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Mar 21, 2021
938a0e8
fix latex for " "
attack68 Mar 21, 2021
0aed431
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Mar 24, 2021
0c0e2bc
latex CSS conversion
attack68 Mar 19, 2021
e82b566
colors as HTML and proper RGB parsing
attack68 Mar 20, 2021
095af35
add extended wrapping flags, for potential future dev
attack68 Mar 28, 2021
8af3c81
enhance the wrapping arguments
attack68 Mar 29, 2021
2e0aee6
remove render(latex=True) option
attack68 Mar 29, 2021
5067ffc
remove render(latex=True) option tests
attack68 Mar 29, 2021
ff4954e
remove render latex
attack68 Mar 29, 2021
d9836aa
remove render latex
attack68 Mar 29, 2021
5bdcb4e
put column headers in braces if not multicol
attack68 Mar 30, 2021
6f4a44b
add siunitx option, and expand docs
attack68 Mar 30, 2021
c211480
add sparsify as input argument and tests
attack68 Mar 30, 2021
2d32556
multirow and multicol alignment options
attack68 Mar 30, 2021
816e62f
test hidden index
attack68 Mar 30, 2021
9c577ce
change 'float' to 'position_float' to avoid shadow name
attack68 Mar 30, 2021
74721a8
doc internals
attack68 Mar 30, 2021
a6bc485
merge with latex mvp
attack68 Mar 30, 2021
7c7f0de
change default wrap
attack68 Mar 30, 2021
527724d
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Mar 30, 2021
4cdefb8
change default wrap
attack68 Mar 30, 2021
ee7397f
change test
attack68 Mar 30, 2021
f381011
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Mar 30, 2021
eb21587
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Mar 30, 2021
b9ff43d
documentation
attack68 Mar 30, 2021
2f5cdec
documentation
attack68 Mar 31, 2021
a6e4e47
compress code
attack68 Mar 31, 2021
e385fb0
clarify code
attack68 Mar 31, 2021
4eacb12
clarify code
attack68 Mar 31, 2021
b71d9eb
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Mar 31, 2021
fd95e34
simplify code
attack68 Apr 1, 2021
7126bda
simplify code
attack68 Apr 1, 2021
25bcba9
simplify code
attack68 Apr 1, 2021
34f0b91
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Apr 1, 2021
e35eea7
user guide docs
attack68 Apr 1, 2021
5ec08d8
basic subclassing
attack68 Apr 2, 2021
b74057b
basic subclassing
attack68 Apr 2, 2021
a49deeb
non_reducing_slice deprivatized
attack68 Apr 2, 2021
228f146
move io methods
attack68 Apr 2, 2021
44ead2d
import typing aliases
attack68 Apr 2, 2021
0ae8c39
rename renderer
attack68 Apr 2, 2021
70067c7
move to_excel and _repr_html_ back
attack68 Apr 2, 2021
3772cc8
move to_excel and _repr_html_ back
attack68 Apr 2, 2021
19828c3
Merge remote-tracking branch 'upstream/master' into basic_subclassing…
attack68 Apr 2, 2021
79ad3a6
Merge remote-tracking branch 'upstream/master' into basic_subclassing…
attack68 Apr 6, 2021
03415e5
fix typing to new standard
attack68 Apr 7, 2021
5697ff9
Merge remote-tracking branch 'upstream/master' into basic_subclassing…
attack68 Apr 9, 2021
41760e0
merge upstream master
attack68 Apr 10, 2021
92c11d1
Merge remote-tracking branch 'upstream/master' into basic_subclassing…
attack68 Apr 10, 2021
6547c6d
Merge branch 'basic_subclassing_styler' into latex_styler_mvp
attack68 Apr 10, 2021
3910fcf
Merge branch 'basic_subclassing_styler' into latex_styler_mvp
attack68 Apr 10, 2021
0164d90
documentation
attack68 Apr 11, 2021
463a54b
isort fix
attack68 Apr 11, 2021
4b7298f
doc improvements
attack68 Apr 11, 2021
47a31a9
doc improvements
attack68 Apr 11, 2021
c373bb6
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 12, 2021
8b00376
doc improvements
attack68 Apr 12, 2021
b1e230d
remove column_format branch
attack68 Apr 12, 2021
fd19d97
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 12, 2021
e31dba0
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 13, 2021
bdab13d
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 13, 2021
1074b62
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 13, 2021
9e5ca75
merge
attack68 Apr 13, 2021
133c1a0
merge
attack68 Apr 13, 2021
394bc3a
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 14, 2021
034960f
doc fix
attack68 Apr 14, 2021
8b62f8d
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 14, 2021
a0f1e79
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 15, 2021
2e714e9
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 18, 2021
38c62eb
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 20, 2021
f95c21e
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 21, 2021
c925958
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 23, 2021
2cc8ad2
mutate d, so return None instead
attack68 Apr 24, 2021
7d962df
review the main to_latex docs (rhshadrach requests)
attack68 Apr 24, 2021
a6f6af2
validate position_float (rhshadrach request)
attack68 Apr 24, 2021
dce66d6
grammar fix
attack68 Apr 24, 2021
8fc9f0b
_parse_latex_table_wrapping doc and bool return (rhshadrach request)
attack68 Apr 24, 2021
bb4479b
_parse_latex_table_styles doc
attack68 Apr 24, 2021
e2ea5ae
_parse_latex_cell_styles doc chg and break (rhshadrach request)
attack68 Apr 24, 2021
518485d
fix boolean
attack68 Apr 24, 2021
d99245c
_parse_latex_header_span docs (rhshadrach request)
attack68 Apr 24, 2021
766ad49
_translate_latex docs and return (rhshadrach request)
attack68 Apr 24, 2021
10c4682
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Apr 24, 2021
ee92f37
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 26, 2021
c7844d5
Merge remote-tracking branch 'origin/latex_styler_mvp' into latex_css…
attack68 Apr 26, 2021
b8e3418
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 26, 2021
2aca649
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 27, 2021
cf2f1e1
Merge remote-tracking branch 'upstream/master' into latex_styler_mvp
attack68 Apr 29, 2021
8f8da7d
Merge branch 'latex_styler_mvp' into latex_css_conversion
attack68 Apr 29, 2021
0ea3127
merge upstream master
attack68 May 24, 2021
a224cdd
add conversion docs
attack68 May 24, 2021
d91f7c3
update docs
attack68 May 24, 2021
f9f6622
remove updates to user_guide
attack68 May 24, 2021
002eb90
remove updates to user_guide
attack68 May 24, 2021
372a71a
mypy fix
attack68 May 25, 2021
11985a5
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 May 26, 2021
aa8e051
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 May 27, 2021
1c2280d
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 May 27, 2021
17f649c
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 May 28, 2021
1bb35c1
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 1, 2021
a55cc5b
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 3, 2021
dbb76ee
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 4, 2021
c569245
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 5, 2021
0ac614b
whats new addition.
attack68 Jun 5, 2021
3dd649a
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 9, 2021
18728c1
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 11, 2021
23281b1
Merge remote-tracking branch 'upstream/master' into latex_css_conversion
attack68 Jun 12, 2021
689afc6
Merge branch 'rls1.3.0' into latex_css_conversion
attack68 Jun 15, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Merge branch 'basic_subclassing_styler' into latex_styler_mvp
# Conflicts:
#	pandas/io/formats/style.py
  • Loading branch information
attack68 committed Apr 10, 2021
commit 3910fcfe7411fcc1ac4d86bed52010bc44dda985
65 changes: 58 additions & 7 deletions pandas/io/formats/style_render.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
from uuid import uuid4

import numpy as np
import pandas as pd

from pandas._config import get_option

Expand Down Expand Up @@ -142,11 +141,28 @@ def render(self, **kwargs) -> str:
* table_attributes
"""
self._compute()
# TODO: namespace all the pandas keys

d = self._translate()
d.update(kwargs)
return self.template.render(**d)

def _render_latex(self, **kwargs) -> str:
"""
Render a Styler in latex format
"""
self._compute()

d = self._translate(blank="")
d = self._translate_latex(d)

self.template_latex.globals["parse_wrap"] = _parse_latex_table_wrapping
self.template_latex.globals["parse_table"] = _parse_latex_table_styles
self.template_latex.globals["parse_cell"] = _parse_latex_cell_styles
self.template_latex.globals["parse_header"] = _parse_latex_header_span

d.update(kwargs)
return self.template_latex.render(**d)

def _compute(self):
"""
Execute the style functions built up in `self._todo`.
Expand All @@ -162,7 +178,7 @@ def _compute(self):
r = func(self)(*args, **kwargs)
return r

def _translate(self, blank=None):
def _translate(self, blank=" "):
"""
Convert the DataFrame in `self.data` and the attrs from `_build_styles`
into a dictionary of {head, body, uuid, cellstyle}.
Expand All @@ -173,7 +189,7 @@ def _translate(self, blank=None):

DATA_CLASS = "data"
BLANK_CLASS = "blank"
BLANK_VALUE = " " if blank is None else blank
BLANK_VALUE = blank

# mapping variables
ctx = self.ctx # td css styles from apply() and applymap()
Expand Down Expand Up @@ -351,6 +367,41 @@ def _translate(self, blank=None):

return d

def _translate_latex(self, d: dict) -> dict:
"""
Post process the default render dict for the LaTeX template format.
- Remove hidden columns from the non-headers part of the body.
- Place cellstyles directly in td cells rather than use cellstyle_map
- Remove hidden indexes or reinsert missing th elements if part of multiindex
or multirow sparsification.
"""
d["head"] = [[col for col in row if col["is_visible"]] for row in d["head"]]
body = []
for r, row in enumerate(d["body"]):
if self.hidden_index:
row_body_headers = []
else:
row_body_headers = [
{
**col,
"display_value": col["display_value"]
if col["is_visible"]
else "",
}
for col in row
if col["type"] == "th"
]

row_body_cells = [
{**col, "cellstyle": self.ctx[r, c - self.data.index.nlevels]}
for c, col in enumerate(row)
if (col["is_visible"] and col["type"] == "td")
]

body.append(row_body_headers + row_body_cells)
d["body"] = body
return d

def format(
self,
formatter: ExtFormatter | None = None,
Expand Down Expand Up @@ -872,8 +923,8 @@ def _parse_latex_table_wrapping(table_styles: CSSStyles, caption: str | None) ->
IGNORED_WRAPPERS = ["toprule", "midrule", "bottomrule", "column_format"]
# ignored selectors are included with {tabular} so do not need wrapping
if (
table_styles is not None
and any(d["selector"] not in IGNORED_WRAPPERS for d in table_styles)
table_styles is not None
and any(d["selector"] not in IGNORED_WRAPPERS for d in table_styles)
) or caption:
return True
return False
Expand Down Expand Up @@ -942,7 +993,7 @@ def _parse_latex_cell_styles(latex_styles: CSSList, display_value: str) -> str:


def _parse_latex_header_span(
cell: dict, multirow_align: str, multicol_align: str, wrap: bool = False
cell: dict, multirow_align: str, multicol_align: str, wrap: bool = False
) -> str:
r"""
examines a header cell dict and if it detects a 'colspan' attribute or a 'rowspan'
Expand Down