Nothing
#' Marquee-aware string interpolation
#'
#' If you want to create your markdown programmatically you'd probably want to
#' use some sort of string interpolation such as `glue()`. However, the custom
#' span syntax of marquee interferes with the standard interpolation syntax of
#' glue. This function let's you use both together.
#'
#' @inheritParams glue::glue_data
#'
#' @return A character vector
#'
#' @details
#' If you choose a different set of delimiters than `"{"` and `"}"` for the
#' interpolation the functions will call the equivalent glue functions directly.
#' However, if you keep the defaults, the functions will use a custom
#' transformer that will make sure to keep the marquee custom span notation. You
#' can both interpolate the content of the span, as well as the span class (see
#' examples)
#'
#' @export
#'
#' @examples
#' # standard use
#' red_text <- "this text will be red"
#' marquee_glue("This will be black and {.red {red_text}}!")
#'
#' # if the span is not valid it will be treated as standard glue interpolation
#' try(
#' marquee_glue("This will be black and {.red}!")
#' )
#'
#' # You can interpolate the tag name as well
#' col <- "green"
#' marquee_glue("This will be black and {.{col} this text will be {col}}!")
#'
#' # Tag name interpolation must follow a `.` or a `#` as these identify the
#' # bracket pair as a custom span class
#' col <- ".yellow"
#' # This is not what you want probably
#' marquee_glue("This will be black and {{col} this text will be {col}}!")
#'
#' # Tag interpolation should also interpolate the full tag and be followed by
#' # a space in order to be valid
#' part <- "l"
#' marquee_glue("This will be black and {.ye{part}low this text will be {col}}!")
#' try(
#' marquee_glue("This will be black and {.{part}avender this text will be {col}}!")
#' )
#'
marquee_glue <- function(..., .sep = "", .envir = parent.frame(), .open = "{",
.close = "}", .na = "NA", .null = character(),
.comment = character(), .literal = FALSE, .transformer = NULL,
.trim = TRUE) {
if (.open != "{" && .close != "}") {
.transformer <- .transformer %||% glue::identity_transformer
} else {
if (!is.null(.transformer)) {
cli::cli_warn("Ignoring supplied {.arg .transformer} when using {.val {'{'}} and {.val {'}'}} as delimiters")
}
.transformer <- marquee_transformer(.na, .null, .comment, .literal)
}
glue::glue(..., .sep = .sep, .envir = .envir, .open = .open, .close = .close,
.na = .na, .null = .null, .comment = .comment, .literal = .literal,
.transformer = .transformer, .trim = .trim)
}
#' @rdname marquee_glue
#' @export
marquee_glue_data <- function(.x, ..., .sep = "", .envir = parent.frame(), .open = "{",
.close = "}", .na = "NA", .null = character(),
.comment = character(), .literal = FALSE, .transformer = NULL,
.trim = TRUE) {
if (.open != "{" && .close != "}") {
.transformer <- .transformer %||% glue::identity_transformer
} else {
if (!is.null(.transformer)) {
cli::cli_warn("Ignoring supplied {.arg .transformer} when using {.val {'{'}} and {.val {'}'}} as delimiters")
}
.transformer <- marquee_transformer(.na, .null, .comment, .literal)
}
glue::glue_data(.x, ..., .sep = .sep, .envir = .envir, .open = .open, .close = .close,
.na = .na, .null = .null, .comment = .comment, .literal = .literal,
.transformer = .transformer, .trim = .trim)
}
marquee_transformer <- function(.na = "NA", .null = character(), .comment = character(),
.literal = FALSE) {
function(text, envir) {
first <- substr(text, 1, 1)
if (first %in% c(".", "#")) {
if (substr(text, 2, 2) == "{") {
tag_ends <- regexec("}", text, fixed = TRUE)[[1]]
if (substr(text, tag_ends + 1L, tag_ends + 1L) != " ") {
cli::cli_abort("Malformed marquee interpolation block. When interpolating a tag name it must be followed by a space")
}
tag <- glue::identity_transformer(substr(text, 2, tag_ends), envir)
if (grepl("\\s", tag)) {
cli::cli_abort("evaluated tag ({.val {tag}}) is not a valid tag name")
}
} else {
tag_ends <- regexec("\\s", text)[[1]]
if (tag_ends == -1) return(glue::identity_transformer(text, envir))
tag_ends <- tag_ends - 1L
tag <- substr(text, 2, tag_ends)
}
body <- glue::glue(substr(text, tag_ends + 2L, nchar(text)),
.envir = envir, .na = .na, .null = .null,
.comment = .comment, .literal = .literal,
.transformer = caller_fn(n = 0))
paste0("{", first, tag, " ", body, "}")
} else {
glue::identity_transformer(text, envir)
}
}
}
Any scripts or data that you put into this service are public.
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.