Running 'run.R' [199s]
Running the tests in 'tests/run.R' failed.
Complete output:
  > # to avoid variability on terminals with different capabilities
  > # plus generally random options being set
  > 
  > if(getRversion() < "3.2.2") {
  +   warning("Cannot run tests with R version less than 3.2.2.")
  + } else if(!suppressWarnings(require('fansi'))) {
  +   # this is to avoid accidentally running tests under valgrind without fansi
  +   # installed... (no, we've never done this...)
  +   warning("Cannot run tests without package `fansi`")
  + } else if(!suppressWarnings(require('unitizer'))) {
  +   warning("Cannot run tests without package `unitizer`")
  + } else {
  +   old.opt <- options(
  +     fansi.tabs.as.spaces=FALSE,
  +     fansi.tab.stops=8L,
  +     fansi.warn=TRUE,
  +     fansi.term.cap=c('bright', '256')
  +     # warnPartialMatchArgs = TRUE,
  +     # warnPartialMatchAttr = TRUE,
  +     # warnPartialMatchDollar = TRUE
  +   )
  +   on.exit(old.opt)
  +   pat.all <- "^[^.].*\\.[Rr]$"
  +   pattern <- pat.all
  +   # pattern <- "over"
  +   unitize_dir(
  +     'unitizer',
  +     pattern=pattern,
  +     state='suggested'
  +   )
  +   # we skip utf8 tests on solaris due to the problems with deparse (and maybe
  +   # others, don't have a solaris system handy for testing).
  +   if(
  +     !grepl("solaris|sun", Sys.info()[['sysname']], ignore.case=TRUE) &&
  +     identical(pattern, pat.all)
  +   ) {
  +     unitize('special/utf8.R', state='suggested')
  +   }
  +   # UCD 12.1 update in 4.0.4 produces correct widths for emoji
  +   if(getRversion() >= "4.0.4" && identical(pattern, pat.all))
  +     unitize('special/emo-graph.R', state='suggested')
  + }
  Loading required package: fansi
  Loading required package: unitizer
  State tracking is disabled by default to comply with CRAN policies. Add `options(unitizer.state='suggested')` to your 'Rprofile' file to enable, or `options(unitizer.state='off')` to quash this message without enabling.  Prior to enabling, be sure to read `?unitizerState`,in particular the 'CRAN non-compliance' section.
  
  Preloads...
  Loading unitizer data...
  Parsing tests...
  Parsing unitizer/has.R
  Parsing unitizer/interactions.R
  Parsing unitizer/misc.R
  Parsing unitizer/nchar.R
  Parsing unitizer/normalize.R
  Parsing unitizer/overflow.R
  Parsing unitizer/strip.R
  Parsing unitizer/strsplit.R
  Parsing unitizer/substr.R
  Parsing unitizer/tabs.R
  Parsing unitizer/tohtml.R
  Parsing unitizer/trimws.R
  Parsing unitizer/url.R
  Parsing unitizer/wrap.R
  Evaluating tests...
  
   1/14 has.R: 
   1/14 has.R: library(fansi)
   1/14 has.R: unitizer_sect("has", {
   1/14 has.R: has_ctl(paste0(red, "hello", end))
  [1] TRUE
   1/14 has.R: has_ctl(paste0("hello", end))
  [1] TRUE
   1/14 has.R: has_ctl(paste0("hello"))
  [1] FALSE
   1/14 has.R: in.middle <- c("world", paste0("hello", red), "wow")
   1/14 has.R: in.end <- c("world", "wow", paste0("hello", red))
   1/14 has.R: in.start <- c(paste0("hello", red), "wow", "world")
   1/14 has.R: has_ctl(in.middle)
  [1] FALSE  TRUE FALSE
   1/14 has.R: has_ctl(in.end)
  [1] FALSE FALSE  TRUE
   1/14 has.R: has_ctl(in.start)
  [1]  TRUE FALSE FALSE
   1/14 has.R: has_ctl(c(in.start, NA))
  [1]  TRUE FALSE FALSE    NA
   1/14 has.R: has_ctl("hello\nworld")
  [1] TRUE
   1/14 has.R: has_sgr("hello\nworld")
  [1] FALSE
   1/14 has.R: has_sgr(in.end)
  [1] FALSE FALSE  TRUE
   1/14 has.R: has_ctl("hello\033p world")
  [1] TRUE
   1/14 has.R: unitizer_sect("corner cases", {
   1/14 has.R: has_ctl("hello\033[31#0mworld")
  [1] TRUE
   1/14 has.R: suppressWarnings(has_ctl("hello\033[31#0mworld"))
  [1] TRUE
   1/14 has.R: has_ctl("hello world", ctl = c("sgr", "sgr"))
  [1] FALSE
   1/14 has.R: has_ctl("hello\033[31#0")
  Warning in has_ctl("hello\033[31#0") :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] TRUE
   1/14 has.R: unitizer_sect("select ctl", {
   1/14 has.R: has_ctl("hello\033[31mworld", ctl = c("sgr"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\033[31mworld", ctl = c("csi"))
  [1] FALSE
   1/14 has.R: has_ctl("hello\033[31!mworld", ctl = c("sgr"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\033[31!mworld", ctl = c("csi"))
  [1] FALSE
   1/14 has.R: has_ctl("hello\033[31lworld", ctl = c("csi"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\nworld", ctl = c("all", "nl"))
  [1] FALSE
   1/14 has.R: has_ctl("hello\nworld", ctl = c("all", "c0"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\tworld", ctl = c("all", "c0"))
  [1] FALSE
   1/14 has.R: has_ctl("hello\tworld", ctl = c("c0"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\033pworld", ctl = c("esc"))
  [1] TRUE
   1/14 has.R: has_ctl("hello\033pworld", ctl = c("all", "esc"))
  [1] FALSE
   1/14 has.R: unitizer_sect("bad inputs", {
   1/14 has.R: has_ctl("hello world", warn = NULL)
  Error in has_ctl("hello world", warn = NULL) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> has_ctl -> VAL_IN_ENV -> stop2
   1/14 has.R: has_ctl("hello world", ctl = 1:3)
  Error in has_ctl("hello world", ctl = 1:3) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> has_ctl -> VAL_IN_ENV -> stop2
   1/14 has.R: has_ctl("hello world", ctl = "bananas")
  Error in has_ctl("hello world", ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> has_ctl -> VAL_IN_ENV -> stop2
   1/14 has.R: has_ctl("hello world", ctl = NA_character_)
  Error in has_ctl("hello world", ctl = NA_character_) : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> has_ctl -> VAL_IN_ENV -> stop2
   1/14 has.R: has_ctl(c("\033[31mhello", "wo\nrld"), ctl = character())
  [1] FALSE FALSE
   1/14 has.R: unitizer_sect("deprecation", {
   1/14 has.R: has_ctl("hello world", which = "sgr")
  Parameter `which` has been deprecated; use `ctl` instead.
  [1] FALSE
  
   2/14 interactions.R: 
   2/14 interactions.R: library(fansi)
   2/14 interactions.R: unitizer_sect("substr", {
   2/14 interactions.R: str.0 <- c("\033[44mhello", "world")
   2/14 interactions.R: substr_ctl(str.0, 2, 4)
  [1] "\033[44mell\033[0m" "orl"               
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = TRUE)
  [1] "\033[44mell\033[0m" "\033[44morl\033[0m"
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = "\033[33m")
  [1] "\033[33;44mell\033[0m" "\033[33;44morl\033[0m"
   2/14 interactions.R: substr2_ctl(str.0, 2, 4, carry = "\033[33m")
  [1] "\033[33;44mell\033[0m" "\033[33;44morl\033[0m"
   2/14 interactions.R: substr_sgr(str.0, 2, 4, carry = "\033[33m")
  [1] "\033[33;44mell\033[0m" "\033[33;44morl\033[0m"
   2/14 interactions.R: substr2_sgr(str.0, 2, 4, carry = "\033[33m")
  [1] "\033[33;44mell\033[0m" "\033[33;44morl\033[0m"
   2/14 interactions.R: str.1 <- c("hello", "\033[44mworld", "barrow")
   2/14 interactions.R: substr_ctl(str.1, 2, 4)
  [1] "ell"                "\033[44morl\033[0m" "arr"               
   2/14 interactions.R: substr_ctl(str.1, 2, 4, carry = TRUE)
  [1] "ell"                "\033[44morl\033[0m" "\033[44marr\033[0m"
   2/14 interactions.R: substr_ctl(str.1, 2, 4, carry = "\033[33m")
  [1] "\033[33mell\033[0m"    "\033[33;44morl\033[0m" "\033[33;44marr\033[0m"
   2/14 interactions.R: str.2 <- c("\033[33mA\033[44mBCD", "ABCD", "\033[39mABCD")
   2/14 interactions.R: substr_ctl(str.2, 2, 2)
  [1] "\033[33;44mB\033[0m" "B"                   "B"                  
   2/14 interactions.R: substr_ctl(str.2, 2, 2, carry = TRUE)
  [1] "\033[33;44mB\033[0m" "\033[33;44mB\033[0m" "\033[44mB\033[0m"   
   2/14 interactions.R: substr_ctl(str.2, 2, 2, carry = TRUE, terminate = FALSE)
  [1] "\033[33;44mB" "B"            "\033[0;44mB" 
   2/14 interactions.R: str.3 <- c("\033[35mA\033[42mB", "\033[49mCD")
   2/14 interactions.R: substr_ctl(str.3, 2, 2, carry = TRUE, terminate = FALSE)
  [1] "\033[35;42mB" "\033[0;35mD" 
   2/14 interactions.R: wrp.0 <- c("once upon \033[44ma time in a land far away ov
   2/14 interactions.R: unitizer_sect("wrap/trim", {
   2/14 interactions.R: strwrap_ctl(wrp.0, 20)
  [1] "once upon \033[44ma time in\033[0m" "\033[44ma land far away\033[0m"    
  [3] "\033[44mover\033[0m"                "the mountains and"                 
  [5] "\033[7msea lived a fair\033[0m"     "\033[7mcreature\033[0m"            
  [7] "with \033[4mdark itentions\033[0m"  "\033[4mand a yappy dog.\033[0m"    
   2/14 interactions.R: strwrap_ctl(wrp.0, 20, carry = TRUE)
  [1] "once upon \033[44ma time in\033[0m"         
  [2] "\033[44ma land far away\033[0m"             
  [3] "\033[44mover\033[0m"                        
  [4] "\033[44mthe mountains and\033[0m"           
  [5] "\033[7;44msea lived a fair\033[0m"          
  [6] "\033[7;44mcreature\033[0m"                  
  [7] "\033[7;44mwith \033[4mdark itentions\033[0m"
  [8] "\033[4;7;44mand a yappy dog.\033[0m"        
   2/14 interactions.R: strwrap_ctl(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in\033[0m"    
  [2] "\033[33;44ma land far away\033[0m"             
  [3] "\033[33;44mover\033[0m"                        
  [4] "\033[33;44mthe mountains and\033[0m"           
  [5] "\033[7;33;44msea lived a fair\033[0m"          
  [6] "\033[7;33;44mcreature\033[0m"                  
  [7] "\033[7;33;44mwith \033[4mdark itentions\033[0m"
  [8] "\033[4;7;33;44mand a yappy dog.\033[0m"        
   2/14 interactions.R: strwrap_sgr(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in\033[0m"    
  [2] "\033[33;44ma land far away\033[0m"             
  [3] "\033[33;44mover\033[0m"                        
  [4] "\033[33;44mthe mountains and\033[0m"           
  [5] "\033[7;33;44msea lived a fair\033[0m"          
  [6] "\033[7;33;44mcreature\033[0m"                  
  [7] "\033[7;33;44mwith \033[4mdark itentions\033[0m"
  [8] "\033[4;7;33;44mand a yappy dog.\033[0m"        
   2/14 interactions.R: strwrap2_ctl(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in\033[0m"    
  [2] "\033[33;44ma land far away\033[0m"             
  [3] "\033[33;44mover\033[0m"                        
  [4] "\033[33;44mthe mountains and\033[0m"           
  [5] "\033[7;33;44msea lived a fair\033[0m"          
  [6] "\033[7;33;44mcreature\033[0m"                  
  [7] "\033[7;33;44mwith \033[4mdark itentions\033[0m"
  [8] "\033[4;7;33;44mand a yappy dog.\033[0m"        
   2/14 interactions.R: strwrap2_sgr(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in\033[0m"    
  [2] "\033[33;44ma land far away\033[0m"             
  [3] "\033[33;44mover\033[0m"                        
  [4] "\033[33;44mthe mountains and\033[0m"           
  [5] "\033[7;33;44msea lived a fair\033[0m"          
  [6] "\033[7;33;44mcreature\033[0m"                  
  [7] "\033[7;33;44mwith \033[4mdark itentions\033[0m"
  [8] "\033[4;7;33;44mand a yappy dog.\033[0m"        
   2/14 interactions.R: strtrim_ctl(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in \033[0m"    
  [2] "\033[33;44mthe mountains and \033[7m s\033[0m"  
  [3] "\033[7;33;44mwith \033[4mdark itentions \033[0m"
   2/14 interactions.R: strtrim_sgr(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in \033[0m"    
  [2] "\033[33;44mthe mountains and \033[7m s\033[0m"  
  [3] "\033[7;33;44mwith \033[4mdark itentions \033[0m"
   2/14 interactions.R: strtrim2_ctl(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in \033[0m"    
  [2] "\033[33;44mthe mountains and \033[7m s\033[0m"  
  [3] "\033[7;33;44mwith \033[4mdark itentions \033[0m"
   2/14 interactions.R: strtrim2_sgr(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in \033[0m"    
  [2] "\033[33;44mthe mountains and \033[7m s\033[0m"  
  [3] "\033[7;33;44mwith \033[4mdark itentions \033[0m"
   2/14 interactions.R: wrp.1 <- c("once upon \033[44ma time in a land far away ov
   2/14 interactions.R: strtrim_ctl(wrp.0, 20, carry = "\033[33m")
  [1] "\033[33monce upon \033[44ma time in \033[0m"    
  [2] "\033[33;44mthe mountains and \033[7m s\033[0m"  
  [3] "\033[7;33;44mwith \033[4mdark itentions \033[0m"
   2/14 interactions.R: wrp.2 <- c("hello \033[42mworld", "goodnight\033[49m moon"
   2/14 interactions.R: strwrap_ctl(wrp.2, 10, carry = "\033[35m", simplify = FALS
  [[1]]
  [1] "\033[35mhello\033[0m"    "\033[35;42mworld\033[0m"
  
  [[2]]
  [1] "\033[35;42mgoodnight\033[0m" "\033[35mmoon\033[0m"        
  
  [[3]]
  [1] "\033[35moh \033[39mboy"
  
   2/14 interactions.R: strwrap_ctl(wrp.2, 10, carry = "\033[35m", simplify = FALS
  [[1]]
  [1] "hello"         "\033[42mworld"
  
  [[2]]
  [1] "goodnight"      "\033[0;35mmoon"
  
  [[3]]
  [1] "oh \033[39mboy"
  
   2/14 interactions.R: unitizer_sect("normalize", {
   2/14 interactions.R: str.2 <- c("\033[44mhello", "wo\033[mrld", "barrow")
   2/14 interactions.R: normalize_state(str.2)
  [1] "\033[44mhello" "world"         "barrow"       
   2/14 interactions.R: normalize_state(str.2, carry = TRUE)
  [1] "\033[44mhello" "wo\033[49mrld" "barrow"       
   2/14 interactions.R: normalize_state(str.2, carry = "\033[33m")
  [1] "\033[44mhello"         "wo\033[39m\033[49mrld" "barrow"               
   2/14 interactions.R: unitizer_sect("carry corner cases", {
   2/14 interactions.R: substr_ctl("", 2, 3, carry = "\033[33m")
  [1] ""
   2/14 interactions.R: substr_ctl("", 2, 3, carry = "\033[33m", terminate = FALSE
  [1] ""
   2/14 interactions.R: substr_ctl("\033[39m", 2, 3, carry = "\033[33m", terminate
  [1] "\033[0m"
   2/14 interactions.R: substr_ctl("\033[39m", 2, 3, carry = "\033[33m", terminate
  [1] "\033[39m"
   2/14 interactions.R: substr_ctl("", 0, 1, carry = "\033[33m")
  [1] ""
   2/14 interactions.R: substr_ctl("", 0, 1, carry = "\033[33m", terminate = FALSE
  [1] ""
   2/14 interactions.R: substr_ctl("\033[39m", 0, 1, carry = "\033[33m", terminate
  [1] "\033[0m"
   2/14 interactions.R: substr_ctl("\033[39m", 0, 1, carry = "\033[33m", terminate
  [1] "\033[39m"
   2/14 interactions.R: substr_ctl("", 0, 0, carry = "\033[33m")
  [1] ""
   2/14 interactions.R: substr_ctl("", 0, 0, carry = "\033[33m", terminate = FALSE
  [1] ""
   2/14 interactions.R: substr_ctl("\033[39m", 0, 0, carry = "\033[33m", terminate
  [1] ""
   2/14 interactions.R: substr_ctl(character(), 2, 4, carry = "\033[33m")
  character(0)
   2/14 interactions.R: substr_ctl(NA, 2, 4, carry = "\033[33m")
  [1] NA
   2/14 interactions.R: substr_ctl(environment(), 2, 4, carry = "\033[33m")
  Error in as.character(args[["x"]]) : 
    cannot coerce type 'environment' to vector of type 'character'
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV
   2/14 interactions.R: substr_ctl("hello", 2, 4, carry = c("\033[33m", "\033[44m"
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `carry` must be scalar.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = NA_character_)
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `carry` may not be NA.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = character())
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `carry` must be scalar.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = 1)
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: substr_ctl(str.0, 2, 4, carry = Inf)
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: sgrs <- c("A\033[31mB", "C\033[1mD", "E\033[4mF", "G\033[1
   2/14 interactions.R: substr_ctl(sgrs, 2, 2, carry = TRUE)
   [1] "\033[31mB\033[0m"           "\033[1;31mD\033[0m"        
   [3] "\033[1;4;31mF\033[0m"       "\033[1;4;31;13mH\033[0m"   
   [5] "\033[1;4;31;62;13mJ\033[0m" "\033[1;4;62;13mL\033[0m"   
   [7] "\033[1;4;52;62;13mN\033[0m" "\033[1;4;52;13mP\033[0m"   
   [9] "\033[4;52;13mR\033[0m"      "\033[52;13mT\033[0m"       
  [11] "\033[13mU\033[0m"           "W"                         
   2/14 interactions.R: normalize_state(str.2, carry = NA_character_)
  Error in normalize_state(str.2, carry = NA_character_) : 
    Argument `carry` may not be NA.
  Calls: unitize_dir ... withVisible -> normalize_state -> VAL_IN_ENV -> stop2
   2/14 interactions.R: normalize_state(str.2, carry = character())
  Error in normalize_state(str.2, carry = character()) : 
    Argument `carry` must be scalar.
  Calls: unitize_dir ... withVisible -> normalize_state -> VAL_IN_ENV -> stop2
   2/14 interactions.R: normalize_state(str.2, carry = 1)
  Error in normalize_state(str.2, carry = 1) : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... withVisible -> normalize_state -> VAL_IN_ENV -> stop2
   2/14 interactions.R: normalize_state(str.2, carry = Inf)
  Error in normalize_state(str.2, carry = Inf) : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... withVisible -> normalize_state -> VAL_IN_ENV -> stop2
   2/14 interactions.R: strwrap_ctl(wrp.0, 20, carry = NA_character_)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `carry` may not be NA.
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: strwrap_sgr(wrp.0, 20, carry = character())
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `carry` must be scalar.
  Calls: unitize_dir ... strwrap_sgr -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: strwrap2_ctl(wrp.0, 20, carry = 1)
  Error in strwrap2_ctl(wrp.0, 20, carry = 1) : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... eval -> withVisible -> strwrap2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: strwrap2_sgr(wrp.0, 20, carry = Inf)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `carry` must be logical or character.
  Calls: unitize_dir ... strwrap2_sgr -> strwrap2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: strwrap_ctl(c("\033[33mA \033[4mB", "\033[44mC D"), carry 
  [1] "\033[33mA\033[0m"      "\033[4;33mB\033[0m"    "\033[4;33;44mC\033[0m"
  [4] "\033[4;33;44mD\033[0m"
   2/14 interactions.R: unitizer_sect("terminate", {
   2/14 interactions.R: str.0 <- c("hel\033[33m", "wo\033[44mrld")
   2/14 interactions.R: substr_ctl(str.0, 2, 5, terminate = FALSE)
  [1] "el\033[33m"   "o\033[44mrld"
   2/14 interactions.R: substr_sgr(str.0, 2, 5, terminate = FALSE)
  [1] "el\033[33m"   "o\033[44mrld"
   2/14 interactions.R: substr2_ctl(str.0, 2, 5, terminate = FALSE)
  [1] "el\033[33m"   "o\033[44mrld"
   2/14 interactions.R: substr2_sgr(str.0, 2, 5, terminate = FALSE)
  [1] "el\033[33m"   "o\033[44mrld"
   2/14 interactions.R: strwrap_ctl(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in" "a land far away"            
  [3] "over"                        "the mountains and"          
  [5] "\033[7msea lived a fair"     "creature"                   
  [7] "with \033[4mdark itentions"  "and a yappy dog."           
   2/14 interactions.R: strwrap_sgr(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in" "a land far away"            
  [3] "over"                        "the mountains and"          
  [5] "\033[7msea lived a fair"     "creature"                   
  [7] "with \033[4mdark itentions"  "and a yappy dog."           
   2/14 interactions.R: strwrap2_ctl(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in" "a land far away"            
  [3] "over"                        "the mountains and"          
  [5] "\033[7msea lived a fair"     "creature"                   
  [7] "with \033[4mdark itentions"  "and a yappy dog."           
   2/14 interactions.R: strwrap2_sgr(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in" "a land far away"            
  [3] "over"                        "the mountains and"          
  [5] "\033[7msea lived a fair"     "creature"                   
  [7] "with \033[4mdark itentions"  "and a yappy dog."           
   2/14 interactions.R: strtrim_ctl(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in " "the mountains and \033[7m s" 
  [3] "with \033[4mdark itentions " 
   2/14 interactions.R: strtrim_sgr(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in " "the mountains and \033[7m s" 
  [3] "with \033[4mdark itentions " 
   2/14 interactions.R: strtrim2_ctl(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in " "the mountains and \033[7m s" 
  [3] "with \033[4mdark itentions " 
   2/14 interactions.R: strtrim2_sgr(wrp.0, 20, terminate = FALSE)
  [1] "once upon \033[44ma time in " "the mountains and \033[7m s" 
  [3] "with \033[4mdark itentions " 
   2/14 interactions.R: strtrim2_sgr(wrp.0, 20, terminate = NA)
  Error in strtrim2_ctl(x = x, width = width, warn = warn, tabs.as.spaces = tabs.as.spaces,  : 
    Argument `terminate` must be TRUE or FALSE
  Calls: unitize_dir ... strtrim2_sgr -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   2/14 interactions.R: unitizer_sect("bridge", {
   2/14 interactions.R: fansi:::bridge("\033[42m", "\033[31m")
  [1] "\033[0;31m"
   2/14 interactions.R: fansi:::bridge("\033[42m", "\033[31m", normalize = TRUE)
  [1] "\033[49m\033[31m"
   2/14 interactions.R: fansi:::bridge("", "\033[31m")
  [1] "\033[31m"
   2/14 interactions.R: fansi:::bridge("\033[42m", "")
  [1] "\033[0m"
   2/14 interactions.R: fansi:::bridge("\033[42m", "\033[42m")
  [1] ""
   2/14 interactions.R: end <- c("\033[31", "\033[41m", NA_character_, "\033[44m")
   2/14 interactions.R: restart <- c("", NA_character_, "\033[45m", "\033[45m")
   2/14 interactions.R: fansi:::bridge(end, restart)
  [1] ""         ""         ""         "\033[45m"
   2/14 interactions.R: base.st <- "%s\033]8;%s;%s\033\\"
   2/14 interactions.R: url <- "https://x.yz"
   2/14 interactions.R: u0 <- sprintf(base.st, "", "", url)
   2/14 interactions.R: fansi:::bridge(paste0("\033[42m", u0), "\033[31m")
  [1] "\033[0;31m\033]8;;\033\\"
   2/14 interactions.R: fansi:::bridge("\033[31m", paste0("\033[42m", u0))
  [1] "\033[0;42m\033]8;;https://x.yz\033\\"
   2/14 interactions.R: txt <- c("A\033[31mBC", "D\033[39mE\033[42mF")
   2/14 interactions.R: `substr_ctl<-`(txt, 2, 2, value = "?", normalize = TRUE, c
  [1] "A?\033[31mC"         "D\033[39m?\033[42mF"
   2/14 interactions.R: unitizer_sect("at end / close", {
   2/14 interactions.R: x <- c("a\033[31mb", "c", "\033[42md")
   2/14 interactions.R: state_at_end(x)
  [1] "\033[31m" ""         "\033[42m"
   2/14 interactions.R: state_at_end(x, carry = TRUE)
  [1] "\033[31m"    "\033[31m"    "\033[31;42m"
   2/14 interactions.R: state_at_end(x, carry = TRUE, normalize = TRUE)
  [1] "\033[31m"         "\033[31m"         "\033[31m\033[42m"
   2/14 interactions.R: state_at_end("a\033[pb")
  Warning in state_at_end("a\033[pb") :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] ""
   2/14 interactions.R: state_at_end("a\033[pb", warn = FALSE)
  [1] ""
   2/14 interactions.R: state_at_end(c("\033[42mA", NA_character_, "\033[31mA"))
  [1] "\033[42m" NA         "\033[31m"
   2/14 interactions.R: state_at_end(c("\033[42mA", NA_character_, "\033[31mA"), c
  [1] "\033[42m" NA         NA        
   2/14 interactions.R: close_state(x)
  [1] "\033[0m" ""        "\033[0m"
   2/14 interactions.R: close_state(x, normalize = TRUE)
  [1] "\033[39m" ""         "\033[49m"
   2/14 interactions.R: close_state("a\033[pb")
  Warning in close_state("a\033[pb") :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] ""
   2/14 interactions.R: close_state("a\033[pb", warn = FALSE)
  [1] ""
   2/14 interactions.R: state_no_arg <- function(x) {
   2/14 interactions.R: x <- "\xf0"
   2/14 interactions.R: Encoding(x) <- "UTF-8"
   2/14 interactions.R: state_no_arg(x)
  [1] "Encountered a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`."
   2/14 interactions.R: y <- "\033[45phello"
   2/14 interactions.R: state_no_arg(y)
  [1] "Encountered a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
  
   3/14 misc.R: 
   3/14 misc.R: library(unitizer)
   3/14 misc.R: library(fansi)
   3/14 misc.R: unitizer_sect("term_cap_test", {
   3/14 misc.R: tct <- term_cap_test()
  [91;104mbright   [0m  ->  \033[91;104mbright   \033[0m                   
  [38;5;196;48;5;21m256      [0m  ->  \033[38;5;196;48;5;21m256      \033[0m         
  [38;2;255;0;0;48;2;0;0;255mtruecolor[0m  ->  \033[38;2;255;0;0;48;2;0;0;255mtruecolor\033[0m
   3/14 misc.R: tct
  [1] "\033[91;104mbright   \033[0m"                   
  [2] "\033[38;5;196;48;5;21m256      \033[0m"         
  [3] "\033[38;2;255;0;0;48;2;0;0;255mtruecolor\033[0m"
   3/14 misc.R: fansi_lines(LETTERS, step = 6)
   [1] "\033[37;48;5;23mA\033[39;49m"  "\033[37;48;5;29mB\033[39;49m" 
   [3] "\033[30;48;5;35mC\033[39;49m"  "\033[30;48;5;41mD\033[39;49m" 
   [5] "\033[30;48;5;47mE\033[39;49m"  "\033[37;48;5;53mF\033[39;49m" 
   [7] "\033[37;48;5;59mG\033[39;49m"  "\033[37;48;5;65mH\033[39;49m" 
   [9] "\033[30;48;5;71mI\033[39;49m"  "\033[30;48;5;77mJ\033[39;49m" 
  [11] "\033[30;48;5;83mK\033[39;49m"  "\033[37;48;5;89mL\033[39;49m" 
  [13] "\033[37;48;5;95mM\033[39;49m"  "\033[37;48;5;101mN\033[39;49m"
  [15] "\033[30;48;5;107mO\033[39;49m" "\033[30;48;5;113mP\033[39;49m"
  [17] "\033[30;48;5;119mQ\033[39;49m" "\033[37;48;5;125mR\033[39;49m"
  [19] "\033[37;48;5;131mS\033[39;49m" "\033[37;48;5;137mT\033[39;49m"
  [21] "\033[30;48;5;143mU\033[39;49m" "\033[30;48;5;149mV\033[39;49m"
  [23] "\033[30;48;5;155mW\033[39;49m" "\033[37;48;5;161mX\033[39;49m"
  [25] "\033[37;48;5;167mY\033[39;49m" "\033[37;48;5;173mZ\033[39;49m"
   3/14 misc.R: local({
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] ""  "a"
   3/14 misc.R: unitizer_sect("add_int", {
   3/14 misc.R: fansi:::add_int(1, 1)
  [1] 2
   3/14 misc.R: fansi:::add_int(2^31 - 1, 1)
  Error in fansi:::add_int(2^31 - 1, 1) : 
    Integer overflow in file utils.c at line 99; contact maintainer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: fansi:::add_int(2^31 - 1, 0)
  [1] 2147483647
   3/14 misc.R: fansi:::add_int(-2^31 + 1, 0)
  [1] -2147483647
   3/14 misc.R: fansi:::add_int(-2^31 + 1, -1)
  Error in fansi:::add_int(-2^31 + 1, -1) : 
    Integer overflow in file utils.c at line 99; contact maintainer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: unitizer_sect("unhandled", {
   3/14 misc.R: string.0 <- c("\033[41mhello world\033[m", "foo\033[22>m", "\033[9
   3/14 misc.R: unhandled_ctl(string.0)
    index start stop             error translated        esc
  1     2     4    9    invalid-substr      FALSE  \033[22>m
  2     3     1    6    invalid-substr      FALSE  \033[999m
  3     4     5   11    invalid-substr      FALSE \033[31#3m
  4     5     2    6 non-SGR/hyperlink      FALSE   \033[31k
  5     6     6    7       non-CSI/OSC      FALSE      \033m
   3/14 misc.R: string.1 <- c("foo\033[22>mhello\033[9999m", "a\033[31k", "hello\0
   3/14 misc.R: unhandled_ctl(string.1)
    index start stop             error translated        esc
  1     1     4    9    invalid-substr      FALSE  \033[22>m
  2     1    15   21    invalid-substr      FALSE \033[9999m
  3     2     2    6 non-SGR/hyperlink      FALSE   \033[31k
  4     3     6    7       non-CSI/OSC      FALSE      \033m
  5     3     9   14    unknown-substr      FALSE  \033[180m
  6     3    21   21     malformed-ESC      FALSE       \033
   3/14 misc.R: unhandled_ctl("hello\033\033\033[45p wor\ald")
    index start stop             error translated      esc
  1     1     6    7     malformed-ESC      FALSE \033\033
  2     1     8   12 non-SGR/hyperlink      FALSE \033[45p
  3     1    17   17                C0      FALSE       \a
   3/14 misc.R: unhandled_ctl("\033[38;5;220mworld\033[m", "bright")
    index start stop           error translated            esc
  1     1     1   11 exceed-term-cap      FALSE \033[38;5;220m
   3/14 misc.R: unhandled_ctl("\033[38;2;10;20;30mworld\033[m", "bright")
    index start stop           error translated                 esc
  1     1     1   16 exceed-term-cap      FALSE \033[38;2;10;20;30m
   3/14 misc.R: unhandled_ctl("\033[38;2;10;20;30mworld\033[m", "bri")
  Error in unhandled_ctl("\033[38;2;10;20;30mworld\033[m", "bri") : 
    Argument `term.cap` may only contain values in c("all", "bright", "256", "truecolor", "old")
  Calls: unitize_dir ... withVisible -> unhandled_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: unhandled_ctl("\033[38;2;10;20;30mworld\033[m", NULL)
  Error in unhandled_ctl("\033[38;2;10;20;30mworld\033[m", NULL) : 
    Argument `term.cap` must be character.
  Calls: unitize_dir ... withVisible -> unhandled_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: unhandled_ctl("AB\033[34m\033]9\033\\\033[1m\033[2LCD")
    index start stop             error translated     esc
  1     1    17   20 non-SGR/hyperlink      FALSE \033[2L
   3/14 misc.R: unhandled_ctl("AB\033[34m\033]9\033[1m\033[2LCD")
    index start stop             error translated                    esc
  1     1     8   20 malformed-CSI/OSC      FALSE \033]9\033[1m\033[2LCD
   3/14 misc.R: unhandled_ctl("A\033[45#1pB\033[256pC\033[256mD")
    index start stop              error translated        esc
  1     1     2    8 CSI/OSC-bad-substr      FALSE \033[45#1p
  2     1    10   15  non-SGR/hyperlink      FALSE  \033[256p
  3     1    17   22     invalid-substr      FALSE  \033[256m
   3/14 misc.R: unhandled_ctl("\033[38m")
    index start stop          error translated      esc
  1     1     1    5 invalid-substr      FALSE \033[38m
   3/14 misc.R: unitizer_sect("strtrim", {
   3/14 misc.R: strtrim_ctl(" hello world", 7)
  [1] " hello "
   3/14 misc.R: strtrim_ctl("\033[42m hello world\033[m", 7)
  [1] "\033[42m hello \033[0m"
   3/14 misc.R: strtrim_ctl(" hello\nworld", 7)
  [1] " hello\nw"
   3/14 misc.R: strtrim_ctl("\033[42m hello\nworld\033[m", 7)
  [1] "\033[42m hello\nw\033[0m"
   3/14 misc.R: strtrim_ctl("\nhello\nworld", 7)
  [1] "\nhello\nwo"
   3/14 misc.R: strtrim_ctl("\033[42m\nhello\nworld\033[m", 7)
  [1] "\033[42m\nhello\nwo\033[0m"
   3/14 misc.R: strtrim_ctl("\thello\rworld foobar", 12)
  Warning in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\thello\rworld f"
   3/14 misc.R: strtrim_ctl("\033[42m\thello\rworld\033[m foobar", 12)
  Warning in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[42m\thello\rworld\033[m f"
   3/14 misc.R: strtrim2_ctl("\033[42m\thello world\033[m foobar", 12, tabs.as.spa
  [1] "\033[42m        hell\033[0m"
   3/14 misc.R: strtrim_sgr("\033[42m\the\allo world\033[m foobar", 12, warn = FAL
  [1] "\033[42m\the\allo worl\033[0m"
   3/14 misc.R: strtrim2_sgr("\033[42m\the\allo world\033[m foobar", 12, tabs.as.s
  [1] "\033[42m  he\allo wor\033[0m"
   3/14 misc.R: identical(strtrim_ctl(c("AB", NA_character_, "CD"), 1), strtrim(c(
  [1] TRUE
   3/14 misc.R: strtrim_ctl(c("AB", NA_character_, "CD"), 1, carry = TRUE)
  [1] "A" NA  NA 
   3/14 misc.R: hello2.0 <- "\033[42m\thello world\033[m foobar"
   3/14 misc.R: strtrim_ctl(1:3, width = 10)
  [1] "1" "2" "3"
   3/14 misc.R: strtrim_ctl(hello2.0, width = "35")
  Error in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  : 
    Argument `width` must be a positive scalar numeric representable as an integer.
  Calls: unitize_dir ... eval -> eval -> withVisible -> strtrim_ctl -> strtrim2_ctl
   3/14 misc.R: strtrim_ctl(hello2.0, width = NA_integer_)
  Error in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  : 
    Argument `width` must be a positive scalar numeric representable as an integer.
  Calls: unitize_dir ... eval -> eval -> withVisible -> strtrim_ctl -> strtrim2_ctl
   3/14 misc.R: strtrim_ctl(hello2.0, width = 10, warn = NULL)
  Error in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> strtrim_ctl -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim_ctl(hello2.0, width = 10, ctl = 0)
  Error in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... withVisible -> strtrim_ctl -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim_ctl(hello2.0, width = 10, ctl = "bananas")
  Error in strtrim2_ctl(x = x, width = width, warn = warn, ctl = ctl, normalize = normalize,  : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... withVisible -> strtrim_ctl -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(1:3, width = 10)
  [1] "1" "2" "3"
   3/14 misc.R: strtrim2_ctl(hello2.0, width = "35")
  Error in strtrim2_ctl(hello2.0, width = "35") : 
    Argument `width` must be a positive scalar numeric representable as an integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strtrim2_ctl
   3/14 misc.R: strtrim2_ctl(hello2.0, width = NA_integer_)
  Error in strtrim2_ctl(hello2.0, width = NA_integer_) : 
    Argument `width` must be a positive scalar numeric representable as an integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strtrim2_ctl
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, warn = NULL)
  Error in strtrim2_ctl(hello2.0, width = 10, warn = NULL) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, tabs.as.spaces = NA)
  Error in strtrim2_ctl(hello2.0, width = 10, tabs.as.spaces = NA) : 
    Argument `tabs.as.spaces` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, tabs.as.spaces = 1:3)
  Error in strtrim2_ctl(hello2.0, width = 10, tabs.as.spaces = 1:3) : 
    Argument `tabs.as.spaces` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, tab.stops = -(1:3))
  Error in strtrim2_ctl(hello2.0, width = 10, tab.stops = -(1:3)) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, tab.stops = 0)
  Error in strtrim2_ctl(hello2.0, width = 10, tab.stops = 0) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, ctl = 0)
  Error in strtrim2_ctl(hello2.0, width = 10, ctl = 0) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: strtrim2_ctl(hello2.0, width = 10, ctl = "bananas")
  Error in strtrim2_ctl(hello2.0, width = 10, ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> strtrim2_ctl -> VAL_IN_ENV -> stop2
   3/14 misc.R: unitizer_sect("enc check", {
   3/14 misc.R: x <- y <- "He\x9f"
   3/14 misc.R: Encoding(x) <- "latin1"
   3/14 misc.R: fansi:::check_enc(x, 1)
  Error in fansi:::check_enc(x, 1) : 
    Internal Error: unexpected encoding 2 encountered at index 1. Contact maintainer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: Encoding(y) <- "bytes"
   3/14 misc.R: fansi:::check_enc(y, 1)
  Error in fansi:::check_enc(y, 1) : 
    Byte encoded string encountered at index 1. Byte encoded strings are not supported.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: fansi:::check_enc("hello", 1)
  [1] TRUE
   3/14 misc.R: unitizer_sect("what as int", {
   3/14 misc.R: fansi:::ctl_as_int(c(1, 2, 3, 4, 5))
  [1] 112
   3/14 misc.R: fansi:::ctl_as_int(c(2, 3, 4, 5))
  [1] 15
   3/14 misc.R: fansi:::ctl_as_int(c(1, 2, 3, 9))
  Error in fansi:::ctl_as_int(c(1, 2, 3, 9)) : 
    Internal Error: max ctl value allowed is 6.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: fansi:::ctl_as_int(c(2, 3, 9))
  Error in fansi:::ctl_as_int(c(2, 3, 9)) : 
    Internal Error: max ctl value allowed is 6.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: unitizer_sect("HTML helper", {
   3/14 misc.R: html_esc(character())
  character(0)
   3/14 misc.R: html_esc(1:10)
  Error in html_esc(1:10) : Argument `x` must be character, is integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
   3/14 misc.R: html_esc(NA_character_)
  [1] NA
   3/14 misc.R: html_esc("<he&llo>")
  [1] "&lt;he&amp;llo&gt;"
   3/14 misc.R: html_esc("ow&wo")
  [1] "ow&amp;wo"
   3/14 misc.R: html_esc(c("hello", "wor<ld>s", NA, ""))
  [1] "hello"          "wor&lt;ld&gt;s" NA               ""              
   3/14 misc.R: html_esc(c("he'l\"lo", "wor<ld>s", NA, ""))
  [1] "he&#039;l&quot;lo" "wor&lt;ld&gt;s"    NA                 
  [4] ""                 
   3/14 misc.R: html_esc("<<<<")
  [1] "&lt;&lt;&lt;&lt;"
   3/14 misc.R: html_esc("<123hello>")
  [1] "&lt;123hello&gt;"
   3/14 misc.R: txt <- c("day > night", "hello world")
   3/14 misc.R: html_code_block(character())
  [1] "<PRE class=\"fansi-output\"><CODE></CODE></PRE>"
   3/14 misc.R: html_code_block(txt)
  [1] "<PRE class=\"fansi-output\"><CODE>day > night\nhello world</CODE></PRE>"
   3/14 misc.R: html_code_block(1:10)
  Error in html_code_block(1:10) : 
    Argument `x` must be character, is integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_code_block
   3/14 misc.R: html_code_block(txt, class = c("not-fansi", "plain"))
  [1] "<PRE class=\"not-fansi plain\"><CODE>day > night\nhello world</CODE></PRE>"
   3/14 misc.R: html_code_block(txt, class = NULL)
  Error in html_code_block(txt, class = NULL) : 
    Argument `class` must be character, is NULL.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_code_block
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "<>")
  [1] "h&e'l\"lo"      "wor&lt;ld&gt;s" NA               ""              
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "><")
  [1] "h&e'l\"lo"      "wor&lt;ld&gt;s" NA               ""              
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "<&>")
  [1] "h&amp;e'l\"lo"  "wor&lt;ld&gt;s" NA               ""              
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'<&>")
  [1] "h&amp;e&#039;l\"lo" "wor&lt;ld&gt;s"     NA                  
  [4] ""                  
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'<&>\"")
  [1] "h&amp;e&#039;l&quot;lo" "wor&lt;ld&gt;s"         NA                      
  [4] ""                      
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'&>\"<")
  [1] "h&amp;e&#039;l&quot;lo" "wor&lt;ld&gt;s"         NA                      
  [4] ""                      
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "")
  [1] "h&e'l\"lo" "wor<ld>s"  NA          ""         
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'<&>\"<")
  [1] "h&amp;e&#039;l&quot;lo" "wor&lt;ld&gt;s"         NA                      
  [4] ""                      
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), character())
  Error in html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), character()) : 
    Argument `what` must be scalar character and not NA.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), NA_character_)
  Error in html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), NA_character_) : 
    Argument `what` must be scalar character and not NA.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), 1:5)
  Error in html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), 1:5) : 
    Argument `what` must be character, is integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'<&><")
  [1] "h&amp;e&#039;l\"lo" "wor&lt;ld&gt;s"     NA                  
  [4] ""                  
   3/14 misc.R: html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'x><")
  Error in html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), "'x><") : 
    Argument `what` may only contain ASCII characters "&", "<", ">", "'", or "\"".
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
   3/14 misc.R: unitizer_sect("hooks", {
   3/14 misc.R: h.1 <- list(set = function(...) cat("Set hooks: ", names(list(...)
   3/14 misc.R: h.2 <- list(set = function(...) cat("Set hooks: ", names(list(...)
   3/14 misc.R: h.3 <- list(set = function(...) cat("Set hooks: ", names(list(...)
   3/14 misc.R: h.4 <- list(set = function(...) stop("error in set"), get = functi
   3/14 misc.R: set_knit_hooks(list(1, 2))
  Error in set_knit_hooks(list(1, 2)) : 
    Argument `hooks` does not appear to be `knitr::knit_hooks`.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(list(function() NULL, function() NULL))
  Error in set_knit_hooks(list(function() NULL, function() NULL)) : 
    Argument `hooks` does not appear to be `knitr::knit_hooks`.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: res1 <- set_knit_hooks(h.1, .test = TRUE)
  Set hooks:  output 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
   3/14 misc.R: res1[["new.hooks"]][["output"]]("hello")
  [1] "old.hook"
   3/14 misc.R: res1[["new.hooks"]][["output"]]("hello\033[31m world")
  [1] "<PRE class=\"fansi fansi-output\"><CODE>hello<span style='color: #BB0000;'> world</span></CODE></PRE>"
   3/14 misc.R: res1a <- set_knit_hooks(h.1, split.nl = TRUE, .test = TRUE)
  Set hooks:  output 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
   3/14 misc.R: res1a[["new.hooks"]][["output"]]("hello\033[31m wo\nrld")
  [1] "<PRE class=\"fansi fansi-output\"><CODE>hello<span style='color: #BB0000;'> wo</span>\n<span style='color: #BB0000;'>rld</span></CODE></PRE>"
   3/14 misc.R: p.f.2 <- function(x, y) NULL
   3/14 misc.R: p.f.3 <- function(x, class) sprintf("new proc fun, '%s'", class)
   3/14 misc.R: p.f.4 <- function(x, class) stop("new proc fun")
   3/14 misc.R: set_knit_hooks(h.1, split.nl = "banana")
  Error in set_knit_hooks(h.1, split.nl = "banana") : 
    Argument `split.n` must be TRUE or FALSE
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, proc.fun = p.f.2)
  Error in set_knit_hooks(h.1, proc.fun = p.f.2) : 
    Argument `proc.fun` must be a function with formals named `x` and `class`.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, which = "hello")
  Error in set_knit_hooks(h.1, which = "hello") : 
    Argument `which` must be character containing values in c("output", "warning", "error", "message")
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, which = NULL)
  Error in set_knit_hooks(h.1, which = NULL) : 
    Argument `which` must be character containing values in c("output", "warning", "error", "message")
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: res2 <- set_knit_hooks(h.1, which = c("output", "message"), class 
  Set hooks:  output message 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
   3/14 misc.R: res2[["new.hooks"]][["message"]]("hello")
  [1] "old.hook"
   3/14 misc.R: res2[["new.hooks"]][["message"]]("hello\033[31m world")
  [1] "new proc fun, 'f-message'"
   3/14 misc.R: res2[["new.hooks"]][["output"]]("hello\033[31m world")
  [1] "new proc fun, 'f-output'"
   3/14 misc.R: res3 <- set_knit_hooks(h.1, which = c("message", "warning"), 
  Set hooks:  message warning 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
   3/14 misc.R: res3[["new.hooks"]][["warning"]]("hello")
  [1] "old.hook"
   3/14 misc.R: res3[["new.hooks"]][["warning"]]("hello\033[31mworld")
  Error in proc.fun(x = x, class = class) : new proc fun
  Error in res3[["new.hooks"]][["warning"]]("hello\033[31mworld") : 
    Argument `proc.fun` for `set_knit_hooks` caused an error when processing output; see prior error.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   3/14 misc.R: set_knit_hooks(h.2)
  Warning in set_knit_hooks(h.2) :
    Retrieved 'output' hook is not a function; are you sure you passed `knitr::knit_hooks` as the `hooks` argument?  Quitting after setting 0/1 hooks
  Set hooks:  output 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
  $output
  NULL
  
   3/14 misc.R: set_knit_hooks(h.3)
  Error in hooks$get(hook.name) : error in get
  Warning in set_knit_hooks(h.3) :
    Failed retrieving 'output' hook from the knit hooks; are you sure you passed `knitr::knit_hooks` as the `hooks` argument?  Quitting after setting 0/1 hooks
  Set hooks:  output 
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
  $output
  NULL
  
   3/14 misc.R: set_knit_hooks(h.4)
  Error in (function (...)  : error in set
  Warning in set_knit_hooks(h.4) :
    Failure while trying to set hooks; see prior error; are you sure you passed `knitr::knit_hooks` as the `hooks` argument?
  <STYLE type='text/css' scoped>
  PRE.fansi SPAN {padding-top: .25em; padding-bottom: .25em};
  </STYLE>
  $output
  function() "old.hook"
  <environment: 0x0000025741a3fba0>
  
   3/14 misc.R: set_knit_hooks(h.1, style = NULL)
  Error in set_knit_hooks(h.1, style = NULL) : 
    Argument `style` must be character.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, class = 1:10)
  Error in set_knit_hooks(h.1, class = 1:10) : 
    Argument `class` should be a character vector the same length as `which`.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, class = letters)
  Error in set_knit_hooks(h.1, class = letters) : 
    Argument `class` should be a character vector the same length as `which`.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: set_knit_hooks(h.1, which = c("output", "message", "output"))
  Error in set_knit_hooks(h.1, which = c("output", "message", "output")) : 
    Argument `which` may not contain duplicate values (output).
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> set_knit_hooks
   3/14 misc.R: unitizer_sect("output funs", {
   3/14 misc.R: fansi_lines(1:3)
  [1] "\033[37;48;5;18m1\033[39;49m" "\033[37;48;5;19m2\033[39;49m"
  [3] "\033[37;48;5;20m3\033[39;49m"
   3/14 misc.R: fansi_lines(1:3, step = "hello")
  Error in fansi_lines(1:3, step = "hello") : 
    Argument `step` must be a strictly positive scalar integer.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> fansi_lines
   3/14 misc.R: capture.output(fwl("\033[43mhello"))
  [1] "\033[43mhello" "<END>\033[0m" 
   3/14 misc.R: unitizer_sect("validation", {
   3/14 misc.R: fansi:::VAL_IN_ENV(booboo = "error")
  Error in fansi:::VAL_IN_ENV(booboo = "error") : 
    Internal Error: some arguments to validate unknown
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
  
   4/14 nchar.R: 
   4/14 nchar.R: library(fansi)
   4/14 nchar.R: unitizer_sect("basic tests", {
   4/14 nchar.R: nchar_ctl(c("hello", "world"))
  [1] 5 5
   4/14 nchar.R: nchar_ctl(c("hello", "world"), type = "width")
  [1] 5 5
   4/14 nchar.R: nchar_ctl(c("hello", "world"), type = "wi")
  [1] 5 5
   4/14 nchar.R: na.world <- c("hello", NA, "world", "")
   4/14 nchar.R: identical(nchar_ctl(na.world), nchar(na.world))
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, keepNA = FALSE), nchar(na.world, 
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, keepNA = NA, type = "width"), nchar
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, keepNA = TRUE, type = "width"), 
  [1] TRUE
   4/14 nchar.R: identical(nzchar_ctl(na.world), nzchar(na.world))
  [1] TRUE
   4/14 nchar.R: identical(nzchar_ctl(na.world, keepNA = TRUE), nzchar(na.world, 
  [1] TRUE
   4/14 nchar.R: identical(nzchar_ctl(na.world, keepNA = NA), nzchar(na.world, 
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, type = "bytes"), nchar(na.world, 
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, keepNA = FALSE, type = "bytes"), 
  [1] TRUE
   4/14 nchar.R: identical(nchar_ctl(na.world, keepNA = TRUE, type = "bytes"), 
  [1] TRUE
   4/14 nchar.R: w.names <- c(a = "hello", b = "world")
   4/14 nchar.R: identical(nchar_ctl(w.names), nchar(w.names))
  [1] TRUE
   4/14 nchar.R: w.dim <- matrix(letters[1:6], 2, 3, dimnames = list(X = LETTERS[2
   4/14 nchar.R: identical(nchar_ctl(w.dim), nchar(w.dim))
  [1] TRUE
   4/14 nchar.R: hw.sgr <- c("hello", "wo\033[42mrld", "\033[31m", "mo\non", "star
   4/14 nchar.R: identical(nchar_ctl(hw.sgr), nchar(strip_ctl(hw.sgr)))
  [1] TRUE
   4/14 nchar.R: x <- "\xf0"
   4/14 nchar.R: if (isTRUE(l10n_info()[["UTF-8"]])) {
  [1] TRUE
   4/14 nchar.R: Encoding(x) <- "UTF-8"
   4/14 nchar.R: identical(nzchar_ctl(x), nzchar(x))
  [1] TRUE
   4/14 nchar.R: nchar_ctl(x)
  Error in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> nchar_ctl_internal
   4/14 nchar.R: nchar_ctl(c("", x))
  Error in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [2], see `?unhandled_ctl`.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> nchar_ctl_internal
   4/14 nchar.R: identical(nchar_ctl(x, allowNA = TRUE), nchar(x, allowNA = TRUE))
  [1] TRUE
   4/14 nchar.R: unitizer_sect("with escapes", {
   4/14 nchar.R: esc.2 <- "\n\r\033P\033[31m\a"
   4/14 nchar.R: nchar_ctl(esc.2)
  [1] 0
   4/14 nchar.R: nchar_ctl(esc.2, warn = FALSE)
  [1] 0
   4/14 nchar.R: nzchar_ctl(esc.2)
  [1] FALSE
   4/14 nchar.R: nzchar_ctl(esc.2, warn = FALSE)
  [1] FALSE
   4/14 nchar.R: nchar_ctl("\033[31#mworld", ctl = "sgr")
  [1] 5
   4/14 nchar.R: nchar_ctl("\033[31#mworld", ctl = "csi")
  [1] 11
   4/14 nchar.R: unitizer_sect("ctl", {
   4/14 nchar.R: esc.3 <- "\n\t\033[31m\033[41!m\033p"
   4/14 nchar.R: nzchar_ctl(esc.3, warn = FALSE)
  [1] FALSE
   4/14 nchar.R: nzchar_ctl(sprintf("%sa", esc.3), warn = FALSE)
  [1] TRUE
   4/14 nchar.R: nzchar_ctl(esc.3, ctl = c("sgr", "csi", "esc"), warn = FALSE)
  [1] TRUE
   4/14 nchar.R: nzchar_ctl(esc.3, ctl = c("c0", "nl"), warn = FALSE)
  [1] TRUE
   4/14 nchar.R: nzchar_ctl("\n\t\n", ctl = c("nl"), warn = FALSE)
  [1] TRUE
   4/14 nchar.R: nzchar_ctl("\t\n", ctl = c("nl"), warn = FALSE)
  [1] TRUE
   4/14 nchar.R: unitizer_sect("corner cases", {
   4/14 nchar.R: ncbad <- c("\033\x80", "\033[31;\x80m", "\033[31;\x80p", "\033]8;
   4/14 nchar.R: Encoding(ncbad) <- "UTF-8"
   4/14 nchar.R: nchar_ctl(ncbad)
  [1] 0 0 0 0 0
   4/14 nchar.R: fansi:::set_rver(numeric_version("3.2.1"))
   4/14 nchar.R: nzchar_ctl(c("\033[31mA", "\033[31m"))
  [1]  TRUE FALSE
   4/14 nchar.R: nchar_ctl(c("\033[31mA", "\033[31m"))
  [1] 1 0
   4/14 nchar.R: fansi:::set_rver()
   4/14 nchar.R: unitizer_sect("bad inputs", {
   4/14 nchar.R: nchar_ctl(9:10, warn = 1:3)
  Error in nchar_ctl(9:10, warn = 1:3) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", allowNA = 1:3)
  Error in nchar_ctl("hello\033[31m world", allowNA = 1:3) : 
    Argument `allowNA` must be interpretable as a scalar logical.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", keepNA = 1:3)
  Error in nchar_ctl("hello\033[31m world", keepNA = 1:3) : 
    Argument `keepNA` must be interpretable as a scalar logical.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", strip = 1:3)
  Parameter `strip` has been deprecated; use `ctl` instead.
  Error in nchar_ctl("hello\033[31m world", strip = 1:3) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", ctl = "bananas")
  Error in nchar_ctl("hello\033[31m world", ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", type = NA_character_)
  Error in nchar_ctl("hello\033[31m world", type = NA_character_) : 
    Argument `type` must partial match one of c("chars", "width", "graphemes", "bytes")
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", type = 1)
  Error in nchar_ctl("hello\033[31m world", type = 1) : 
    Argument `type` must partial match one of c("chars", "width", "graphemes", "bytes")
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nchar_ctl("hello\033[31m world", type = "bananas")
  Error in nchar_ctl("hello\033[31m world", type = "bananas") : 
    Argument `type` must partial match one of c("chars", "width", "graphemes", "bytes")
  Calls: unitize_dir ... eval -> withVisible -> nchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nzchar_ctl(9:10, warn = 1:3)
  Error in nzchar_ctl(9:10, warn = 1:3) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> nzchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nzchar_ctl("hello\033[31m world", keepNA = 1:3)
  Error in nzchar_ctl("hello\033[31m world", keepNA = 1:3) : 
    Argument `keepNA` must be interpretable as a scalar logical.
  Calls: unitize_dir ... eval -> withVisible -> nzchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nzchar_ctl("hello\033[31m world", ctl = 1)
  Error in nzchar_ctl("hello\033[31m world", ctl = 1) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> nzchar_ctl -> VAL_IN_ENV -> stop2
   4/14 nchar.R: nzchar_ctl("hello\033[31m world", ctl = "bananas")
  Error in nzchar_ctl("hello\033[31m world", ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> nzchar_ctl -> VAL_IN_ENV -> stop2
  
   5/14 normalize.R: 
   5/14 normalize.R: library(fansi)
   5/14 normalize.R: unitizer_sect("no expansion", {
   5/14 normalize.R: normalize_state("A\033[31mB")
  [1] "A\033[31mB"
   5/14 normalize.R: normalize_state("\033[31mAB")
  [1] "\033[31mAB"
   5/14 normalize.R: normalize_state("AB\033[31m")
  [1] "AB\033[31m"
   5/14 normalize.R: normalize_state(c("A\033[31mB", "AB"))
  [1] "A\033[31mB" "AB"        
   5/14 normalize.R: normalize_state(c("\033[31mAB", "AB"))
  [1] "\033[31mAB" "AB"        
   5/14 normalize.R: normalize_state(c("AB\033[31m", "AB"))
  [1] "AB\033[31m" "AB"        
   5/14 normalize.R: unitizer_sect("simple expansion", {
   5/14 normalize.R: normalize_state(c("A\033[31;42mB", "AB"))
  [1] "A\033[31m\033[42mB" "AB"                
   5/14 normalize.R: normalize_state(c("\033[31;42mAB", "AB"))
  [1] "\033[31m\033[42mAB" "AB"                
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", "AB"))
  [1] "AB\033[31m\033[42m" "AB"                
   5/14 normalize.R: normalize_state(c("A\033[31;42mB", "A\033[39;4mB"))
  [1] "A\033[31m\033[42mB" "A\033[4mB"         
   5/14 normalize.R: normalize_state(c("A\033[31;42mB", "\033[39;4mAB"))
  [1] "A\033[31m\033[42mB" "\033[4mAB"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", "A\033[39;4mB"))
  [1] "AB\033[31m\033[42m" "A\033[4mB"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", "A\033[0;4mB"))
  [1] "AB\033[31m\033[42m" "A\033[4mB"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", "AB\033[0;4m"))
  [1] "AB\033[31m\033[42m" "AB\033[4m"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", "\033[0;4mAB"))
  [1] "AB\033[31m\033[42m" "\033[4mAB"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", NA, "\033[0;4mAB"))
  [1] "AB\033[31m\033[42m" NA                   "\033[4mAB"         
   5/14 normalize.R: normalize_state(c("AB\033[31;42m", NA, "\033[0;4mAB"), carry 
  [1] "AB\033[31m\033[42m" NA                   NA                  
   5/14 normalize.R: unitizer_sect("superflous codes", {
   5/14 normalize.R: normalize_state(c("A\033[31;44;38;5;226;36mBC\033[mD"))
  [1] "A\033[36m\033[44mBC\033[39m\033[49mD"
   5/14 normalize.R: normalize_state(c("A\033[31;44;38;5;226;36m\033[0mBCD"))
  [1] "ABCD"
   5/14 normalize.R: unitizer_sect("broad code test", {
   5/14 normalize.R: normalize_state(c("A\033[33;44mB\033[1;3;4mCD\033[mE"))
  [1] "A\033[33m\033[44mB\033[1m\033[3m\033[4mCD\033[22m\033[23m\033[24m\033[39m\033[49mE"
   5/14 normalize.R: normalize_state("A\033[33;44mB\033[1;2;3;4;5;6;7;8;9;11;21;26
  [1] "A\033[33m\033[44mB\033[1m\033[2m\033[3m\033[4m\033[5m\033[6m\033[7m\033[8m\033[9m\033[21m\033[26m\033[51m\033[52m\033[53m\033[60m\033[61m\033[62m\033[63m\033[64m\033[11mC\033[10m\033[22m\033[23m\033[24m\033[25m\033[27m\033[28m\033[29m\033[39m\033[49m\033[50m\033[54m\033[55m\033[65m"
   5/14 normalize.R: unhandled_ctl(normalize_state("A\033[33;44mB\033[1;2;3;4;5;6;
  [1] index      start      stop       error      translated esc       
  <0 rows> (or 0-length row.names)
   5/14 normalize.R: normalize_state("A\033[33;44mB\033[1;2;3;4;5;6;7;8;9;11;21;26
  [1] "A\033[33m\033[44mB\033[39m\033[49mC"
   5/14 normalize.R: normalize_state("A\033[33;44mB\033[1;2;3;4;5;6;7;8;9;11;21;26
  [1] "A\033[33m\033[44mB\033[1m\033[2m\033[3m\033[4m\033[5m\033[6m\033[7m\033[8m\033[9m\033[21m\033[26m\033[51m\033[52m\033[53m\033[60m\033[61m\033[62m\033[63m\033[64m\033[11mC\033[10m\033[22m\033[23m\033[24m\033[25m\033[27m\033[28m\033[29m\033[39m\033[49m\033[50m\033[54m\033[55m\033[65mD"
   5/14 normalize.R: unitizer_sect("errors and warnings", {
   5/14 normalize.R: normalize_state(list(1, 2, 3))
  [1] "1" "2" "3"
   5/14 normalize.R: x <- c("A\033[38;2;100;150;3;36mBC\033[mD")
   5/14 normalize.R: normalize_state(x, term.cap = c("old"))
  Warning in normalize_state(x, term.cap = c("old")) :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "A\033[2m\033[3m\033[36mBC\033[22m\033[23m\033[39mD"
   5/14 normalize.R: normalize_state(x, term.cap = c("bright", "old"))
  Warning in normalize_state(x, term.cap = c("bright", "old")) :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "A\033[2m\033[3m\033[36m\033[100mBC\033[22m\033[23m\033[39m\033[49mD"
   5/14 normalize.R: normalize_state(x, term.cap = character())
  Warning in normalize_state(x, term.cap = character()) :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "A\033[36mBC\033[39mD"
   5/14 normalize.R: normalize_state(x, term.cap = c("bright"))
  Warning in normalize_state(x, term.cap = c("bright")) :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "A\033[36mBC\033[39mD"
   5/14 normalize.R: normalize_state(x, term.cap = c("bright", "256", "truecolor")
  [1] "A\033[36mBC\033[39mD"
   5/14 normalize.R: substr_ctl(x, 1, 2, normalize = "yeah baby")
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `normalize` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   5/14 normalize.R: substr_ctl(x, 1, 2, normalize = NA)
  Error in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  : 
    Argument `normalize` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> VAL_IN_ENV -> stop2
   5/14 normalize.R: unitizer_sect("in functions", {
   5/14 normalize.R: string1 <- "hello \033[33;44mblue world"
   5/14 normalize.R: string2 <- "\033[4;1mgoodbye\033[7m white \033[mmoon"
   5/14 normalize.R: string3 <- c(string1, string2)
   5/14 normalize.R: strwrap_ctl(string1, 11, normalize = TRUE)
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"
  [2] "\033[33m\033[44mworld\033[39m\033[49m"     
   5/14 normalize.R: strwrap_ctl(string2, 11, normalize = TRUE)
  [1] "\033[1m\033[4mgoodbye\033[22m\033[24m"                  
  [2] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
   5/14 normalize.R: strwrap_ctl(string3, 11, normalize = TRUE)
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"             
  [2] "\033[33m\033[44mworld\033[39m\033[49m"                  
  [3] "\033[1m\033[4mgoodbye\033[22m\033[24m"                  
  [4] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
   5/14 normalize.R: strwrap_ctl(string3, 11, normalize = TRUE, simplify = FALSE)
  [[1]]
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"
  [2] "\033[33m\033[44mworld\033[39m\033[49m"     
  
  [[2]]
  [1] "\033[1m\033[4mgoodbye\033[22m\033[24m"                  
  [2] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
  
   5/14 normalize.R: strwrap2_ctl(string3, 11, normalize = TRUE, pad.end = " ")
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"             
  [2] "\033[33m\033[44mworld     \033[39m\033[49m"             
  [3] "\033[1m\033[4mgoodbye\033[7m   \033[22m\033[24m\033[27m"
  [4] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
   5/14 normalize.R: strwrap_sgr(string3, 11, normalize = TRUE)
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"             
  [2] "\033[33m\033[44mworld\033[39m\033[49m"                  
  [3] "\033[1m\033[4mgoodbye\033[22m\033[24m"                  
  [4] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
   5/14 normalize.R: strwrap2_sgr(string3, 11, normalize = TRUE, pad.end = " ")
  [1] "hello \033[33m\033[44mblue\033[39m\033[49m"             
  [2] "\033[33m\033[44mworld     \033[39m\033[49m"             
  [3] "\033[1m\033[4mgoodbye\033[7m   \033[22m\033[24m\033[27m"
  [4] "\033[1m\033[4m\033[7mwhite \033[22m\033[24m\033[27mmoon"
   5/14 normalize.R: strtrim_sgr(string3, 8, normalize = TRUE)
  [1] "hello \033[33m\033[44mbl\033[39m\033[49m"             
  [2] "\033[1m\033[4mgoodbye\033[7m \033[22m\033[24m\033[27m"
   5/14 normalize.R: strtrim_sgr(string3, 8, normalize = TRUE)
  [1] "hello \033[33m\033[44mbl\033[39m\033[49m"             
  [2] "\033[1m\033[4mgoodbye\033[7m \033[22m\033[24m\033[27m"
   5/14 normalize.R: substr_ctl("\033[33;44mhello\033[m world", 3, 8, normalize = 
  [1] "\033[33m\033[44mllo\033[39m\033[49m wo"
   5/14 normalize.R: substr2_ctl("\033[33;44mhello\033[m world", 3, 8, normalize =
  [1] "\033[33m\033[44mllo\033[39m\033[49m wo"
   5/14 normalize.R: substr_sgr("\033[33;44mhello\033[m world", 3, 8, normalize = 
  [1] "\033[33m\033[44mllo\033[39m\033[49m wo"
   5/14 normalize.R: substr2_sgr("\033[33;44mhello\033[m world", 3, 8, normalize =
  [1] "\033[33m\033[44mllo\033[39m\033[49m wo"
   5/14 normalize.R: substr_ctl(string3, c(3, 3), c(8, 15), normalize = TRUE)
  [1] "llo \033[33m\033[44mbl\033[39m\033[49m"                    
  [2] "\033[1m\033[4modbye\033[7m white \033[22m\033[24m\033[27mm"
   5/14 normalize.R: strsplit_ctl(string3, " ", normalize = TRUE)
  [[1]]
  [1] "hello"                                
  [2] "\033[33m\033[44mblue\033[39m\033[49m" 
  [3] "\033[33m\033[44mworld\033[39m\033[49m"
  
  [[2]]
  [1] "\033[1m\033[4mgoodbye\033[22m\033[24m"             
  [2] "\033[1m\033[4m\033[7mwhite\033[22m\033[24m\033[27m"
  [3] "moon"                                              
  
  
   6/14 overflow.R: 
   6/14 overflow.R: library(fansi)
   6/14 overflow.R: old_max <- fansi:::set_int_max(15)
   6/14 overflow.R: unitizer_sect("tabs", {
   6/14 overflow.R: tabs_as_spaces("\t1234567")
  [1] "        1234567"
   6/14 overflow.R: tryCatch(tabs_as_spaces("\t12345678"), error = conditionMessag
  [1] "Converting tabs to spaces will cause string to be longer than allowed INT_MAX."
   6/14 overflow.R: invisible(fansi:::set_int_max(12))
   6/14 overflow.R: tabs_as_spaces(c("\t", "\t123"))
  [1] "        "    "        123"
   6/14 overflow.R: unitizer_sect("wrap", {
   6/14 overflow.R: invisible(fansi:::set_int_max(15))
   6/14 overflow.R: string <- "0123456789"
   6/14 overflow.R: strwrap_ctl(string, 16)
  [1] "0123456789"
   6/14 overflow.R: strwrap2_ctl(string, 16, pad.end = " ")
  [1] "0123456789     "
   6/14 overflow.R: tce(strwrap2_ctl(string, 17, pad.end = " "))
  [1] "Adding padding will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: strwrap_ctl(string, 16, prefix = "-----")
  [1] "-----0123456789"
   6/14 overflow.R: tce(strwrap_ctl(string, 16, prefix = "------"))
  [1] "Adding prefix characters will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: strwrap_ctl(string, 16, indent = 5)
  [1] "     0123456789"
   6/14 overflow.R: tce(strwrap_ctl(string, 16, indent = 6))
  [1] "Adding prefix characters will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: strwrap_ctl(string, 16, indent = 2, prefix = "---")
  [1] "---  0123456789"
   6/14 overflow.R: tce(strwrap_ctl(string, 16, indent = 3, prefix = "---"))
  [1] "Adding prefix characters will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: string2 <- "012345678901234"
   6/14 overflow.R: string3 <- "0123456789012345"
   6/14 overflow.R: strwrap_ctl(string2, 16)
  [1] "012345678901234"
   6/14 overflow.R: tce(strwrap_ctl(string3, 16))
  [1] "Strings longer than INT_MAX not supported (length 16 at index 1)."
   6/14 overflow.R: string4 <- "\033[31m0123456789"
   6/14 overflow.R: tce(strwrap_ctl(string4, 16))
  [1] "Generating closing SGR will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: invisible(fansi:::set_int_max(9))
   6/14 overflow.R: tce(strwrap_ctl("A\033[31m a", 5))
  [1] "Generating closing SGR will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: unitizer_sect("html", {
   6/14 overflow.R: invisible(fansi:::set_int_max(38))
   6/14 overflow.R: sgr_to_html("\033[31ma")
  [1] "<span style='color: #BB0000;'>a</span>"
   6/14 overflow.R: tce(sgr_to_html("\033[31mab"))
  [1] "Expanding SGR sequences to HTML will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: tce(sgr_to_html("\033[31m\033[42mhello"))
  [1] "Expanding SGR sequences to HTML will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: invisible(fansi:::set_int_max(57))
   6/14 overflow.R: tce(sgr_to_html("\033[31m\033[42mhello", classes = TRUE))
  [1] "Expanding SGR sequences to HTML will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: invisible(fansi:::set_int_max(58))
   6/14 overflow.R: (x <- sgr_to_html("\033[31m\033[42mhello", classes = TRUE))
  [1] "<span class='fansi-color-001 fansi-bgcol-002'>hello</span>"
   6/14 overflow.R: nchar(x)
  [1] 58
   6/14 overflow.R: invisible(fansi:::set_int_max(4))
   6/14 overflow.R: tce(sgr_to_html("hello"))
  [1] "Strings longer than INT_MAX not supported (length 5 at index 1)."
   6/14 overflow.R: tce(html_esc("hello"))
  [1] "Strings longer than INT_MAX not supported (length 5 at index 1)."
   6/14 overflow.R: tce(html_esc("<"))
  [1] "&lt;"
   6/14 overflow.R: tce(html_esc("<!"))
  [1] "Internal Error: max allowed buffer size is INT_MAX + 1. (req: 6 vs lim: 5), in FANSI_esc_html."
   6/14 overflow.R: tce(html_esc("&"))
  [1] "Escaping HTML special characters will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: tce(html_esc("'"))
  [1] "Escaping HTML special characters will create string longer than INT_MAX at index [1]. Try again with smaller strings."
   6/14 overflow.R: unitizer_sect("unhandled", {
   6/14 overflow.R: invisible(fansi:::set_int_max(10))
   6/14 overflow.R: string <- paste0(rep("\a", 10), collapse = "")
   6/14 overflow.R: unhandled_ctl(string)
     index start stop error translated esc
  1      1     1    1    C0      FALSE  \a
  2      1     2    2    C0      FALSE  \a
  3      1     3    3    C0      FALSE  \a
  4      1     4    4    C0      FALSE  \a
  5      1     5    5    C0      FALSE  \a
  6      1     6    6    C0      FALSE  \a
  7      1     7    7    C0      FALSE  \a
  8      1     8    8    C0      FALSE  \a
  9      1     9    9    C0      FALSE  \a
  10     1    10   10    C0      FALSE  \a
   6/14 overflow.R: tcw(unhandled_ctl(c("\a", string)))
  [1] "There are more than INT_MAX unhandled sequences, returning first INT_MAX errors."
   6/14 overflow.R: suppressWarnings(unhandled_ctl(c("\a", string)))
     index start stop error translated esc
  1      1     1    1    C0      FALSE  \a
  2      2     1    1    C0      FALSE  \a
  3      2     2    2    C0      FALSE  \a
  4      2     3    3    C0      FALSE  \a
  5      2     4    4    C0      FALSE  \a
  6      2     5    5    C0      FALSE  \a
  7      2     6    6    C0      FALSE  \a
  8      2     7    7    C0      FALSE  \a
  9      2     8    8    C0      FALSE  \a
  10     2     9    9    C0      FALSE  \a
   6/14 overflow.R: unitizer_sect("size buffer", {
   6/14 overflow.R: invisible(fansi:::set_int_max(old_max))
   6/14 overflow.R: fansi:::size_buff(c(0L, 127L, 128L, 64L, 200L, 1024L))
  [1]  128  128  256  256  256 1025
   6/14 overflow.R: fansi:::size_buff(c(0L, 127L, -128L))
  Error in fansi:::size_buff(c(0L, 127L, -128L)) : 
    Internal Error: negative buffer allocations disallowed in FANSI_size_buff_ext.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   6/14 overflow.R: invisible(fansi:::set_int_max(130))
   6/14 overflow.R: fansi:::size_buff(c(0L, 127L, 128L, 64L, 200L, 1024L))
  Error in fansi:::size_buff(c(0L, 127L, 128L, 64L, 200L, 1024L)) : 
    Internal Error: max allowed buffer size is INT_MAX + 1. (req: 201 vs lim: 131), in FANSI_size_buff_ext.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   6/14 overflow.R: invisible(fansi:::set_int_max(64))
   6/14 overflow.R: fansi:::size_buff(c(0L, 32L, 63L, 64L))
  [1]  1 33 65 65
   6/14 overflow.R: fansi:::size_buff(c(0L, 32L, 63L, 65L))
  Error in fansi:::size_buff(c(0L, 32L, 63L, 65L)) : 
    Internal Error: max allowed buffer size is INT_MAX + 1. (req: 66 vs lim: 65), in FANSI_size_buff_ext.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
   6/14 overflow.R: invisible(fansi:::set_int_max(old_max))
   6/14 overflow.R: dat <- fansi:::size_buff_prot_test()
  Warning in fansi:::size_buff_prot_test() :
    Unable to release buffer allocated by FANSI_size_buff_prot_test while in native code. Buffer will be released on return to R.
  Warning in fansi:::size_buff_prot_test() :
    Unable to release buffer allocated by FANSI_size_buff_prot_test while in native code. Buffer will be released on return to R.
   6/14 overflow.R: dat["first", "self"] == dat["smaller 1.0", "self"]
  [1] TRUE
   6/14 overflow.R: dat["new buff", "prev"] == dat["grow 1.0", "self"]
  [1] TRUE
   6/14 overflow.R: dat["new buff", "prev"] != dat["new buff", "self"]
  [1] TRUE
   6/14 overflow.R: dat["smaller 1.1", "self"] == dat["grow 1.0", "self"]
  [1] TRUE
   6/14 overflow.R: dat["smaller 2.0", "self"] == dat["new buff", "self"]
  [1] TRUE
   6/14 overflow.R: dat["smaller 2.0", "prev"] == dat["new buff", "prev"]
  [1] TRUE
   6/14 overflow.R: dat["smaller 2.0", "prev"] == dat["grow 2.0", "prev"]
  [1] TRUE
   6/14 overflow.R: dat["grow 1.1", "prev"] == dat["grow 2.0", "self"]
  [1] TRUE
   6/14 overflow.R: dat["grow 2.1", "prev"] == dat["grow 1.1", "self"]
  [1] TRUE
   6/14 overflow.R: unitizer_sect("misc", {
   6/14 overflow.R: invisible(fansi:::set_int_max(5))
   6/14 overflow.R: substr_ctl("\033[43mA B", 5, 5)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Strings longer than INT_MAX not supported (length 8 at index 1).
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
   6/14 overflow.R: substr_ctl("12345", 1, 5)
  [1] "12345"
   6/14 overflow.R: substr_ctl("123456", 1, 6)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Strings longer than INT_MAX not supported (length 6 at index 1).
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
   6/14 overflow.R: fansi:::reset_limits()
  [1] TRUE
   6/14 overflow.R: unitizer_sect("R_len_t", {
   6/14 overflow.R: old_rlent <- fansi:::set_rlent_max(5)
   6/14 overflow.R: tabs_as_spaces("A\tB")
  Error in tabs_as_spaces("A\tB") : 
    Attempting to create CHARSXP longer than R_LEN_T_MAX at index [1].
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> tabs_as_spaces
   6/14 overflow.R: new_rlent <- fansi:::set_rlent_max(old_rlent)
   6/14 overflow.R: fansi:::reset_limits()
  [1] TRUE
   6/14 overflow.R: unitizer_sect("internal", {
   6/14 overflow.R: tce(.Call(fansi:::FANSI_buff_test_reset))
  [1] "Internal Error: attempt to size buffer w/o reset in FANSI_buff_test_reset."
   6/14 overflow.R: tce(.Call(fansi:::FANSI_buff_test_copy_overflow))
  [1] "Internal Error: exceeded target buffer size in _copy."
   6/14 overflow.R: tce(.Call(fansi:::FANSI_buff_test_mcopy_overflow))
  [1] "Internal Error: exceeded target buffer size in _mcopy."
   6/14 overflow.R: tce(.Call(fansi:::FANSI_buff_test_fill_overflow))
  [1] "Internal Error: exceeded allocated buffer in _fill."
  
   7/14 strip.R: 
   7/14 strip.R: library(fansi)
   7/14 strip.R: unitizer_sect("Strip ansi", {
   7/14 strip.R: strip_ctl(sprintf("hello %sworld%s", red, end))
  [1] "hello world"
   7/14 strip.R: strip_ctl(sprintf("he%sllo %sworld", red, end))
  [1] "hello world"
   7/14 strip.R: strip_ctl(sprintf("%shello %sworld%s", grn.bg, red, end))
  [1] "hello world"
   7/14 strip.R: strip_ctl(sprintf("%s%shello %sworld%s", grn.bg, inv, red, end))
  [1] "hello world"
   7/14 strip.R: string <- paste("string", format(1:10))
   7/14 strip.R: string[c(2, 4, 6)] <- paste0(red, string[c(2, 4, 6)], end)
   7/14 strip.R: strip_ctl(string)
   [1] "string  1" "string  2" "string  3" "string  4" "string  5" "string  6"
   [7] "string  7" "string  8" "string  9" "string 10"
   7/14 strip.R: strip_sgr(string)
   [1] "string  1" "string  2" "string  3" "string  4" "string  5" "string  6"
   [7] "string  7" "string  8" "string  9" "string 10"
   7/14 strip.R: strip_sgr(1:3)
  [1] "1" "2" "3"
   7/14 strip.R: unitizer_sect("Corner cases", {
   7/14 strip.R: strip_ctl("hello\033")
  Warning in strip_ctl("hello\033") :
    Argument `x` contains a malformed escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"
   7/14 strip.R: strip_ctl("hello\033", ctl = c("nl", "c0"))
  [1] "hello\033"
   7/14 strip.R: strip_ctl("hello\033[")
  Warning in strip_ctl("hello\033[") :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"
   7/14 strip.R: strip_ctl("hello\033[42")
  Warning in strip_ctl("hello\033[42") :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"
   7/14 strip.R: strip_ctl("hello\033[42", ctl = c("all", "csi", "sgr"))
  [1] "hello42"
   7/14 strip.R: strip_ctl("hello\033[31##3m illegal")
  [1] "hello illegal"
   7/14 strip.R: strip_ctl("hello\033[31##m legal")
  [1] "hello legal"
   7/14 strip.R: strip_ctl(1:3)
  [1] "1" "2" "3"
   7/14 strip.R: unitizer_sect("Whitespace", {
   7/14 strip.R: fansi:::process("hello     world")
  [1] "hello world"
   7/14 strip.R: fansi:::process("hello.    world")
  [1] "hello.  world"
   7/14 strip.R: fansi:::process(c("hello     world", "hello.    world"))
  [1] "hello world"   "hello.  world"
   7/14 strip.R: fansi:::process("hello.   world?   moon!   wow.")
  [1] "hello.  world?  moon!  wow."
   7/14 strip.R: fansi:::process("  hello")
  [1] "hello"
   7/14 strip.R: fansi:::process("  hello\n  world")
  [1] "hello world"
   7/14 strip.R: fansi:::process("  hello  \n  world")
  [1] "hello world"
   7/14 strip.R: fansi:::process("  hello world\n  ")
  [1] "hello world"
   7/14 strip.R: fansi:::process("hello.   ")
  [1] "hello."
   7/14 strip.R: fansi:::process("hello!  ")
  [1] "hello!"
   7/14 strip.R: fansi:::process("hello? ")
  [1] "hello?"
   7/14 strip.R: fansi:::process("hello? ")
  [1] "hello?"
   7/14 strip.R: fansi:::process(" \t hello")
  [1] "hello"
   7/14 strip.R: fansi:::process(" \t\a\r hello")
  [1] "\a\rhello"
   7/14 strip.R: fansi:::process(" \t\a\r hello", ctl = c("all", "c0"))
  [1] "\a\r hello"
   7/14 strip.R: fansi:::process("hello.  \r world.")
  [1] "hello.  \rworld."
   7/14 strip.R: fansi:::process("hello.  \033[31m world.\033[0m")
  [1] "hello.  \033[31mworld.\033[0m"
   7/14 strip.R: str1 <- c("hello ", " world")
   7/14 strip.R: fansi:::process(str1)
  [1] "hello" "world"
   7/14 strip.R: str1
  [1] "hello " " world"
   7/14 strip.R: fansi:::process("hello.\n\nworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\n\nworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\n\n\nworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n  \nworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\t\nworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\t\n\tworld")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n \t \n \t world")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\nworld\n\n")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\nworld\n\n  ")
  [1] "hello.\n\nworld"
   7/14 strip.R: fansi:::process("\n\nhello.\n\t\n\tworld\n\t\n woohoo\n ")
  [1] "\n\nhello.\n\nworld\n\nwoohoo"
   7/14 strip.R: fansi:::process("\n \t\nhello.\n\t\n\tworld\n\t\n woohoo\n ")
  [1] "\n\nhello.\n\nworld\n\nwoohoo"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\nworld")
  [1] "hello.\n\n\033[44mworld"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\n \t\nworld")
  [1] "hello.\n\n\033[44mworld"
   7/14 strip.R: fansi:::process("hello.\033[44m\n\n \t\nworld")
  [1] "hello.\033[44m\n\nworld"
   7/14 strip.R: fansi:::process("hello.\n\n \t\n\033[44mworld")
  [1] "hello.\n\n\033[44mworld"
   7/14 strip.R: fansi:::process("hello.\n\n\033[44m \t\nworld")
  [1] "hello.\n\n\033[44mworld"
   7/14 strip.R: fansi:::process("hello \033[44m world")
  [1] "hello \033[44mworld"
   7/14 strip.R: fansi:::process("hello. \033[44m world")
  [1] "hello.  \033[44mworld"
   7/14 strip.R: fansi:::process("hello\033[44m\033[31m world")
  [1] "hello\033[44m\033[31m world"
   7/14 strip.R: fansi:::process("hello\033[44m\033[31m\n\nworld")
  [1] "hello\033[44m\033[31m\n\nworld"
   7/14 strip.R: fansi:::process("hello\n\033[44m\033[31m\nworld")
  [1] "hello\n\n\033[44m\033[31mworld"
   7/14 strip.R: fansi:::process("hello\n\n\033[44m\033[31mworld")
  [1] "hello\n\n\033[44m\033[31mworld"
   7/14 strip.R: fansi:::process("hello\033[44m\033[31d world")
  [1] "hello\033[44m\033[31d world"
   7/14 strip.R: fansi:::process("hello \033[44m\033[31d world")
  [1] "hello \033[44m\033[31dworld"
   7/14 strip.R: fansi:::process("hello \033[44m \033[31d world")
  [1] "hello \033[44m\033[31dworld"
   7/14 strip.R: fansi:::process("hello\033[44m\033[31d world", ctl = c("all", 
  [1] "hello\033[44m\033[31d world"
   7/14 strip.R: fansi:::process("hello \033[44m\033[31d world", ctl = c("all", 
  [1] "hello \033[44m\033[31d world"
   7/14 strip.R: fansi:::process("hello \033[44m \033[31d world", ctl = c("all", 
  [1] "hello \033[44m\033[31d world"
   7/14 strip.R: fansi:::process("hello\033[44m\a world", ctl = c("all"))
  [1] "hello\033[44m\a world"
   7/14 strip.R: fansi:::process("hello\033[44m\a world", ctl = c("all", "c0"))
  [1] "hello\033[44m\a world"
   7/14 strip.R: fansi:::process("hello.  \033[44m\a world", ctl = c("all"))
  [1] "hello.  \033[44m\aworld"
   7/14 strip.R: fansi:::process("hello.  \033[44m\a world", ctl = c("all", "c0"))
  [1] "hello.  \033[44m\a world"
   7/14 strip.R: fansi:::process("hello. \033[44m \a world", ctl = c("all"))
  [1] "hello.  \033[44m\aworld"
   7/14 strip.R: fansi:::process("hello. \033[44m \a world", ctl = c("all", "c0"))
  [1] "hello.  \033[44m\a world"
   7/14 strip.R: fansi:::process("hello.\n\033[44m \a world", ctl = c("all"))
  [1] "hello.  \033[44m\aworld"
   7/14 strip.R: fansi:::process("hello.\n\033[44m \a world", ctl = c("all", "c0")
  [1] "hello.  \033[44m\a world"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\n\a world", ctl = c("all"))
  [1] "hello.\n\n\033[44m\aworld"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\n\a world", ctl = c("all", 
  [1] "hello.\n\n\033[44m\a world"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\a\n world", ctl = c("all"))
  [1] "hello.\n\n\033[44m\aworld"
   7/14 strip.R: fansi:::process("hello.\n\033[44m\a\n world", ctl = c("all", 
  [1] "hello. \033[44m\a world"
   7/14 strip.R: unitizer_sect("Selective stripping", {
   7/14 strip.R: string.0 <- "hello\033k\033[45p world\n\033[31mgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.0)
  [1] "hello worldgoodbye moon"
   7/14 strip.R: strip_ctl(string.0, "sgr")
  [1] "hello\033k\033[45p world\ngoodbye\a moon"
   7/14 strip.R: strip_ctl(string.0, c("nl", "c0", "sgr", "csi", "esc"))
  [1] "hello worldgoodbye moon"
   7/14 strip.R: strip_ctl(string.0, "all")
  [1] "hello worldgoodbye moon"
   7/14 strip.R: strip_ctl(string.0, c("c0", "esc"))
  [1] "hello45p world\n31mgoodbye moon"
   7/14 strip.R: strip_ctl(string.0, c("nl"))
  [1] "hello\033k\033[45p world\033[31mgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.0, character())
  [1] "hello\033k\033[45p world\n\033[31mgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.0, c("all", "c0", "esc"))
  [1] "hello\033k worldgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.0, c("all", "sgr"))
  [1] "hello world\033[31mgoodbye moon"
   7/14 strip.R: string.1 <- "hello\033\033[45p world\n\033[31#3mgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.1, c("nl", "sgr", "esc"))
  Warning in strip_ctl(string.1, c("nl", "sgr", "esc")) :
    Argument `x` contains a malformed escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello[45p worldgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.1, c("csi"))
  [1] "hello\033 world\n\033[31#3mgoodbye\a moon"
   7/14 strip.R: strip_ctl(string.1, "all")
  Warning in strip_ctl(string.1, "all") :
    Argument `x` contains a malformed escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello[45p worldgoodbye moon"
   7/14 strip.R: strip_ctl(string.1, c("c0", "nl"))
  [1] "hello\033\033[45p world\033[31#3mgoodbye moon"
   7/14 strip.R: strip_ctl(string.1, c("all", "sgr"))
  Warning in strip_ctl(string.1, c("all", "sgr")) :
    Argument `x` contains a malformed escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello[45p world\033[31#3mgoodbye moon"
   7/14 strip.R: strip_sgr(string.1)
  [1] "hello\033\033[45p world\ngoodbye\a moon"
   7/14 strip.R: strip_ctl(c(string.0, string.1, "hello"), warn = FALSE)
  [1] "hello worldgoodbye moon"     "hello[45p worldgoodbye moon"
  [3] "hello"                      
   7/14 strip.R: string.2 <- "\033k\033[45p\a\n\033[31mgoodbye moon"
   7/14 strip.R: strip_ctl(string.2)
  [1] "goodbye moon"
   7/14 strip.R: strip_ctl(string.2, "sgr")
  [1] "\033k\033[45p\a\ngoodbye moon"
   7/14 strip.R: string.3 <- "hello world\033k\033[45p\a\n\033[31m"
   7/14 strip.R: strip_ctl(string.3)
  [1] "hello world"
   7/14 strip.R: strip_ctl(string.3, "sgr")
  [1] "hello world\033k\033[45p\a\n"
   7/14 strip.R: unitizer_sect("Bad Inputs", {
   7/14 strip.R: strip_ctl("hello\033[41mworld", warn = 1:3)
  Error in strip_ctl("hello\033[41mworld", warn = 1:3) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strip_ctl -> VAL_IN_ENV -> stop2
   7/14 strip.R: strip_ctl("hello\033[41mworld", ctl = 1:3)
  Error in strip_ctl("hello\033[41mworld", ctl = 1:3) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> strip_ctl -> VAL_IN_ENV -> stop2
   7/14 strip.R: strip_ctl("hello\033[41mworld", ctl = "bananas")
  Error in strip_ctl("hello\033[41mworld", ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> strip_ctl -> VAL_IN_ENV -> stop2
   7/14 strip.R: strip_ctl("hello\033[41mworld", strip = "sgr")
  Parameter `strip` has been deprecated; use `ctl` instead.
  [1] "helloworld"
   7/14 strip.R: strip_sgr("hello\033[41mworld", warn = 1:3)
  Error in strip_sgr("hello\033[41mworld", warn = 1:3) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strip_sgr -> VAL_IN_ENV -> stop2
  
   8/14 strsplit.R: 
   8/14 strsplit.R: library(fansi)
   8/14 strsplit.R: unitizer_sect("basic splits", {
   8/14 strsplit.R: str.0 <- c("hello world", "goodbye moon")
   8/14 strsplit.R: identical(strsplit(str.0[1], " "), strsplit_ctl(str.0[1], " ")
  [1] TRUE
   8/14 strsplit.R: identical(strsplit(str.0, "h"), strsplit_ctl(str.0, "h"))
  [1] TRUE
   8/14 strsplit.R: identical(strsplit(str.0, "m"), strsplit_ctl(str.0, "m"))
  [1] TRUE
   8/14 strsplit.R: identical(strsplit(str.0, "g"), strsplit_ctl(str.0, "g"))
  [1] TRUE
   8/14 strsplit.R: str.1 <- "hello\033[31m world"
   8/14 strsplit.R: str.2 <- "\033[42m hello\033[m world, Goodbye Moon"
   8/14 strsplit.R: strsplit_ctl(str.1, " ")
  [[1]]
  [1] "hello"                "\033[31mworld\033[0m"
  
   8/14 strsplit.R: strsplit_ctl(str.1, "hello")
  [[1]]
  [1] ""                      "\033[31m world\033[0m"
  
   8/14 strsplit.R: strsplit_ctl(str.2, ", ")
  [[1]]
  [1] "\033[42m hello\033[m world" "Goodbye Moon"              
  
   8/14 strsplit.R: strsplit_ctl(c(str.1, "hello world", str.2), "hello")
  [[1]]
  [1] ""                      "\033[31m world\033[0m"
  
  [[2]]
  [1] ""       " world"
  
  [[3]]
  [1] "\033[42m \033[0m"     " world, Goodbye Moon"
  
   8/14 strsplit.R: unitizer_sect("corner cases", {
   8/14 strsplit.R: strsplit_ctl("hello\033[31m world", "")
  [[1]]
   [1] "h"                "e"                "l"                "l"               
   [5] "o"                "\033[31m \033[0m" "\033[31mw\033[0m" "\033[31mo\033[0m"
   [9] "\033[31mr\033[0m" "\033[31ml\033[0m" "\033[31md\033[0m"
  
   8/14 strsplit.R: strsplit_ctl("hello\033[31m world", "[", fixed = TRUE)
  [[1]]
  [1] "hello\033[31m world"
  
   8/14 strsplit.R: strsplit_ctl("hello\033[31m world", NA_character_)
  Error in strsplit_ctl("hello\033[31m world", NA_character_) : 
    Argument `split` may not contain NAs.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: strsplit_ctl("hello\033[31m world", character())
  [[1]]
   [1] "h"                "e"                "l"                "l"               
   [5] "o"                "\033[31m \033[0m" "\033[31mw\033[0m" "\033[31mo\033[0m"
   [9] "\033[31mr\033[0m" "\033[31ml\033[0m" "\033[31md\033[0m"
  
   8/14 strsplit.R: strsplit_ctl("hello\033[31m world", letters)
  [[1]]
  [1] "hello\033[31m world"
  
   8/14 strsplit.R: splits <- c("h", "e", "o", "llo", "x", "hello")
   8/14 strsplit.R: str.spl1 <- strsplit_ctl(rep("hello", 6), splits)
   8/14 strsplit.R: str.spl2 <- strsplit(rep("hello", 6), splits)
   8/14 strsplit.R: identical(str.spl1, str.spl2)
  [1] TRUE
   8/14 strsplit.R: str.spl3 <- strsplit_ctl(rep("\033[31mhello\033[39m", 6), spli
   8/14 strsplit.R: str.spl3
  [[1]]
  [1] ""                    "\033[31mello\033[0m"
  
  [[2]]
  [1] "\033[31mh\033[0m"   "\033[31mllo\033[0m"
  
  [[3]]
  [1] "\033[31mhell\033[0m"
  
  [[4]]
  [1] "\033[31mhe\033[0m"
  
  [[5]]
  [1] "\033[31mhello\033[39m"
  
  [[6]]
  [1] ""
  
   8/14 strsplit.R: identical(lapply(str.spl3, strip_ctl), str.spl2)
  [1] TRUE
   8/14 strsplit.R: strsplit_ctl("", " ")
  [[1]]
  character(0)
  
   8/14 strsplit.R: strsplit_ctl("", "")
  [[1]]
  character(0)
  
   8/14 strsplit.R: strsplit_ctl(c("\033[31mab\033[0m", ""), "")
  [[1]]
  [1] "\033[31ma\033[0m" "\033[31mb\033[0m"
  
  [[2]]
  character(0)
  
   8/14 strsplit.R: strsplit_ctl("hello", NULL)
  [[1]]
  [1] "h" "e" "l" "l" "o"
  
   8/14 strsplit.R: str.sp14 <- c("\033[31mhello\nworld", "\ngoodbye\nmoon")
   8/14 strsplit.R: strsplit_ctl(str.sp14, "\n")
  [[1]]
  [1] "\033[31mhello\nworld"
  
  [[2]]
  [1] "\ngoodbye\nmoon"
  
   8/14 strsplit.R: strsplit_sgr(str.sp14, "\n")
  [[1]]
  [1] "\033[31mhello\033[0m" "\033[31mworld\033[0m"
  
  [[2]]
  [1] ""        "goodbye" "moon"   
  
   8/14 strsplit.R: strsplit_ctl(str.sp14, "\n", ctl = c("all", "nl"))
  [[1]]
  [1] "\033[31mhello\033[0m" "\033[31mworld\033[0m"
  
  [[2]]
  [1] ""        "goodbye" "moon"   
  
   8/14 strsplit.R: unitizer_sect("bad intputs", {
   8/14 strsplit.R: str.bytes <- "\xde"
   8/14 strsplit.R: Encoding(str.bytes) <- "bytes"
   8/14 strsplit.R: strsplit_ctl(str.bytes, "")
  Error in strsplit_ctl(str.bytes, "") : 
    Argument `x` contains a "bytes" encoded string at index [1], which is disallowed.
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl(str.2, NA)
  Error in strsplit_ctl(str.2, NA) : Argument `split` may not contain NAs.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: strsplit_ctl(str.2, "", warn = NULL)
  Error in strsplit_ctl(str.2, "", warn = NULL) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl(str.2, "", fixed = NA_integer_)
  Error in strsplit_ctl(str.2, "", fixed = NA_integer_) : 
    Argument `fixed` must be TRUE or FALSE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: strsplit_ctl(str.2, "", perl = NA_integer_)
  Error in strsplit_ctl(str.2, "", perl = NA_integer_) : 
    Argument `perl` must be TRUE or FALSE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: strsplit_ctl(str.2, "", useBytes = NA_integer_)
  Error in strsplit_ctl(str.2, "", useBytes = NA_integer_) : 
    Argument `useBytes` must be TRUE or FALSE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: strsplit_ctl(str.2, "", term.cap = 1:3)
  Error in strsplit_ctl(str.2, "", term.cap = 1:3) : 
    Argument `term.cap` must be character.
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl(str.2, "", term.cap = "bananas")
  Error in strsplit_ctl(str.2, "", term.cap = "bananas") : 
    Argument `term.cap` may only contain values in c("all", "bright", "256", "truecolor", "old")
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl(str.2, "", ctl = 1:3)
  Error in strsplit_ctl(str.2, "", ctl = 1:3) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl(str.2, "", ctl = "bananas")
  Error in strsplit_ctl(str.2, "", ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> strsplit_ctl -> VAL_IN_ENV -> stop2
   8/14 strsplit.R: strsplit_ctl("a b", str.bytes)
  Error in strsplit_ctl("a b", str.bytes) : 
    Argument `split` may not be "bytes" encoded.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strsplit_ctl
   8/14 strsplit.R: unitizer_sect("issue 55", {
   8/14 strsplit.R: strsplit_ctl("hello\nworld", "\n")
  [[1]]
  [1] "hello\nworld"
  
   8/14 strsplit.R: strsplit_sgr("hello\033[31mworld", "\033[31m", fixed = TRUE)
  [[1]]
  [1] "hello\033[31mworld"
  
   8/14 strsplit.R: strsplit_ctl("a\nb", "\n", ctl = c("all", "nl"))
  [[1]]
  [1] "a" "b"
  
   8/14 strsplit.R: strsplit_sgr("hello\nworld", "\n")
  [[1]]
  [1] "hello" "world"
  
  
   9/14 substr.R: 
   9/14 substr.R: library(fansi)
   9/14 substr.R: unitizer_sect("Simple", {
   9/14 substr.R: str01 <- sprintf("hello %sworld%s how", red, inv)
   9/14 substr.R: substr_ctl(str01, 1, 7)
  [1] "hello \033[31mw\033[0m"
   9/14 substr.R: substr_ctl(str01, 7, 11)
  [1] "\033[31mworld\033[0m"
   9/14 substr.R: substr_ctl(str01, 8, 10)
  [1] "\033[31morl\033[0m"
   9/14 substr.R: substr_ctl(str01, 8, 14)
  [1] "\033[31morld\033[7m ho\033[0m"
   9/14 substr.R: str02 <- sprintf("%shello world %sit's a %scrazy world%s out the
   9/14 substr.R: term.cap <- c("bright", "256", "truecolor")
   9/14 substr.R: substr_ctl(str02, 1, 7)
  [1] "\033[42mhello w\033[0m"
   9/14 substr.R: substr_ctl(str02, 10, 20)
  [1] "\033[42mld \033[31mit's a \033[0mc"
   9/14 substr.R: substr_ctl(str02, 15, 40, term.cap = term.cap)
  [1] "\033[31;42m's a \033[0mcrazy world\033[4;38;2;0;120;200m out there\033[0m"
   9/14 substr.R: substr_ctl(str02, 35, 60, term.cap = term.cap)
  [1] "\033[4;38;2;0;120;200m there \033[7misn't it\033[0m\033[48;5;141m right?\033[0m"
   9/14 substr.R: str03 <- sprintf("hello %sworld", rgb.und)
   9/14 substr.R: substr_ctl(str03, 1, 12, term.cap = term.cap)
  [1] "hello \033[4;38;2;0;120;200mworld\033[0m"
   9/14 substr.R: str04 <- sprintf("hello%s%s world%s%s yowza", red, inv, grn.bg, 
   9/14 substr.R: substr_ctl(str04, 5, 7, term.cap = term.cap)
  [1] "o\033[31m\033[7m w\033[0m"
   9/14 substr.R: substr_ctl(str04, 5, 13, term.cap = term.cap)
  [1] "o\033[31m\033[7m world\033[42m\033[4;38;2;0;120;200m y\033[0m"
   9/14 substr.R: unitizer_sect("Multi-line", {
   9/14 substr.R: str.m.0 <- paste0("\033[44m", c("hello world", rep("goodbye \033
   9/14 substr.R: substr_ctl(str.m.0, (1:4) * 2, (3:8) * 2)
  [1] "\033[44mello \033[0m"         "\033[44mdbye \033[0m"        
  [3] "\033[44mye \033[45mmo\033[0m" "\033[44mombas\033[0m"        
   9/14 substr.R: unitizer_sect("tabs", {
   9/14 substr.R: substr2_ctl("yo\tworld", 1, 8, tabs.as.spaces = TRUE)
  [1] "yo      "
   9/14 substr.R: unitizer_sect("Corner cases", {
   9/14 substr.R: substr_ctl("hello", 0, -1)
  [1] ""
   9/14 substr.R: substr_ctl("hello", 0, 0)
  [1] ""
   9/14 substr.R: substr_ctl(rep("hello", 2), c(1, 0), c(1, 1))
  [1] "h" "h"
   9/14 substr.R: substr_ctl(character(), 1, 1)
  character(0)
   9/14 substr.R: substr_ctl(list("hello", list("goodbye", "there")), 1, 2)
  [1] "he" "li"
   9/14 substr.R: substr_ctl(structure(list(list("goodbye", "there")), class = "fo
  [1] "li"
   9/14 substr.R: str.0 <- "\033[31mred\033[m"
   9/14 substr.R: str.1 <- "\033[31mred\033[42m"
   9/14 substr.R: str.2 <- c(str.0, str.1)
   9/14 substr.R: substr_ctl(str.2, 0, 0)
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 1, 1)
  [1] "\033[31mr\033[0m" "\033[31mr\033[0m"
   9/14 substr.R: substr_ctl(str.2, 3, 3)
  [1] "\033[31md\033[0m" "\033[31md\033[0m"
   9/14 substr.R: substr_ctl(str.2, 4, 4)
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 3, 4)
  [1] "\033[31md\033[0m" "\033[31md\033[0m"
   9/14 substr.R: substr_ctl(str.2, 3, 5)
  [1] "\033[31md\033[0m" "\033[31md\033[0m"
   9/14 substr.R: substr_ctl(str.2, 3, 4, terminate = FALSE)
  [1] "\033[31md\033[m"   "\033[31md\033[42m"
   9/14 substr.R: substr_ctl(str.2, 3, 5, terminate = FALSE)
  [1] "\033[31md\033[m"   "\033[31md\033[42m"
   9/14 substr.R: substr_ctl(str.2, -1, 2)
  [1] "\033[31mre\033[0m" "\033[31mre\033[0m"
   9/14 substr.R: substr_ctl(str.2, -2, -1)
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 4, 1)
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 4, 1, terminate = FALSE)
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 4, 1, carry = "\033[44m")
  [1] "" ""
   9/14 substr.R: substr_ctl(str.2, 4, 1, carry = "\033[44m", terminate = FALSE)
  [1] "" ""
   9/14 substr.R: substr_ctl("hello", 5, 5)
  [1] "o"
   9/14 substr.R: substr_ctl("hello", 6, 6)
  [1] ""
   9/14 substr.R: substr_ctl("hello", 7, 6)
  [1] ""
   9/14 substr.R: substr_ctl("hello", 6, 7)
  [1] ""
   9/14 substr.R: substr_ctl("hello", 7, 5)
  [1] ""
   9/14 substr.R: substr_ctl("hello", 0, 6)
  [1] "hello"
   9/14 substr.R: substr_ctl("hello", 0, 5)
  [1] "hello"
   9/14 substr.R: substr_ctl("hello", 1, 6)
  [1] "hello"
   9/14 substr.R: substr_ctl("hello", "1", 1)
  [1] "h"
   9/14 substr.R: substr_ctl("hello", 1, "1")
  [1] "h"
   9/14 substr.R: substr_ctl("hello", "a", "b")
  Warning in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  :
    NAs introduced by coercion
  Warning in substr2_ctl(x = x, start = start, stop = stop, warn = warn, term.cap = term.cap,  :
    NAs introduced by coercion
  [1] NA
   9/14 substr.R: substr_ctl("hello", 1, NA_integer_)
  [1] NA
   9/14 substr.R: substr_ctl("hello", NA_integer_, 1)
  [1] NA
   9/14 substr.R: substr_ctl(rep("\033[31mhello\033[m", 3), c(3, 2, 1), c(3, 4, 
  [1] "\033[31ml\033[0m"     "\033[31mell\033[0m"   "\033[31mhello\033[0m"
   9/14 substr.R: str.3 <- structure("fu\033[42mba\033[0mr", class = "foo", at = "
   9/14 substr.R: substr_ctl(str.3, 2, 3)
  [1] "u\033[42mb\033[0m"
  attr(,"class")
  [1] "foo"
  attr(,"at")
  [1] "bar"
   9/14 substr.R: substr_ctl(str.2, 2, 6, ctl = c("all", "sgr"))
  [1] "[31mr" "[31mr"
   9/14 substr.R: substr_ctl(str.2, 8, 10, ctl = c("all", "sgr"))
  [1] "d\033[" "d\033["
   9/14 substr.R: substr2_ctl(rep("o\033[31m ", 2), 1:2, 1:2)
  [1] "o"                "\033[31m \033[0m"
   9/14 substr.R: substr_ctl("hello\033[41b", 1, 5)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"
   9/14 substr.R: substr_ctl("hello\033[41b", 1, 6)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello\033[41b"
   9/14 substr.R: substr_ctl("\033[1p\033[31mA", 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[31mA\033[0m"
   9/14 substr.R: substr_ctl("\033[1p\033[31mA", 0, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[1p\033[31mA\033[0m"
   9/14 substr.R: substr_ctl("\033[1p\033[31mA", -1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[1p\033[31mA\033[0m"
   9/14 substr.R: substr_ctl("\033[31m\033[1pA", 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[31mA\033[0m"
   9/14 substr.R: substr_ctl("\033[31m\033[1pA", 0, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[31m\033[1pA\033[0m"
   9/14 substr.R: substr_ctl("\033[31m\033[1pA", -1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[31m\033[1pA\033[0m"
   9/14 substr.R: substr_ctl("\033[41m\033[1mA", 1, 1)
  [1] "\033[1;41mA\033[0m"
   9/14 substr.R: substr_ctl("\033[41m\033[1mA", 0, 1)
  [1] "\033[1;41mA\033[0m"
   9/14 substr.R: substr_ctl("\033[41m\033[1mA", -1, 1)
  [1] "\033[1;41mA\033[0m"
   9/14 substr.R: str.4 <- c("A\033[45mB", "A")
   9/14 substr.R: substr_ctl(str.4, 1, 1, carry = TRUE, terminate = FALSE)
  [1] "A"         "\033[45mA"
   9/14 substr.R: substr_ctl("a\033[42", 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
   9/14 substr.R: substr_ctl("a\033[42", 1, 2)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[42"
   9/14 substr.R: substr_ctl("a\033[42", 1, 2, terminate = FALSE)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[42"
   9/14 substr.R: substr_ctl("a\033]8;;END", 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
   9/14 substr.R: substr_ctl("a\033]8;;END", 1, 2)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
   9/14 substr.R: substr_ctl("a\033]8;;END", 1, 2, terminate = FALSE)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033]8;;END"
   9/14 substr.R: substr_ctl("a\033];;END", 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
   9/14 substr.R: substr_ctl("a\033];;END", 1, 2)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033];;END"
   9/14 substr.R: substr_ctl("a\033[38;5mb", 1, 2, term.cap = "all")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[38;5mb"
   9/14 substr.R: substr_ctl("a\033[38;2mb", 1, 2, term.cap = "all")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[38;2mb"
   9/14 substr.R: substr_ctl("a\033[38;2;255mb", 1, 2, term.cap = "all")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[38;2;255mb"
   9/14 substr.R: substr_ctl("a\033[38;2;255;255mb", 1, 2, term.cap = "all")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033[38;2;255;255mb"
   9/14 substr.R: substr_ctl("\033[45pA", 1, 1, warn = FALSE)
  [1] "A"
   9/14 substr.R: substr_ctl("\033[45pA", 0, 1, warn = FALSE)
  [1] "\033[45pA"
   9/14 substr.R: substr_ctl(c("AB", NA, "CD"), 1, 2)
  [1] "AB" NA   "CD"
   9/14 substr.R: substr_ctl(c("AB", NA, "CD"), 1, 2, carry = TRUE)
  [1] "AB" NA   NA  
   9/14 substr.R: substr_ctl(c("AB", "CD"), c(NA, 1), 2)
  [1] NA   "CD"
   9/14 substr.R: substr_ctl(c("AB", "CD"), c(NA, 1), 2, carry = TRUE)
  [1] NA   "CD"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = "bright")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[38;5;4mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = c("bright", "old"))
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[4;5mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = c("all", "256"))
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[38;5;4mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = c("all", "256", 
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[4;5mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = c("256"))
  [1] "\033[38;5;4mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;5;4mA", 1, 1, term.cap = c("256", "old"))
  [1] "\033[38;5;4mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = "bright")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[38;2;1;1;1mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = c("bright", 
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[1;2mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = c("all", "truec
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[38;2;1;1;1mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = c("all", "truec
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[1;2mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = c("truecolor"))
  [1] "\033[38;2;1;1;1mA\033[0m"
   9/14 substr.R: substr_ctl("\033[38;2;1;1;1mA", 1, 1, term.cap = c("truecolor", 
  [1] "\033[38;2;1;1;1mA\033[0m"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = "256")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[107mA\033[0m"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = c("256", "old"))
  [1] "A"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = c("all", "bright"))
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[107mA\033[0m"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = c("all", "bright", 
  [1] "A"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = c("bright"))
  [1] "\033[107mA\033[0m"
   9/14 substr.R: substr_ctl("\033[107mA", 1, 1, term.cap = c("bright", "old"))
  [1] "\033[107mA\033[0m"
   9/14 substr.R: str.5 <- c("\033[48;2;100;100;100mAB", "\033[48;2;100;100;100mCD
   9/14 substr.R: substr_ctl(str.5, 2, 2, terminate = FALSE, carry = TRUE, term.ca
  [1] "\033[48;2;100;100;100mB" "D"                      
   9/14 substr.R: str.5a <- c("\033[48;2;100;100;100mAB", "\033[48;2;100;100;101mC
   9/14 substr.R: substr_ctl(str.5a, 2, 2, terminate = FALSE, carry = TRUE, term.c
  [1] "\033[48;2;100;100;100mB" "\033[48;2;100;100;101mD"
   9/14 substr.R: unitizer_sect("Obscure escapes", {
   9/14 substr.R: tryCatch(substr_ctl("\033[38;6;31mworld\033[m", 2, 3), warning =
  [1] "Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: suppressWarnings(substr_ctl("\033[38;6;31mworld\033[m", 2, 3))
  [1] "\033[6;31mor\033[0m"
   9/14 substr.R: tryCatch(substr_ctl("\033[31mhello\033[38;5;256m world\033[m", 
  [1] "Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: suppressWarnings(substr_ctl("\033[31mhello\033[38;5;256m world\0
  [1] "\033[31mwo\033[0m"
   9/14 substr.R: substr_ctl("\033[20mworld\033[m", 2, 3)
  [1] "\033[20mor\033[0m"
   9/14 substr.R: substr_ctl("\033[21mworld\033[m", 2, 3)
  [1] "\033[21mor\033[0m"
   9/14 substr.R: substr_ctl(rep("\033[26mhello \033[50mworld\033[m", 2), c(2, 
  [1] "\033[26mel\033[0m" "orl"              
   9/14 substr.R: substr_ctl(rep("\033[61mwor\033[65mld\033[m", 2), c(2, 4), c(3, 
  [1] "\033[61mor\033[0m" "ld"               
   9/14 substr.R: tryCatch(substr_ctl("\033[56mworld\033[m", 2, 3), warning = cond
  [1] "Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: suppressWarnings(substr_ctl("\033[56mworld\033[m", 2, 3))
  [1] "or"
   9/14 substr.R: tryCatch(substr_ctl("\033[66mworld\033[m", 2, 3), warning = cond
  [1] "Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: tryCatch(substr_ctl("\033[200mworld\033[m", 2, 3), warning = con
  [1] "Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: substr_ctl(rep("\033[91mwor\033[101mld\033[m", 2), c(2, 4), c(3,
  [1] "\033[91mor\033[0m"     "\033[91;101mld\033[0m"
   9/14 substr.R: unitizer_sect("bad args", {
   9/14 substr.R: hello2.0 <- "\033[42m\thello world\033[m foobar"
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, warn = NULL)
  Error in substr2_ctl(hello2.0, 1, 2, warn = NULL) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, tabs.as.spaces = 1)
  [1] "\033[42m  \033[0m"
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, tabs.as.spaces = NA)
  Error in substr2_ctl(hello2.0, 1, 2, tabs.as.spaces = NA) : 
    Argument `tabs.as.spaces` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, tab.stops = -(1:3))
  Error in substr2_ctl(hello2.0, 1, 2, tab.stops = -(1:3)) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, tab.stops = 0)
  Error in substr2_ctl(hello2.0, 1, 2, tab.stops = 0) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, round = "bananas")
  Error in substr2_ctl(hello2.0, 1, 2, round = "bananas") : 
    Argument `round` must partial match one of c("start", "stop", "both", "neither")
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, term.cap = 0)
  Error in substr2_ctl(hello2.0, 1, 2, term.cap = 0) : 
    Argument `term.cap` must be character.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, term.cap = "bananas")
  Error in substr2_ctl(hello2.0, 1, 2, term.cap = "bananas") : 
    Argument `term.cap` may only contain values in c("all", "bright", "256", "truecolor", "old")
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, type = "bananas")
  Error in substr2_ctl(hello2.0, 1, 2, type = "bananas") : 
    Argument `type` must partial match one of c("chars", "width", "graphemes")
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, ctl = "bananas")
  Error in substr2_ctl(hello2.0, 1, 2, ctl = "bananas") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: substr2_ctl(hello2.0, 1, 2, ctl = 0)
  Error in substr2_ctl(hello2.0, 1, 2, ctl = 0) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... eval -> withVisible -> substr2_ctl -> VAL_IN_ENV -> stop2
   9/14 substr.R: unitizer_sect("`ctl` related issues", {
   9/14 substr.R: substr_sgr("\033[31;42mhello world", 2, 4)
  [1] "\033[31;42mell\033[0m"
   9/14 substr.R: substr_sgr("\033[31m\033[42mhello world", 2, 4)
  [1] "\033[31;42mell\033[0m"
   9/14 substr.R: tryCatch(substr_sgr("\033[31;42!mhello world", 2, 4), warning = 
  [1] "Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
   9/14 substr.R: substr_sgr("\033[55;38l\033[31mhello world", 2, 4, warn = FALSE)
  [1] "[55"
   9/14 substr.R: substr_sgr("\033[31m\033[55;38lhello world", 2, 4, warn = FALSE)
  [1] "\033[31m[55\033[0m"
   9/14 substr.R: substr_sgr("hello \033[31m\033[55;38lworld", 7, 9, warn = FALSE)
  [1] "\033[31m\033[5\033[0m"
   9/14 substr.R: substr_ctl("\033[55;38l\033[31mhello world", 2, 4, warn = FALSE)
  [1] "\033[31mell\033[0m"
   9/14 substr.R: substr_ctl("\033[31m\033[55;38lhello world", 2, 4, warn = FALSE)
  [1] "\033[31mell\033[0m"
   9/14 substr.R: substr_ctl("hello \033[31m\033[55;38lworld", 7, 9, warn = FALSE)
  [1] "\033[31mwor\033[0m"
   9/14 substr.R: substr_ctl("hello\033[55;38l \033[31mworld", 4, 7, warn = FALSE)
  [1] "lo\033[55;38l \033[31mw\033[0m"
   9/14 substr.R: substr_sgr("ab\n\tcd\n", 3, 6, warn = FALSE)
  [1] "\n\tcd"
   9/14 substr.R: substr_sgr("ab\n\033[31m\tcd\n", 3, 6, warn = FALSE)
  [1] "\n\033[31m\tcd\033[0m"
   9/14 substr.R: substr_ctl("ab\n\033[31m\tcd\n", 3, 6, warn = FALSE, ctl = c("al
  [1] "\n\033[31m\tcd\n\033[0m"
   9/14 substr.R: substr_ctl("ab\n\033[31m\tcd\n", 3, 6, warn = FALSE, ctl = c("al
  [1] "\n\033[31m\tcd\033[0m"
   9/14 substr.R: substr_sgr(c("\a", "b", "c"), 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\a" "b"  "c" 
   9/14 substr.R: substr_sgr(c("a", "\b", "c"), 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"  "\b" "c" 
   9/14 substr.R: substr_sgr(c("a", "b", "\ac"), 1, 1)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [3], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"  "b"  "\a"
   9/14 substr.R: unitizer_sect("Rep Funs - Equivalence", {
   9/14 substr.R: txt0 <- "ABCD"
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 2, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 2, value = "#?"), `substr<-`(t
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 3, value = "#?-"), `substr<-`(
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 0, 0, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 1, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 10, 12, value = "#"), `substr<-`(
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 3, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 1, 5, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 0, 5, value = "#"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: `substr_ctl<-`(txt0, 0, -1, value = "#")
  [1] "ABCD"
   9/14 substr.R: rep1 <- c("_", "_.")
   9/14 substr.R: rep2 <- c("_", "_.", "...")
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 3, value = rep1), `substr<-`(t
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 3, value = rep2), `substr<-`(t
  [1] TRUE
   9/14 substr.R: txt1 <- c("AB", "CDE")
   9/14 substr.R: identical(`substr_ctl<-`(txt1, 2, 3, value = "_"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt1, 2, 3, value = rep1), `substr<-`(t
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt1, 2, 3, value = rep2), `substr<-`(t
  [1] TRUE
   9/14 substr.R: txt2 <- c("AB", "CDE", "EFGH")
   9/14 substr.R: identical(`substr_ctl<-`(txt2, 2, 3, value = "_"), `substr<-`(tx
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt2, 2, 3, value = rep1), `substr<-`(t
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt2, 2, 3, value = rep2), `substr<-`(t
  [1] TRUE
   9/14 substr.R: txt3a <- txt3b <- c("ABC", "ABC")
   9/14 substr.R: substr(txt3a[2], 2, 2) <- "_"
   9/14 substr.R: substr_ctl(txt3b[2], 2, 2) <- "_"
   9/14 substr.R: identical(txt3a, txt3b)
  [1] TRUE
   9/14 substr.R: identical(`substr_ctl<-`(txt0, 2, 3, value = NA_character_), 
  [1] TRUE
   9/14 substr.R: txt.na <- NA_character_
   9/14 substr.R: identical(`substr_ctl<-`(txt.na, 1, 2, value = "AB"), `substr<-`
  [1] TRUE
   9/14 substr.R: unitizer_sect("Rep Funs - SGR", {
   9/14 substr.R: txt1 <- "\033[33mABCD"
   9/14 substr.R: txt2 <- "\033[33mA\033[44mBCD"
   9/14 substr.R: txt3 <- "\033[33mA\033[44mBC\033[1mD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 2, value = "#")
  [1] "\033[33mA\033[0m#\033[33mCD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, value = "#?-")
  [1] "\033[33mA\033[0m#?\033[33mD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, value = "#\033[32m?-")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[33mD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, value = "#\033[32m?-\033[0m")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[33mD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, value = "#\033[0m?-")
  [1] "\033[33mA\033[0m#\033[0m?\033[33mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, value = "#\033[32m?-")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, value = "#\033[32m?-\033[0m")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, value = "#\033[0m?-")
  [1] "\033[33mA\033[0m#\033[0m?\033[33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt3, 2, 3, value = "#\033[32m?-")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[1;33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt3, 2, 3, value = "#\033[32m?-\033[0m")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[1;33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt3, 2, 3, value = "#\033[0m?-")
  [1] "\033[33mA\033[0m#\033[0m?\033[1;33;44mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 2, terminate = FALSE, value = "#")
  [1] "\033[33mA#\033[44mCD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, terminate = FALSE, value = "#\033[32m
  [1] "\033[33mA#\033[32m?\033[44mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, terminate = FALSE, value = "#\033[32m
  [1] "\033[33mA#\033[32m?\033[44mD"
   9/14 substr.R: `substr_ctl<-`(txt2, 2, 3, terminate = FALSE, value = "#\033[0m?
  [1] "\033[33mA#\033[0m?\033[44mD"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, terminate = FALSE, value = "#\033[0m?
  [1] "\033[33mA#\033[0m?D"
   9/14 substr.R: `substr_ctl<-`(txt1, 2, 3, terminate = FALSE, value = "#\033[0m\
  [1] "\033[33mA#\033[0m\033[45m?D"
   9/14 substr.R: txt4 <- c(txt2, txt0, "\033[39mABCD")
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, value = "#")
  [1] "\033[33mA\033[0m#\033[33;44mCD" "A#CD"                          
  [3] "\033[39mA#CD"                  
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, value = c("#", "?"))
  [1] "\033[33mA\033[0m#\033[33;44mCD" "A?CD"                          
  [3] "\033[39mA#CD"                  
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, value = c("#", "?", "$"))
  [1] "\033[33mA\033[0m#\033[33;44mCD" "A?CD"                          
  [3] "\033[39mA$CD"                  
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 2, carry = TRUE, value = "#")
  [1] "\033[33mA\033[0m#\033[33;44mCD" "A\033[0m#\033[33;44mCD"        
  [3] "\033[39mA\033[0m#\033[44mCD"   
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, carry = TRUE, value = "#\033[32m?-")
  [1] "\033[33mA\033[0m#\033[32m?\033[0m\033[33;44mD"     
  [2] "A\033[0m\033[32m#\033[32m?\033[0m\033[33;44mD"     
  [3] "\033[39mA\033[0m\033[32m#\033[32m?\033[0m\033[44mD"
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, carry = TRUE, value = "#\033[42m?-\03
  [1] "\033[33mA\033[0m#\033[42m?\033[0m\033[33;44mD"
  [2] "A\033[0m#\033[42m?\033[0m\033[33;44mD"        
  [3] "\033[39mA\033[0m#\033[42m?\033[0m\033[44mD"   
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, carry = TRUE, value = "#\033[0m?-")
  [1] "\033[33mA\033[0m#\033[0m?\033[33;44mD"
  [2] "A\033[0m#\033[0m?\033[33;44mD"        
  [3] "\033[39mA\033[0m#\033[0m?\033[44mD"   
   9/14 substr.R: rep4 <- c("\033[32m_\033[45m", ".-", "\033[39m__")
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, carry = TRUE, value = rep4)
  [1] "\033[33mA\033[0m\033[32m_\033[0m\033[33;44mCD"
  [2] "A\033[0m\033[32;45m.-\033[0m\033[33;44mD"     
  [3] "\033[39mA\033[0m\033[45m__\033[0m\033[44mD"   
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 2, terminate = FALSE, carry = TRUE, valu
  [1] "\033[33mA#\033[44mCD" "A#CD"                 "\033[39mA#CD"        
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, terminate = FALSE, carry = TRUE, valu
  [1] "\033[33mA#\033[32m?\033[44mD" "A#\033[32m?D"                
  [3] "\033[39mA#\033[32m?D"        
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, terminate = FALSE, carry = TRUE, valu
  [1] "\033[33mA#\033[35m?\033[44mD" "A\033[0m#\033[35m?D"         
  [3] "\033[39mA\033[0m#\033[35m?D" 
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, terminate = FALSE, carry = TRUE, valu
  [1] "\033[33mA#\033[0m?\033[44mD" "A#\033[0m?D"                
  [3] "\033[39mA#\033[0m?D"        
   9/14 substr.R: `substr_ctl<-`(txt4, 2, 3, terminate = FALSE, carry = TRUE, valu
  [1] "\033[33mA\033[32m_\033[45m\033[44mCD"
  [2] "A.-D"                                
  [3] "\033[39mA\033[0;45m__D"              
   9/14 substr.R: txt5 <- c("ABD", "DFG")
   9/14 substr.R: `substr_ctl<-`(txt5, 2, 2, value = ".\033[45m", carry = TRUE, 
  [1] "A.D"         "D\033[45m.G"
   9/14 substr.R: txt6 <- "A123456789B"
   9/14 substr.R: `substr2_ctl<-`(txt6, 2, 9, value = "\t", tabs.as.spaces = TRUE)
  [1] "A        9B"
   9/14 substr.R: `substr2_ctl<-`(txt6, 2, 3, value = "\t", tabs.as.spaces = TRUE)
  [1] "A  3456789B"
   9/14 substr.R: `substr2_ctl<-`(txt6, 2, 10, value = "\t", tabs.as.spaces = TRUE
  [1] "A        9B"
   9/14 substr.R: txt7a <- "Šos"
   9/14 substr.R: txt7b <- "sos"
   9/14 substr.R: txt7c <- "soŠ"
   9/14 substr.R: val.scar <- "š"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7a, 1, 1, value = val.scar))
  [1] "UTF-8"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7a, 1, 1, value = "s"))
  [1] "unknown"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7a, 2, 2, value = val.scar))
  [1] "UTF-8"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7a, 2, 2, value = "s"))
  [1] "UTF-8"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7b, 2, 2, value = val.scar))
  [1] "UTF-8"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7b, 2, 2, value = "s"))
  [1] "unknown"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7c, 3, 3, value = val.scar))
  [1] "UTF-8"
   9/14 substr.R: Encoding(`substr_ctl<-`(txt7c, 3, 3, value = "s"))
  [1] "unknown"
   9/14 substr.R: unitizer_sect("Rep Funs - Corner Cases", {
   9/14 substr.R: `substr_ctl<-`(txt2, 1, 3, terminate = FALSE, value = "#\033[32m
  [1] "\033[33m#\033[32m?\033[0m\033[44mCD"
   9/14 substr.R: txt8 <- "\033[32mAB\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 2, value = "12")
  [1] "\033[32m\033[0m12\033[32m\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 2, value = "12", terminate = FALSE)
  [1] "\033[32m12\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 3, value = "12")
  [1] "\033[32m\033[0m12"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 3, value = "1")
  [1] "\033[32m\033[0m1\033[32mB\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 3, value = "")
  [1] "\033[32mAB\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 3, value = "123")
  [1] "\033[32m\033[0m12"
   9/14 substr.R: `substr_ctl<-`(txt8, 0, 2, value = "12")
  [1] "12\033[32m\033[45m"
   9/14 substr.R: `substr_ctl<-`(txt8, 0, 3, value = "12")
  [1] "12"
   9/14 substr.R: `substr_ctl<-`(txt8, 1, 3, value = "\033[1m", terminate = FALSE)
  [1] "\033[32m\033[1mAB\033[45m"
   9/14 substr.R: tce(`substr_ctl<-`(txt8, 1, 3, value = "A", carry = "\033[41m"))
  [1] "Argument `carry` must be TRUE or FALSE in replacement mode."
   9/14 substr.R: lat <- "fa\xe7ile"
   9/14 substr.R: Encoding(lat) <- "latin1"
   9/14 substr.R: tce(`substr_ctl<-`(lat, 1, 3, value = "ABC"))
  [1] "`x` may only contain ASCII or marked UTF-8 encoded strings; you can use `enc2utf8` to convert `x` prior to use with `substr_ctl<-` (replacement form).  Illegal value at position [1]."
   9/14 substr.R: txt.na2 <- c("AB", NA, "BC")
   9/14 substr.R: `substr_ctl<-`(txt.na2, 1, 1, value = "#")
  [1] "#B" NA   "#C"
   9/14 substr.R: txt.nona <- c("AB", "BC", "CD")
   9/14 substr.R: `substr_ctl<-`(txt.nona, 1, 1, value = c("#", NA), carry = TRUE)
  [1] "#B" NA   NA  
  
  10/14 tabs.R: 
  10/14 tabs.R: library(unitizer)
  10/14 tabs.R: library(fansi)
  10/14 tabs.R: unitizer_sect("simple tabs", {
  10/14 tabs.R: string <- "1\t12\t123\t1234\t12345678"
  10/14 tabs.R: tabs_as_spaces(string)
  [1] "1       12      123     1234    12345678"
  10/14 tabs.R: tabs_as_spaces(string, c(2, 3, 4, 5, 8))
  [1] "1 12 123 1234 12345678"
  10/14 tabs.R: tabs_as_spaces(string, c(2, 8))
  [1] "1 12      123     1234    12345678"
  10/14 tabs.R: tabs_as_spaces(1:3)
  [1] "1" "2" "3"
  10/14 tabs.R: unitizer_sect("newlines", {
  10/14 tabs.R: string.n <- paste0("1\t12\t123\t1234\t12345678\n", "1\t12\t123\t12
  10/14 tabs.R: tabs_as_spaces(string.n)
  [1] "1       12      123     1234    12345678\n1       12      123     1234    12345678"
  10/14 tabs.R: tabs_as_spaces(string.n, c(2, 3, 4, 8))
  [1] "1 12 123 1234    12345678\n1 12 123 1234    12345678"
  10/14 tabs.R: tabs_as_spaces(string.n, c(2, 8))
  [1] "1 12      123     1234    12345678\n1 12      123     1234    12345678"
  10/14 tabs.R: unitizer_sect("corner cases", {
  10/14 tabs.R: tabs_as_spaces("")
  [1] ""
  10/14 tabs.R: tabs_as_spaces("\t")
  [1] "        "
  10/14 tabs.R: tabs_as_spaces("\n")
  [1] "\n"
  10/14 tabs.R: tabs_as_spaces(c(string, string, string))
  [1] "1       12      123     1234    12345678"
  [2] "1       12      123     1234    12345678"
  [3] "1       12      123     1234    12345678"
  10/14 tabs.R: tabs_as_spaces("\t\t")
  [1] "                "
  10/14 tabs.R: unitizer_sect("bad inputs", {
  10/14 tabs.R: tabs_as_spaces(string, warn = 1:3)
  Error in tabs_as_spaces(string, warn = 1:3) : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> tabs_as_spaces -> VAL_IN_ENV -> stop2
  10/14 tabs.R: tabs_as_spaces(string, tab.stops = "hello")
  Error in tabs_as_spaces(string, tab.stops = "hello") : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... withVisible -> tabs_as_spaces -> VAL_IN_ENV -> stop2
  10/14 tabs.R: tabs_as_spaces(string, ctl = "hello")
  Error in tabs_as_spaces(string, ctl = "hello") : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... withVisible -> tabs_as_spaces -> VAL_IN_ENV -> stop2
  10/14 tabs.R: tabs_as_spaces(string, ctl = 0)
  Error in tabs_as_spaces(string, ctl = 0) : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... withVisible -> tabs_as_spaces -> VAL_IN_ENV -> stop2
  
  11/14 tohtml.R: 
  11/14 tohtml.R: library(unitizer)
  11/14 tohtml.R: library(fansi)
  11/14 tohtml.R: unitizer_sect("colors", {
  11/14 tohtml.R: style <- "width: 16px; height: 16px; display: inline-block;"
  11/14 tohtml.R: span <- "<span style=\"background-color: %s; %s\"></span>"
  11/14 tohtml.R: colors.8 <- fansi:::esc_color_code_to_html(rbind(c(0:7), 0L, 
  11/14 tohtml.R: colors.8
  [1] "#000000" "#BB0000" "#00BB00" "#BBBB00" "#0000BB" "#BB00BB" "#00BBBB"
  [8] "#BBBBBB"
  11/14 tohtml.R: fansi:::esc_color_code_to_html(matrix(c(9L, 0L, 0L, 0L, 0L)))
  Error in fansi:::esc_color_code_to_html(matrix(c(9L, 0L, 0L, 0L, 0L))) : 
    Internal Error: applying non-color.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
  11/14 tohtml.R: colors.255 <- fansi:::esc_color_code_to_html(rbind(8L, 5L, 0:255
  11/14 tohtml.R: colors.255
    [1] "#000000" "#800000" "#008000" "#808000" "#000080" "#800080" "#008080"
    [8] "#C0C0C0" "#808080" "#FF0000" "#00FF00" "#FFFF00" "#0000FF" "#FF00FF"
   [15] "#00FFFF" "#FFFFFF" "#000000" "#00005F" "#000087" "#0000AF" "#0000D7"
   [22] "#0000FF" "#005F00" "#005F5F" "#005F87" "#005FAF" "#005FD7" "#005FFF"
   [29] "#008700" "#00875F" "#008787" "#0087AF" "#0087D7" "#0087FF" "#00AF00"
   [36] "#00AF5F" "#00AF87" "#00AFAF" "#00AFD7" "#00AFFF" "#00D700" "#00D75F"
   [43] "#00D787" "#00D7AF" "#00D7D7" "#00D7FF" "#00FF00" "#00FF5F" "#00FF87"
   [50] "#00FFAF" "#00FFD7" "#00FFFF" "#5F0000" "#5F005F" "#5F0087" "#5F00AF"
   [57] "#5F00D7" "#5F00FF" "#5F5F00" "#5F5F5F" "#5F5F87" "#5F5FAF" "#5F5FD7"
   [64] "#5F5FFF" "#5F8700" "#5F875F" "#5F8787" "#5F87AF" "#5F87D7" "#5F87FF"
   [71] "#5FAF00" "#5FAF5F" "#5FAF87" "#5FAFAF" "#5FAFD7" "#5FAFFF" "#5FD700"
   [78] "#5FD75F" "#5FD787" "#5FD7AF" "#5FD7D7" "#5FD7FF" "#5FFF00" "#5FFF5F"
   [85] "#5FFF87" "#5FFFAF" "#5FFFD7" "#5FFFFF" "#870000" "#87005F" "#870087"
   [92] "#8700AF" "#8700D7" "#8700FF" "#875F00" "#875F5F" "#875F87" "#875FAF"
   [99] "#875FD7" "#875FFF" "#878700" "#87875F" "#878787" "#8787AF" "#8787D7"
  [106] "#8787FF" "#87AF00" "#87AF5F" "#87AF87" "#87AFAF" "#87AFD7" "#87AFFF"
  [113] "#87D700" "#87D75F" "#87D787" "#87D7AF" "#87D7D7" "#87D7FF" "#87FF00"
  [120] "#87FF5F" "#87FF87" "#87FFAF" "#87FFD7" "#87FFFF" "#AF0000" "#AF005F"
  [127] "#AF0087" "#AF00AF" "#AF00D7" "#AF00FF" "#AF5F00" "#AF5F5F" "#AF5F87"
  [134] "#AF5FAF" "#AF5FD7" "#AF5FFF" "#AF8700" "#AF875F" "#AF8787" "#AF87AF"
  [141] "#AF87D7" "#AF87FF" "#AFAF00" "#AFAF5F" "#AFAF87" "#AFAFAF" "#AFAFD7"
  [148] "#AFAFFF" "#AFD700" "#AFD75F" "#AFD787" "#AFD7AF" "#AFD7D7" "#AFD7FF"
  [155] "#AFFF00" "#AFFF5F" "#AFFF87" "#AFFFAF" "#AFFFD7" "#AFFFFF" "#D70000"
  [162] "#D7005F" "#D70087" "#D700AF" "#D700D7" "#D700FF" "#D75F00" "#D75F5F"
  [169] "#D75F87" "#D75FAF" "#D75FD7" "#D75FFF" "#D78700" "#D7875F" "#D78787"
  [176] "#D787AF" "#D787D7" "#D787FF" "#D7AF00" "#D7AF5F" "#D7AF87" "#D7AFAF"
  [183] "#D7AFD7" "#D7AFFF" "#D7D700" "#D7D75F" "#D7D787" "#D7D7AF" "#D7D7D7"
  [190] "#D7D7FF" "#D7FF00" "#D7FF5F" "#D7FF87" "#D7FFAF" "#D7FFD7" "#D7FFFF"
  [197] "#FF0000" "#FF005F" "#FF0087" "#FF00AF" "#FF00D7" "#FF00FF" "#FF5F00"
  [204] "#FF5F5F" "#FF5F87" "#FF5FAF" "#FF5FD7" "#FF5FFF" "#FF8700" "#FF875F"
  [211] "#FF8787" "#FF87AF" "#FF87D7" "#FF87FF" "#FFAF00" "#FFAF5F" "#FFAF87"
  [218] "#FFAFAF" "#FFAFD7" "#FFAFFF" "#FFD700" "#FFD75F" "#FFD787" "#FFD7AF"
  [225] "#FFD7D7" "#FFD7FF" "#FFFF00" "#FFFF5F" "#FFFF87" "#FFFFAF" "#FFFFD7"
  [232] "#FFFFFF" "#080808" "#121212" "#1C1C1C" "#262626" "#303030" "#3A3A3A"
  [239] "#444444" "#4E4E4E" "#585858" "#626262" "#6C6C6C" "#767676" "#808080"
  [246] "#8A8A8A" "#949494" "#9E9E9E" "#A8A8A8" "#B2B2B2" "#BCBCBC" "#C6C6C6"
  [253] "#D0D0D0" "#DADADA" "#E4E4E4" "#EEEEEE"
  11/14 tohtml.R: vals <- c(0L, 127L, 255L)
  11/14 tohtml.R: colors.tru <- fansi:::esc_color_code_to_html(do.call(rbind, c(li
  11/14 tohtml.R: colors.tru
   [1] "#000000" "#7F0000" "#FF0000" "#007F00" "#7F7F00" "#FF7F00" "#00FF00"
   [8] "#7FFF00" "#FFFF00" "#00007F" "#7F007F" "#FF007F" "#007F7F" "#7F7F7F"
  [15] "#FF7F7F" "#00FF7F" "#7FFF7F" "#FFFF7F" "#0000FF" "#7F00FF" "#FF00FF"
  [22] "#007FFF" "#7F7FFF" "#FF7FFF" "#00FFFF" "#7FFFFF" "#FFFFFF"
  11/14 tohtml.R: unitizer_sect("simple html conversion", {
  11/14 tohtml.R: as_html_page <- function(x) {
  11/14 tohtml.R: sgr_to_html("hello \033[31;42;1mworld\033[0m")
  [1] "hello <span style='color: #BB0000; background-color: #00BB00; font-weight: bold;'>world</span>"
  11/14 tohtml.R: sgr_to_html("hello \033[31;48;5;23;1mworld\033[m")
  [1] "hello <span style='color: #BB0000; background-color: #005F5F; font-weight: bold;'>world</span>"
  11/14 tohtml.R: sgr_to_html("\033[1mbold\033[22m \033[2mfaint\033[22m \033[mital
  [1] "<span style='font-weight: bold;'>bold</span> <span style='font-weight: 100;'>faint</span> italic\n"
  11/14 tohtml.R: csi_string <- c("\033[1mbold\033[22m \033[2mfaint\033[22m \033[3
  11/14 tohtml.R: html_string <- sgr_to_html(csi_string)
  11/14 tohtml.R: html_string
   [1] "<span style='font-weight: bold;'>bold</span> <span style='font-weight: 100;'>faint</span> <span style='font-style: italic;'>italic</span>"                                                                                                                                                                                 
   [2] "<span style='font-style: italic; text-decoration: underline;'>underline</span><span style='font-style: italic;'> </span><span style='font-style: italic; text-decoration: blink;'>slow-blink</span>"                                                                                                                       
   [3] "<span style='font-style: italic; text-decoration: blink;'>fast-blink</span>"                                                                                                                                                                                                                                               
   [4] "<span style='color: #BB0000; background-color: #00BB00; font-style: italic;'>red-fg-green-bg</span><span style='color: #00BB00; background-color: #BB0000; font-style: italic;'>inverse inverse-off</span>"                                                                                                                
   [5] "<span style='font-style: italic; color: transparent;'>conceal</span><span style='font-style: italic;'> reveal </span><span style='font-style: italic; text-decoration: line-through;'>crossed-out</span><span style='font-style: italic;'>clear</span>"                                                                    
   [6] "<span style='background-color: #BB0000; font-weight: bold;'>bold</span><span style='background-color: #BB0000;'> </span><span style='background-color: #00BB00; font-weight: 100;'>faint</span><span style='background-color: #00BB00;'> </span><span style='background-color: #BBBB00; font-style: italic;'>italic</span>"
   [7] "<span style='background-color: #0000BB; text-decoration: underline;'>underline</span><span style='background-color: #0000BB;'> </span><span style='background-color: #BB00BB; text-decoration: blink;'>slow-blink</span>"                                                                                                  
   [8] "<span style='background-color: #00BBBB; text-decoration: blink;'>fast-blink</span>"                                                                                                                                                                                                                                        
   [9] "<span style='color: #BB0000; background-color: #00BB00;'>red-fg-green-bg</span><span style='color: #00BB00; background-color: #BB0000;'>inverse inverse-off</span>"                                                                                                                                                        
  [10] "<span style='color: transparent;'>conceal</span> reveal <span style='text-decoration: line-through;'>crossed-out</span>clear"                                                                                                                                                                                              
  [11] "<span style='font-style: italic;'>italic again not italic?</span>"                                                                                                                                                                                                                                                         
  11/14 tohtml.R: unitizer_sect("Bright Colors", {
  11/14 tohtml.R: sgr_to_html("hello\033[94;101m world\033[39m yow\033[49mza")
  [1] "hello<span style='color: #5555FF; background-color: #FF5555;'> world</span><span style='background-color: #FF5555;'> yow</span>za"
  11/14 tohtml.R: sgr_to_html("hello\033[98;101m world\033[39m yow\033[49mza")
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello<span style='background-color: #FF5555;'> world yow</span>za"
  11/14 tohtml.R: unitizer_sect("Corner cases", {
  11/14 tohtml.R: sgr_to_html("hello\033[0m")
  [1] "hello"
  11/14 tohtml.R: sgr_to_html("hello\033[31m")
  [1] "hello"
  11/14 tohtml.R: sgrs <- paste0(rep("\033[31m", 20), collapse = "")
  11/14 tohtml.R: sgr_to_html(sprintf("%shello world\033[m", sgrs))
  [1] "<span style='color: #BB0000;'>hello world</span>"
  11/14 tohtml.R: sgr_to_html(1:3)
  [1] "1" "2" "3"
  11/14 tohtml.R: sgr_to_html("\033[31mhello\033[m\033[42m world\033[m")
  [1] "<span style='color: #BB0000;'>hello</span><span style='background-color: #00BB00;'> world</span>"
  11/14 tohtml.R: sgr_to_html("\033[33mhello")
  [1] "<span style='color: #BBBB00;'>hello</span>"
  11/14 tohtml.R: sgr_to_html("he\033[33mllo")
  [1] "he<span style='color: #BBBB00;'>llo</span>"
  11/14 tohtml.R: sgr_to_html("hello\033[33m")
  [1] "hello"
  11/14 tohtml.R: sgr_to_html(c("\033[33mhello", "world"))
  [1] "<span style='color: #BBBB00;'>hello</span>"
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("\033[33mhello", "\033[44mworld"))
  [1] "<span style='color: #BBBB00;'>hello</span>"                           
  [2] "<span style='color: #BBBB00; background-color: #0000BB;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("\033[33mhello", "wor\033[44mld"))
  [1] "<span style='color: #BBBB00;'>hello</span>"                                                                
  [2] "<span style='color: #BBBB00;'>wor</span><span style='color: #BBBB00; background-color: #0000BB;'>ld</span>"
  11/14 tohtml.R: sgr_to_html(c("\033[33mhello", "world\033[44m"))
  [1] "<span style='color: #BBBB00;'>hello</span>"
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("he\033[33mllo", "world"))
  [1] "he<span style='color: #BBBB00;'>llo</span>"
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("he\033[33mllo", "\033[44mworld"))
  [1] "he<span style='color: #BBBB00;'>llo</span>"                           
  [2] "<span style='color: #BBBB00; background-color: #0000BB;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("he\033[33mllo", "wor\033[44mld"))
  [1] "he<span style='color: #BBBB00;'>llo</span>"                                                                
  [2] "<span style='color: #BBBB00;'>wor</span><span style='color: #BBBB00; background-color: #0000BB;'>ld</span>"
  11/14 tohtml.R: sgr_to_html(c("he\033[33mllo", "world\033[44m"))
  [1] "he<span style='color: #BBBB00;'>llo</span>"
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("hello\033[33m", "world"))
  [1] "hello"                                     
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("hello\033[33m", "\033[44mworld"))
  [1] "hello"                                                                
  [2] "<span style='color: #BBBB00; background-color: #0000BB;'>world</span>"
  11/14 tohtml.R: sgr_to_html(c("hello\033[33m", "wor\033[44mld"))
  [1] "hello"                                                                                                     
  [2] "<span style='color: #BBBB00;'>wor</span><span style='color: #BBBB00; background-color: #0000BB;'>ld</span>"
  11/14 tohtml.R: sgr_to_html(c("hello\033[33m", "world\033[44m"))
  [1] "hello"                                     
  [2] "<span style='color: #BBBB00;'>world</span>"
  11/14 tohtml.R: unitizer_sect("Bad inputs", {
  11/14 tohtml.R: fansi:::esc_color_code_to_html(matrix(1:12, 4))
  Error in fansi:::esc_color_code_to_html(matrix(1:12, 4)) : 
    Argument `x` must be a five row integer matrix.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> <Anonymous>
  11/14 tohtml.R: sgr_to_html(1:3)
  [1] "1" "2" "3"
  11/14 tohtml.R: sgr_to_html("a", warn = 1:3)
  Error in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> VAL_IN_ENV -> stop2
  11/14 tohtml.R: sgr_to_html("a", term.cap = 1:3)
  Error in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  : 
    Argument `term.cap` must be character.
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> VAL_IN_ENV -> stop2
  11/14 tohtml.R: sgr_to_html("a", term.cap = "hello")
  Error in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  : 
    Argument `term.cap` may only contain values in c("all", "bright", "256", "truecolor", "old")
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> VAL_IN_ENV -> stop2
  11/14 tohtml.R: unitizer_sect("issue54", {
  11/14 tohtml.R: string <- c("\033[31m", "\033[39m")
  11/14 tohtml.R: fansi::sgr_to_html(string)
  [1] "" ""
  11/14 tohtml.R: string1 <- c("\033[31mhello", "world\033[39m moon")
  11/14 tohtml.R: fansi::sgr_to_html(string1)
  [1] "<span style='color: #BB0000;'>hello</span>"     
  [2] "<span style='color: #BB0000;'>world</span> moon"
  11/14 tohtml.R: string2 <- c("\033[3mhello\033[24m", "world\033[23m moon")
  11/14 tohtml.R: fansi::sgr_to_html(string2)
  [1] "<span style='font-style: italic;'>hello</span>"     
  [2] "<span style='font-style: italic;'>world</span> moon"
  11/14 tohtml.R: unitizer_sect("Colors as classes (#65)", {
  11/14 tohtml.R: sgr_to_html("\033[94mhello\033[31;42;1mworld\033[m", classes = T
  [1] "<span class='fansi-color-012'>hello</span><span class='fansi-color-001 fansi-bgcol-002' style='font-weight: bold;'>world</span>"
  11/14 tohtml.R: class.8 <- do.call(paste, c(expand.grid(c("fg", "bg"), 0:7), 
  11/14 tohtml.R: class.16 <- do.call(paste, c(expand.grid(c("fg", "bg"), 0:15), 
  11/14 tohtml.R: class.256 <- do.call(paste, c(expand.grid(c("fg", "bg"), 0:255),
  11/14 tohtml.R: x <- c("\033[94mhe\033[107mllo\033[31;42;1mworld\033[m", "\033[4
  11/14 tohtml.R: term.cap <- c("bright", "256", "truecolor")
  11/14 tohtml.R: sgr_to_html(x, classes = class.8, term.cap = term.cap)
  [1] "<span style='color: #5555FF;'>he</span><span style='color: #5555FF; background-color: #FFFFFF;'>llo</span><span class='fg-1 bg-2' style='font-weight: bold;'>world</span>"              
  [2] "<span style='color: #5FAF00; background-color: #FFFF00;'>good</span><span style='color: #FFFF00; background-color: #5FAF00;'>bye</span> super <span style='color: #EB0014;'>moon</span>"
  11/14 tohtml.R: sgr_to_html(x, classes = class.16, term.cap = term.cap)
  [1] "<span class='fg-12'>he</span><span class='fg-12 bg-15'>llo</span><span class='fg-1 bg-2' style='font-weight: bold;'>world</span>"                                        
  [2] "<span class='bg-11' style='color: #5FAF00;'>good</span><span class='fg-11' style='background-color: #5FAF00;'>bye</span> super <span style='color: #EB0014;'>moon</span>"
  11/14 tohtml.R: sgr_to_html(x, classes = class.256, term.cap = term.cap)
  [1] "<span class='fg-12'>he</span><span class='fg-12 bg-15'>llo</span><span class='fg-1 bg-2' style='font-weight: bold;'>world</span>"
  [2] "<span class='fg-70 bg-11'>good</span><span class='fg-11 bg-70'>bye</span> super <span style='color: #EB0014;'>moon</span>"       
  11/14 tohtml.R: make_styles(class.8)
   [1] ".fg-0 {color: #000000;}"            ".bg-0 {background-color: #000000;}"
   [3] ".fg-1 {color: #800000;}"            ".bg-1 {background-color: #800000;}"
   [5] ".fg-2 {color: #008000;}"            ".bg-2 {background-color: #008000;}"
   [7] ".fg-3 {color: #808000;}"            ".bg-3 {background-color: #808000;}"
   [9] ".fg-4 {color: #000080;}"            ".bg-4 {background-color: #000080;}"
  [11] ".fg-5 {color: #800080;}"            ".bg-5 {background-color: #800080;}"
  [13] ".fg-6 {color: #008080;}"            ".bg-6 {background-color: #008080;}"
  [15] ".fg-7 {color: #C0C0C0;}"            ".bg-7 {background-color: #C0C0C0;}"
  11/14 tohtml.R: make_styles(class.8, matrix(c(0, 1, 0, 0, 0, 1, 1, 0, 0), 3))
   [1] ".fg-0 {color: #000000;}"            ".bg-0 {background-color: #000000;}"
   [3] ".fg-1 {color: #000080;}"            ".bg-1 {background-color: #000080;}"
   [5] ".fg-2 {color: #800000;}"            ".bg-2 {background-color: #800000;}"
   [7] ".fg-3 {color: #800080;}"            ".bg-3 {background-color: #800080;}"
   [9] ".fg-4 {color: #008000;}"            ".bg-4 {background-color: #008000;}"
  [11] ".fg-5 {color: #008080;}"            ".bg-5 {background-color: #008080;}"
  [13] ".fg-6 {color: #808000;}"            ".bg-6 {background-color: #808000;}"
  [15] ".fg-7 {color: #C0C0C0;}"            ".bg-7 {background-color: #C0C0C0;}"
  11/14 tohtml.R: sgr_to_html(sgr_256())
   [1] "Standard"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
   [2] "<span style='color: #FFFFFF; background-color: #000000;'>  0</span> <span style='color: #FFFFFF; background-color: #800000;'>  1</span> <span style='color: #FFFFFF; background-color: #008000;'>  2</span> <span style='color: #FFFFFF; background-color: #808000;'>  3</span> <span style='color: #FFFFFF; background-color: #000080;'>  4</span> <span style='color: #FFFFFF; background-color: #800080;'>  5</span> <span style='color: #FFFFFF; background-color: #008080;'>  6</span> <span style='color: #FFFFFF; background-color: #C0C0C0;'>  7</span>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
   [3] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
   [4] "High-Intensity"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        
   [5] "<span style='color: #000000; background-color: #808080;'>  8</span> <span style='color: #000000; background-color: #FF0000;'>  9</span> <span style='color: #000000; background-color: #00FF00;'> 10</span> <span style='color: #000000; background-color: #FFFF00;'> 11</span> <span style='color: #000000; background-color: #0000FF;'> 12</span> <span style='color: #000000; background-color: #FF00FF;'> 13</span> <span style='color: #000000; background-color: #00FFFF;'> 14</span> <span style='color: #000000; background-color: #FFFFFF;'> 15</span>"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       
   [6] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
   [7] "216 Colors (Dark)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
   [8] "<span style='color: #FFFFFF; background-color: #000000;'> 16</span><span style='color: #FFFFD7; background-color: #00005F;'> 17</span><span style='color: #FFFFAF; background-color: #000087;'> 18</span><span style='color: #FFFF87; background-color: #0000AF;'> 19</span><span style='color: #FFFF5F; background-color: #0000D7;'> 20</span><span style='color: #FFFF00; background-color: #0000FF;'> 21</span><span style='color: #FFD7FF; background-color: #005F00;'> 22</span><span style='color: #FFD7D7; background-color: #005F5F;'> 23</span><span style='color: #FFD7AF; background-color: #005F87;'> 24</span><span style='color: #FFD787; background-color: #005FAF;'> 25</span><span style='color: #FFD75F; background-color: #005FD7;'> 26</span><span style='color: #FFD700; background-color: #005FFF;'> 27</span><span style='color: #FFAFFF; background-color: #008700;'> 28</span><span style='color: #FFAFD7; background-color: #00875F;'> 29</span><span style='color: #FFAFAF; background-color: #008787;'> 30</span><span style='color: #FFAF87; background-color: #0087AF;'> 31</span><span style='color: #FFAF5F; background-color: #0087D7;'> 32</span><span style='color: #FFAF00; background-color: #0087FF;'> 33</span>"
   [9] "<span style='color: #D7FFFF; background-color: #5F0000;'> 52</span><span style='color: #D7FFD7; background-color: #5F005F;'> 53</span><span style='color: #D7FFAF; background-color: #5F0087;'> 54</span><span style='color: #D7FF87; background-color: #5F00AF;'> 55</span><span style='color: #D7FF5F; background-color: #5F00D7;'> 56</span><span style='color: #D7FF00; background-color: #5F00FF;'> 57</span><span style='color: #D7D7FF; background-color: #5F5F00;'> 58</span><span style='color: #D7D7D7; background-color: #5F5F5F;'> 59</span><span style='color: #D7D7AF; background-color: #5F5F87;'> 60</span><span style='color: #D7D787; background-color: #5F5FAF;'> 61</span><span style='color: #D7D75F; background-color: #5F5FD7;'> 62</span><span style='color: #D7D700; background-color: #5F5FFF;'> 63</span><span style='color: #D7AFFF; background-color: #5F8700;'> 64</span><span style='color: #D7AFD7; background-color: #5F875F;'> 65</span><span style='color: #D7AFAF; background-color: #5F8787;'> 66</span><span style='color: #D7AF87; background-color: #5F87AF;'> 67</span><span style='color: #D7AF5F; background-color: #5F87D7;'> 68</span><span style='color: #D7AF00; background-color: #5F87FF;'> 69</span>"
  [10] "<span style='color: #AFFFFF; background-color: #870000;'> 88</span><span style='color: #AFFFD7; background-color: #87005F;'> 89</span><span style='color: #AFFFAF; background-color: #870087;'> 90</span><span style='color: #AFFF87; background-color: #8700AF;'> 91</span><span style='color: #AFFF5F; background-color: #8700D7;'> 92</span><span style='color: #AFFF00; background-color: #8700FF;'> 93</span><span style='color: #AFD7FF; background-color: #875F00;'> 94</span><span style='color: #AFD7D7; background-color: #875F5F;'> 95</span><span style='color: #AFD7AF; background-color: #875F87;'> 96</span><span style='color: #AFD787; background-color: #875FAF;'> 97</span><span style='color: #AFD75F; background-color: #875FD7;'> 98</span><span style='color: #AFD700; background-color: #875FFF;'> 99</span><span style='color: #AFAFFF; background-color: #878700;'>100</span><span style='color: #AFAFD7; background-color: #87875F;'>101</span><span style='color: #AFAFAF; background-color: #878787;'>102</span><span style='color: #AFAF87; background-color: #8787AF;'>103</span><span style='color: #AFAF5F; background-color: #8787D7;'>104</span><span style='color: #AFAF00; background-color: #8787FF;'>105</span>"
  [11] "<span style='color: #87FFFF; background-color: #AF0000;'>124</span><span style='color: #87FFD7; background-color: #AF005F;'>125</span><span style='color: #87FFAF; background-color: #AF0087;'>126</span><span style='color: #87FF87; background-color: #AF00AF;'>127</span><span style='color: #87FF5F; background-color: #AF00D7;'>128</span><span style='color: #87FF00; background-color: #AF00FF;'>129</span><span style='color: #87D7FF; background-color: #AF5F00;'>130</span><span style='color: #87D7D7; background-color: #AF5F5F;'>131</span><span style='color: #87D7AF; background-color: #AF5F87;'>132</span><span style='color: #87D787; background-color: #AF5FAF;'>133</span><span style='color: #87D75F; background-color: #AF5FD7;'>134</span><span style='color: #87D700; background-color: #AF5FFF;'>135</span><span style='color: #87AFFF; background-color: #AF8700;'>136</span><span style='color: #87AFD7; background-color: #AF875F;'>137</span><span style='color: #87AFAF; background-color: #AF8787;'>138</span><span style='color: #87AF87; background-color: #AF87AF;'>139</span><span style='color: #87AF5F; background-color: #AF87D7;'>140</span><span style='color: #87AF00; background-color: #AF87FF;'>141</span>"
  [12] "<span style='color: #5FFFFF; background-color: #D70000;'>160</span><span style='color: #5FFFD7; background-color: #D7005F;'>161</span><span style='color: #5FFFAF; background-color: #D70087;'>162</span><span style='color: #5FFF87; background-color: #D700AF;'>163</span><span style='color: #5FFF5F; background-color: #D700D7;'>164</span><span style='color: #5FFF00; background-color: #D700FF;'>165</span><span style='color: #5FD7FF; background-color: #D75F00;'>166</span><span style='color: #5FD7D7; background-color: #D75F5F;'>167</span><span style='color: #5FD7AF; background-color: #D75F87;'>168</span><span style='color: #5FD787; background-color: #D75FAF;'>169</span><span style='color: #5FD75F; background-color: #D75FD7;'>170</span><span style='color: #5FD700; background-color: #D75FFF;'>171</span><span style='color: #5FAFFF; background-color: #D78700;'>172</span><span style='color: #5FAFD7; background-color: #D7875F;'>173</span><span style='color: #5FAFAF; background-color: #D78787;'>174</span><span style='color: #5FAF87; background-color: #D787AF;'>175</span><span style='color: #5FAF5F; background-color: #D787D7;'>176</span><span style='color: #5FAF00; background-color: #D787FF;'>177</span>"
  [13] "<span style='color: #00FFFF; background-color: #FF0000;'>196</span><span style='color: #00FFD7; background-color: #FF005F;'>197</span><span style='color: #00FFAF; background-color: #FF0087;'>198</span><span style='color: #00FF87; background-color: #FF00AF;'>199</span><span style='color: #00FF5F; background-color: #FF00D7;'>200</span><span style='color: #00FF00; background-color: #FF00FF;'>201</span><span style='color: #00D7FF; background-color: #FF5F00;'>202</span><span style='color: #00D7D7; background-color: #FF5F5F;'>203</span><span style='color: #00D7AF; background-color: #FF5F87;'>204</span><span style='color: #00D787; background-color: #FF5FAF;'>205</span><span style='color: #00D75F; background-color: #FF5FD7;'>206</span><span style='color: #00D700; background-color: #FF5FFF;'>207</span><span style='color: #00AFFF; background-color: #FF8700;'>208</span><span style='color: #00AFD7; background-color: #FF875F;'>209</span><span style='color: #00AFAF; background-color: #FF8787;'>210</span><span style='color: #00AF87; background-color: #FF87AF;'>211</span><span style='color: #00AF5F; background-color: #FF87D7;'>212</span><span style='color: #00AF00; background-color: #FF87FF;'>213</span>"
  [14] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  [15] "216 Colors (Light)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
  [16] "<span style='color: #FF87FF; background-color: #00AF00;'> 34</span><span style='color: #FF87D7; background-color: #00AF5F;'> 35</span><span style='color: #FF87AF; background-color: #00AF87;'> 36</span><span style='color: #FF8787; background-color: #00AFAF;'> 37</span><span style='color: #FF875F; background-color: #00AFD7;'> 38</span><span style='color: #FF8700; background-color: #00AFFF;'> 39</span><span style='color: #FF5FFF; background-color: #00D700;'> 40</span><span style='color: #FF5FD7; background-color: #00D75F;'> 41</span><span style='color: #FF5FAF; background-color: #00D787;'> 42</span><span style='color: #FF5F87; background-color: #00D7AF;'> 43</span><span style='color: #FF5F5F; background-color: #00D7D7;'> 44</span><span style='color: #FF5F00; background-color: #00D7FF;'> 45</span><span style='color: #FF00FF; background-color: #00FF00;'> 46</span><span style='color: #FF00D7; background-color: #00FF5F;'> 47</span><span style='color: #FF00AF; background-color: #00FF87;'> 48</span><span style='color: #FF0087; background-color: #00FFAF;'> 49</span><span style='color: #FF005F; background-color: #00FFD7;'> 50</span><span style='color: #FF0000; background-color: #00FFFF;'> 51</span>"
  [17] "<span style='color: #D787FF; background-color: #5FAF00;'> 70</span><span style='color: #D787D7; background-color: #5FAF5F;'> 71</span><span style='color: #D787AF; background-color: #5FAF87;'> 72</span><span style='color: #D78787; background-color: #5FAFAF;'> 73</span><span style='color: #D7875F; background-color: #5FAFD7;'> 74</span><span style='color: #D78700; background-color: #5FAFFF;'> 75</span><span style='color: #D75FFF; background-color: #5FD700;'> 76</span><span style='color: #D75FD7; background-color: #5FD75F;'> 77</span><span style='color: #D75FAF; background-color: #5FD787;'> 78</span><span style='color: #D75F87; background-color: #5FD7AF;'> 79</span><span style='color: #D75F5F; background-color: #5FD7D7;'> 80</span><span style='color: #D75F00; background-color: #5FD7FF;'> 81</span><span style='color: #D700FF; background-color: #5FFF00;'> 82</span><span style='color: #D700D7; background-color: #5FFF5F;'> 83</span><span style='color: #D700AF; background-color: #5FFF87;'> 84</span><span style='color: #D70087; background-color: #5FFFAF;'> 85</span><span style='color: #D7005F; background-color: #5FFFD7;'> 86</span><span style='color: #D70000; background-color: #5FFFFF;'> 87</span>"
  [18] "<span style='color: #AF87FF; background-color: #87AF00;'>106</span><span style='color: #AF87D7; background-color: #87AF5F;'>107</span><span style='color: #AF87AF; background-color: #87AF87;'>108</span><span style='color: #AF8787; background-color: #87AFAF;'>109</span><span style='color: #AF875F; background-color: #87AFD7;'>110</span><span style='color: #AF8700; background-color: #87AFFF;'>111</span><span style='color: #AF5FFF; background-color: #87D700;'>112</span><span style='color: #AF5FD7; background-color: #87D75F;'>113</span><span style='color: #AF5FAF; background-color: #87D787;'>114</span><span style='color: #AF5F87; background-color: #87D7AF;'>115</span><span style='color: #AF5F5F; background-color: #87D7D7;'>116</span><span style='color: #AF5F00; background-color: #87D7FF;'>117</span><span style='color: #AF00FF; background-color: #87FF00;'>118</span><span style='color: #AF00D7; background-color: #87FF5F;'>119</span><span style='color: #AF00AF; background-color: #87FF87;'>120</span><span style='color: #AF0087; background-color: #87FFAF;'>121</span><span style='color: #AF005F; background-color: #87FFD7;'>122</span><span style='color: #AF0000; background-color: #87FFFF;'>123</span>"
  [19] "<span style='color: #8787FF; background-color: #AFAF00;'>142</span><span style='color: #8787D7; background-color: #AFAF5F;'>143</span><span style='color: #8787AF; background-color: #AFAF87;'>144</span><span style='color: #878787; background-color: #AFAFAF;'>145</span><span style='color: #87875F; background-color: #AFAFD7;'>146</span><span style='color: #878700; background-color: #AFAFFF;'>147</span><span style='color: #875FFF; background-color: #AFD700;'>148</span><span style='color: #875FD7; background-color: #AFD75F;'>149</span><span style='color: #875FAF; background-color: #AFD787;'>150</span><span style='color: #875F87; background-color: #AFD7AF;'>151</span><span style='color: #875F5F; background-color: #AFD7D7;'>152</span><span style='color: #875F00; background-color: #AFD7FF;'>153</span><span style='color: #8700FF; background-color: #AFFF00;'>154</span><span style='color: #8700D7; background-color: #AFFF5F;'>155</span><span style='color: #8700AF; background-color: #AFFF87;'>156</span><span style='color: #870087; background-color: #AFFFAF;'>157</span><span style='color: #87005F; background-color: #AFFFD7;'>158</span><span style='color: #870000; background-color: #AFFFFF;'>159</span>"
  [20] "<span style='color: #5F87FF; background-color: #D7AF00;'>178</span><span style='color: #5F87D7; background-color: #D7AF5F;'>179</span><span style='color: #5F87AF; background-color: #D7AF87;'>180</span><span style='color: #5F8787; background-color: #D7AFAF;'>181</span><span style='color: #5F875F; background-color: #D7AFD7;'>182</span><span style='color: #5F8700; background-color: #D7AFFF;'>183</span><span style='color: #5F5FFF; background-color: #D7D700;'>184</span><span style='color: #5F5FD7; background-color: #D7D75F;'>185</span><span style='color: #5F5FAF; background-color: #D7D787;'>186</span><span style='color: #5F5F87; background-color: #D7D7AF;'>187</span><span style='color: #5F5F5F; background-color: #D7D7D7;'>188</span><span style='color: #5F5F00; background-color: #D7D7FF;'>189</span><span style='color: #5F00FF; background-color: #D7FF00;'>190</span><span style='color: #5F00D7; background-color: #D7FF5F;'>191</span><span style='color: #5F00AF; background-color: #D7FF87;'>192</span><span style='color: #5F0087; background-color: #D7FFAF;'>193</span><span style='color: #5F005F; background-color: #D7FFD7;'>194</span><span style='color: #5F0000; background-color: #D7FFFF;'>195</span>"
  [21] "<span style='color: #0087FF; background-color: #FFAF00;'>214</span><span style='color: #0087D7; background-color: #FFAF5F;'>215</span><span style='color: #0087AF; background-color: #FFAF87;'>216</span><span style='color: #008787; background-color: #FFAFAF;'>217</span><span style='color: #00875F; background-color: #FFAFD7;'>218</span><span style='color: #008700; background-color: #FFAFFF;'>219</span><span style='color: #005FFF; background-color: #FFD700;'>220</span><span style='color: #005FD7; background-color: #FFD75F;'>221</span><span style='color: #005FAF; background-color: #FFD787;'>222</span><span style='color: #005F87; background-color: #FFD7AF;'>223</span><span style='color: #005F5F; background-color: #FFD7D7;'>224</span><span style='color: #005F00; background-color: #FFD7FF;'>225</span><span style='color: #0000FF; background-color: #FFFF00;'>226</span><span style='color: #0000D7; background-color: #FFFF5F;'>227</span><span style='color: #0000AF; background-color: #FFFF87;'>228</span><span style='color: #000087; background-color: #FFFFAF;'>229</span><span style='color: #00005F; background-color: #FFFFD7;'>230</span><span style='color: #000000; background-color: #FFFFFF;'>231</span>"
  [22] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
  [23] "Grayscale"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             
  [24] "<span style='color: #FFFFFF; background-color: #080808;'>232</span> <span style='color: #FFFFFF; background-color: #121212;'>233</span> <span style='color: #FFFFFF; background-color: #1C1C1C;'>234</span> <span style='color: #FFFFFF; background-color: #262626;'>235</span> <span style='color: #FFFFFF; background-color: #303030;'>236</span> <span style='color: #FFFFFF; background-color: #3A3A3A;'>237</span> <span style='color: #FFFFFF; background-color: #444444;'>238</span> <span style='color: #FFFFFF; background-color: #4E4E4E;'>239</span> <span style='color: #FFFFFF; background-color: #585858;'>240</span> <span style='color: #FFFFFF; background-color: #626262;'>241</span> <span style='color: #FFFFFF; background-color: #6C6C6C;'>242</span> <span style='color: #FFFFFF; background-color: #767676;'>243</span>"                                                                                                                                                                                                                                                                                                                                                                                                       
  [25] "<span style='color: #000000; background-color: #808080;'>244</span> <span style='color: #000000; background-color: #8A8A8A;'>245</span> <span style='color: #000000; background-color: #949494;'>246</span> <span style='color: #000000; background-color: #9E9E9E;'>247</span> <span style='color: #000000; background-color: #A8A8A8;'>248</span> <span style='color: #000000; background-color: #B2B2B2;'>249</span> <span style='color: #000000; background-color: #BCBCBC;'>250</span> <span style='color: #000000; background-color: #C6C6C6;'>251</span> <span style='color: #000000; background-color: #D0D0D0;'>252</span> <span style='color: #000000; background-color: #DADADA;'>253</span> <span style='color: #000000; background-color: #E4E4E4;'>254</span> <span style='color: #000000; background-color: #EEEEEE;'>255</span>"                                                                                                                                                                                                                                                                                                                                                                                                       
  11/14 tohtml.R: sgr_to_html(sgr_256(), classes = class.256)
   [1] "Standard"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    
   [2] "<span class='fg-15 bg-0'>  0</span> <span class='fg-15 bg-1'>  1</span> <span class='fg-15 bg-2'>  2</span> <span class='fg-15 bg-3'>  3</span> <span class='fg-15 bg-4'>  4</span> <span class='fg-15 bg-5'>  5</span> <span class='fg-15 bg-6'>  6</span> <span class='fg-15 bg-7'>  7</span>"                                                                                                                                                                                                                                                                                                                                                                                                             
   [3] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
   [4] "High-Intensity"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              
   [5] "<span class='fg-0 bg-8'>  8</span> <span class='fg-0 bg-9'>  9</span> <span class='fg-0 bg-10'> 10</span> <span class='fg-0 bg-11'> 11</span> <span class='fg-0 bg-12'> 12</span> <span class='fg-0 bg-13'> 13</span> <span class='fg-0 bg-14'> 14</span> <span class='fg-0 bg-15'> 15</span>"                                                                                                                                                                                                                                                                                                                                                                                                               
   [6] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
   [7] "216 Colors (Dark)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           
   [8] "<span class='fg-231 bg-16'> 16</span><span class='fg-230 bg-17'> 17</span><span class='fg-229 bg-18'> 18</span><span class='fg-228 bg-19'> 19</span><span class='fg-227 bg-20'> 20</span><span class='fg-226 bg-21'> 21</span><span class='fg-225 bg-22'> 22</span><span class='fg-224 bg-23'> 23</span><span class='fg-223 bg-24'> 24</span><span class='fg-222 bg-25'> 25</span><span class='fg-221 bg-26'> 26</span><span class='fg-220 bg-27'> 27</span><span class='fg-219 bg-28'> 28</span><span class='fg-218 bg-29'> 29</span><span class='fg-217 bg-30'> 30</span><span class='fg-216 bg-31'> 31</span><span class='fg-215 bg-32'> 32</span><span class='fg-214 bg-33'> 33</span>"                  
   [9] "<span class='fg-195 bg-52'> 52</span><span class='fg-194 bg-53'> 53</span><span class='fg-193 bg-54'> 54</span><span class='fg-192 bg-55'> 55</span><span class='fg-191 bg-56'> 56</span><span class='fg-190 bg-57'> 57</span><span class='fg-189 bg-58'> 58</span><span class='fg-188 bg-59'> 59</span><span class='fg-187 bg-60'> 60</span><span class='fg-186 bg-61'> 61</span><span class='fg-185 bg-62'> 62</span><span class='fg-184 bg-63'> 63</span><span class='fg-183 bg-64'> 64</span><span class='fg-182 bg-65'> 65</span><span class='fg-181 bg-66'> 66</span><span class='fg-180 bg-67'> 67</span><span class='fg-179 bg-68'> 68</span><span class='fg-178 bg-69'> 69</span>"                  
  [10] "<span class='fg-159 bg-88'> 88</span><span class='fg-158 bg-89'> 89</span><span class='fg-157 bg-90'> 90</span><span class='fg-156 bg-91'> 91</span><span class='fg-155 bg-92'> 92</span><span class='fg-154 bg-93'> 93</span><span class='fg-153 bg-94'> 94</span><span class='fg-152 bg-95'> 95</span><span class='fg-151 bg-96'> 96</span><span class='fg-150 bg-97'> 97</span><span class='fg-149 bg-98'> 98</span><span class='fg-148 bg-99'> 99</span><span class='fg-147 bg-100'>100</span><span class='fg-146 bg-101'>101</span><span class='fg-145 bg-102'>102</span><span class='fg-144 bg-103'>103</span><span class='fg-143 bg-104'>104</span><span class='fg-142 bg-105'>105</span>"            
  [11] "<span class='fg-123 bg-124'>124</span><span class='fg-122 bg-125'>125</span><span class='fg-121 bg-126'>126</span><span class='fg-120 bg-127'>127</span><span class='fg-119 bg-128'>128</span><span class='fg-118 bg-129'>129</span><span class='fg-117 bg-130'>130</span><span class='fg-116 bg-131'>131</span><span class='fg-115 bg-132'>132</span><span class='fg-114 bg-133'>133</span><span class='fg-113 bg-134'>134</span><span class='fg-112 bg-135'>135</span><span class='fg-111 bg-136'>136</span><span class='fg-110 bg-137'>137</span><span class='fg-109 bg-138'>138</span><span class='fg-108 bg-139'>139</span><span class='fg-107 bg-140'>140</span><span class='fg-106 bg-141'>141</span>"
  [12] "<span class='fg-87 bg-160'>160</span><span class='fg-86 bg-161'>161</span><span class='fg-85 bg-162'>162</span><span class='fg-84 bg-163'>163</span><span class='fg-83 bg-164'>164</span><span class='fg-82 bg-165'>165</span><span class='fg-81 bg-166'>166</span><span class='fg-80 bg-167'>167</span><span class='fg-79 bg-168'>168</span><span class='fg-78 bg-169'>169</span><span class='fg-77 bg-170'>170</span><span class='fg-76 bg-171'>171</span><span class='fg-75 bg-172'>172</span><span class='fg-74 bg-173'>173</span><span class='fg-73 bg-174'>174</span><span class='fg-72 bg-175'>175</span><span class='fg-71 bg-176'>176</span><span class='fg-70 bg-177'>177</span>"                  
  [13] "<span class='fg-51 bg-196'>196</span><span class='fg-50 bg-197'>197</span><span class='fg-49 bg-198'>198</span><span class='fg-48 bg-199'>199</span><span class='fg-47 bg-200'>200</span><span class='fg-46 bg-201'>201</span><span class='fg-45 bg-202'>202</span><span class='fg-44 bg-203'>203</span><span class='fg-43 bg-204'>204</span><span class='fg-42 bg-205'>205</span><span class='fg-41 bg-206'>206</span><span class='fg-40 bg-207'>207</span><span class='fg-39 bg-208'>208</span><span class='fg-38 bg-209'>209</span><span class='fg-37 bg-210'>210</span><span class='fg-36 bg-211'>211</span><span class='fg-35 bg-212'>212</span><span class='fg-34 bg-213'>213</span>"                  
  [14] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  [15] "216 Colors (Light)"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          
  [16] "<span class='fg-213 bg-34'> 34</span><span class='fg-212 bg-35'> 35</span><span class='fg-211 bg-36'> 36</span><span class='fg-210 bg-37'> 37</span><span class='fg-209 bg-38'> 38</span><span class='fg-208 bg-39'> 39</span><span class='fg-207 bg-40'> 40</span><span class='fg-206 bg-41'> 41</span><span class='fg-205 bg-42'> 42</span><span class='fg-204 bg-43'> 43</span><span class='fg-203 bg-44'> 44</span><span class='fg-202 bg-45'> 45</span><span class='fg-201 bg-46'> 46</span><span class='fg-200 bg-47'> 47</span><span class='fg-199 bg-48'> 48</span><span class='fg-198 bg-49'> 49</span><span class='fg-197 bg-50'> 50</span><span class='fg-196 bg-51'> 51</span>"                  
  [17] "<span class='fg-177 bg-70'> 70</span><span class='fg-176 bg-71'> 71</span><span class='fg-175 bg-72'> 72</span><span class='fg-174 bg-73'> 73</span><span class='fg-173 bg-74'> 74</span><span class='fg-172 bg-75'> 75</span><span class='fg-171 bg-76'> 76</span><span class='fg-170 bg-77'> 77</span><span class='fg-169 bg-78'> 78</span><span class='fg-168 bg-79'> 79</span><span class='fg-167 bg-80'> 80</span><span class='fg-166 bg-81'> 81</span><span class='fg-165 bg-82'> 82</span><span class='fg-164 bg-83'> 83</span><span class='fg-163 bg-84'> 84</span><span class='fg-162 bg-85'> 85</span><span class='fg-161 bg-86'> 86</span><span class='fg-160 bg-87'> 87</span>"                  
  [18] "<span class='fg-141 bg-106'>106</span><span class='fg-140 bg-107'>107</span><span class='fg-139 bg-108'>108</span><span class='fg-138 bg-109'>109</span><span class='fg-137 bg-110'>110</span><span class='fg-136 bg-111'>111</span><span class='fg-135 bg-112'>112</span><span class='fg-134 bg-113'>113</span><span class='fg-133 bg-114'>114</span><span class='fg-132 bg-115'>115</span><span class='fg-131 bg-116'>116</span><span class='fg-130 bg-117'>117</span><span class='fg-129 bg-118'>118</span><span class='fg-128 bg-119'>119</span><span class='fg-127 bg-120'>120</span><span class='fg-126 bg-121'>121</span><span class='fg-125 bg-122'>122</span><span class='fg-124 bg-123'>123</span>"
  [19] "<span class='fg-105 bg-142'>142</span><span class='fg-104 bg-143'>143</span><span class='fg-103 bg-144'>144</span><span class='fg-102 bg-145'>145</span><span class='fg-101 bg-146'>146</span><span class='fg-100 bg-147'>147</span><span class='fg-99 bg-148'>148</span><span class='fg-98 bg-149'>149</span><span class='fg-97 bg-150'>150</span><span class='fg-96 bg-151'>151</span><span class='fg-95 bg-152'>152</span><span class='fg-94 bg-153'>153</span><span class='fg-93 bg-154'>154</span><span class='fg-92 bg-155'>155</span><span class='fg-91 bg-156'>156</span><span class='fg-90 bg-157'>157</span><span class='fg-89 bg-158'>158</span><span class='fg-88 bg-159'>159</span>"            
  [20] "<span class='fg-69 bg-178'>178</span><span class='fg-68 bg-179'>179</span><span class='fg-67 bg-180'>180</span><span class='fg-66 bg-181'>181</span><span class='fg-65 bg-182'>182</span><span class='fg-64 bg-183'>183</span><span class='fg-63 bg-184'>184</span><span class='fg-62 bg-185'>185</span><span class='fg-61 bg-186'>186</span><span class='fg-60 bg-187'>187</span><span class='fg-59 bg-188'>188</span><span class='fg-58 bg-189'>189</span><span class='fg-57 bg-190'>190</span><span class='fg-56 bg-191'>191</span><span class='fg-55 bg-192'>192</span><span class='fg-54 bg-193'>193</span><span class='fg-53 bg-194'>194</span><span class='fg-52 bg-195'>195</span>"                  
  [21] "<span class='fg-33 bg-214'>214</span><span class='fg-32 bg-215'>215</span><span class='fg-31 bg-216'>216</span><span class='fg-30 bg-217'>217</span><span class='fg-29 bg-218'>218</span><span class='fg-28 bg-219'>219</span><span class='fg-27 bg-220'>220</span><span class='fg-26 bg-221'>221</span><span class='fg-25 bg-222'>222</span><span class='fg-24 bg-223'>223</span><span class='fg-23 bg-224'>224</span><span class='fg-22 bg-225'>225</span><span class='fg-21 bg-226'>226</span><span class='fg-20 bg-227'>227</span><span class='fg-19 bg-228'>228</span><span class='fg-18 bg-229'>229</span><span class='fg-17 bg-230'>230</span><span class='fg-16 bg-231'>231</span>"                  
  [22] ""                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            
  [23] "Grayscale"                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
  [24] "<span class='fg-15 bg-232'>232</span> <span class='fg-15 bg-233'>233</span> <span class='fg-15 bg-234'>234</span> <span class='fg-15 bg-235'>235</span> <span class='fg-15 bg-236'>236</span> <span class='fg-15 bg-237'>237</span> <span class='fg-15 bg-238'>238</span> <span class='fg-15 bg-239'>239</span> <span class='fg-15 bg-240'>240</span> <span class='fg-15 bg-241'>241</span> <span class='fg-15 bg-242'>242</span> <span class='fg-15 bg-243'>243</span>"                                                                                                                                                                                                                                     
  [25] "<span class='fg-0 bg-244'>244</span> <span class='fg-0 bg-245'>245</span> <span class='fg-0 bg-246'>246</span> <span class='fg-0 bg-247'>247</span> <span class='fg-0 bg-248'>248</span> <span class='fg-0 bg-249'>249</span> <span class='fg-0 bg-250'>250</span> <span class='fg-0 bg-251'>251</span> <span class='fg-0 bg-252'>252</span> <span class='fg-0 bg-253'>253</span> <span class='fg-0 bg-254'>254</span> <span class='fg-0 bg-255'>255</span>"                                                                                                                                                                                                                                                 
  11/14 tohtml.R: sgr_to_html("\033[31mhello\033[31m", classes = NULL)
  Error in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  : 
    Argument `classes` must be TRUE, FALSE, or a character vector.
  Calls: unitize_dir ... eval -> eval -> withVisible -> sgr_to_html -> to_html_int
  11/14 tohtml.R: sgr_to_html("\033[31mhello\033[31m", classes = character(7L))
  Error in check_classes(classes) : 
    Argument `classes` must be length 16, 32, or 512 if it is a character vector (is 7).
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> check_classes
  11/14 tohtml.R: sgr_to_html("\033[31mhello\033[31m", classes = rep(NA_character_
  Error in check_classes(classes) : Argument `classes` contains NA values.
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> check_classes
  11/14 tohtml.R: sgr_to_html("\033[31mhello\033[31m", classes = rep("bad class", 
  Error in check_classes(classes) : 
    Argument `classes` contains charcters other than ASCII letters, numbers, the hyphen, and underscore.
  Calls: unitize_dir ... withVisible -> sgr_to_html -> to_html_int -> check_classes
  11/14 tohtml.R: make_styles(class.8, c(1, 1, 0, 0, 0, 1, 1, 0, 0))
  Error in make_styles(class.8, c(1, 1, 0, 0, 0, 1, 1, 0, 0)) : 
    Argument `rgb.mix` must be a 3 x 3 numeric matrix with no NAs.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> make_styles
  11/14 tohtml.R: make_styles(class.8, matrix(c(0, 1, 0, 0, 0, 1, 1, 0, NA), 3))
  Error in make_styles(class.8, matrix(c(0, 1, 0, 0, 0, 1, 1, 0, NA), 3)) : 
    Argument `rgb.mix` must be a 3 x 3 numeric matrix with no NAs.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> make_styles
  11/14 tohtml.R: make_styles(class.8, "hello")
  Error in make_styles(class.8, "hello") : 
    Argument `rgb.mix` must be a 3 x 3 numeric matrix with no NAs.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> make_styles
  11/14 tohtml.R: make_styles(letters, matrix(c(0, 1, 0, 0, 0, 1, 1, 0, 0), 3))
  Error in check_classes(classes) : 
    Argument `classes` must be length 16, 32, or 512 if it is a character vector (is 26).
  Calls: unitize_dir ... eval -> withVisible -> make_styles -> check_classes
  11/14 tohtml.R: make_styles(NULL)
  Error in make_styles(NULL) : Argument `classes` is not character.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> make_styles
  11/14 tohtml.R: unitizer_sect("chars to escape", {
  11/14 tohtml.R: str.esc <- c("A\033[45m<B", "A\033[44m>B", "A\033[43m&B")
  11/14 tohtml.R: to_html(str.esc)
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    `x` contains unescaped HTML special character '<' at index [1] (see ?html_esc); you can use `warn=FALSE` to turn off these warnings.
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    `x` contains unescaped HTML special character '>' at index [2] (see ?html_esc); you can use `warn=FALSE` to turn off these warnings.
  [1] "A<span style='background-color: #BB00BB;'><B</span>"                                                
  [2] "<span style='background-color: #BB00BB;'>A</span><span style='background-color: #0000BB;'>>B</span>"
  [3] "<span style='background-color: #0000BB;'>A</span><span style='background-color: #BBBB00;'>&B</span>"
  11/14 tohtml.R: sgr_to_html(str.esc)
  [1] "A<span style='background-color: #BB00BB;'><B</span>"                                                
  [2] "<span style='background-color: #BB00BB;'>A</span><span style='background-color: #0000BB;'>>B</span>"
  [3] "<span style='background-color: #0000BB;'>A</span><span style='background-color: #BBBB00;'>&B</span>"
  11/14 tohtml.R: to_html(str.esc, warn = FALSE)
  [1] "A<span style='background-color: #BB00BB;'><B</span>"                                                
  [2] "<span style='background-color: #BB00BB;'>A</span><span style='background-color: #0000BB;'>>B</span>"
  [3] "<span style='background-color: #0000BB;'>A</span><span style='background-color: #BBBB00;'>&B</span>"
  11/14 tohtml.R: to_html(html_esc(str.esc))
  [1] "A<span style='background-color: #BB00BB;'>&lt;B</span>"                                                 
  [2] "<span style='background-color: #BB00BB;'>A</span><span style='background-color: #0000BB;'>&gt;B</span>" 
  [3] "<span style='background-color: #0000BB;'>A</span><span style='background-color: #BBBB00;'>&amp;B</span>"
  11/14 tohtml.R: str.esc2 <- c("A\033[45m<B", "A\033[200m>B", "A\033[201mB")
  11/14 tohtml.R: to_html(str.esc2)
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    `x` contains unescaped HTML special character '<' at index [1] (see ?html_esc); you can use `warn=FALSE` to turn off these warnings.
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    `x` contains unescaped HTML special character '>' at index [2] (see ?html_esc); you can use `warn=FALSE` to turn off these warnings.
  Warning in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [3], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "A<span style='background-color: #BB00BB;'><B</span>"
  [2] "<span style='background-color: #BB00BB;'>A>B</span>"
  [3] "<span style='background-color: #BB00BB;'>AB</span>" 
  11/14 tohtml.R: to_html(str.esc2, warn = FALSE)
  [1] "A<span style='background-color: #BB00BB;'><B</span>"
  [2] "<span style='background-color: #BB00BB;'>A>B</span>"
  [3] "<span style='background-color: #BB00BB;'>AB</span>" 
  11/14 tohtml.R: unitizer_sect("helpers", {
  11/14 tohtml.R: html <- sgr_to_html("\033[42mHello")
  11/14 tohtml.R: f <- in_html(html, css = "span {background-color: #CCC;}", displ
  11/14 tohtml.R: readLines(f)
   [1] "<!DOCTYPE html>"                                      
   [2] "<html>"                                               
   [3] "<style>"                                              
   [4] "span {background-color: #CCC;}"                       
   [5] "</style>"                                             
   [6] "<body>"                                               
   [7] "<pre>"                                                
   [8] "<span style='background-color: #00BB00;'>Hello</span>"
   [9] "</pre>"                                               
  [10] "</body>"                                              
  [11] "</html>"                                              
  11/14 tohtml.R: unlink(f)
  11/14 tohtml.R: in_html(html, css = "span {background-color: #CCC;}", display = 
  11/14 tohtml.R: unitizer_sect("carry", {
  11/14 tohtml.R: string.2 <- c("A\033[44m", "B\033[49m", "C", "\033[39mD")
  11/14 tohtml.R: to_html(string.2)
  [1] "A"                                                
  [2] "<span style='background-color: #0000BB;'>B</span>"
  [3] "C"                                                
  [4] "D"                                                
  11/14 tohtml.R: to_html(string.2, carry = FALSE)
  [1] "A" "B" "C" "D"
  11/14 tohtml.R: to_html(string.2, carry = "\033[33m")
  [1] "<span style='color: #BBBB00;'>A</span>"                           
  [2] "<span style='color: #BBBB00; background-color: #0000BB;'>B</span>"
  [3] "<span style='color: #BBBB00;'>C</span>"                           
  [4] "D"                                                                
  11/14 tohtml.R: to_html(string.2, carry = "\033[33m\033]8;;https://w.z\033\\")
  [1] "<a href='https://w.z'><span style='color: #BBBB00;'>A</span></a>"                           
  [2] "<a href='https://w.z'><span style='color: #BBBB00; background-color: #0000BB;'>B</span></a>"
  [3] "<a href='https://w.z'><span style='color: #BBBB00;'>C</span></a>"                           
  [4] "<a href='https://w.z'>D</a>"                                                                
  11/14 tohtml.R: string.3 <- c("A\033[44m", "\033[31mC", NA, "\033[39mD")
  11/14 tohtml.R: to_html(string.3)
  [1] "A"                                                                
  [2] "<span style='color: #BB0000; background-color: #0000BB;'>C</span>"
  [3] NA                                                                 
  [4] NA                                                                 
  11/14 tohtml.R: to_html(string.3, carry = FALSE)
  [1] "A"                                     
  [2] "<span style='color: #BB0000;'>C</span>"
  [3] NA                                      
  [4] "D"                                     
  
  12/14 trimws.R: 
  12/14 trimws.R: library(fansi)
  12/14 trimws.R: unitizer_sect("Equivalence", {
  12/14 trimws.R: txt1 <- c("", "hello", " \t \n\r he\nl\tl\r o \r\t\n", "he\nl\tl
  12/14 trimws.R: identical(trimws(txt1), trimws_ctl(txt1))
  [1] TRUE
  12/14 trimws.R: identical(trimws(txt1, which = "left"), trimws_ctl(txt1, which =
  [1] TRUE
  12/14 trimws.R: identical(trimws(txt1, which = "right"), trimws_ctl(txt1, which 
  [1] TRUE
  12/14 trimws.R: unitizer_sect("Controls", {
  12/14 trimws.R: txt2 <- c("\033[31m he\033[42;1m llo \033[49m\n\t ", " \033]8;;h
  12/14 trimws.R: trimws_ctl(txt2)
  [1] "\033[31mhe\033[42;1m llo\033[0;1;31m"                              
  [2] "\033]8;;https://x.yz\033\\LINK\033[45m hello\033[31m\033]8;;\033\\"
  12/14 trimws.R: trimws_ctl(txt2, which = "left")
  [1] "\033[31mhe\033[42;1m llo \033[49m\n\t "                              
  [2] "\033]8;;https://x.yz\033\\LINK\033[45m hello \033]8;;\033\\ \033[31m"
  12/14 trimws.R: trimws_ctl(txt2, which = "right")
  [1] "\033[31m he\033[42;1m llo\033[0;1;31m"                                
  [2] " \033]8;;https://x.yz\033\\\tLINK\033[45m hello\033[31m\033]8;;\033\\"
  12/14 trimws.R: trimws_ctl(txt2, ctl = c("all", "url", "osc"))
  Warning in trimws_ctl(txt2, ctl = c("all", "url", "osc")) :
    Argument `x` contains a non-CSI/OSC escape sequence at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[31mhe\033[42;1m llo\033[0;1;31m"                            
  [2] "8;;https://x.yz\033\\\tLINK\033[45m hello \033]8;;\033\\\033[31m"
  12/14 trimws.R: trimws_ctl(txt2, ctl = c("all", "sgr", "csi"))
  Warning in trimws_ctl(txt2, ctl = c("all", "sgr", "csi")) :
    Argument `x` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in trimws_ctl(txt2, ctl = c("all", "sgr", "csi")) :
    Argument `x` contains a non-CSI/OSC escape sequence at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "31m he\033[42;1m llo \033[49m"                                       
  [2] "\033]8;;https://x.yz\033\\LINK\033[45m hello \033]8;;\033\\ \033[31m"
  12/14 trimws.R: trimws_ctl(" \r\a A \a\t ", ctl = c("all", "c0"))
  Warning in trimws_ctl(" \r\a A \a\t ", ctl = c("all", "c0")) :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\a A \a"
  12/14 trimws.R: unitizer_sect("Errors / Corner caess", {
  12/14 trimws.R: trimws_ctl(character())
  character(0)
  12/14 trimws.R: trimws_ctl("hello", which = "top")
  Error in trimws_ctl("hello", which = "top") : 
    Argument `which` must partial match one of c("both", "left", "right").
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> trimws_ctl
  12/14 trimws.R: trimws_ctl("hello", whitespace = " ")
  Error in trimws_ctl("hello", whitespace = " ") : 
    Argument `whitespace` may only be set to "[ \t\r\n]".
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> trimws_ctl
  
  13/14 url.R: 
  13/14 url.R: library(fansi)
  13/14 url.R: unitizer_sect("wrap", {
  13/14 url.R: txt <- "This is a link"
  13/14 url.R: base.st <- "%s\033]8;%s;%s\033\\%s\033]8;;\033\\%s"
  13/14 url.R: base.a <- "%s\033]8;%s;%s\a%s\033]8;;\a%s"
  13/14 url.R: url <- "https://x.yz"
  13/14 url.R: u0 <- sprintf(base.st, "", "", url, txt, "")
  13/14 url.R: u1 <- sprintf(base.a, "", "", url, txt, "")
  13/14 url.R: strtrim_ctl(u0, 5)
  [1] "\033]8;;https://x.yz\033\\This \033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u0, 5)
  [1] "\033]8;;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u0, 8)
  [1] "\033]8;;https://x.yz\033\\This is\033]8;;\033\\"
  [2] "\033]8;;https://x.yz\033\\a link\033]8;;\033\\" 
  13/14 url.R: strwrap_ctl(u1, 5)
  [1] "\033]8;;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: u2 <- sprintf(base.st, "", "id=one", url, txt, "")
  13/14 url.R: u2a <- sprintf(base.st, "", "id=", url, txt, "")
  13/14 url.R: u2b <- sprintf(base.st, "", "id", url, txt, "")
  13/14 url.R: u3 <- sprintf(base.st, "", "title=ab:id=one", url, txt, "")
  13/14 url.R: u4 <- sprintf(base.st, "", "id=one:title=ba", url, txt, "")
  13/14 url.R: u6 <- sprintf(base.st, "", "id=one~title=ba", url, txt, "")
  13/14 url.R: strwrap_ctl(u2, 5)
  [1] "\033]8;id=one;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;id=one;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;id=one;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u3, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;id=one;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;id=one;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;id=one;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u4, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;id=one;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;id=one;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;id=one;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u6, 5)
  [1] "\033]8;id=one~title=ba;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;id=one~title=ba;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;id=one~title=ba;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: u7 <- sprintf(base.st, "AB", "id=one", url, txt, "CD")
  13/14 url.R: strwrap_ctl(u7, 8)
  [1] "AB\033]8;id=one;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;id=one;https://x.yz\033\\is a\033]8;;\033\\"  
  [3] "\033]8;id=one;https://x.yz\033\\link\033]8;;\033\\CD"
  13/14 url.R: txt2 <- "This\033[34m is a link\033[49m"
  13/14 url.R: u8 <- sprintf(base.st, "A\033[43mB", "", url, txt2, "CD")
  13/14 url.R: strwrap_ctl(u8, 7)
  [1] "A\033[43mB\033]8;;https://x.yz\033\\This\033[0m\033]8;;\033\\"           
  [2] "\033[34;43m\033]8;;https://x.yz\033\\is a\033[0m\033]8;;\033\\"          
  [3] "\033[34;43m\033]8;;https://x.yz\033\\link\033[49m\033]8;;\033\\CD\033[0m"
  13/14 url.R: url2 <- ";wow;https://x.yz"
  13/14 url.R: u9 <- sprintf(base.st, "", "", url2, txt, "")
  13/14 url.R: strwrap_ctl(u9, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;wow;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;;wow;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;;wow;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: u10 <- sprintf(base.st, "", "\a", url, txt, "")
  13/14 url.R: u11 <- sprintf(base.st, "", "\016", url, txt, "")
  13/14 url.R: Encoding(u10) <- "UTF-8"
  13/14 url.R: Encoding(u11) <- "UTF-8"
  13/14 url.R: u11a <- sprintf(base.st, "", "hello", url, txt, "")
  13/14 url.R: strwrap_ctl(u10, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] ";https://x.yz\033\\This" "is a"                   
  [3] "link"                   
  13/14 url.R: strwrap_ctl(u11, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: strwrap_ctl(u11a, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with unknown substrings or a OSC hyperlink with unsupported parameters at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;https://x.yz\033\\This\033]8;;\033\\"
  [2] "\033]8;;https://x.yz\033\\is a\033]8;;\033\\"
  [3] "\033]8;;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: nchar_ctl(c(u10, u11, u11a))
  [1] 27 14 14
  13/14 url.R: u12 <- sprintf(base.st, "", "", "\b", txt, "")
  13/14 url.R: u12a <- sprintf(base.st, "", "", "\x80", txt, "")
  13/14 url.R: Encoding(u12) <- "UTF-8"
  13/14 url.R: Encoding(u12a) <- "UTF-8"
  13/14 url.R: strwrap_ctl(u12, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "This" "is a" "link"
  13/14 url.R: strwrap_ctl(u12a, 5)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `x` contains an illegal non-ASCII byte at index [1], see `?unhandled_ctl`.
  Calls: unitize_dir ... eval -> eval -> withVisible -> strwrap_ctl -> strwrap2_ctl
  13/14 url.R: nchar_ctl(c(u12, u12a))
  [1] 14 14
  13/14 url.R: nchar_ctl(c(u12, u12a), allowNA = TRUE)
  [1] 14 14
  13/14 url.R: u13 <- "a\033]8;;THE END"
  13/14 url.R: u13a <- "a\033];;THE END"
  13/14 url.R: u14 <- "a\033]8;;THE END\033]8;;NO?"
  13/14 url.R: u15 <- "a\033]8;;THE END\033]8;;\033["
  13/14 url.R: strwrap_ctl(u13, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
  13/14 url.R: strwrap_ctl(u13, 5, terminate = FALSE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033]8;;THE END"
  13/14 url.R: strwrap_ctl(u13a, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a\033];;THE END"
  13/14 url.R: strwrap_ctl(u14, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
  13/14 url.R: strwrap_ctl(u15, 5)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "a"
  13/14 url.R: nchar_ctl(c(u13, u13a, u14, u15))
  Warning in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [3], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [4], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] 1 1 1 1
  13/14 url.R: u16 <- sprintf(base.st, "", "", "", txt, "")
  13/14 url.R: u17 <- sprintf(base.st, "", "", "", "", "")
  13/14 url.R: strwrap_ctl(u16, 5)
  [1] "This" "is a" "link"
  13/14 url.R: strwrap_ctl(u17, 5)
  [1] ""
  13/14 url.R: strwrap_ctl(u0, 5, terminate = FALSE)
  [1] "\033]8;;https://x.yz\033\\This"              
  [2] "\033]8;;https://x.yz\033\\is a"              
  [3] "\033]8;;https://x.yz\033\\link\033]8;;\033\\"
  13/14 url.R: open <- "\033]8;;ab.c\033\\"
  13/14 url.R: u21 <- c("he\033[44mllo \033]8;;de.f\033\\world", "night moon")
  13/14 url.R: strwrap_ctl(u21, 5, carry = "\033[33m")
  [1] "\033[33mhe\033[44mllo\033[0m"                           
  [2] "\033[33;44m\033]8;;de.f\033\\world\033[0m\033]8;;\033\\"
  [3] "\033[33;44m\033]8;;de.f\033\\night\033[0m\033]8;;\033\\"
  [4] "\033[33;44m\033]8;;de.f\033\\moon\033[0m\033]8;;\033\\" 
  13/14 url.R: strwrap_ctl(u21, 5, carry = paste0(open, "\033[33m"))
  [1] "\033[33m\033]8;;ab.c\033\\he\033[44mllo\033[0m\033]8;;\033\\"
  [2] "\033[33;44m\033]8;;de.f\033\\world\033[0m\033]8;;\033\\"     
  [3] "\033[33;44m\033]8;;de.f\033\\night\033[0m\033]8;;\033\\"     
  [4] "\033[33;44m\033]8;;de.f\033\\moon\033[0m\033]8;;\033\\"      
  13/14 url.R: unitizer_sect("normalize", {
  13/14 url.R: u18 <- "A\033]8;id=a;x.yz\033\\B\033]8;id=a;x.yz\033\\C\033]8;;\033
  13/14 url.R: normalize_state(u18)
  [1] "A\033]8;id=a;x.yz\033\\BC\033]8;;\033\\D"
  13/14 url.R: u18a <- "A\033]8;id=a;x.yz\033\\B\033]8;;\033\\\033]8;id=a;x.yz\033
  13/14 url.R: normalize_state(u18a)
  [1] "A\033]8;id=a;x.yz\033\\BC\033]8;;\033\\D"
  13/14 url.R: u18b <- "A\033]8;id=a;x.yz\033\\\033]8;id=b;x.yz\033\\C\033]8;;\033
  13/14 url.R: normalize_state(u18b)
  [1] "A\033]8;id=b;x.yz\033\\C\033]8;;\033\\D"
  13/14 url.R: u19 <- "A\033]8;id=a;x.yz\033\\B\033]8;id=b;x.yz\033\\C\033]8;;\033
  13/14 url.R: u20 <- "A\033]8;id=a;x.yz\033\\B\033]8;id=a;w.yz\033\\C\033]8;;\033
  13/14 url.R: normalize_state(u19)
  [1] "A\033]8;id=a;x.yz\033\\B\033]8;id=b;x.yz\033\\C\033]8;;\033\\D"
  13/14 url.R: normalize_state(u20)
  [1] "A\033]8;id=a;x.yz\033\\B\033]8;id=a;w.yz\033\\C\033]8;;\033\\D"
  13/14 url.R: unitizer_sect("substr", {
  13/14 url.R: substr_ctl(u0, 6, 9)
  [1] "\033]8;;https://x.yz\033\\is a\033]8;;\033\\"
  13/14 url.R: substr_ctl(u0, 6, 9, terminate = FALSE)
  [1] "\033]8;;https://x.yz\033\\is a"
  13/14 url.R: substr_ctl("hello world", 3, 8, carry = "\033]8;;a.b\033\\")
  [1] "\033]8;;a.b\033\\llo wo\033]8;;\033\\"
  13/14 url.R: np.bytes <- c("A\033]8;a=\r:id=c;x.y\033\\B", "A\033]8;a=c:id=\r;x.
  13/14 url.R: Encoding(np.bytes) <- "UTF-8"
  13/14 url.R: substr_ctl(np.bytes[1:3], 2, 2)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [2], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [3], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;id=c;x.y\033\\B\033]8;;\033\\"
  [2] "\033]8;;x.y\033\\B\033]8;;\033\\"    
  [3] "B"                                   
  13/14 url.R: substr_ctl(np.bytes[4], 2, 2)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains an illegal non-ASCII byte at index [1], see `?unhandled_ctl`.
  Calls: unitize_dir ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  13/14 url.R: unitizer_sect("tohtml", {
  13/14 url.R: to_html(u0)
  [1] "<a href='https://x.yz'>This is a link</a>"
  13/14 url.R: to_html("A\033[44mB\033]8;;x.y\033\\C\033[33m\033]8;;\033\\D")
  [1] "A<span style='background-color: #0000BB;'>B</span><a href='x.y'><span style='background-color: #0000BB;'>C</span></a><span style='color: #BBBB00; background-color: #0000BB;'>D</span>"
  13/14 url.R: to_html("A\033[44mB\033]8;;x.y\033\\C\033[33m\033]8;;w.z\033\\D")
  [1] "A<span style='background-color: #0000BB;'>B</span><a href='x.y'><span style='background-color: #0000BB;'>C</span></a><a href='w.z'><span style='color: #BBBB00; background-color: #0000BB;'>D</span></a>"
  13/14 url.R: u23 <- c("A \033[44mB \033]8;;x.y\033\\C \033[33m\033]8;;w.z\033\\D
  13/14 url.R: to_html(u23)
  [1] "A <span style='background-color: #0000BB;'>B </span><a href='x.y'><span style='background-color: #0000BB;'>C </span></a><a href='w.z'><span style='color: #BBBB00; background-color: #0000BB;'>D</span></a>"                                                                                        
  [2] "<a href='w.z'><span style='color: #BBBB00; background-color: #0000BB;'>E </span></a><a href='www.z.com'><span style='color: #BBBB00; background-color: #0000BB;'>F </span></a><a href='www.z.com'><span style='color: #BBBB00; background-color: #0000BB; text-decoration: underline;'>G</span></a>"
  [3] "<a href='www.z.com'><span style='color: #BBBB00; background-color: #0000BB; text-decoration: underline;'>H </span></a><span style='color: #BBBB00; background-color: #5F87AF; text-decoration: underline;'> I</span>"                                                                               
  13/14 url.R: to_html(strwrap_ctl(u23, 4))
  [1] "A <span style='background-color: #0000BB;'>B</span>"                                                                                                    
  [2] "<a href='x.y'><span style='background-color: #0000BB;'>C </span></a><a href='w.z'><span style='color: #BBBB00; background-color: #0000BB;'>D</span></a>"
  [3] "E <a href='www.z.com'>F</a>"                                                                                                                            
  [4] "<a href='www.z.com'><span style='text-decoration: underline;'>G</span></a>"                                                                             
  [5] "H <span style='background-color: #5F87AF;'>I</span>"                                                                                                    
  13/14 url.R: unitizer_sect("osc", {
  13/14 url.R: nchar_ctl("\033]hello \aworld")
  [1] 5
  13/14 url.R: nchar_ctl("\033]hello \033\\world")
  [1] 5
  13/14 url.R: nchar_ctl("\033]hello \033\\world", ctl = c("all", "osc"))
  [1] 11
  13/14 url.R: x <- "\033]hello\x80\033\\world"
  13/14 url.R: Encoding(x) <- "UTF-8"
  13/14 url.R: nchar_ctl(x)
  [1] 5
  13/14 url.R: nchar_ctl("\033]hello world")
  Warning in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  :
    Argument `x` contains a malformed CSI or OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] 0
  
  14/14 wrap.R: 
  14/14 wrap.R: library(unitizer)
  14/14 wrap.R: library(fansi)
  14/14 wrap.R: unitizer_sect("Basic wrap", {
  14/14 wrap.R: hello.0 <- "hello world this is a lovely day"
  14/14 wrap.R: strwrap_ctl(hello.0, width = 10)
  [1] "hello"     "world"     "this is a" "lovely"    "day"      
  14/14 wrap.R: hello.1 <- "hello  world  this  is.  a lovely day."
  14/14 wrap.R: strwrap_ctl(hello.1, width = 10)
  [1] "hello"    "world"    "this is." "a lovely" "day."    
  14/14 wrap.R: hello.2 <- "hello\rworld\rthis  is.  a lovely day."
  14/14 wrap.R: strwrap_ctl(hello.2, width = 10)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello\rworld\rthis" "is.  a"             "lovely"            
  [4] "day."              
  14/14 wrap.R: hello.3 <- "hello\rworld\nthis  is.  a lovely\n day."
  14/14 wrap.R: strwrap_ctl(hello.3, width = 10)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello\rworld" "this is."     "a lovely"     "day."        
  14/14 wrap.R: hello.4 <- "  hello  world  this  is  a lovely day."
  14/14 wrap.R: strwrap_ctl(hello.4, width = 10)
  [1] "hello"     "world"     "this is a" "lovely"    "day."     
  14/14 wrap.R: hello.5 <- "hello.\n\n\nworld"
  14/14 wrap.R: strwrap_ctl(hello.5, width = 10)
  [1] "hello." ""       "world" 
  14/14 wrap.R: hello.5a <- "hello.\n \n \nworld"
  14/14 wrap.R: strwrap_ctl(hello.5a, width = 10)
  [1] "hello." ""       "world" 
  14/14 wrap.R: hello.6a <- "hello.\"  there"
  14/14 wrap.R: strwrap_ctl(hello.6a, width = 40)
  [1] "hello.\"  there"
  14/14 wrap.R: hello.6b <- "hello.'  there"
  14/14 wrap.R: strwrap_ctl(hello.6b, width = 40)
  [1] "hello.'  there"
  14/14 wrap.R: hello.6c <- "hello.)  there"
  14/14 wrap.R: strwrap_ctl(hello.6c, width = 40)
  [1] "hello.)  there"
  14/14 wrap.R: unitizer_sect("Basic Ansi", {
  14/14 wrap.R: hello2.0 <- paste0("hello ", red, "world ", grn.bg, " this is a  l
  14/14 wrap.R: strwrap_ctl(hello2.0, 10)
  [1] "hello"                        "\033[31mworld\033[0m"        
  [3] "\033[31;42mthis is a\033[0m"  "\033[31;42mlovely\033[0mday."
  14/14 wrap.R: strwrap_ctl(strip_ctl(hello2.0, "sgr"), 10)
  [1] "hello"      "world"      "this is a"  "lovelyday."
  14/14 wrap.R: hello2.1 <- paste0("hello \033[41mworld\033[m how are you today")
  14/14 wrap.R: hello2.2 <- paste0("hello \033[41mworld\033[0m how are you today")
  14/14 wrap.R: strwrap_ctl(hello2.1, 15)
  [1] "hello \033[41mworld\033[0m" "how are you"               
  [3] "today"                     
  14/14 wrap.R: hello.bold.faint <- paste0("hello \033[1mbolded once upon a time\0
  14/14 wrap.R: strwrap_ctl(hello.bold.faint, 10)
   [1] "hello"                   "\033[1mbolded\033[0m"   
   [3] "\033[1monce upon\033[0m" "\033[1ma time\033[0m"   
   [5] "normal"                  "\033[2mfainting\033[0m" 
   [7] "\033[2min\033[0m"        "\033[2mfaintness\033[0m"
   [9] "\033[2moh no\033[0m"     "normal"                 
  14/14 wrap.R: hello.blinky <- paste0("hello \033[5mbliking slowly oh my\033[25m 
  14/14 wrap.R: strwrap_ctl(hello.blinky, 10)
  [1] "hello"                    "\033[5mbliking\033[0m"   
  [3] "\033[5mslowly oh\033[0m"  "\033[5mmy\033[25m normal"
  [5] "\033[6mblinking\033[0m"   "\033[6mquickly\033[0m"   
  [7] "\033[6moh my\033[0m"      "normal"                  
  14/14 wrap.R: strwrap_ctl(hello.blinky, 10, terminate = FALSE)
  [1] "hello"             "\033[5mbliking"    "slowly oh"        
  [4] "my\033[25m normal" "\033[6mblinking"   "quickly"          
  [7] "oh my"             "\033[0mnormal"    
  14/14 wrap.R: hello2.3 <- c(hello2.1, hello2.2)
  14/14 wrap.R: strwrap_ctl(hello2.3, 10, simplify = FALSE)
  [[1]]
  [1] "hello"                   "\033[41mworld\033[m how"
  [3] "are you"                 "today"                  
  
  [[2]]
  [1] "hello"                    "\033[41mworld\033[0m how"
  [3] "are you"                  "today"                   
  
  14/14 wrap.R: strwrap2_ctl(hello2.3, 10, simplify = FALSE)
  [[1]]
  [1] "hello"                   "\033[41mworld\033[m how"
  [3] "are you"                 "today"                  
  
  [[2]]
  [1] "hello"                    "\033[41mworld\033[0m how"
  [3] "are you"                  "today"                   
  
  14/14 wrap.R: strwrap_ctl("aliquip \033[31mex ea commodo consequat\033[0m\n", 
  [1] "aliquip \033[31mex ea commodo\033[0m"
  [2] "\033[31mconsequat\033[0m"            
  14/14 wrap.R: unitizer_sect("Long Wrap", {
  14/14 wrap.R: wrap.csi <- strwrap_ctl(lorem.r.thanks, 40)
  14/14 wrap.R: nchar(strip_ctl(wrap.csi, "sgr"))
   [1] 34 37 30 13  0 37 38  9  0 39 36 37 15  0 35 39 37 37 31 25  0 39 37 38 39
  [26]  5  0 39 36 34 33 36 39 27  0 31 29 37 39 35 34 37 34 31 36 25 37
  14/14 wrap.R: nchar(wrap.csi)
   [1] 44 37 30 13  0 68 56 17  0 98 55 57 25  0 61 47 63 90 72 61  0 68 37 38 49
  [26]  5  0 75 54 47 49 64 67 45  0 91 78 87 88 74 73 86 54 60 75 25 67
  14/14 wrap.R: unitizer_sect("Other Escapes", {
  14/14 wrap.R: strwrap_ctl("hello \033kworld yohoo", 12)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello \033kworld" "yohoo"           
  14/14 wrap.R: strwrap_ctl("hello \033\nworld yohoo", 12)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a malformed escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello \033\nworld" "yohoo"            
  14/14 wrap.R: c0 <- "hello\037\037\037\037\037\037 world yohoo"
  14/14 wrap.R: Encoding(c0) <- "UTF-8"
  14/14 wrap.R: strwrap_ctl(c0, 12)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello\037\037\037\037\037\037 world" "yohoo"                              
  14/14 wrap.R: strwrap_ctl("hello \033[999mworld", 6)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello" "world"
  14/14 wrap.R: strwrap_ctl("hello \033[31#31mworld", 6)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence or OSC hyperlink with invalid substrings at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello" "world"
  14/14 wrap.R: strwrap_ctl("hello \033[999nworld", 6)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"          "\033[999nworld"
  14/14 wrap.R: strwrap_ctl("hello \033[999mworld", 6, warn = FALSE)
  [1] "hello" "world"
  14/14 wrap.R: strwrap_ctl("hello \033[31#31mworld", 6, warn = FALSE)
  [1] "hello" "world"
  14/14 wrap.R: strwrap_ctl("hello \033[999nworld", 6, warn = FALSE)
  [1] "hello"          "\033[999nworld"
  14/14 wrap.R: unitizer_sect("prefix / initial simple", {
  14/14 wrap.R: lorem.sentence <- unlist(strsplit_ctl(lorem, "[.]\\K ", perl = TRU
  14/14 wrap.R: lorem.sentence <- gsub(",", ",\n", lorem.sentence, fixed = TRUE)
  14/14 wrap.R: lorem.para <- c(paste0(lorem.sentence[1:2], collapse = "\n\n"), 
  14/14 wrap.R: strwrap_ctl(lorem.para, indent = 2)
   [1] "  Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do"      
   [2] "eiusmod tempor incididunt ut labore et dolore magna aliqua."            
   [3] ""                                                                       
   [4] "  Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"   
   [5] "nisi ut aliquip ex ea commodo consequat."                               
   [6] "  Duis aute irure dolor in reprehenderit in voluptate velit esse cillum"
   [7] "dolore eu fugiat nulla pariatur."                                       
   [8] ""                                                                       
   [9] "  Excepteur sint occaecat cupidatat non proident, sunt in culpa qui"    
  [10] "officia deserunt mollit anim id est laborum."                           
  14/14 wrap.R: strwrap_ctl(lorem.para, exdent = 2)
   [1] "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod"
   [2] "  tempor incididunt ut labore et dolore magna aliqua."                  
   [3] ""                                                                       
   [4] "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi"
   [5] "  ut aliquip ex ea commodo consequat."                                  
   [6] "Duis aute irure dolor in reprehenderit in voluptate velit esse cillum"  
   [7] "  dolore eu fugiat nulla pariatur."                                     
   [8] ""                                                                       
   [9] "Excepteur sint occaecat cupidatat non proident, sunt in culpa qui"      
  [10] "  officia deserunt mollit anim id est laborum."                         
  14/14 wrap.R: strwrap_ctl(lorem.para, indent = 4, exdent = 2)
   [1] "    Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do"   
   [2] "  eiusmod tempor incididunt ut labore et dolore magna aliqua."         
   [3] ""                                                                      
   [4] "    Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris"
   [5] "  nisi ut aliquip ex ea commodo consequat."                            
   [6] "    Duis aute irure dolor in reprehenderit in voluptate velit esse"    
   [7] "  cillum dolore eu fugiat nulla pariatur."                             
   [8] ""                                                                      
   [9] "    Excepteur sint occaecat cupidatat non proident, sunt in culpa qui" 
  [10] "  officia deserunt mollit anim id est laborum."                        
  14/14 wrap.R: unitizer_sect("prefix / initial with ESC", {
  14/14 wrap.R: pre <- "\033[32m+ \033[0m"
  14/14 wrap.R: ini <- "\033[33m> \033[0m"
  14/14 wrap.R: hello.8a <- "hello world yohoo"
  14/14 wrap.R: wrap.csi.2 <- strwrap_ctl(hello.8a, 14, prefix = pre, initial = in
  14/14 wrap.R: wrap.csi.2
  [1] "\033[33m> \033[0mhello world" "\033[32m+ \033[0myohoo"      
  14/14 wrap.R: hello.8b <- c(hello.8a, "oh my this has 2 elements")
  14/14 wrap.R: wrap.csi.3 <- strwrap_ctl(hello.8b, 14, prefix = pre, initial = in
  14/14 wrap.R: wrap.csi.3
  [1] "\033[33m> \033[0mhello world" "\033[32m+ \033[0myohoo"      
  [3] "\033[32m+ \033[0moh my this"  "\033[32m+ \033[0mhas 2"      
  [5] "\033[32m+ \033[0melements"   
  14/14 wrap.R: unitizer_sect("wrap2", {
  14/14 wrap.R: hello.9a <- "hello\t\033[41mred\033[49m\tworld"
  14/14 wrap.R: strwrap2_ctl(hello.9a, 12)
  [1] "hello \033[41mred\033[0m" "world"                   
  14/14 wrap.R: strwrap2_ctl(hello.9a, 12, tabs.as.spaces = TRUE)
  [1] "hello   \033[41mred\033[49m" "     world"                 
  14/14 wrap.R: strwrap2_ctl(hello.9a, 13, tabs.as.spaces = TRUE)
  [1] "hello   \033[41mred\033[49m " "    world"                   
  14/14 wrap.R: strwrap2_ctl(hello.9a, 12, tabs.as.spaces = TRUE, tab.stops = c(6,
  [1] "hello \033[41mred\033[49m  " "       "                    
  [3] "world"                      
  14/14 wrap.R: r.thanks <- lorem.r.thanks.2
  14/14 wrap.R: bg <- ceiling(seq_along(r.thanks)/length(r.thanks) * 215) + 16
  14/14 wrap.R: fg <- ifelse((((bg - 16)%/%18)%%2), 30, 37)
  14/14 wrap.R: tpl <- "\033[%d;48;5;%dm%s\033[49m"
  14/14 wrap.R: nz <- nzchar(r.thanks)
  14/14 wrap.R: r.thanks[nz] <- sprintf(tpl, fg[nz], bg[nz], r.thanks[nz])
  14/14 wrap.R: r.col <- paste0(r.thanks, collapse = "\n")
  14/14 wrap.R: r.wrap <- strwrap2_ctl(r.col, 35, pad.end = " ", wrap.always = TRU
  14/14 wrap.R: (r.wrap)
   [1] "\033[37;48;5;23mMany more, too numerous to mention\033[0m"                                                   
   [2] "\033[37;48;5;23mhere, have contributed by sending \033[0m"                                                   
   [3] "\033[37;48;5;23mbug\033[49m \033[37;48;5;30mreports and suggesting various\033[0m"                           
   [4] "\033[37;48;5;30mimprovements.\033[49m                     \033[0m"                                           
   [5] "\033[37m                                  \033[0m"                                                           
   [6] "\033[30;48;5;43mSimon Davies whilst at the        \033[0m"                                                   
   [7] "\033[30;48;5;43mUniversity of Auckland wrote the  \033[0m"                                                   
   [8] "\033[30;48;5;43moriginal\033[49m \033[30;48;5;50mversion of glm().\033[49m        \033[0m"                   
   [9] "\033[30m                                  \033[0m"                                                           
  [10] "\033[37;48;5;64mJulian Harris and Wing Kwong      \033[0m"                                                   
  [11] "\033[37;48;5;64m(Tiki) Wan whilst at the          \033[0m"                                                   
  [12] "\033[37;48;5;64mUniversity of\033[49m \033[30;48;5;70mAuckland assisted   \033[0m"                           
  [13] "\033[30;48;5;70mRoss Ihaka with the original      \033[0m"                                                   
  [14] "\033[30;48;5;70mMacintosh port.\033[49m                   \033[0m"                                           
  [15] "\033[30m                                  \033[0m"                                                           
  [16] "\033[30;48;5;84mR was inspired by the S           \033[0m"                                                   
  [17] "\033[30;48;5;84menvironment which has been        \033[0m"                                                   
  [18] "\033[30;48;5;84mprincipally\033[49m \033[37;48;5;90mdeveloped by John     \033[0m"                           
  [19] "\033[37;48;5;90mChambers, with substantial input  \033[0m"                                                   
  [20] "\033[37;48;5;90mfrom Douglas Bates,\033[49m \033[37;48;5;97mRick Becker,  \033[0m"                           
  [21] "\033[37;48;5;97mBill Cleveland, Trevor Hastie,    \033[0m"                                                   
  [22] "\033[37;48;5;97mDaryl Pregibon and\033[49m \033[37;48;5;104mAllan Wilks.\033[49m   \033[0m"                  
  [23] "\033[37m                                  \033[0m"                                                           
  [24] "\033[30;48;5;117mA special debt is owed to John    \033[0m"                                                  
  [25] "\033[30;48;5;117mChambers who has graciously       \033[0m"                                                  
  [26] "\033[30;48;5;117mcontributed\033[49m \033[37;48;5;124madvice and            \033[0m"                         
  [27] "\033[37;48;5;124mencouragement in the early days of\033[0m"                                                  
  [28] "\033[37;48;5;124mR and later became a\033[49m \033[37;48;5;131mmember of the\033[0m"                         
  [29] "\033[37;48;5;131mcore team.\033[49m                        \033[0m"                                          
  [30] "\033[37m                                  \033[0m"                                                           
  [31] "\033[30;48;5;158mThe R Foundation may decide to    \033[0m"                                                  
  [32] "\033[30;48;5;158mgive out                          \033[0m"                                                  
  [33] "\033[30;48;5;158m<first.lastname>@R-project.org\033[49m    \033[0m"                                          
  [34] "\033[37;48;5;164memail addresses to contributors to\033[0m"                                                  
  [35] "\033[37;48;5;164mthe R Project (even without making\033[0m"                                                  
  [36] "\033[37;48;5;164mthem\033[49m \033[37;48;5;171mmembers of the R Foundation) \033[0m"                         
  [37] "\033[37;48;5;171mwhen in the view of the R         \033[0m"                                                  
  [38] "\033[37;48;5;171mFoundation this\033[49m \033[30;48;5;178mwould help advance\033[0m"                         
  [39] "\033[30;48;5;178mthe R project.\033[49m                    \033[0m"                                          
  [40] "\033[30m                                  \033[0m"                                                           
  [41] "\033[30;48;5;191mThe R Core Group, Roger Bivand,   \033[0m"                                                  
  [42] "\033[30;48;5;191mJennifer Bryan, Di Cook, Dirk     \033[0m"                                                  
  [43] "\033[30;48;5;191mEddelbuettel,\033[49m \033[37;48;5;198mJohn Fox, Bettina   \033[0m"                         
  [44] "\033[37;48;5;198mGrün, Frank Harrell, Torsten      \033[0m"                                                  
  [45] "\033[37;48;5;198mHothorn, Stefano Iacus,\033[49m \033[37;48;5;205mJulie     \033[0m"                         
  [46] "\033[37;48;5;205mJosse, Balasubramanian Narasimhan,\033[0m"                                                  
  [47] "\033[37;48;5;205mMarc Schwartz, Heather Turner,\033[49m    \033[0m"                                          
  [48] "\033[37;48;5;211mBill Venables, Hadley Wickham and \033[0m"                                                  
  [49] "\033[37;48;5;211mAchim Zeileis are the ordinary    \033[0m"                                                  
  [50] "\033[37;48;5;211mmembers of\033[49m \033[30;48;5;218mthe R Foundation.\033[49m \033[30;48;5;225mIn   \033[0m"
  [51] "\033[30;48;5;225maddition, David Meyer and Simon   \033[0m"                                                  
  [52] "\033[30;48;5;225mWood are also e-addressable by\033[49m    \033[0m"                                          
  [53] "\033[30;48;5;231m<Firstname>.<Lastname>@R-project.o\033[0m"                                                  
  [54] "\033[30;48;5;231mrg.\033[49m                               \033[0m"                                          
  14/14 wrap.R: hello.9b <- "\033[41mhello\n\nworld."
  14/14 wrap.R: strwrap2_ctl(hello.9b, 8, pad.end = " ")
  [1] "\033[41mhello  \033[0m" "\033[41m       \033[0m" "\033[41mworld. \033[0m"
  14/14 wrap.R: strwrap2_ctl(hello.9b, 8, pad.end = 0)
  [1] "\033[41mhello00\033[0m" "\033[41m0000000\033[0m" "\033[41mworld.0\033[0m"
  14/14 wrap.R: hello.9b <- "  \033[41mhello world."
  14/14 wrap.R: strwrap2_ctl(hello.9b, 8, strip.spaces = FALSE)
  [1] "  \033[41mhello\033[0m" "\033[41m world.\033[0m"
  14/14 wrap.R: hello.9c <- "\033[41m  hello world."
  14/14 wrap.R: ws.0 <- "hello   worldza"
  14/14 wrap.R: ws.1 <- "hello \t worldza"
  14/14 wrap.R: ws.2 <- "hello \n worldza"
  14/14 wrap.R: strwrap2_sgr(ws.0, 7, strip.spaces = FALSE)
  [1] "hello "  "  "      "worldza"
  14/14 wrap.R: strwrap2_sgr(ws.0, 7, strip.spaces = FALSE, wrap.always = TRUE)
  [1] "hello " "  "     "worldz" "a"     
  14/14 wrap.R: strwrap2_sgr(ws.0, 6, strip.spaces = FALSE)
  [1] "hello"   "   "     "worldza"
  14/14 wrap.R: strwrap2_sgr(ws.0, 6, strip.spaces = FALSE, wrap.always = TRUE)
  [1] "hello" "   "   "world" "za"   
  14/14 wrap.R: strwrap2_sgr(ws.1, 7, strip.spaces = FALSE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello "  "\t "     "worldza"
  14/14 wrap.R: strwrap2_sgr(ws.1, 7, strip.spaces = FALSE, wrap.always = TRUE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello " "\t "    "worldz" "a"     
  14/14 wrap.R: strwrap2_sgr(ws.1, 6, strip.spaces = FALSE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello"   " \t "    "worldza"
  14/14 wrap.R: strwrap2_sgr(ws.1, 6, strip.spaces = FALSE, wrap.always = TRUE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello" " \t "  "world" "za"   
  14/14 wrap.R: strwrap2_sgr(" hello world ", 7, strip.spaces = FALSE)
  [1] " hello" " world" " "     
  14/14 wrap.R: strwrap2_sgr("\thello\tworld\t", 7, strip.spaces = FALSE)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\thello" "\tworld" "\t"     
  14/14 wrap.R: strwrap2_sgr("\nhello\nworld\n", 7, strip.spaces = FALSE)
  [1] ""      "hello" "world" ""     
  14/14 wrap.R: unitizer_sect("_sgr", {
  14/14 wrap.R: hello.9e <- c("hello\t\033[91mworld\033[m\t\033[38;2;31;42;4mworld
  14/14 wrap.R: strwrap_sgr(hello.9e, 12, term.cap = "256")
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello \033[91mworld\033[0m"          
  [2] "\033[38;2;31;42;4mworld\033[0m"      
  [3] "\033[38;2;31;42;4mboohaythere\033[0m"
  [4] "asdfasdfasdfasdf"                    
  14/14 wrap.R: hello.9f <- "hello \033[91mworld boohaythereyowza"
  14/14 wrap.R: strwrap2_sgr(hello.9f, 12, prefix = "++", initial = ">>", wrap.alw
  [1] ">>hello ~~~"                "\033[91m++world ~~~\033[0m"
  [3] "\033[91m++boohaythe\033[0m" "\033[91m++reyowza~~\033[0m"
  14/14 wrap.R: strwrap2_sgr(hello.9e, 12, tabs.as.spaces = TRUE, tab.stops = c(6,
  [[1]]
  [1] ">>  hello ~"                         
  [2] "\033[91m++ world\033[m   "           
  [3] "++    \033[38;2;31;42;4mworld\033[0m"
  [4] "\033[38;2;31;42;4m++  ~~~~~~~\033[0m"
  [5] "\033[38;2;31;42;4m++ boohayth\033[0m"
  [6] "\033[38;2;31;42;4m++ ere~~~~~\033[0m"
  
  [[2]]
  [1] "++  asdfasd" "++ fasdfasd" "++ f~~~~~~~"
  
  14/14 wrap.R: strwrap_sgr(hello.9e, 12, warn = FALSE, indent = 2, exdent = 1, 
  [[1]]
  [1] ">>  hello"                              
  [2] "\033[91m++ world\033[0m"                
  [3] "\033[38;2;31;42;4m++ world\033[0m"      
  [4] "\033[38;2;31;42;4m++ boohaythere\033[0m"
  
  [[2]]
  [1] "++  asdfasdfasdfasdf"
  
  14/14 wrap.R: strwrap_sgr(hello.9e, 12, indent = 2, exdent = 1, prefix = "++", 
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [[1]]
  [1] ">>  hello"                              
  [2] "\033[91m++ world\033[0m"                
  [3] "\033[38;2;31;42;4m++ world\033[0m"      
  [4] "\033[38;2;31;42;4m++ boohaythere\033[0m"
  
  [[2]]
  [1] "++  asdfasdfasdfasdf"
  
  14/14 wrap.R: unitizer_sect("long words", {
  14/14 wrap.R: hello.long <- "\033[31mhelloworld\033[mlongword"
  14/14 wrap.R: strwrap_ctl(hello.long, 8)
  [1] "\033[31mhelloworld\033[mlongword"
  14/14 wrap.R: strwrap2_ctl(hello.long, 8, wrap.always = TRUE)
  [1] "\033[31mhellowo\033[0m" "\033[31mrld\033[mlong"  "word"                  
  14/14 wrap.R: unitizer_sect("rare escapes", {
  14/14 wrap.R: hello.border <- c("hello \033[51mworld woohoo\033[54m woohoo", 
  14/14 wrap.R: strwrap_ctl(hello.border, 12)
  [1] "hello \033[51mworld\033[0m" "\033[51mwoohoo\033[0m"     
  [3] "woohoo"                     "hello \033[52mworld\033[0m"
  [5] "\033[52mwoohoo\033[0m"      "woohoo"                    
  [7] "hello \033[53mworld\033[0m" "\033[53mwoohoo\033[0m"     
  [9] "woohoo"                    
  14/14 wrap.R: strwrap_ctl(hello.border, 12, terminate = FALSE)
  [1] "hello \033[51mworld" "woohoo"              "\033[0mwoohoo"      
  [4] "hello \033[52mworld" "woohoo"              "\033[0mwoohoo"      
  [7] "hello \033[53mworld" "woohoo"              "\033[0mwoohoo"      
  14/14 wrap.R: hello.ideogram <- c("hello \033[60mworld woohoo\033[65m woohoo", 
  14/14 wrap.R: strwrap_ctl(hello.ideogram, 12, terminate = FALSE)
   [1] "hello \033[60mworld" "woohoo"              "\033[0mwoohoo"      
   [4] "hello \033[61mworld" "woohoo"              "\033[0mwoohoo"      
   [7] "hello \033[62mworld" "woohoo"              "\033[0mwoohoo"      
  [10] "hello \033[63mworld" "woohoo"              "\033[0mwoohoo"      
  [13] "hello \033[64mworld" "woohoo"              "\033[0mwoohoo"      
  14/14 wrap.R: hello.font <- c("hello \033[10mworld woohoo\033[10m woohoo", 
  14/14 wrap.R: strwrap_ctl(hello.font, 12, terminate = FALSE)
   [1] "hello \033[10mworld" "woohoo"              "woohoo"             
   [4] "hello \033[11mworld" "woohoo"              "\033[0mwoohoo"      
   [7] "hello \033[12mworld" "woohoo"              "\033[0mwoohoo"      
  [10] "hello \033[13mworld" "woohoo"              "\033[0mwoohoo"      
  [13] "hello \033[14mworld" "woohoo"              "\033[0mwoohoo"      
  [16] "hello \033[15mworld" "woohoo"              "\033[0mwoohoo"      
  [19] "hello \033[16mworld" "woohoo"              "\033[0mwoohoo"      
  [22] "hello \033[17mworld" "woohoo"              "\033[0mwoohoo"      
  [25] "hello \033[18mworld" "woohoo"              "\033[0mwoohoo"      
  [28] "hello \033[19mworld" "woohoo"              "\033[0mwoohoo"      
  14/14 wrap.R: unitizer_sect("term cap and bright", {
  14/14 wrap.R: getOption("fansi.term.cap", dflt_term_cap())
  [1] "bright" "256"   
  14/14 wrap.R: hello.bright <- "\033[42mhello \033[103mworld wowza\033[49m"
  14/14 wrap.R: strwrap_ctl(hello.bright, 13)
  [1] "\033[42mhello \033[103mworld\033[0m" "\033[103mwowza\033[0m"              
  14/14 wrap.R: strwrap_ctl(hello.bright, 13, term.cap = character())
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[42mhello \033[103mworld\033[0m" "\033[103mwowza\033[0m"              
  14/14 wrap.R: hello.255 <- "\033[42mhello \033[48;5;47mworld wowza\033[49m"
  14/14 wrap.R: strwrap_ctl(hello.255, 13)
  [1] "\033[42mhello \033[48;5;47mworld\033[0m"
  [2] "\033[48;5;47mwowza\033[0m"              
  14/14 wrap.R: strwrap_ctl(hello.255, 13, term.cap = character())
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[42mhello \033[48;5;47mworld\033[0m"
  [2] "\033[48;5;47mwowza\033[0m"              
  14/14 wrap.R: hello.tru <- "\033[42mhello \033[48;2;7;41;4mworld wowza\033[m"
  14/14 wrap.R: strwrap_ctl(hello.tru, 13, term.cap = "truecolor")
  [1] "\033[42mhello \033[48;2;7;41;4mworld\033[0m"
  [2] "\033[48;2;7;41;4mwowza\033[0m"              
  14/14 wrap.R: strwrap_ctl(hello.tru, 13)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a CSI SGR sequence with color codes not supported by terminal at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[42mhello \033[48;2;7;41;4mworld\033[0m"
  [2] "\033[48;2;7;41;4mwowza\033[0m"              
  14/14 wrap.R: unitizer_sect("corner cases", {
  14/14 wrap.R: strwrap_ctl("a", -1)
  [1] "a"
  14/14 wrap.R: strwrap2_ctl("a", -1)
  [1] "a"
  14/14 wrap.R: strwrap2_ctl("a", Inf)
  [1] "a"
  14/14 wrap.R: strwrap2_ctl("a", NA_real_)
  Error in strwrap2_ctl("a", NA_real_) : 
    Argument `width` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap2_ctl("a", NA_integer_)
  Error in strwrap2_ctl("a", NA_integer_) : 
    Argument `width` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap2_ctl("a", -1, wrap.always = TRUE)
  Error in strwrap2_ctl("a", -1, wrap.always = TRUE) : 
    Width must be at least 2 in `wrap.always` mode.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: strwrap2_ctl("a", 0, wrap.always = TRUE)
  Error in strwrap2_ctl("a", 0, wrap.always = TRUE) : 
    Width must be at least 2 in `wrap.always` mode.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: strwrap2_ctl("a", 1, wrap.always = TRUE)
  Error in strwrap2_ctl("a", 1, wrap.always = TRUE) : 
    Width must be at least 2 in `wrap.always` mode.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: tryCatch(strwrap_ctl("hello world", 6, prefix = "\033p"), warning 
  [1] "Argument `prefix` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings."
  14/14 wrap.R: suppressWarnings(strwrap_ctl("hello world", 6, prefix = "\033p"))
  [1] "\033phello" "\033pworld"
  14/14 wrap.R: tryCatch(strwrap2_ctl("hello world", 8, pad.end = "\t"), error = c
  [1] "Argument `pad.end` must be an empty string or a single printable ASCII character."
  14/14 wrap.R: tryCatch(strwrap2_ctl("hello world", 8, pad.end = "  "), error = c
  [1] "Argument `pad.end` must be at most one byte long."
  14/14 wrap.R: strwrap2_ctl("goodbye moon", 8, indent = 5, prefix = "> hello >")
  [1] "> hello >     goodbye" "> hello >moon"        
  14/14 wrap.R: strwrap2_ctl("goodbye moon", 16, indent = 5, prefix = "> hello >",
  [1] "> hello >     g" "> hello >oodbye" "> hello >moon"  
  14/14 wrap.R: tryCatch(strwrap2_ctl("goodbye moon", 15, indent = 5, prefix = "> 
  [1] "Width error: sum of `indent` and `initial` width or sum of `exdent` and `prefix` width must be less than `width - 1` when in `wrap.always`."
  14/14 wrap.R: strwrap_ctl("hello world\033[31m\033A", 12)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello world\033[31m\033A\033[0m"
  14/14 wrap.R: strwrap_ctl("hello world\033A\033[31m", 12)
  Warning in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  :
    Argument `x` contains a non-CSI/OSC escape sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "hello world\033A"
  14/14 wrap.R: strwrap_ctl("hello \033[44m world", 5)
  [1] "hello"                "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \033[44m world", 6)
  [1] "hello"                "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \033[44m world", 5, terminate = FALSE)
  [1] "hello"         "\033[44mworld"
  14/14 wrap.R: strwrap_ctl("hello \033[44m world", 6, terminate = FALSE)
  [1] "hello"         "\033[44mworld"
  14/14 wrap.R: strwrap_ctl("hello\n\033[44m\nworld", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \n\033[44m\n world", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \n \033[44m\n world", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \n \n\033[44mworld", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \n \n\033[44m world", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \n \n\033[44m\nworld", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap_ctl("hello \033[44m\n\n world", 5)
  [1] "hello"                ""                     "\033[44mworld\033[0m"
  14/14 wrap.R: strwrap("hello \n\n world", 5)
  [1] "hello" ""      "world"
  14/14 wrap.R: strwrap_ctl("\033[33mAB\033[44m CD", 3)
  [1] "\033[33mAB\033[0m"    "\033[33;44mCD\033[0m"
  14/14 wrap.R: strwrap2_ctl("AB\033[44m\n\nCD", 3, wrap.always = TRUE)
  [1] "AB"                ""                  "\033[44mCD\033[0m"
  14/14 wrap.R: strwrap2_ctl("AB\033[44m\n\nCD", 3, wrap.always = TRUE, pad.end = 
  [1] "AB"                "\033[44m##\033[0m" "\033[44mCD\033[0m"
  14/14 wrap.R: strwrap2_ctl("AB\033[44m\n\nCD", 3, wrap.always = TRUE, terminate 
  [1] "AB"       "\033[44m" "CD"      
  14/14 wrap.R: strwrap2_ctl("AB\033[44m CD", 4, pad.end = "#")
  [1] "AB\033[44m#\033[0m" "\033[44mCD#\033[0m"
  14/14 wrap.R: strwrap2_ctl("AB\033[44m CD", 3, pad.end = "#")
  [1] "AB"                "\033[44mCD\033[0m"
  14/14 wrap.R: strwrap2_sgr("\033[43mAB \033[34mCD", strip.spaces = FALSE, 4)
  [1] "\033[43mAB \033[0m"   "\033[34;43mCD\033[0m"
  14/14 wrap.R: strwrap_ctl("\033[31m\033[43m", 5)
  [1] ""
  14/14 wrap.R: strwrap2_ctl("a\033[31mb", 2, wrap.always = TRUE)
  [1] "a"                "\033[31mb\033[0m"
  14/14 wrap.R: strwrap_ctl("A \033[31mB\033[39m", 3)
  [1] "A"                "\033[31mB\033[0m"
  14/14 wrap.R: strwrap2_ctl("\033[35phello \033[35p world", 5, strip.spaces = FAL
  Warning in strwrap2_ctl("\033[35phello \033[35p world", 5, strip.spaces = FALSE) :
    Argument `x` contains a non-SGR CSI or a non-URL OSC sequence at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[35phello" " \033[35p "    "world"        
  14/14 wrap.R: identical(strwrap(c(NA, "a b"), 4, prefix = ">"), strwrap_ctl(c(NA
  [1] TRUE
  14/14 wrap.R: identical(strwrap("a b", 4, prefix = NA), strwrap_ctl("a b", 
  [1] TRUE
  14/14 wrap.R: unitizer_sect("bad inputs", {
  14/14 wrap.R: strwrap_ctl(1:3)
  [1] "1" "2" "3"
  14/14 wrap.R: strwrap_ctl(hello2.0, width = "35")
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `width` must be numeric.
  Calls: unitize_dir ... strwrap_ctl -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, width = NA_integer_)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `width` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, indent = NA_integer_)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `indent` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, indent = -3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `indent` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, exdent = -3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `exdent` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, exdent = 1:3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `exdent` must be a positive scalar numeric representable as integer.
  Calls: unitize_dir ... strwrap2_ctl -> VAL_WRAP_IN_ENV -> is_scl_int_pos -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, prefix = 1:3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `prefix` must be a scalar character.
  Calls: unitize_dir ... strwrap_ctl -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, initial = 1:3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `initial` must be a scalar character.
  Calls: unitize_dir ... strwrap_ctl -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, warn = NULL)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `warn` must be TRUE or FALSE.
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, term.cap = 1:3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `term.cap` must be character.
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, term.cap = "bananas")
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `term.cap` may only contain values in c("all", "bright", "256", "truecolor", "old")
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, ctl = 1:3)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `ctl` must be character.
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, ctl = "bananas")
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `ctl` may contain only values in `c("all", "nl", "c0", "sgr", "csi", "esc", "url", "osc")`
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, wrap.always = 1:3)
  Error in strwrap2_ctl(hello2.0, wrap.always = 1:3) : 
    Argument `wrap.always` must be TRUE or FALSE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: strwrap2_ctl(hello2.0, wrap.always = NA)
  Error in strwrap2_ctl(hello2.0, wrap.always = NA) : 
    Argument `wrap.always` must be TRUE or FALSE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: strwrap2_ctl(hello2.0, tabs.as.spaces = NA)
  Error in strwrap2_ctl(hello2.0, tabs.as.spaces = NA) : 
    Argument `tabs.as.spaces` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, tabs.as.spaces = 1)
  [1] "hello \033[31mworld \033[42m this is a  lovely\033[0mday."
  14/14 wrap.R: strwrap2_ctl(hello2.0, tab.stops = -(1:3))
  Error in strwrap2_ctl(hello2.0, tab.stops = -(1:3)) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, tab.stops = 0)
  Error in strwrap2_ctl(hello2.0, tab.stops = 0) : 
    Argument `tab.stops` must be numeric, strictly positive, and representable as an integer.
  Calls: unitize_dir ... eval -> withVisible -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, strip.spaces = 1:3)
  Error in strwrap2_ctl(hello2.0, strip.spaces = 1:3) : 
    Argument `strip.spaces` must be TRUE or FALSE.
  Calls: unitize_dir ... eval -> withVisible -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, tabs.as.spaces = TRUE, strip.spaces = TRUE)
  Error in strwrap2_ctl(hello2.0, tabs.as.spaces = TRUE, strip.spaces = TRUE) : 
    `tabs.as.spaces` and `strip.spaces` should not both be TRUE.
  Calls: unitize_dir ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  14/14 wrap.R: strwrap2_ctl(hello2.0, pad.end = letters)
  Error in strwrap2_ctl(hello2.0, pad.end = letters) : 
    Argument `pad.end` must be a scalar character.
  Calls: unitize_dir ... withVisible -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: bytes <- "\xf0\xe3"
  14/14 wrap.R: Encoding(bytes) <- "bytes"
  14/14 wrap.R: strwrap_ctl(hello2.0, prefix = bytes)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `prefix` cannot be "bytes" encoded.
  Calls: unitize_dir ... strwrap_ctl -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(hello2.0, initial = bytes)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `initial` cannot be "bytes" encoded.
  Calls: unitize_dir ... strwrap_ctl -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap2_ctl(hello2.0, pad.end = bytes)
  Error in strwrap2_ctl(hello2.0, pad.end = bytes) : 
    Argument `pad.end` cannot be "bytes" encoded.
  Calls: unitize_dir ... withVisible -> strwrap2_ctl -> VAL_WRAP_IN_ENV -> stop2
  14/14 wrap.R: strwrap_ctl(c(hello2.0, bytes))
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `x` contains a "bytes" encoded string at index [2], which is disallowed.
  Calls: unitize_dir ... withVisible -> strwrap_ctl -> strwrap2_ctl -> VAL_IN_ENV -> stop2
  
  Prepping Unitizers...
  Warning in history_capt(history, interactive.mode) :
    Unable to capture history in non-interactive mode.
  
  | Summary of files in common directory 'unitizer':
  | 
  |                      Pass Fail
  |   1.          has.R    32    -
  |   2. interactions.R    93    -
  |   3.         misc.R   107    -
  |   4.        nchar.R    48    -
  |   5.    normalize.R    47    -
  |   6.     overflow.R    56    -
  |   7.        strip.R    99    -
  |   8.     strsplit.R    38    -
  |   9.       substr.R   219    -
  |  10.         tabs.R    16    -
  |  11.       tohtml.R    68    -
  |  12.       trimws.R    12    -
  |  13.          url.R    50    -
  |  14.         wrap.R   141    -
  | ..............................
  |                      1026    -
  
  | 1026/1026 tests passed; nothing to review.
  
  
  Preloads...
  Loading unitizer data...
  Parsing tests...
  Parsing special/utf8.R
  Evaluating tests...
  
  library(fansi)
  unitizer_sect("substr", {
  term.cap <- c("bright", "256", "truecolor")
  lorem.cn.pieces <- substr(rep(lorem.cn, 5), c(1, 11, 21, 31), 
  lorem.cn.col.1 <- paste0(red, lorem.cn.pieces[1], inv, lorem.cn.pieces[2], 
  lor.cn.c.1.5 <- rep(lorem.cn.col.1, 5)
  starts <- seq(1, 17, 4)
  ends <- starts + 3
  substr2_ctl(lor.cn.c.1.5, starts, ends, term.cap = term.cap)
  [1] "\033[31m中華人民\033[0m"                           
  [2] "\033[31m共和國是\033[0m"                           
  [3] "\033[31m單一\033[7m制的\033[0m"                    
  [4] "\033[7;31m多民族\033[42m劃\033[0m"                 
  [5] "\033[7;31;42m分\033[4;38;2;0;120;200m台灣省\033[0m"
  lorem.cn.col.2 <- paste0(red, lorem.cn.pieces[1], "hello", inv, 
  lor.cn.c.2.5 <- rep(lorem.cn.col.2, 5)
  starts <- seq(1, by = 6, length.out = 5)
  ends <- starts + 5
  substr2_ctl(lor.cn.c.2.5, starts, ends, term.cap = term.cap)
  [1] "\033[31m中華人民共和\033[0m"                             
  [2] "\033[31m國是單一he\033[0m"                               
  [3] "\033[31mllo\033[7m制的多\033[0m"                         
  [4] "\033[7;31m民族 the\033[0m"                               
  [5] "\033[7;31mre \033[42m劃分\033[4;38;2;0;120;200m台\033[0m"
  substr2_sgr(lor.cn.c.2.5, starts, ends, term.cap = term.cap)
  [1] "\033[31m中華人民共和\033[0m"                             
  [2] "\033[31m國是單一he\033[0m"                               
  [3] "\033[31mllo\033[7m制的多\033[0m"                         
  [4] "\033[7;31m民族 the\033[0m"                               
  [5] "\033[7;31mre \033[42m劃分\033[4;38;2;0;120;200m台\033[0m"
  starts <- seq(1, by = 12, length.out = 5)
  ends <- starts + 11
  substr2_ctl(lor.cn.c.2.5, starts, ends, type = "width", term.cap = term.cap)
  [1] "\033[31m中華人民共和\033[0m"                                
  [2] "\033[31m國是單一hell\033[0m"                                
  [3] "\033[31mo\033[7m制的多民族 \033[0m"                         
  [4] "\033[7;31mthere \033[42m劃分\033[4;38;2;0;120;200m台\033[0m"
  [5] "\033[4;7;38;2;0;120;200;42m灣省并沒有實\033[0m"             
  lorem.cn.col.4 <- paste0(red, lorem.cn.pieces[1], "hello", inv, 
  lor.cn.c.4.5 <- rep(lorem.cn.col.4, 5)
  substr2_ctl(lor.cn.c.4.5, starts, ends, type = "width")
  [1] "\033[31m中華人民共和\033[0m"                          
  [2] "\033[31m國是單一hell\033[0m"                          
  [3] "\033[31mo\033[7m制的多民族 \033[0m"                   
  [4] "\033[7;31mthere \033[42m劃分\033[4;38;5;141m台\033[0m"
  [5] "\033[4;7;38;5;141;42m灣省并沒有實\033[0m"             
  lorem.cn.col.3 <- paste0(red, lorem.cn.pieces[1], "helloo", inv, 
  lor.cn.c.3.5 <- rep(lorem.cn.col.3, 5)
  starts <- seq(1, by = 12, length.out = 5)
  ends <- starts + 10
  ends[2] <- 24
  substr2_ctl(lor.cn.c.3.5, starts, ends, type = "width", term.cap = term.cap)
  [1] "\033[31m中華人民共\033[0m"                   
  [2] "\033[31m國是單一hell\033[0m"                 
  [3] "\033[31moo\033[7m制的多民\033[0m"            
  [4] "\033[7;31m world! \033[42m劃\033[0m"         
  [5] "\033[4;7;38;2;0;120;200;42m台灣省并沒\033[0m"
  substr2_ctl(lor.cn.c.3.5, starts, ends, type = "width", round = "both", 
  [1] "\033[31m中華人民共和\033[0m"                   
  [2] "\033[31m國是單一hell\033[0m"                   
  [3] "\033[31moo\033[7m制的多民族\033[0m"            
  [4] "\033[7;31m world! \033[42m劃分\033[0m"         
  [5] "\033[4;7;38;2;0;120;200;42m台灣省并沒有\033[0m"
  starts <- seq(1, by = 7, length.out = 5)
  ends <- starts + 8
  substr2_ctl(lor.cn.c.1.5, starts, ends, type = "width", term.cap = term.cap)
  [1] "\033[31m中華人民\033[0m"                                
  [2] "\033[31m民共和國是\033[0m"                              
  [3] "\033[31m是單一\033[7m制\033[0m"                         
  [4] "\033[7;31m制的多民族\033[0m"                            
  [5] "\033[7;31m族\033[42m劃分\033[4;38;2;0;120;200m台\033[0m"
  substr2_ctl(lor.cn.c.1.5, starts, ends, type = "width", round = "stop", 
  [1] "\033[31m中華人民共\033[0m"                                
  [2] "\033[31m共和國是\033[0m"                                  
  [3] "\033[31m是單一\033[7m制的\033[0m"                         
  [4] "\033[7;31m的多民族\033[0m"                                
  [5] "\033[7;31m族\033[42m劃分\033[4;38;2;0;120;200m台灣\033[0m"
  bytes <- "\xc0\xb1\xf0\xb1\xc0\xb1\xc0\xb1"
  Encoding(bytes) <- "bytes"
  tce(substr_ctl(bytes, 2, 3))
  [1] "Argument `x` contains a \"bytes\" encoded string at index [1], which is disallowed."
  latin <- "H\xe9llo W\xd6rld!"
  Encoding(latin) <- "latin1"
  latin.utf8 <- substr_ctl(latin, 1, 9)
  latin.utf8
  [1] "Héllo WÖr"
  Encoding(latin.utf8)
  [1] "UTF-8"
  rnd.1 <- "ＭnＷ"
  Encoding(rnd.1) <- "UTF-8"
  substr2_ctl(rnd.1, 2, 4, type = "width", round = "start")
  [1] "Ｍn"
  substr2_ctl(rnd.1, 2, 4, type = "width", round = "stop")
  [1] "nＷ"
  substr2_ctl(rnd.1, 2, 4, type = "width", round = "neither")
  [1] "n"
  substr2_ctl(rnd.1, 2, 4, type = "width", round = "both")
  [1] "ＭnＷ"
  rnd.2 <- "ＭＷ"
  Encoding(rnd.2) <- "UTF-8"
  substr2_ctl(rnd.2, 2, 3, type = "width", round = "start")
  [1] "Ｍ"
  substr2_ctl(rnd.2, 2, 3, type = "width", round = "stop")
  [1] "Ｗ"
  substr2_ctl(rnd.2, 1, 2, type = "width", round = "start")
  [1] "Ｍ"
  substr2_ctl(rnd.2, 1, 2, type = "width", round = "stop")
  [1] "Ｍ"
  substr2_ctl(rnd.2, 3, 4, type = "width", round = "start")
  [1] "Ｗ"
  substr2_ctl(rnd.2, 3, 4, type = "width", round = "stop")
  [1] "Ｗ"
  unitizer_sect("rounding", {
  substr2_ctl(lorem.cn.col.2, 1, 2, type = "width")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 3, type = "width")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 3, type = "width")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 4, type = "width")
  [1] "\033[31m中華\033[0m"
  substr2_ctl(lorem.cn.col.2, 3, 4, type = "width")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 2, type = "width", round = "stop")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 3, type = "width", round = "stop")
  [1] "\033[31m中華\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 3, type = "width", round = "stop")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 4, type = "width", round = "stop")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 3, 4, type = "width", round = "stop")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 2, type = "width", round = "both")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 3, type = "width", round = "both")
  [1] "\033[31m中華\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 3, type = "width", round = "both")
  [1] "\033[31m中華\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 4, type = "width", round = "both")
  [1] "\033[31m中華\033[0m"
  substr2_ctl(lorem.cn.col.2, 3, 4, type = "width", round = "both")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 2, type = "width", round = "neither")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 1, 3, type = "width", round = "neither")
  [1] "\033[31m中\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 3, type = "width", round = "neither")
  [1] ""
  substr2_ctl(lorem.cn.col.2, 2, 4, type = "width", round = "neither")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 3, 4, type = "width", round = "neither")
  [1] "\033[31m華\033[0m"
  substr2_ctl(lorem.cn.col.2, 2, 3, type = "width", round = "neither", 
  [1] "\033[31m"
  unitizer_sect("multi-elem", {
  lor.cn.2.2 <- rep(lorem.cn.col.2, 2)
  substr2_ctl(lor.cn.2.2, c(1, 3), c(2, 4), type = "width")
  [1] "\033[31m中\033[0m" "\033[31m華\033[0m"
  substr2_ctl(lor.cn.2.2, c(2, 4), c(2, 4), type = "width")
  [1] "\033[31m中\033[0m" "\033[31m華\033[0m"
  unitizer_sect("zero width combining", {
  combo <- "hellò͜ world"
  Encoding(combo) <- "UTF-8"
  substr2_ctl(combo, 1, 5, type = "width")
  [1] "hellò͜"
  substr2_ctl(combo, 5, 8, type = "width")
  [1] "ò͜ wo"
  substr2_ctl(rep(combo, 2), c(1, 5), c(5, 8), type = "width")
  [1] "hellò͜" "ò͜ wo" 
  nchar_ctl(combo, type = "width")
  [1] 11
  nchar_ctl(combo, type = "graphemes")
  [1] 11
  combo3 <- paste0(substr(lorem.cn.pieces[1], 1, 2), "̀")
  Encoding(combo3) <- "UTF-8"
  substr2_ctl(combo3, 3, 4, type = "width")
  [1] "華̀"
  substr2_ctl(combo3, 2, 4, type = "width")
  [1] "中華̀"
  substr2_ctl(combo3, 4, 4, type = "width")
  [1] "華̀"
  substr2_ctl(combo3, 4, 5, type = "width")
  [1] "華̀"
  combo4 <- paste0("̀hello")
  substr2_ctl(combo4, 1, 1, type = "width")
  [1] "h"
  substr2_ctl(combo4, 1, 1)
  [1] "̀"
  substr2_ctl(combo4, 0, 1, type = "width")
  [1] "̀h"
  substr2_ctl(combo4, 0, 0, type = "width")
  [1] ""
  unitizer_sect("Corner cases", {
  utf8.bad <- "hello \xf0 world, goodnight moon"
  Encoding(utf8.bad) <- "UTF-8"
  substr_ctl(utf8.bad, 1, 7)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  substr_ctl(utf8.bad, 5, 10)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  tce(substr2_ctl(utf8.bad, 1, 7, type = "width"))
  [1] "Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`."
  tce(substr2_ctl(utf8.bad, 5, 10, type = "width"))
  [1] "Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`."
  chrs.2 <- "hello\xee"
  Encoding(chrs.2) <- "UTF-8"
  tce(substr2_ctl(chrs.2, 1, 10, type = "width"))
  [1] "Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`."
  bad.u <- c("A\033[31;\x80mB", "A\033[31;\x80pB")
  Encoding(bad.u) <- "UTF-8"
  substr_ctl(bad.u[1], 0, 3)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains an illegal non-ASCII byte at index [1], see `?unhandled_ctl`.
  Calls: unitize ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  substr_ctl(bad.u[2], 0, 3)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains an illegal non-ASCII byte at index [1], see `?unhandled_ctl`.
  Calls: unitize ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  b.test <- c("샶뻙", ("́a뻙"), ("뻙́a"), ("뻙á"))
  identical(substr_ctl(b.test, 0, 3), substr(b.test, 0, 3))
  [1] TRUE
  identical(substr_ctl(b.test, 0, 2), substr(b.test, 0, 2))
  [1] TRUE
  identical(substr_ctl(b.test, 1, 2), substr(b.test, 1, 2))
  [1] TRUE
  identical(substr_ctl(b.test, 0, 4), substr(b.test, 0, 4))
  [1] TRUE
  identical(substr_ctl(b.test, 4, 4), substr(b.test, 4, 4))
  [1] TRUE
  b.t.c <- sprintf("\033[43m%s\033[49m", b.test)
  substr_ctl(b.t.c, 0, 0)
  [1] "" "" "" ""
  substr_ctl(b.t.c, 0, 2)
  [1] "\033[43m샶뻙\033[0m" "\033[43ḿa\033[0m"    "\033[43m뻙́\033[0m"  
  [4] "\033[43m뻙a\033[0m" 
  substr_ctl(b.t.c, 1, 2)
  [1] "\033[43m샶뻙\033[0m" "\033[43ḿa\033[0m"    "\033[43m뻙́\033[0m"  
  [4] "\033[43m뻙a\033[0m" 
  substr_ctl(b.t.c, 0, 4)
  [1] "\033[43m샶뻙\033[0m" "\033[43ḿa뻙\033[0m"  "\033[43m뻙́a\033[0m" 
  [4] "\033[43m뻙á\033[0m" 
  substr_ctl(b.t.c, 4, 4)
  [1] "" "" "" ""
  substr2_ctl(b.t.c, 0, 0, type = "width")
  [1] "" "" "" ""
  substr2_ctl(b.t.c, 0, 2, type = "width")
  [1] "\033[43m샶\033[0m" "\033[43ḿa\033[0m"  "\033[43m뻙́\033[0m"
  [4] "\033[43m뻙\033[0m"
  substr2_ctl(b.t.c, 1, 4, type = "width")
  [1] "\033[43m샶뻙\033[0m" "\033[43ma뻙\033[0m"  "\033[43m뻙́a\033[0m" 
  [4] "\033[43m뻙á\033[0m" 
  substr2_ctl(b.t.c, 0, 5, type = "width")
  [1] "\033[43m샶뻙\033[0m" "\033[43ḿa뻙\033[0m"  "\033[43m뻙́a\033[0m" 
  [4] "\033[43m뻙á\033[0m" 
  substr2_ctl(b.t.c, 5, 5, type = "width")
  [1] "" "" "" ""
  substr_ctl(b.t.c, 0, 4, terminate = FALSE)
  [1] "\033[43m샶뻙\033[49m" "\033[43ḿa뻙\033[49m"  "\033[43m뻙́a\033[49m" 
  [4] "\033[43m뻙á\033[49m" 
  substr2_ctl(b.t.c, 1, 4, terminate = FALSE, type = "width")
  [1] "\033[43m샶뻙"        "\033[43ma뻙\033[49m" "\033[43m뻙́a\033[49m"
  [4] "\033[43m뻙á\033[49m"
  unitizer_sect("nchar", {
  chr.dia <- "Å"
  nchar_ctl(chr.dia)
  [1] 2
  nchar(chr.dia)
  [1] 2
  nchar_ctl(chr.dia, type = "width")
  [1] 1
  w1 <- "一丁七"
  w2 <- "一丁七"
  nchar_ctl(w1)
  [1] 3
  nchar_ctl(w2, type = "width")
  [1] 6
  nchar_ctl(w2, type = "graphemes")
  [1] 3
  nchar_ctl(w2, type = "bytes")
  [1] 9
  hello.illegal <- c("hello", "\xf0", "\xf0aaaa")
  Encoding(hello.illegal) <- "UTF-8"
  nchar_ctl(hello.illegal)
  Error in nchar_ctl_internal(x = x, type.int = TYPE.INT, allowNA = allowNA,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [2], see `?unhandled_ctl`.
  Calls: unitize ... eval -> withVisible -> nchar_ctl -> nchar_ctl_internal
  nchar_ctl(hello.illegal, allowNA = TRUE)
  [1]  5 NA NA
  nzchar_ctl(hello.illegal)
  [1] TRUE TRUE TRUE
  esc.1 <- sprintf("hello \033[31mworld\033[m%s\033[48;5;123m blahs \033[m%s", 
  Encoding(esc.1) <- "UTF-8"
  nchar_ctl(esc.1)
  [1] 23
  nchar_ctl(esc.1, type = "width")
  [1] 28
  nchar_ctl(esc.1, type = "bytes")
  [1] 33
  nzchar_ctl(esc.1)
  [1] TRUE
  esc.2 <- "\n\r\033P\033[31m\a"
  nchar_ctl(c(esc.1, esc.2, "hello"), warn = FALSE)
  [1] 23  0  5
  esc.4 <- c(sprintf("\033[31m%shello", w1), NA, hello.illegal)
  nchar_sgr(esc.4, type = "width", keepNA = FALSE, warn = FALSE, 
  [1] 11  2  5 NA NA
  nzchar_sgr(esc.4, keepNA = FALSE, warn = FALSE)
  [1] TRUE TRUE TRUE TRUE TRUE
  nchar_sgr("\033[31m\thello", type = "width") >= nchar_ctl("\033[31m\thello", 
  [1] TRUE
  ncb <- c("123\033[31\x80m123", "123\033\x80123")
  Encoding(ncb) <- "UTF-8"
  nchar_ctl(ncb)
  [1] 6 6
  unitizer_sect("unhandled", {
  utf8.bad.0 <- "hello\033\033\033[45p \xf0how wor\ald"
  Encoding(utf8.bad.0) <- "UTF-8"
  unhandled_ctl(utf8.bad.0)
    index start stop             error translated      esc
  1     1     6    7     malformed-ESC      FALSE \033\033
  2     1     8   12 non-SGR/hyperlink      FALSE \033[45p
  3     1    14   14    malformed-UTF8      FALSE     \xf0
  4     1    22   22                C0      FALSE       \a
  utf8.bad.1 <- "hello \xf0ho"
  Encoding(utf8.bad.1) <- "UTF-8"
  unhandled_ctl(utf8.bad.1)
    index start stop          error translated  esc
  1     1     7    7 malformed-UTF8      FALSE \xf0
  unitizer_sect("utf8clen", {
  chrs <- c("\u0080", "߿", "ࠀ", "\u0fff", "က", "쿿", "퀀", 
  Encoding(chrs) <- "UTF-8"
  nchar(chrs, allowNA = TRUE)
   [1]  1  1  1  1  1  1  1  1  1  1  1  1 NA NA NA NA
  nchar_ctl(chrs, allowNA = TRUE)
   [1]  1  1  1  1  1  1  1  1  1  1  1  1 NA NA NA NA
  utf8.bad.2 <- "\xbfaaaaaa"
  Encoding(utf8.bad.2) <- "UTF-8"
  nchar(utf8.bad.2, allowNA = TRUE)
  [1] NA
  nchar_ctl(utf8.bad.2, allowNA = TRUE)
  [1] NA
  substr_ctl(utf8.bad.2, 1, 1)
  Error in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... withVisible -> substr_ctl -> substr2_ctl -> substr_ctl_internal
  unitizer_sect("wrap corner cases", {
  pre.2 <- "\033[32mП \033[0m"
  ini.2 <- "\033[33mр \033[0m"
  hello.8c <- "hello Привет world"
  Encoding(pre.2) <- "UTF-8"
  Encoding(ini.2) <- "UTF-8"
  Encoding(hello.8c) <- "UTF-8"
  pre.3 <- "П "
  ini.3 <- "р "
  Encoding(pre.3) <- "UTF-8"
  Encoding(ini.3) <- "UTF-8"
  wrap.csi.4 <- strwrap_ctl(hello.8c, 15, prefix = pre.2, initial = ini.2)
  wrap.csi.4
  [1] "\033[33mр \033[0mhello Привет" "\033[32mП \033[0mworld"       
  utf8.chr <- "直"
  strwrap2_ctl(utf8.chr, 1, wrap.always = TRUE)
  Error in strwrap2_ctl(utf8.chr, 1, wrap.always = TRUE) : 
    Width must be at least 2 in `wrap.always` mode.
  Calls: unitize ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  strwrap2_ctl(utf8.chr, 2, wrap.always = TRUE)
  Error in strwrap2_ctl(utf8.chr, 2, wrap.always = TRUE) : 
    Wrap error: trying to wrap to width narrower than character width; set `wrap.always=FALSE` to resolve.
  Calls: unitize ... withCallingHandlers -> eval -> eval -> withVisible -> strwrap2_ctl
  strwrap2_ctl(utf8.chr, 3, wrap.always = TRUE)
  [1] "直"
  strwrap_ctl("lovelyday.", 10)
  [1] "lovelyday."
  strwrap2_ctl("lovelyday.", 10, wrap.always = TRUE)
  [1] "lovelyday" "."        
  utf8.bad <- "hello \xf0 world, goodnight moon"
  Encoding(utf8.bad) <- "UTF-8"
  strwrap_ctl(utf8.bad, 10)
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `x` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... eval -> eval -> withVisible -> strwrap_ctl -> strwrap2_ctl
  utf8.bad.2 <- "\xf0"
  Encoding(utf8.bad.2) <- "UTF-8"
  tcw(strwrap_ctl("hello world", 6, prefix = utf8.bad.2))
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `prefix` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... tryCatchOne -> doTryCatch -> strwrap_ctl -> strwrap2_ctl
  suppressWarnings(strwrap_ctl("hello world", 6, prefix = utf8.bad.2))
  Error in strwrap2_ctl(x = x, width = width, indent = indent, exdent = exdent,  : 
    Argument `prefix` contains a malformed UTF-8 sequence at index [1], see `?unhandled_ctl`.
  Calls: unitize ... doWithOneRestart -> withCallingHandlers -> eval -> eval -> withVisible
  bytes <- "\xc0\xb1\xf0\xb1\xc0\xb1\xc0\xb1"
  Encoding(bytes) <- "bytes"
  tce(strwrap_ctl(bytes))
  [1] "Argument `x` contains a \"bytes\" encoded string at index [1], which is disallowed."
  encstrings <- c("hellø world", "hello wørld")
  Encoding(strwrap_ctl(encstrings, 5))
  [1] "UTF-8"   "unknown" "unknown" "UTF-8"  
  str.inf <- "😀 😀"
  strwrap2_ctl(str.inf, 2)
  [1] "😀" "😀"
  unitizer_sect("wrap with wide UTF8 and ESC", {
  wrap.mix <- strwrap_ctl(lorem.mix, 25)
  wrap.mix
   [1] "lorem ipsum dolor"                                 
   [2] "\033[32m個直轄市和 中华 中華人\033[0m"             
   [3] "\033[1;7;32msit amet consectetur\033[0m"           
   [4] "\033[1;7;32madipiscing elit sed do\033[0m"         
   [5] ""                                                  
   [6] "\033[1;7;38;5;105meiusmod tempor\033[0m"           
   [7] "\033[1;7;38;5;105mincididunt ut labore et\033[0m"  
   [8] "\033[1;7;38;5;105mdolore magna aliqua ut\033[0m"   
   [9] ""                                                  
  [10] "個自治區 全國劃 中華"                              
  [11] "\033[34;43menim ad minim veniam\033[0m"            
  [12] "\033[34;43mquis\033[49mnostrud exercitation\033[0m"
  [13] "\033[34mullamco laboris nisi\033[0m"               
  [14] "\033[4m维吾尔族 滿族 蒙古\033[0m"                  
  [15] ""                                                  
  [16] "\033[4m藏族 朝鲜族等 主要宗教有\033[0m"            
  [17] "\033[4mut aliquip ex ea commodo\033[0m"            
  [18] "\033[4mconsequat\033[0m"                           
  string <- "\033[37;48;5;32m國官方認定的民族現有56個\033[39;49m"
  Encoding(string) <- "UTF-8"
  strwrap2_ctl(string, 24, wrap.always = TRUE, pad.end = " ")
  [1] "\033[37;48;5;32m國官方認定的民族現有56 \033[0m"    
  [2] "\033[37;48;5;32m個\033[39;49m                     "
  unitizer_sect("issue 54 ctd", {
  string3 <- c("\033[38;5;246m# … with 5 more variables: total_time \033[3m\033[38
  Encoding(string3) <- "UTF-8"
  fansi::sgr_to_html(html_esc(string3))
  [1] "<span style='color: #949494;'># … with 5 more variables: total_time </span><span style='color: #949494; font-style: italic;'>&lt;bch:tm&gt;</span><span style='color: #949494;'>, result </span><span style='color: #949494; font-style: italic;'>&lt;list&gt;</span><span style='color: #949494;'>, memory </span><span style='color: #949494; font-style: italic;'>&lt;list&gt;</span><span style='color: #949494;'>,</span>"
  [2] "<span style='color: #949494;'>#   time </span><span style='color: #949494; font-style: italic;'>&lt;list&gt;</span><span style='color: #949494;'>, gc </span><span style='color: #949494; font-style: italic;'>&lt;list&gt;</span>"                                                                                                                                                                                            
  string4 <- c("wow \033[31m then", "hello\033[\x80;wow", "yo \033[m there", 
  Encoding(string4) <- "UTF-8"
  sgr_to_html(string4)
  Error in to_html_int(x = x, warn = warn, term.cap = term.cap, classes = classes,  : 
    Argument `x` contains an illegal non-ASCII byte at index [2], see `?unhandled_ctl`.
  Calls: unitize ... eval -> eval -> withVisible -> sgr_to_html -> to_html_int
  unitizer_sect("html_esc", {
  x <- "😀"
  html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), x)
  Error in html_esc(c("h&e'l\"lo", "wor<ld>s", NA, ""), x) : 
    Argument `what` may only contain ASCII characters "&", "<", ">", "'", or "\"".
  Calls: unitize ... withCallingHandlers -> eval -> eval -> withVisible -> html_esc
  
  Prepping Unitizers...
  Warning in history_capt(history, interactive.mode) :
    Unable to capture history in non-interactive mode.
  
  | 125/125 tests passed; nothing to review.
  
  
  Preloads...
  Loading unitizer data...
  Parsing tests...
  Parsing special/emo-graph.R
  Evaluating tests...
  
  library(fansi)
  unitizer_sect("Emoji combining", {
  flags <- "🇦🇷🇦🇴🇦🇮"
  nchar(flags, type = "chars")
  [1] 6
  nchar(flags, type = "width")
  [1] 6
  nchar_ctl(flags, type = "chars")
  [1] 6
  nchar_ctl(flags, type = "width")
  [1] 6
  nchar(substr2_ctl(flags, 1, 2))
  [1] 2
  nchar(substr2_ctl(flags, 1, 2, type = "width"))
  [1] 2
  unitizer_sect("graphemes", {
  flags <- paste0(rep("🇦🇿🇧🇾🇨🇽", 2), collapse = "")
  strwrap2_ctl(flags, 6, wrap.always = TRUE, pad.end = " ", carry = "\033[44m")
  [1] "\033[44m🇦🇿🇧🇾 \033[0m" "\033[44m🇨🇽🇦🇿 \033[0m" "\033[44m🇧🇾🇨🇽 \033[0m"
  strwrap2_ctl(flags, 7, wrap.always = TRUE, pad.end = " ", carry = "\033[44m")
  [1] "\033[44m🇦🇿🇧🇾🇨🇽\033[0m" "\033[44m🇦🇿🇧🇾🇨🇽\033[0m"
  flags.1 <- paste0("a", flags)
  strwrap2_ctl(flags.1, 7, wrap.always = TRUE, pad.end = " ", carry = "\033[44m")
  [1] "\033[44ma🇦🇿🇧🇾 \033[0m" "\033[44m🇨🇽🇦🇿🇧🇾\033[0m" "\033[44m🇨🇽    \033[0m"
  substr2_ctl(flags, 1, 1, type = "width")
  [1] ""
  substr2_ctl(flags, 1, 1, type = "width", round = "stop")
  [1] "🇦🇿"
  substr2_ctl(flags, 1, 2, type = "width", round = "neither")
  [1] "🇦🇿"
  substr2_ctl(flags, 2, 3, type = "width", round = "stop")
  [1] "🇧🇾"
  substr2_ctl(flags, 2, 3, type = "width", round = "start")
  [1] "🇦🇿"
  substr2_ctl(flags, 2, 3, type = "width", round = "both")
  [1] "🇦🇿🇧🇾"
  substr2_ctl(flags, 2, 3, type = "width", round = "neither")
  [1] ""
  emo.0 <- "👶🏽👨🏿👮🏿"
  emo.1 <- "A_👨🏾‍🦳_B"
  emo.2 <- "👨🏾‍🦳"
  emo.2a <- paste0("_", emo.2, "^", emo.2)
  nchar_ctl(c(emo.0, emo.1, emo.2), type = "width")
  [1] 6 6 2
  nchar_ctl(c(emo.0, emo.1, emo.2), type = "graphemes")
  [1] 3 5 1
  substr2_ctl(emo.0, 1, 1, type = "width")
  [1] ""
  substr2_ctl(emo.0, 1, 1, type = "width", round = "stop")
  [1] "👶🏽"
  substr2_ctl(emo.0, 1, 2, type = "width", round = "stop")
  [1] "👶🏽"
  substr2_ctl(emo.0, 2, 3, type = "width", round = "stop")
  [1] "👨🏿"
  substr2_ctl(emo.0, 2, 3, type = "width", round = "start")
  [1] "👶🏽"
  substr2_ctl(emo.0, 2, 3, type = "width", round = "both")
  [1] "👶🏽👨🏿"
  substr2_ctl(emo.0, 2, 3, type = "width", round = "neither")
  [1] ""
  substr2_ctl(emo.1, 1, 3, type = "width")
  [1] "A_"
  substr2_ctl(emo.1, 1, 3, type = "width", round = "stop")
  [1] "A_👨🏾‍🦳"
  substr2_ctl(emo.1, 3, 5, type = "width")
  [1] "👨🏾‍🦳_"
  substr2_ctl(emo.1, 4, 5, type = "width")
  [1] "👨🏾‍🦳_"
  emo.3 <- "👩🏽‍✈️"
  emo.4 <- "👨‍👩‍👧‍👦"
  emo.big <- rep(sprintf(paste0("once upon a time %s there was a humpty %s%s dumpt
  strwrap2_ctl(emo.big, 10, wrap.always = TRUE, carry = "\033[44m", 
   [1] "\033[44monce upon\033[0m"         "\033[44ma time   \033[0m"        
   [3] "\033[44m🇦🇿🇧🇾🇨🇽🇦🇿 \033[0m"         "\033[44m🇧🇾🇨🇽     \033[0m"        
   [5] "\033[44mthere was\033[0m"         "\033[44ma humpty \033[0m"        
   [7] "\033[44m👶🏽👨🏿👮🏿👶🏽 \033[0m" "\033[44m👨🏿👮🏿     \033[0m"    
   [9] "\033[44mdumpty   \033[0m"         "\033[44mA_👨🏾‍🦳_B on\033[0m"    
  [11] "\033[44mthe wall \033[0m"         "\033[44m👨🏾‍🦳and he \033[0m"    
  [13] "\033[44mhad 👩🏽‍✈️ a \033[0m"      "\033[44m👨‍👩‍👧‍👦 big   \033[0m"  
  [15] "\033[44mfall 👩🏽‍✈️  \033[0m"      "\033[44moh no 👨🏾‍🦳 \033[0m"    
  [17] "\033[44monce upon\033[0m"         "\033[44ma time   \033[0m"        
  [19] "\033[44m🇦🇿🇧🇾🇨🇽🇦🇿 \033[0m"         "\033[44m🇧🇾🇨🇽     \033[0m"        
  [21] "\033[44mthere was\033[0m"         "\033[44ma humpty \033[0m"        
  [23] "\033[44m👶🏽👨🏿👮🏿👶🏽 \033[0m" "\033[44m👨🏿👮🏿     \033[0m"    
  [25] "\033[44mdumpty   \033[0m"         "\033[44mA_👨🏾‍🦳_B on\033[0m"    
  [27] "\033[44mthe wall \033[0m"         "\033[44m👨🏾‍🦳and he \033[0m"    
  [29] "\033[44mhad 👩🏽‍✈️ a \033[0m"      "\033[44m👨‍👩‍👧‍👦 big   \033[0m"  
  [31] "\033[44mfall 👩🏽‍✈️  \033[0m"      "\033[44moh no 👨🏾‍🦳 \033[0m"    
  emo.6 <- c(emo.0, emo.2a, emo.4)
  substr2_ctl(emo.6, 1, 2, type = "graphemes")
  [1] "👶🏽👨🏿" "_👨🏾‍🦳"  "👨‍👩‍👧‍👦"
  substr2_ctl(emo.6, 1, 3, type = "graphemes")
  [1] "👶🏽👨🏿👮🏿" "_👨🏾‍🦳^"     "👨‍👩‍👧‍👦"    
  substr2_ctl(emo.6, 2, 3, type = "graphemes")
  [1] "👨🏿👮🏿" "👨🏾‍🦳^"  ""        
  substr2_ctl(emo.6, 3, 3, type = "graphemes")
  [1] "👮🏿" "^"    ""    
  emo.5 <- "👶\033[43m🏽###\033[m"
  Encoding(emo.5) <- "UTF-8"
  substr2_ctl(emo.5, 1, 2, type = "width")
  [1] "👶\033[43m🏽\033[0m"
  substr2_ctl(emo.5, 2, 3, type = "width")
  [1] "👶\033[43m🏽#\033[0m"
  nchar_ctl(emo.5, type = "width")
  [1] 5
  nchar_ctl(emo.5, type = "grapheme")
  [1] 4
  emo.0.1 <- paste0("\033[33m", substr2_ctl(emo.0, 1, 1, type = "graphemes"), 
  substr2_ctl(emo.0.1, 2, 2, type = "width")
  [1] "\033[33m👶🏽\033[0m"
  substr2_ctl(emo.0.1, 2, 2, type = "width", terminate = FALSE)
  [1] "\033[33m👶🏽"
  substr2_ctl(emo.0.1, 1, 1, type = "width", round = "stop")
  [1] "\033[33m👶🏽\033[0m"
  substr2_ctl(emo.0.1, 1, 3, type = "width")
  [1] "\033[33m👶🏽\033[0m"
  substr2_ctl(emo.0.1, 1, 3, type = "width", terminate = FALSE)
  [1] "\033[33m👶🏽\033[45m"
  substr2_ctl(emo.0.1, 1, 3, type = "width", round = "stop")
  [1] "\033[33m👶🏽\033[0m"
  emo.0.2 <- paste0(emo.0.1, "\a")
  substr2_ctl(emo.0.2, 1, 3, type = "width", round = "start")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[33m👶🏽\033[45m\a\033[0m"
  emo.0.3 <- paste0(emo.0.1, "\a\033]8;;x.yz\033\\")
  substr2_ctl(emo.0.3, 1, 3, type = "width", round = "start")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033[33m👶🏽\033[45m\a\033[0m"
  emo.0.4 <- paste0("\033]8;;x.yz\033\\", substr2_ctl(emo.0, 1, 
  substr2_ctl(emo.0.4, 1, 3, type = "width")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;x.yz\033\\👶🏽\033]8;;w.ww\033\\\a\033]8;;\033\\"
  substr2_ctl(emo.0.4, 1, 3, type = "width", terminate = FALSE)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;x.yz\033\\👶🏽\033]8;;w.ww\033\\\a\033[42m"
  substr2_ctl(emo.0.4, 1, 2, type = "width", terminate = FALSE)
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;x.yz\033\\👶🏽"
  substr2_ctl(emo.0.4, 1, 2, type = "width")
  Warning in substr_ctl_internal(x, start = start, stop = stop, type.int = TYPE.INT,  :
    Argument `x` contains a C0 control character at index [1], see `?unhandled_ctl`; you can use `warn=FALSE` to turn off these warnings.
  [1] "\033]8;;x.yz\033\\👶🏽\033]8;;\033\\"
  unitizer_sect("replacement and width", {
  `substr2_ctl<-`(emo.1, 3, 4, value = emo.0)
  [1] "A_👶🏽‍🦳_B"
  `substr2_ctl<-`(emo.1, 3, 4, value = emo.0, type = "width")
  [1] "A_👶🏽_B"
  `substr2_ctl<-`(emo.1, 4, 4, value = emo.0, type = "width")
  [1] "A_👨🏾‍🦳_B"
  `substr2_ctl<-`(emo.1, 4, 4, value = emo.0, type = "width", round = "stop")
  [1] "A_👨🏾‍🦳_B"
  `substr2_ctl<-`(emo.1, 4, 4, value = emo.0, type = "width", round = "neither")
  [1] "A_👨🏾‍🦳_B"
  `substr2_ctl<-`(emo.1, 4, 4, value = "#", type = "width")
  [1] "A_#_B"
  `substr2_ctl<-`(emo.1, 4, 5, value = emo.0, type = "width")
  [1] "A_👶🏽_B"
  x <- "ABCDEF"
  `substr2_ctl<-`(x, 2, 4, value = emo.0, type = "width")
  [1] "A👶🏽DEF"
  `substr2_ctl<-`(x, 2, 4, value = emo.0, type = "width", round = "stop")
  [1] "A👶🏽DEF"
  `substr2_ctl<-`(x, 2, 5, value = emo.0, type = "width")
  [1] "A👶🏽👨🏿F"
  `substr2_ctl<-`(emo.1, 3, 4, value = emo.0, type = "width", round = "both")
  [1] "A_👶🏽_B"
  `substr2_ctl<-`(emo.1, 4, 4, value = emo.0, type = "width", round = "both")
  [1] "A_👨🏾‍🦳_B"
  a <- c(rep(emo.1, 4), rep(x, 2))
  b <- c(emo.0, "#", rep(emo.0, 4))
  starts <- c(3, 4, 4, 4, 2, 2)
  stops <- c(4, 4, 4, 5, 4, 5)
  x <- a
  substr2_ctl(x, starts, stops, type = "width") <- b
  x
  [1] "A_👶🏽_B"   "A_#_B"      "A_👨🏾‍🦳_B" "A_👶🏽_B"   "A👶🏽DEF"  
  [6] "A👶🏽👨🏿F"
  starts <- c(3, 4, 2, 3, 4, 2)
  ends <- c(8, 9, 7, 7, 8, 6)
  emo.3 <- rep(paste0("👧🏿🧔🏿", emo.0), length(starts))
  emo.4 <- "👩‍🦱🤷👩‍⚕️"
  x0 <- x1 <- emo.3
  substr2_ctl(x0, starts, ends, type = "width") <- emo.4
  x0
  [1] "👧🏿👩‍🦱🤷👩‍⚕️👮🏿"  "👧🏿👩‍🦱🤷👩‍⚕️👮🏿"  "👩‍🦱🤷👩‍⚕️👨🏿👮🏿" 
  [4] "👧🏿👩‍🦱🤷👨🏿👮🏿" "👧🏿👩‍🦱🤷👨🏿👮🏿" "👩‍🦱🤷👶🏽👨🏿👮🏿"
  substr2_ctl(x1, starts, ends, type = "width", round = "stop") <- emo.4
  x1
  [1] "👧🏿👩‍🦱🤷👩‍⚕️👮🏿"  "👧🏿🧔🏿👩‍🦱🤷👩‍⚕️"  "👧🏿👩‍🦱🤷👩‍⚕️👮🏿" 
  [4] "👧🏿👩‍🦱🤷👩‍⚕️👮🏿"  "👧🏿🧔🏿👩‍🦱🤷👮🏿" "👧🏿👩‍🦱🤷👨🏿👮🏿"
  emo.7 <- "😀_😀"
  emo.7a <- "😀"
  `substr2_ctl<-`(emo.7, 3, 3, type = "width", round = "stop", 
  [1] "😀_😀"
  `substr2_ctl<-`(emo.7, 3, 3, type = "width", round = "stop", 
  [1] "😀#😀"
  `substr2_ctl<-`(emo.7a, 2, 1, type = "width", round = "both", 
  [1] "😀"
  
  Prepping Unitizers...
  Warning in history_capt(history, interactive.mode) :
    Unable to capture history in non-interactive mode.
  
  | 68/68 tests passed; nothing to review.
  
  > 
  > proc.time()
     user  system elapsed 
    20.39    0.89   22.28