bump version
diff --git a/DESCRIPTION b/DESCRIPTION
index a6e65c3..ba3c629 100644
--- a/DESCRIPTION
+++ b/DESCRIPTION
@@ -1,7 +1,7 @@
Package: kableExtra
Type: Package
Title: Construct Complex Table with 'kable' and Pipe Syntax
-Version: 1.1.2
+Version: 1.2.0
Authors@R: c(
person('Hao', 'Zhu', email = 'haozhu233@gmail.com', role = c('aut', 'cre'),
comment = c(ORCID = '0000-0002-3386-6076')),
diff --git a/docs/experimental/md_to_code_addin.R b/docs/experimental/md_to_code_addin.R
new file mode 100644
index 0000000..cc6d005
--- /dev/null
+++ b/docs/experimental/md_to_code_addin.R
@@ -0,0 +1,98 @@
+#' Convert selected RStudio markdown table to kable code
+#'
+#' @description RStudio 1.4 comes with a very nice live markdown table editor
+#' (see https://bookdown.org/yihui/rmarkdown-cookbook/rstudio-visual.html for
+#' details). For those who need to further customize those markdown tables, you
+#' can use this function/addin to convert the markdown table to necessary R
+#' code to render that table using `kableExtra`.
+#'
+#' @export
+md_table_to_kable <- function() {
+ current_selection <- rstudioapi::getSourceEditorContext()
+ x <- current_selection$selection[[1]]$text
+ if (x == "") {
+ stop("You have not yet selected any markdown table text!")
+ }
+ x <- trimws(x)
+ x_lines <- stringr::str_split(x, '\n')[[1]]
+ if (!stringr::str_detect(x_lines[2], '^\\|[\\-\\:]')) {
+ stop("Unexpected form of markdown table. This function only works for ",
+ "regular markdown tables. Compact mode is not supported.")
+ }
+
+ # Get caption if available
+ if (stringr::str_detect(x_lines[length(x_lines)], '^: ')) {
+ caption <- sub('^: ', '', x_lines[length(x_lines)])
+ x_lines <- x_lines[-c(length(x_lines) - 1, length(x_lines))]
+ } else {
+ caption <- NULL
+ }
+ n_row <- length(x_lines) - 2
+
+ # get content matrix
+ col_length <- stringr::str_split(x_lines[2], "\\|")[[1]]
+ col_length <- col_length[-c(1, length(col_length))]
+ n_col <- length(col_length)
+ col_length <- nchar(col_length)
+ col_offset <- cumsum(col_length + 1) + 1
+ col_offset <- c(1, col_offset[-n_col])
+ start_pos <- col_offset + 2
+ end_pos <- col_length + col_offset - 1
+ content_matrix <- matrix(
+ unlist(lapply(x_lines, substring, start_pos, end_pos)),
+ ncol = n_col, byrow = TRUE
+ )
+
+ # Get alignment
+ alignment <- vapply(content_matrix[2, ], function(x) {
+ if (stringr::str_sub(x, -1, -1) == ":") {
+ if (stringr::str_sub(x, 1, 1) == ":") {
+ return('c')
+ } else {
+ return('r')
+ }
+ } else {
+ return('l')
+ }
+ }, 'character', USE.NAMES = FALSE)
+
+ content_matrix <- trimws(content_matrix)
+ col_names <- content_matrix[1, ]
+
+ content_matrix <- content_matrix[-c(1, 2), ]
+ content_matrix <- sim_double_escape(content_matrix)
+
+ str_parts <- c(
+ '```{r}\n',
+ 'data.frame(\n'
+ )
+
+ if (n_col > 1) {
+ for (i in seq(n_col - 1)) {
+ str_parts[i + 2] <- paste0(
+ ' `Col', i, '` = ', vector_str(content_matrix[, i]), ', \n'
+ )
+ }
+ }
+ str_parts[n_col + 2] <- paste0(
+ ' `Col', n_col, '` = ', vector_str(content_matrix[, n_col]), '\n'
+ )
+ str_parts[n_col + 3] <- paste0(
+ ') %>%\n kableExtra::kbl(\n escape = F, \n col.names = ',
+ if (all(col_names == "")) 'NULL' else vector_str(col_names),
+ ', \n align = ', vector_str(alignment), ', \n caption = ',
+ if (is.null(caption)) 'NULL' else paste0('"', caption, '"'),
+ ',\n booktable = T\n ) %>%\n kableExtra::kable_styling()\n```'
+ )
+ out <- paste(str_parts, collapse = "")
+
+ rstudioapi::insertText(location = current_selection$selection[[1]]$range,
+ text = out,
+ id = current_selection$id)
+
+ return(out)
+}
+
+vector_str <- function(v) {
+ return(paste0('c(', paste0('"', v, '"', collapse = ", "), ')'))
+}