with html results, css not working
Posted: Wed Jul 31, 2024 2:35 pm
Hi,
I'm trying to create a html result for a Jamovi module, but the css stylesheets never work.
I'm trying to add the stylesheets as htmltools::htmlDependencies() attributes of the result object. Some styling is found in an "inst/tab.css" external file of the R package.
Below is a test example of the kind of things I'm trying to send into self$result$html_table$setContent() in my "*.b.R" R script. As an attachment you will also find a zipped RProject with all the required files and a test script ("R/test.R") :
The problem may come from the setContent() function of the html R6 result object, https://github.com/jamovi/jmvcore/blob/ ... 1/R/html.R :
With R 4.3.1, jmvcore 2.4.7, knitr 1.4.7, the knitted object loses attributes and all html dependencies are lost. Just replacing the 2nd line by knitMeta <- attr(value, 'html_dependencies') may work, but I cannot replace my R6 objet setContent() function without having a "cannot change value for locked binding" error. If I am right, is there a workaround to make it work until the change is made in Jamovi ? If there's something I'm totally missing, what is the right format and the right way to use self$result$html_table$setContent() for an html result ?
Thanks,
I'm trying to create a html result for a Jamovi module, but the css stylesheets never work.
I'm trying to add the stylesheets as htmltools::htmlDependencies() attributes of the result object. Some styling is found in an "inst/tab.css" external file of the R package.
Below is a test example of the kind of things I'm trying to send into self$result$html_table$setContent() in my "*.b.R" R script. As an attachment you will also find a zipped RProject with all the required files and a test script ("R/test.R") :
Code: Select all
htmltestClass <- if (requireNamespace('jmvcore', quietly=TRUE)) R6::R6Class(
"htmltestClass",
inherit = htmltestBase,
private = list(
.run = function() {
tab <- table(dplyr::pull(self$data, self$options$row_var),
dplyr::pull(self$data, self$options$col_var))
html_tab <- tab |>
knitr::kable(format = "html") |>
kableExtra::kable_classic(lightable_options = "hover") |>
kableExtra::add_footnote("This should be a very small footnote (font-size: 40%).",
notation = "none", escape = FALSE)
# from kableExtra:::print.kableExtra
dep <- list(
rmarkdown::html_dependency_jquery(),
rmarkdown::html_dependency_bootstrap(theme = "cosmo"),
kableExtra::html_dependency_kePrint(),
kableExtra::html_dependency_lightable(),
# A css with just ".lightable-classic tfoot {font-size: 20%;}"
htmltools::htmlDependency(
name = "tab_css",
version = "1.00",
src = "inst",
meta = NULL,
script = NULL,
stylesheet = "tab.css",
head = NULL,
attachment = NULL,
package = "jamovitest",
all_files = FALSE
)
)
html_tab <- htmltools::HTML(as.character(html_tab) )
htmltools::htmlDependencies(html_tab) <- dep # add attributes
self$results$html_table$setContent(html_tab)
})
)
Code: Select all
setContent=function(value) {
knitted <- knitr::knit(text=value)
knitMeta <- attr(knitted, 'html_dependencies')
if ( ! is.null(knitMeta)) {
[…]
scripts <- sapply(knitMeta$script, joinPaths, USE.NAMES=FALSE)
sss <- sapply(knitMeta$stylesheet, joinPaths, USE.NAMES=FALSE)
private$.scripts <- scripts
private$.stylesheets <- sss
}
[…]
}
Thanks,