diff --git a/DESCRIPTION b/DESCRIPTION index e9551518f0..8c5c69eef9 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -15,6 +15,8 @@ Authors@R: c(person("Carson", "Sievert", role = c("aut", "cre"), email = "marianne.corvellec@igdore.org", comment = c(ORCID = "0000-0002-1994-3581")), person("Pedro", "Despouy", role = "aut", email = "pedro@plot.ly"), + person("Salim", "Brüggemann", role = "ctb", + email = "salim-b@pm.me", comment = c(ORCID = "0000-0002-5329-5987")), person("Plotly Technologies Inc.", role = "cph")) License: MIT + file LICENSE Description: Create interactive web graphics from 'ggplot2' graphs and/or a custom interface to the (MIT-licensed) JavaScript library 'plotly.js' inspired by the grammar of graphics. diff --git a/NEWS.md b/NEWS.md index 9f4fe92385..998d7a4c91 100644 --- a/NEWS.md +++ b/NEWS.md @@ -8,6 +8,8 @@ * All HTTP requests are now retried upon failure (#1656) +* R linebreaks (`\n`) in _factor labels_ are now translated to HTML linebreaks (`
`), too. Before, this conversion was only done for colums of type character. ([#1700](https://github.com/ropensci/plotly/pull/1700), @salim-b) + ## BUG FIXES * `ggplotly()` now handles discrete axes of a `facet_wrap` and `facet_grid` correctly when there is only one category in panels > 1 (#1577 and #1720). diff --git a/R/utils.R b/R/utils.R index 93dd1461b5..5161d93491 100644 --- a/R/utils.R +++ b/R/utils.R @@ -609,12 +609,14 @@ translate_linebreaks <- function(p) { typ <- typeof(a) if (typ == "list") { # retain the class of list elements - # which important for many things, such as colorbars + # which is important for many things, such as colorbars a[] <- lapply(a, recurse) } else if (typ == "character" && !inherits(a, "JS_EVAL")) { attrs <- attributes(a) a <- gsub("\n", br(), a, fixed = TRUE) attributes(a) <- attrs + } else if (is.factor(a)) { + levels(a) <- gsub("\n", br(), levels(a), fixed = TRUE) } a } diff --git a/tests/testthat/test-plotly.R b/tests/testthat/test-plotly.R index 8dd43a405a..9f42656291 100644 --- a/tests/testthat/test-plotly.R +++ b/tests/testthat/test-plotly.R @@ -317,3 +317,34 @@ test_that("toWebGL() shouldn't complain if it's already webgl", { toWebGL() expect_silent(plotly_build(p)) }) + +test_that("Line breaks are properly translated (R -> HTML)", { + # create target labels + suffix <- "\n\n(third line)\n(fourth line)" + + target_labels <- iris$Species %>% + unique() %>% + paste0(suffix) %>% + gsub(pattern = "\n", + replacement = br(), + x = ., + fixed = TRUE) + + # test factor column + d <- iris + levels(d$Species) <- paste0(levels(d$Species), suffix) + p1 <- d %>% plot_ly(x = ~Sepal.Length, + y = ~Species) + + expect_equivalent(plotly_build(p1)[["x"]][["layout"]][["yaxis"]][["categoryarray"]], + target_labels) + + # test character column + p2 <- d %>% + dplyr::mutate(Species = as.character(Species)) %>% + plot_ly(x = ~Sepal.Length, + y = ~Species) + + expect_equivalent(plotly_build(p2)[["x"]][["layout"]][["yaxis"]][["categoryarray"]], + target_labels) +})