|
- #' 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)
- }
|