1
2palette_idx <- function(id) {
3  ifelse(
4    id < 38,
5    id - (30 - 1),
6  ifelse(
7    id < 48,
8    -(id - (40 - 1)),
9  ifelse(
10    id < 98,
11    id - (90 - 9),
12    -(id - (100 - 9))
13  )))
14}
15
16palette_color <- function(x) {
17  c(x, palette = palette_idx(x[[1]]))
18}
19
20## ----------------------------------------------------------------------
21## Styles
22
23codes <- list(
24  reset = list(0, c(0, 22, 23, 24, 27, 28, 29, 39, 49)),
25  bold = list(1, 22), # 21 isn't widely supported and 22 does the same thing
26  blurred = list(2, 22),
27  italic = list(3, 23),
28  underline = list(4, 24),
29  inverse = list(7, 27),
30  hidden = list(8, 28),
31  strikethrough = list(9, 29),
32
33  black = palette_color(list(30, 39)),
34  red = palette_color(list(31, 39)),
35  green = palette_color(list(32, 39)),
36  yellow = palette_color(list(33, 39)),
37  blue = palette_color(list(34, 39)),
38  magenta = palette_color(list(35, 39)),
39  cyan = palette_color(list(36, 39)),
40  white = palette_color(list(37, 39)),
41  silver = palette_color(list(90, 39)),
42
43  bgBlack = palette_color(list(40, 49)),
44  bgRed = palette_color(list(41, 49)),
45  bgGreen = palette_color(list(42, 49)),
46  bgYellow = palette_color(list(43, 49)),
47  bgBlue = palette_color(list(44, 49)),
48  bgMagenta = palette_color(list(45, 49)),
49  bgCyan = palette_color(list(46, 49)),
50  bgWhite = palette_color(list(47, 49))
51)
52
53## ANSI fg color -> R color
54
55ansi_fg_r <- c(
56  "black" = "black",
57  "red" = "red",
58  "green" = "green",
59  "yellow" = "yellow",
60  "blue" = "blue",
61  "magenta" = "magenta",
62  "cyan" = "cyan",
63  "white" = "white",
64  "silver" = "grey"
65)
66
67ansi_fg_rgb <- col2rgb(ansi_fg_r)
68
69ansi_bg_r <- c(
70  "bgBlack" = "black",
71  "bgRed" = "red",
72  "bgGreen" = "green",
73  "bgYellow" = "yellow",
74  "bgBlue" = "blue",
75  "bgMagenta" = "magenta",
76  "bgCyan" = "cyan",
77  "bgWhite" = "white"
78)
79
80ansi_bg_rgb <- col2rgb(ansi_bg_r)
81
82# code can have length > 1, used to generate the closing tags for reset
83
84make_chr_ansi_tag <- function(code)
85  paste0('\u001b[', chr(code), 'm', collapse="")
86
87make_chr_style <- function(code) {
88  list(
89    open = make_chr_ansi_tag(codes[[code]][[1]]),
90    close = make_chr_ansi_tag(codes[[code]][[2]]),
91    palette = if (length(codes[[code]]) >= 3) codes[[code]][[3]]
92  )
93}
94
95builtin_styles <- lapply(names(codes), make_chr_style)
96names(builtin_styles) <- names(codes)
97