blob: c9b153ee9181e4ea7c25bd7d9c9fac881609ca5c [file] [log] [blame]
Hao Zhu26234122017-02-22 15:34:33 -05001#' Add an extra header row above the current header
2#' @export
3htmlTable_add_header_above <- function(kable_input, header = NULL) {
Hao Zhu981933b2017-02-22 18:46:23 -05004 # if (is.null(header)) return(kable_input)
Hao Zhu26234122017-02-22 15:34:33 -05005 kable_xml <- read_xml(as.character(kable_input), options = c("COMPACT"))
Hao Zhu981933b2017-02-22 18:46:23 -05006 # somehow xml2 cannot directly search by name here (it will result in a crash)
7 kable_xml_thead <- xml_child(kable_xml, 1)
8 if (xml_name(kable_xml_thead) != "thead") {
9 kable_xml_thead <- xml_child(kable_xml, 2)
10 }
Hao Zhu26234122017-02-22 15:34:33 -050011
Hao Zhu981933b2017-02-22 18:46:23 -050012 header <- standardize_header_input(header)
Hao Zhu26234122017-02-22 15:34:33 -050013
Hao Zhu981933b2017-02-22 18:46:23 -050014 header_rows <- xml_children(kable_xml_thead)
15 bottom_header_row <- header_rows[[length(header_rows)]]
16 kable_ncol <- length(xml_children(bottom_header_row))
17 if (sum(header$colspan) != kable_ncol) {
18 stop("The new header row you provided has a different total number of ",
19 "columns with the original kable output.")
20 }
Hao Zhu26234122017-02-22 15:34:33 -050021
Hao Zhu981933b2017-02-22 18:46:23 -050022 new_header_row <- new_header_generator(header)
23 xml_add_child(kable_xml_thead, new_header_row, .where = 0)
24 return(structure(as.character(kable_xml), format = "html",
25 class = "knitr_kable"))
26}
Hao Zhu26234122017-02-22 15:34:33 -050027
Hao Zhu981933b2017-02-22 18:46:23 -050028standardize_header_input <- function(header) {
29 header_names <- names(header)
30
31 if (is.null(header_names)) {
32 return(data.frame(header = header, colspan = 1, row.names = NULL))
33 }
34
35 names(header)[header_names == ""] <- header[header_names == ""]
36 header[header_names == ""] <- 1
37 header_names <- names(header)
38 header <- as.numeric(header)
39 names(header) <- header_names
40 return(data.frame(header = names(header), colspan = header, row.names = NULL))
41}
42
43new_header_generator <- function(header_vector) {
44 header_items <- apply(header_vector, 1, function(x) {
45 paste0('<th style="text-align:center;" colspan="', x[2], '">',
46 x[1], '</th>')
47 })
48 header_text <- paste(c("<tr>", header_items, "</tr>"), collapse = "")
49 header_xml <- read_xml(header_text, options = c("COMPACT"))
50 return(header_xml)
Hao Zhu26234122017-02-22 15:34:33 -050051}