R Under development (unstable) (2025-04-19 r88162 ucrt) -- "Unsuffered Consequences" Copyright (C) 2025 The R Foundation for Statistical Computing Platform: x86_64-w64-mingw32/x64 R is free software and comes with ABSOLUTELY NO WARRANTY. You are welcome to redistribute it under certain conditions. Type 'license()' or 'licence()' for distribution details. R is a collaborative project with many contributors. Type 'contributors()' for more information and 'citation()' on how to cite R or R packages in publications. Type 'demo()' for some demos, 'help()' for on-line help, or 'help.start()' for an HTML browser interface to help. Type 'q()' to quit R. > NAME <- "text" > source(file.path('_helper', 'init.R')) > > # - simple wrap > > txt1 <- c( + "humpty dumpty sat on a wall and had a big fall", + "humpty sat on a wall and dumped a big fall" + ) > res1 <- diffobj:::wrap(txt1, 10, TRUE, sgr.supported=TRUE) > > identical( + gsub(" *$", "", vapply(res1, paste0, character(1L), collapse="")), txt1 + ) [1] TRUE > all.equal(lapply(res1, nchar), list(rep(10L, 5L), rep(10L, 5L))) [1] TRUE > > txt2 <- "hello world!" > identical( + unlist(diffobj:::wrap(txt2, nchar(txt2), TRUE, sgr.supported=TRUE)), + txt2 + ) [1] TRUE > identical( + paste0( + unlist(diffobj:::wrap(txt2, nchar(txt2) / 2, TRUE, sgr.supported=TRUE)), + collapse="" + ), + txt2 + ) [1] TRUE > > # - wrap with escape sequences > > txt3 <- c( + paste0( + "humpty dumpty ", crayon::style("sat on a wall", "red"), + " and had a big fall", + crayon::style( + crayon::style( + "humpty sat on a wall and dumped a big fall", + "green" + ), + "bgRed" + ), "woohoo" + ), + paste0( + crayon::style("hello ", "inverse"), "beautiful ", + crayon::style("world", "blue") + ) + ) > res3 <- diffobj:::wrap(txt3, 10, TRUE, sgr.supported=TRUE) > > identical( + crayon::strip_style( + gsub(" *$", "", vapply(res3, paste0, character(1L), collapse="")) + ), + crayon::strip_style(txt3) + ) [1] TRUE > all.equal( + lapply(res3, crayon::col_nchar), + list(rep(10L, 10L), rep(10L, 3L)) + ) [1] TRUE > > # - strip hz whitespace > > options(crayon.enabled=FALSE) > all.equal( + diffobj:::strip_hz_control("a\tb", stops=4L, sgr.supported=TRUE), "a b") [1] TRUE > all.equal( + diffobj:::strip_hz_control("ab\t", stops=4L, sgr.supported=TRUE), "ab ") [1] TRUE > all.equal( + diffobj:::strip_hz_control("a\tb\t", stops=4L, sgr.supported=TRUE), "a b ") [1] TRUE > all.equal( + diffobj:::strip_hz_control("\ta\tb\t", stops=4L, sgr.supported=TRUE), + " a b " + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control("\ta\tb\t", stops=c(2L, 4L), sgr.supported=TRUE), + " a b " + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control( + c("ab\t", "\ta\tb\t"), sgr.supported=TRUE, stops=4L + ), + c("ab ", " a b ") + ) [1] TRUE > # recall that nchar("\033") == 1 > all.equal( + diffobj:::strip_hz_control( + "\033[31ma\t\033[39mhello\tb", stops=10L, sgr.supported=FALSE + ), + "\033[31ma \033[39mhello b" + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control( + "\033[31ma\t\033[39mhello\tb", stops=10L, sgr.supported=TRUE + ), + "\033[31ma\033[39m \033[31m\033[39mhello \033[31m\033[39mb" + ) [1] TRUE > # carriage returns > > all.equal( + diffobj:::strip_hz_control("hellothere\rHELLO", sgr.supported=TRUE), + "HELLOthere" + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control( + c("hellothere\rHELLO", "000\r12345678\rabcdef\rABC"), sgr.supported=TRUE + ), + c("HELLOthere", "ABCdef78") + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control("hellothere\r", sgr.supported=TRUE), + "hellothere" + ) [1] TRUE > all.equal( + diffobj:::strip_hz_control(character(), sgr.supported=TRUE), character() + ) [1] TRUE > # newlines > > all.equal( + diffobj:::strip_hz_control(c("a", "", "\n", "a\nb"), sgr.supported=TRUE), + c("a", "", "", "a", "b") + ) [1] TRUE > # with colors > > options(crayon.enabled=TRUE) > > all.equal( + crayon::strip_style( + diffobj:::strip_hz_control( + "\033[31ma\t\033[39mhello\tb", stops=10L, sgr.supported=TRUE) + ), + "a hello b" + ) [1] TRUE > test.chr <- paste0( + crayon::red(crayon::`%+%`("000", crayon::bgBlue("\r12345678"))), + "\rabcdef", crayon::green("\rABC") + ) > # visually inspect these > > # cat("\n") > # cat(test.chr, sep="\n") > res <- diffobj:::strip_hz_control(test.chr, sgr.supported=TRUE) > # cat(res, sep="\n") > all.equal(crayon::strip_style(res), "ABCdef78") [1] TRUE > > # Mix tabs and carriage returns, visual inspection assumes terminal tab > # stops at 8L; note output not exactly the same since it seems tabs don't > # ovewrite prior screen state whereas spaces do > > test.chr.2 <- paste0( + crayon::red(crayon::`%+%`("000", crayon::bgBlue("\r123\t456\t78"))), + "\rab\tcd f", crayon::green("\rABC") + ) > # cat("\n") > # cat(test.chr.2, sep="\n") > res.2 <- diffobj:::strip_hz_control(test.chr.2, stops=8L, sgr.supported=TRUE) > # cat(res.2, sep="\n") > > all.equal(crayon::strip_style(res.2), "ABC cd f 78") [1] TRUE > > # multi line > > test.chr.3 <- c(test.chr, test.chr.2) > # cat("\n") > res.3 <- diffobj:::strip_hz_control(test.chr.3, sgr.supported=TRUE) > # cat(res.3, sep="\n") > # cat(test.chr.3, sep="\n") > > all.equal(crayon::strip_style(res.3), c("ABCdef78", "ABC cd f 78")) [1] TRUE > > > proc.time() user system elapsed 0.57 0.09 0.65