Skip to content

Commit

Permalink
Merge pull request #1818 from olivroy/footnote-tweaks
Browse files Browse the repository at this point in the history
Refactor footnotes tests + stores styles and footnotes in data frames.
  • Loading branch information
rich-iannone authored Aug 7, 2024
2 parents 00ea7c0 + e96dd33 commit aebc2b1
Show file tree
Hide file tree
Showing 5 changed files with 321 additions and 358 deletions.
2 changes: 2 additions & 0 deletions NEWS.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,8 @@

* Improve the centering of the stubhead label in Latex when `row_group_as_column = TRUE` and the width of the row name column is specified (@kbrevoort, #1804).

* Performance improvement for footnote rendering (@olivroy, #1818).

# gt 0.11.0

## New features
Expand Down
4 changes: 2 additions & 2 deletions R/dt_footnotes.R
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ dt_footnotes_set <- function(data, footnotes) {
dt_footnotes_init <- function(data) {

footnotes_df <-
dplyr::tibble(
vctrs::data_frame(
locname = character(0L),
grpname = character(0L),
colname = character(0L),
Expand Down Expand Up @@ -69,7 +69,7 @@ dt_footnotes_add <- function(
)

result <-
dplyr::tibble(
vctrs::data_frame(
locname = locname,
grpname = grid$grpname,
colname = grid$colname,
Expand Down
4 changes: 2 additions & 2 deletions R/dt_styles.R
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ dt_styles_set <- function(data, styles) {
dt_styles_init <- function(data) {

styles_tbl <-
dplyr::tibble(
vctrs::data_frame(
locname = character(0L),
grpname = character(0L),
colname = character(0L),
Expand Down Expand Up @@ -67,7 +67,7 @@ dt_styles_add <- function(
)

result <-
dplyr::tibble(
vctrs::data_frame(
locname = locname,
grpname = grid$grpname,
colname = grid$colname,
Expand Down
104 changes: 56 additions & 48 deletions R/z_utils_render_footnotes.R
Original file line number Diff line number Diff line change
Expand Up @@ -307,9 +307,7 @@ resolve_footnotes_styles <- function(data, tbl_type) {
if (nrow(spanner_label_df) > 0L) {

tmp <- tbl
tmp$colnum <- NULL
tmp$colname <- NULL
tmp$rownum <- NULL
tmp[ c("colnum", "colname", "rownum")] <- NULL
tmp <- tmp[tmp$locname == "columns_groups", ]

tbl_column_spanner_cells <-
Expand Down Expand Up @@ -375,8 +373,11 @@ resolve_footnotes_styles <- function(data, tbl_type) {

if (tbl_type == "styles" && nrow(tbl) > 0L) {
tbl <-
dplyr::group_by(tbl, locname, grpname, colname, locnum, rownum, colnum) %>%
dplyr::summarize(styles = list(as_style(styles)), .groups = "drop")
dplyr::summarize(
tbl,
styles = list(as_style(styles)),
.by = c("locname", "grpname", "colname", "locnum", "rownum", "colnum")
)
}

if (tbl_type == "footnotes") {
Expand Down Expand Up @@ -411,9 +412,7 @@ set_footnote_marks_columns <- function(data, context = "html") {

footnotes_columns_group_marks <-
footnotes_columns_groups_tbl %>%
dplyr::group_by(grpname) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ","), .by = "grpname") %>%
dplyr::distinct(grpname, fs_id_coalesced)

for (i in seq_len(nrow(footnotes_columns_group_marks))) {
Expand Down Expand Up @@ -467,9 +466,7 @@ set_footnote_marks_columns <- function(data, context = "html") {
footnotes_columns_column_marks <-
footnotes_columns_columns_tbl %>%
dplyr::filter(locname == "columns_columns") %>%
dplyr::group_by(colname) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ","), .by = "colname") %>%
dplyr::distinct(colname, fs_id_coalesced)

for (i in seq_len(nrow(footnotes_columns_column_marks))) {
Expand Down Expand Up @@ -519,9 +516,7 @@ set_footnote_marks_stubhead <- function(data, context = "html") {

footnotes_stubhead_marks <-
footnotes_tbl %>%
dplyr::group_by(grpname) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ","), .by = "grpname") %>%
dplyr::distinct(grpname, fs_id_coalesced) %>%
dplyr::pull(fs_id_coalesced)

Expand Down Expand Up @@ -562,26 +557,27 @@ apply_footnotes_to_output <- function(data, context = "html") {

boxhead_var_stub <- dt_boxhead_get_var_stub(data = data)

footnotes_tbl_data[
which(is.na(footnotes_tbl_data$colname)), "colname"
] <- boxhead_var_stub
footnotes_tbl_data$colname[is.na(footnotes_tbl_data$colname)] <-
boxhead_var_stub
}

footnotes_data_marks <-
footnotes_tbl_data %>%
dplyr::group_by(rownum, colnum) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::distinct(colname, rownum, locname, placement, fs_id_coalesced)
dplyr::mutate(
footnotes_tbl_data,
fs_id_coalesced = paste(fs_id, collapse = ","),
.by = c("rownum", "colnum")
)
footnotes_data_marks <-
dplyr::distinct(footnotes_data_marks, colname, rownum, locname, placement, fs_id_coalesced)

for (i in seq_len(nrow(footnotes_data_marks))) {

text <-
body[[footnotes_data_marks$rownum[i], footnotes_data_marks$colname[i]]]

colname <- dplyr::pull(footnotes_data_marks[i, ], "colname")
rownum <- dplyr::pull(footnotes_data_marks[i, ], "rownum")
placement <- dplyr::pull(footnotes_data_marks[i, ], "placement")
colname <- footnotes_data_marks[i, "colname", drop = TRUE]
rownum <- footnotes_data_marks[i, "rownum", drop = TRUE]
placement <- footnotes_data_marks[i, "placement", drop = TRUE]

footnote_placement <-
resolve_footnote_placement(
Expand All @@ -604,7 +600,7 @@ apply_footnotes_to_output <- function(data, context = "html") {
# Footnote placement on the right of the cell text

if (context == "html" && endsWith(text, "</p>\n</div>")) {

# FIXME possibly the place where we could fix #1773
text <-
paste0(
gsub("</p>\n</div>", "", text, fixed = TRUE),
Expand Down Expand Up @@ -657,11 +653,13 @@ set_footnote_marks_row_groups <- function(data, context = "html") {
if (nrow(footnotes_row_groups_tbl) > 0) {

footnotes_row_groups_marks <-
footnotes_row_groups_tbl %>%
dplyr::group_by(grpname) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::distinct(grpname, fs_id_coalesced)
dplyr::mutate(
footnotes_row_groups_tbl,
fs_id_coalesced = paste(fs_id, collapse = ","),
.by = "grpname"
)
# will only remain
footnotes_row_groups_marks <- dplyr::distinct(footnotes_row_groups_marks, fs_id_coalesced, grpname)

for (i in seq_len(nrow(footnotes_row_groups_marks))) {

Expand Down Expand Up @@ -692,23 +690,29 @@ apply_footnotes_to_summary <- function(data, context = "html") {

list_of_summaries <- dt_summary_df_get(data = data)
footnotes_tbl <- dt_footnotes_get(data = data)

# dplyr::coalesce()
footnotes_tbl$colname[is.na(footnotes_tbl$colname)] <- "rowname"
summary_df_list <- list_of_summaries$summary_df_display_list

if ("summary_cells" %in% footnotes_tbl$locname) {

footnotes_tbl_data <- footnotes_tbl[footnotes_tbl$locname == "summary_cells", ]
footnotes_tbl_data <- vctrs::vec_slice(
footnotes_tbl,
footnotes_tbl$locname == "summary_cells"
)

footnotes_tbl_data$row <- round((footnotes_tbl_data$rownum - floor(footnotes_tbl_data$rownum)) * 100, 0)
footnotes_tbl_data$row <- as.integer(footnotes_tbl_data$row)

footnotes_data_marks <-
footnotes_tbl_data %>%
dplyr::mutate(
row = as.integer(round((rownum - floor(rownum)) * 100, 0)),
colname = ifelse(is.na(colname), "rowname", colname)
) %>%
dplyr::group_by(grpname, row, colnum) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::distinct(grpname, colname, row, fs_id_coalesced)
footnotes_tbl_data,
fs_id_coalesced = paste(fs_id, collapse = ","),
.by = c("grpname", "row", "colnum"),
)

footnotes_data_marks <-
dplyr::distinct(footnotes_data_marks, grpname, colname, row, fs_id_coalesced)

for (i in seq_len(nrow(footnotes_data_marks))) {

Expand All @@ -730,15 +734,19 @@ apply_footnotes_to_summary <- function(data, context = "html") {
if ("grand_summary_cells" %in% footnotes_tbl$locname) {

footnotes_tbl_data <-
footnotes_tbl[footnotes_tbl$locname == "grand_summary_cells", ]
vctrs::vec_slice(
footnotes_tbl,
footnotes_tbl$locname == "grand_summary_cells"
)

footnotes_data_marks <-
footnotes_tbl_data %>%
dplyr::mutate(colname = ifelse(is.na(colname), "rowname", colname)) %>%
dplyr::group_by(rownum, colnum) %>%
dplyr::mutate(fs_id_coalesced = paste(fs_id, collapse = ",")) %>%
dplyr::ungroup() %>%
dplyr::distinct(colname, rownum, fs_id_coalesced)
dplyr::mutate(
footnotes_tbl_data,
fs_id_coalesced = paste(fs_id, collapse = ","),
.by = c("rownum", "colnum")
)

footnotes_data_marks <- dplyr::distinct(footnotes_data_marks, colname, rownum, fs_id_coalesced)

for (i in seq_len(nrow(footnotes_data_marks))) {

Expand Down
Loading

1 comment on commit aebc2b1

@github-actions
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.