## TODO: continuation lines
idesc_str <- function(self, private, by_field, normalize = TRUE,
mode = c("file", "screen")) {
stopifnot(is_flag(by_field))
mode <- match.arg(mode)
cols <- names(private$data)
if (normalize) cols <- field_order(cols)
col_str <- vapply(
cols, FUN.VALUE = "",
FUN = function(col) {
if (normalize) {
format(private$data[[col]], mode = mode)
} else {
paste0(
private$data[[col]]$key, ": ",
mark_continuation_lines(private$data[[col]]$value)
)
}
})
if (by_field) col_str else paste(col_str, collapse = "\n")
}
field_order <- function(fields) {
first <- c(
"Type", "Package", "Title", "Version", "Date",
"Authors@R", "Author", "Maintainer",
"Description", "License", "URL", "BugReports",
"Depends", setdiff(dep_types, "Depends"), "VignetteBuilder",
"RdMacros", "Remotes"
)
last <- collate_fields
c(
intersect(first, fields),
sort(setdiff(fields, c(first, last))),
intersect(last, fields)
)
}
color_bad <- function(x) {
if (identical(check_field(x), TRUE)) x$value else cli::col_red(x$value)
}
#' @export
#' @method format DescriptionField
format.DescriptionField <- function(x, ..., width = 75) {
mark_continuation_lines(paste(
strwrap(paste0(cli::col_blue(x$key), ": ", color_bad(x)), exdent = 4, width = width),
collapse = "\n"
))
}
#' @export
#' @method format DescriptionDependencyList
format.DescriptionDependencyList <- function(x, ...) {
paste0(
cli::col_blue(x$key), if (nzchar(x$value)) ":\n" else ":",
if (nzchar(x$value)) paste0(
" ",
sort(str_trim(strsplit(color_bad(x), ",", fixed = TRUE)[[1]])),
collapse = ",\n"
)
)
}
#' @export
#' @method format DescriptionPackageList
format.DescriptionPackageList <- format.DescriptionDependencyList
#' @export
#' @method format DescriptionRemotes
format.DescriptionRemotes <- format.DescriptionDependencyList
#' @export
#' @method format DescriptionCollate
format.DescriptionCollate <- function(x, ...) {
paste0(
cli::col_blue(x$key), ":",
deparse_collate(parse_collate(color_bad(x)))
)
}
#' @export
#' @method format DescriptionAuthorsAtR
format.DescriptionAuthorsAtR <- function(x, mode = c("file", "screen"),
...) {
xx <- parse_authors_at_r(x$value)
if (mode == "screen") {
good <- check_field(x)
xxx <- if (good) xx else cli::col_red(xx)
paste0(
cli::col_blue(x$key), " (parsed):\n",
paste0(" * ", format(xxx), collapse = "\n")
)
} else {
paste0(
x$key, ":",
sub("\n$", "", deparse_authors_at_r(xx))
)
}
}
idesc_print <- function(self, private) {
cat(
idesc_str(self, private, by_field = FALSE, mode = "screen"),
sep = "",
"\n"
)
invisible(self)
}
idesc_normalize <- function(self, private) {
self$reformat_fields()
self$reorder_fields()
invisible(self)
}
idesc_reformat_fields <- function(self, private) {
old <- options(cli.num_colors = 1, crayon.enabled = FALSE)
on.exit(options(old), add = TRUE)
norm_fields <- idesc_str(self, private, by_field = TRUE)
for (f in names(norm_fields)) {
private$data[[f]]$value <-
sub(paste0(f, ":[ ]?"), "", norm_fields[[f]])
}
invisible(self)
}
idesc_reorder_fields <- function(self, private) {
private$data <- private$data[field_order(names(private$data))]
invisible(self)
}
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.