-
Notifications
You must be signed in to change notification settings - Fork 285
/
block.R
117 lines (96 loc) · 2.83 KB
/
block.R
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
block_append <- function(desc, value, path,
block_start = "# <<<",
block_end = "# >>>",
block_prefix = NULL,
block_suffix = NULL,
sort = FALSE) {
if (!is.null(path) && file_exists(path)) {
lines <- read_utf8(path)
if (all(value %in% lines)) {
return(FALSE)
}
block_lines <- block_find(lines, block_start, block_end)
} else {
block_lines <- NULL
}
if (is.null(block_lines)) {
ui_bullets(c(
"_" = "Copy and paste the following lines into {.path {pth(path)}}:"
))
ui_code_snippet(c(block_prefix, block_start, value, block_end, block_suffix))
return(FALSE)
}
ui_bullets(c("v" = "Adding {.val {desc}} to {.path {pth(path)}}."))
start <- block_lines[[1]]
end <- block_lines[[2]]
block <- lines[seq2(start, end)]
new_lines <- union(block, value)
if (sort) {
new_lines <- sort(new_lines)
}
lines <- c(
lines[seq2(1, start - 1L)],
new_lines,
lines[seq2(end + 1L, length(lines))]
)
write_utf8(path, lines)
TRUE
}
block_replace <- function(desc, value, path,
block_start = "# <<<",
block_end = "# >>>") {
if (!is.null(path) && file_exists(path)) {
lines <- read_utf8(path)
block_lines <- block_find(lines, block_start, block_end)
} else {
block_lines <- NULL
}
if (is.null(block_lines)) {
ui_bullets(c(
"_" = "Copy and paste the following lines into {.path {pth(path)}}:"
))
ui_code_snippet(c(block_start, value, block_end))
return(invisible(FALSE))
}
start <- block_lines[[1]]
end <- block_lines[[2]]
block <- lines[seq2(start, end)]
if (identical(value, block)) {
return(invisible(FALSE))
}
ui_bullets(c("v" = "Replacing {desc} in {.path {pth(path)}}."))
lines <- c(
lines[seq2(1, start - 1L)],
value,
lines[seq2(end + 1L, length(lines))]
)
write_utf8(path, lines)
}
block_show <- function(path, block_start = "# <<<", block_end = "# >>>") {
lines <- read_utf8(path)
block <- block_find(lines, block_start, block_end)
lines[seq2(block[[1]], block[[2]])]
}
block_find <- function(lines, block_start = "# <<<", block_end = "# >>>") {
# No file
if (is.null(lines)) {
return(NULL)
}
start <- which(lines == block_start)
end <- which(lines == block_end)
# No block
if (length(start) == 0 && length(end) == 0) {
return(NULL)
}
if (!(length(start) == 1 && length(end) == 1 && start < end)) {
ui_abort(c(
"Invalid block specification.",
"Must start with {.code {block_start}} and end with
{.code {block_end}}."
))
}
c(start + 1L, end - 1L)
}
block_create <- function(lines = character(), block_start = "# <<<", block_end = "# >>>") {
c(block_start, unique(lines), block_end)
}