#' Magic mirror that returns kable's attributes
#'
#' @param input The output of kable
#'
#' @export

magic_mirror <- function(input){
  if(!"knitr_kable" %in% attr(input, "class")){
    warning("magic_mirror may not be able to produce correct result if the",
            " input table is not rendered by knitr::kable. ")
  }
  kable_format <- attr(input, "format")
  if (kable_format == "latex"){
    kable_info <- magic_mirror_latex(input)
  }
  if (kable_format == "html"){
    kable_info <- magic_mirror_html(input)
  }
  return(kable_info)
}

#' Magic mirror for latex tables
magic_mirror_latex <- function(input){
  kable_info <- list(tabular = NULL, booktabs = NULL, align = NULL,
                     ncol=NULL, nrow=NULL, colnames = NULL, rownames = NULL,
                     caption = NULL, contents = NULL)
  # Tabular
  kable_info$tabular <- ifelse(
    grepl("\\\\begin\\{tabular\\}", input),
    "tabular", "longtable"
  )
  # Booktabs
  kable_info$booktabs <- ifelse(grepl("\\\\toprule", input), TRUE, FALSE)
  # Align
  kable_info$align <- gsub("\\|", "", str_match(
    input, paste0("\\\\begin\\{", kable_info$tabular,"\\}\\{(.*?)\\}"))[2])
  # N of columns
  kable_info$ncol <- nchar(kable_info$align)
  # N of rows
  kable_info$nrow <- str_count(input, "\\\\\n")
  # Caption
  kable_info$caption <- str_match(input, "caption\\{(.*?)\\}")[2]
  # Contents
  kable_info$contents <- str_match_all(input, "\n(.*)\\\\\\\\")[[1]][,2]
  # Column names
  kable_info$colnames <- str_split(kable_info$contents[1], " \\& ")[[1]]
  # Row names
  kable_info$rownames <- str_extract(kable_info$contents, "^[^ &]*")
  return(kable_info)
}
