1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131
|
#' Convert string to upper case, lower case, title case, or sentence case
#'
#' * `str_to_upper()` converts to upper case.
#' * `str_to_lower()` converts to lower case.
#' * `str_to_title()` converts to title case, where only the first letter of
#' each word is capitalized.
#' * `str_to_sentence()` convert to sentence case, where only the first letter
#' of sentence is capitalized.
#'
#' @inheritParams str_detect
#' @inheritParams coll
#' @return A character vector the same length as `string`.
#' @examples
#' dog <- "The quick brown dog"
#' str_to_upper(dog)
#' str_to_lower(dog)
#' str_to_title(dog)
#' str_to_sentence("the quick brown dog")
#'
#' # Locale matters!
#' str_to_upper("i") # English
#' str_to_upper("i", "tr") # Turkish
#' @name case
NULL
#' @export
#' @rdname case
str_to_upper <- function(string, locale = "en") {
check_string(locale)
copy_names(string, stri_trans_toupper(string, locale = locale))
}
#' @export
#' @rdname case
str_to_lower <- function(string, locale = "en") {
check_string(locale)
copy_names(string, stri_trans_tolower(string, locale = locale))
}
#' @export
#' @rdname case
str_to_title <- function(string, locale = "en") {
check_string(locale)
out <- stri_trans_totitle(
string,
opts_brkiter = stri_opts_brkiter(locale = locale)
)
copy_names(string, out)
}
#' @export
#' @rdname case
str_to_sentence <- function(string, locale = "en") {
check_string(locale)
out <- stri_trans_totitle(
string,
opts_brkiter = stri_opts_brkiter(type = "sentence", locale = locale)
)
copy_names(string, out)
}
#' Convert between different types of programming case
#'
#' @description
#' * `str_to_camel()` converts to camel case, where the first letter of
#' each word is capitalized, with no separation between words. By default
#' the first letter of the first word is not capitalized.
#'
#' * `str_to_kebab()` converts to kebab case, where words are converted to
#' lower case and separated by dashes (`-`).
#'
#' * `str_to_snake()` converts to snake case, where words are converted to
#' lower case and separated by underscores (`_`).
#' @inheritParams str_to_lower
#' @export
#' @param first_upper Logical. Should the first letter be capitalized?
#' @examples
#' str_to_camel("my-variable")
#' str_to_camel("my-variable", first_upper = TRUE)
#'
#' str_to_snake("MyVariable")
#' str_to_kebab("MyVariable")
str_to_camel <- function(string, first_upper = FALSE) {
check_character(string)
check_bool(first_upper)
string <- string |>
to_words() |>
str_to_title() |>
str_remove_all(pattern = fixed(" "))
if (!first_upper) {
str_sub(string, 1, 1) <- str_to_lower(str_sub(string, 1, 1))
}
string
}
#' @export
#' @rdname str_to_camel
str_to_snake <- function(string) {
check_character(string)
to_separated_case(string, sep = "_")
}
#' @export
#' @rdname str_to_camel
str_to_kebab <- function(string) {
check_character(string)
to_separated_case(string, sep = "-")
}
to_separated_case <- function(string, sep) {
out <- to_words(string)
str_replace_all(out, fixed(" "), sep)
}
to_words <- function(string) {
breakpoints <- paste(
# non-word characters
"[^\\p{L}\\p{N}]+",
# lowercase followed by uppercase
"(?<=\\p{Ll})(?=\\p{Lu})",
# letter followed by number
"(?<=\\p{L})(?=\\p{N})",
# number followed by letter
"(?<=\\p{N})(?=\\p{L})",
# uppercase followed uppercase then lowercase (i.e. end of acronym)
"(?<=\\p{Lu})(?=\\p{Lu}\\p{Ll})",
sep = "|"
)
out <- str_replace_all(string, breakpoints, " ")
out <- str_to_lower(out)
str_trim(out)
}
|