diff --git a/DESCRIPTION b/DESCRIPTION index fdd59d0d7..f16a46112 100644 --- a/DESCRIPTION +++ b/DESCRIPTION @@ -202,6 +202,7 @@ Collate: 'with.R' 'with_id.R' 'xml_nodes_to_lints.R' + 'xml_utils.R' 'yoda_test_linter.R' 'zzz.R' Language: en-US diff --git a/R/utils.R b/R/utils.R index 3cce15d9f..079431c75 100644 --- a/R/utils.R +++ b/R/utils.R @@ -86,17 +86,6 @@ names2 <- function(x) { names(x) %||% rep("", length(x)) } -safe_parse_to_xml <- function(parsed_content) { - if (is.null(parsed_content)) { - return(xml2::xml_missing()) - } - tryCatch( - xml2::read_xml(xmlparsedata::xml_parse_data(parsed_content)), - # use xml_missing so that code doesn't always need to condition on XML existing - error = function(e) xml2::xml_missing() - ) -} - get_content <- function(lines, info) { lines[is.na(lines)] <- "" @@ -257,18 +246,6 @@ get_r_string <- function(s, xpath = NULL) { out } -#' str2lang, but for xml children. -#' -#' [xml2::xml_text()] is deceptively close to obviating this helper, but it collapses -#' text across lines. R is _mostly_ whitespace-agnostic, so this only matters in some edge cases, -#' in particular when there are comments within an expression (`` node). See #1919. -#' -#' @noRd -xml2lang <- function(x) { - x_strip_comments <- xml_find_all(x, ".//*[not(self::COMMENT or self::expr)]") - str2lang(paste(xml_text(x_strip_comments), collapse = " ")) -} - is_linter <- function(x) inherits(x, "linter") is_tainted <- function(lines) { diff --git a/R/xml_nodes_to_lints.R b/R/xml_nodes_to_lints.R index 323a0f5be..32b49c905 100644 --- a/R/xml_nodes_to_lints.R +++ b/R/xml_nodes_to_lints.R @@ -96,10 +96,3 @@ xml_nodes_to_lints <- function(xml, source_expression, lint_message, ranges = list(c(col1, col2)) ) } - -is_node <- function(xml) inherits(xml, "xml_node") -is_nodeset <- function(xml) inherits(xml, "xml_nodeset") -is_nodeset_like <- function(xml) { - is_nodeset(xml) || - (is.list(xml) && all(vapply(xml, is_node, logical(1L)))) -} diff --git a/R/xml_utils.R b/R/xml_utils.R new file mode 100644 index 000000000..3b0546da6 --- /dev/null +++ b/R/xml_utils.R @@ -0,0 +1,32 @@ +# utils for working with XML + +#' str2lang, but for xml children. +#' +#' [xml2::xml_text()] is deceptively close to obviating this helper, but it collapses +#' text across lines. R is _mostly_ whitespace-agnostic, so this only matters in some edge cases, +#' in particular when there are comments within an expression (`` node). See #1919. +#' +#' @noRd +xml2lang <- function(x) { + x_strip_comments <- xml_find_all(x, ".//*[not(self::COMMENT or self::expr)]") + str2lang(paste(xml_text(x_strip_comments), collapse = " ")) +} + + +safe_parse_to_xml <- function(parsed_content) { + if (is.null(parsed_content)) { + return(xml2::xml_missing()) + } + tryCatch( + xml2::read_xml(xmlparsedata::xml_parse_data(parsed_content)), + # use xml_missing so that code doesn't always need to condition on XML existing + error = function(e) xml2::xml_missing() + ) +} + +is_node <- function(xml) inherits(xml, "xml_node") +is_nodeset <- function(xml) inherits(xml, "xml_nodeset") +is_nodeset_like <- function(xml) { + is_nodeset(xml) || + (is.list(xml) && all(vapply(xml, is_node, logical(1L)))) +}