R/addins.R

Defines functions regexplain_file regexplain_addin

Documented in regexplain_addin regexplain_file

#' RegExplain Addin
#'
#' Addin for regexplain. If the selection does not contain multiple lines, the
#' addin tries to evaluate the selection and coerce the result to a character
#' string. Only unique lines are passed to the gadget to maximize screen space.
#' The max number of lines returned is set by the option
#' `regexplain.addin.max_lines`, with a default value of 100 lines.
#' If evaluating the selection does not produce a character vector without
#' errors, the original selection is returned.
#'
#' @keywords internal
regexplain_addin <- function() {
  # Get the document context.
  context <- rstudioapi::getActiveDocumentContext()

  # Get context text
  ctx_text <- context$selection[[1]]$text

  max_lines <- getOption("rexeplain.addin.max_lines", 100)

  # If it is one line and evaluates to something, use that
  # Otherwise treat as text
  obj <- tryCatch(
    {
      if (grepl("\n", ctx_text)) {
        ctx_text[1:min(length(ctx_text), max_lines)]
      } else {
        x <- eval(parse(text = ctx_text))
        if (inherits(x, "list")) x <- unlist(x)
        x <- as.character(x)
        if (length(x) == 1 && grepl("\n", x)) {
          x <- strsplit(x, "\n")[[1]]
        }
        x <- unique(x)
        if (length(x) > max_lines) {
          message(
            ctx_text,
            " gave ",
            length(x),
            " lines, limiting to first ",
            max_lines,
            " unique lines. Set ",
            "options('regexplain.addin.max_lines') to a higher value to ",
            "increase the number of lines."
          )
          x <- unique(x)
          x[1:min(length(x), max_lines)]
        } else {
          x
        }
      }
    },
    error = function(e) {
      as.character(ctx_text[1:min(length(ctx_text), max_lines)])
    }
  )

  regexplain_gadget(if (length(obj) && obj != "") obj)
}

#' @describeIn regexplain_gadget Opens file chooser to pick file, reads lines,
#'   returns first `regexplain.addin.max_lines` (default 100). Used in the
#'   "Regexplain File" [regexplain_addin].
#' @export
regexplain_file <- function(pattern = NULL, start_page = "RegEx") {
  fname <- file.choose()
  x <- readLines(fname)
  max_lines <- getOption("rexeplain.addin.max_lines", 100)
  if (length(x) > max_lines) {
    message("There were ", format(length(x), big.mark = ","), " lines in ",
            fname, "\nUsing only first ", max_lines, ".\n",
            "Set options('regexplain.addin.max_lines') to a higher value to ",
            "increase the number of lines.")
    x <- x[1:max_lines]
  }
  regexplain_gadget(text = x, pattern = pattern, start_page = start_page)
}
gadenbuie/regexhelp documentation built on June 1, 2021, 4:24 p.m.