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 = ", "), ')'))
+}