blob: 85ed54a7c00d6a1de2c58a0d55c06222ba40f65d [file] [log] [blame]
Hao Zhu73cf3732018-05-11 17:50:05 -04001#' Save kable to files
2#'
3#' @param x A piece of HTML code for tables, usually generated by kable and
4#' kableExtra
Hao Zhu7f8b6842018-10-23 17:41:13 -04005#' @param file save to files. If the input table is in HTML and the output file
6#' ends with `.png`, `.pdf` and `.jpeg`, `webshot` will be used to do the
Hao Zhu7039ecf2019-01-06 17:51:21 -05007#' conversion.
Hao Zhu73cf3732018-05-11 17:50:05 -04008#' @param bs_theme Which Bootstrap theme to use
9#' @param self_contained Will the files be self-contained?
Hao Zhu7039ecf2019-01-06 17:51:21 -050010#' @param extra_dependencies Additional HTML dependencies. For example,
11#' `list(`
12#' @param ... Additional variables being passed to `webshot::webshot`. This
13#' is for HTML only.
14#' @param latex_header_includes A character vector of extra LaTeX header stuff.
15#' Each element is a row. You can have things like
16#' `c("\\\\usepackage{threeparttable}", "\\\\usepackage{icons}")` You could
17#' probably add your language package here if you use non-English text in your
18#' table, such as `\\\\usepackage[magyar]{babel}`.
19#' @param keep_tex A T/F option to control if the latex file that is initially created
20#' should be kept. Default is `FALSE`.
Hao Zhu73cf3732018-05-11 17:50:05 -040021#'
22#' @export
23save_kable <- function(x, file,
Hao Zhu7039ecf2019-01-06 17:51:21 -050024 bs_theme = "simplex", self_contained = TRUE,
25 extra_dependencies = NULL, ...,
26 latex_header_includes = NULL, keep_tex = FALSE) {
Hao Zhu7f8b6842018-10-23 17:41:13 -040027 if (attr(x, "format") == "latex") {
Hao Zhu7039ecf2019-01-06 17:51:21 -050028 return(save_kable_latex(x, file, latex_header_includes, keep_tex))
Hao Zhu7f8b6842018-10-23 17:41:13 -040029 }
Hao Zhu7039ecf2019-01-06 17:51:21 -050030 return(save_kable_html(x, file, bs_theme, self_contained,
31 extra_dependencies, ...))
Hao Zhu7f8b6842018-10-23 17:41:13 -040032}
33
Hao Zhu7039ecf2019-01-06 17:51:21 -050034save_kable_html <- function(x, file, bs_theme, self_contained,
35 extra_dependencies, ...) {
36 dependencies <- list(
Hao Zhu73cf3732018-05-11 17:50:05 -040037 rmarkdown::html_dependency_jquery(),
38 rmarkdown::html_dependency_bootstrap(theme = bs_theme),
39 html_dependency_kePrint()
40 )
Hao Zhu7039ecf2019-01-06 17:51:21 -050041 if (!is.null(extra_dependencies)) {
42 dependencies <- append(dependencies, extra_dependencies)
43 }
44
45 html_header <- htmltools::tag("head", dependencies)
Hao Zhu73cf3732018-05-11 17:50:05 -040046 html_table <- htmltools::HTML(as.character(x))
47 html_result <- htmltools::tagList(html_header, html_table)
Hao Zhu7f8b6842018-10-23 17:41:13 -040048
49 # Use webshot if necessary
50 if (tools::file_ext(file) %in% c("png", "jpg", "jpeg", "pdf")) {
Hao Zhu7039ecf2019-01-06 17:51:21 -050051 message("Putting together a HTML file...")
Hao Zhu7f8b6842018-10-23 17:41:13 -040052 file_html <- paste0(tools::file_path_sans_ext(file), ".html")
53 htmltools::save_html(html_result, file = file_html)
Hao Zhu7039ecf2019-01-06 17:51:21 -050054 message("Converting HTML to ", tools::file_ext(file), "...")
Hao Zhu7f8b6842018-10-23 17:41:13 -040055 webshot::webshot(file_html, file, ...)
Hao Zhu7039ecf2019-01-06 17:51:21 -050056 message("Done. ")
57 if (tools::file_ext(file) == "pdf") {
58 message("Note that HTML color may not be displayed on PDF properly.")
59 }
Hao Zhu7f8b6842018-10-23 17:41:13 -040060 unlink(file_html)
Hao Zhu73cf3732018-05-11 17:50:05 -040061 unlink("lib", recursive = TRUE)
Hao Zhu7f8b6842018-10-23 17:41:13 -040062 } else {
63 htmltools::save_html(html_result, file = file)
64 if (self_contained) {
65 rmarkdown::pandoc_self_contained_html(file, file)
66 unlink("lib", recursive = TRUE)
67 }
Hao Zhu73cf3732018-05-11 17:50:05 -040068 }
69}
Hao Zhu7f8b6842018-10-23 17:41:13 -040070
Hao Zhu7039ecf2019-01-06 17:51:21 -050071save_kable_latex <- function(x, file, latex_header_includes, keep_tex) {
72 temp_tex <- c(
73 "\\documentclass[border=1mm, preview]{standalone}",
74 "\\usepackage[active,tightpage]{preview}",
75 "\\usepackage{varwidth}",
76 "\\usepackage{amssymb, amsmath}",
77 "\\usepackage{ifxetex,ifluatex}",
78 "\\usepackage{fixltx2e}",
79 "\\usepackage{polyglossia}",
80 "\\setmainlanguage{$mainlang$}",
81 latex_pkg_list(),
82 "\\usepackage{graphicx}",
83 "\\usepackage{mathspec}",
84 "\\usepackage{xltxtra,xunicode}",
85 latex_header_includes,
86 "\\begin{document}",
87 solve_enc(x),
88 "\\end{document}"
89 )
90 temp_tex <- paste(temp_tex, collapse = "\n")
Hao Zhu7f8b6842018-10-23 17:41:13 -040091
Hao Zhu7039ecf2019-01-06 17:51:21 -050092 temp_tex_file <- tools::file_path_sans_ext(file)
93 writeLines(temp_tex, temp_tex_file, useBytes = T)
94 system(paste0("xelatex -interaction=batchmode ", temp_tex_file))
95 if (!keep_tex) {
96 temp_file_delete <- paste0(tools::file_path_sans_ext(file),
97 c(".tex", ".aux", ".log"))
98 unlink(temp_file_delete)
99 }
100
101 table_img_pdf <- try(magick::image_read(paste0(temp_file, ".pdf"),
102 density = density),
103 silent = T)
104 if (class(table_img_pdf) == "try-error") {
105 stop("Ghostscript is required to read PDF on windows. ",
106 "Please download it here: https://ghostscript.com/")
107 }
108 if (!keep_pdf) {
109 unlink(paste0(temp_file, ".pdf"))
110 }
111 table_img <- magick::image_convert(table_img_pdf, file_format)
112 if (!is.null(filename)) {
113 temp_img <- paste0(filename, ".", file_format)
114 } else {
115 temp_img <- tempfile(fileext = paste0(".", file_format))
116 }
117 magick::image_write(table_img, temp_img)
118
119 include_graphics(temp_img)
Hao Zhu7f8b6842018-10-23 17:41:13 -0400120}