Skip to content

Commit c13723d

Browse files
authored
Ensure UTF-8 encoding when parsing (#285)
# Pull Request Fixes #284
1 parent 230ccbc commit c13723d

5 files changed

Lines changed: 26 additions & 6 deletions

File tree

NEWS.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
# teal.code 0.7.1.9000
22

3+
### Bug fixes
4+
5+
* Fixed a problem parsing Chinese characters due to the encoding (#284)
6+
37
# teal.code 0.7.1
48

59
### Bug fixes

R/qenv-eval_code.R

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ setMethod("eval_code", signature = c(object = "qenv.error"), function(object, co
4747
code <- paste(split_code(code), collapse = "\n")
4848

4949
object@.xData <- rlang::env_clone(object@.xData, parent = parent.env(object@.xData))
50-
parsed_code <- parse(text = code, keep.source = TRUE)
50+
parsed_code <- parse(text = code, keep.source = TRUE, encoding = "UTF-8")
5151

5252
old <- evaluate::inject_funs(
5353
library = function(...) {
@@ -72,7 +72,10 @@ setMethod("eval_code", signature = c(object = "qenv.error"), function(object, co
7272
for (this in out) {
7373
if (inherits(this, "source")) {
7474
this_code <- gsub("\n$", "", this$src)
75-
attr(this_code, "dependency") <- extract_dependency(parse(text = this_code, keep.source = TRUE))
75+
attr(this_code, "dependency") <- extract_dependency(parse(
76+
text = this_code,
77+
keep.source = TRUE, encoding = "UTF-8"
78+
))
7679
new_code <- c(new_code, stats::setNames(list(this_code), sample.int(.Machine$integer.max, size = 1)))
7780
} else {
7881
last_code <- new_code[[length(new_code)]]

R/qenv-get_code.R

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -119,7 +119,7 @@ setMethod("get_code", signature = "qenv", function(object, deparse = TRUE, names
119119
if (deparse) {
120120
paste(unlist(code), collapse = "\n")
121121
} else {
122-
parse(text = paste(c("{", unlist(code), "}"), collapse = "\n"), keep.source = TRUE)
122+
parse(text = paste(c("{", unlist(code), "}"), collapse = "\n"), keep.source = TRUE, encoding = "UTF-8")
123123
}
124124
})
125125

R/utils-get_code_dependency.R

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -407,7 +407,7 @@ extract_dependency <- function(parsed_code) {
407407
queue <- as.list(parsed_code[[1]][expr_ix])
408408
new_list <- parsed_code[[1]]
409409
new_list[expr_ix] <- NULL
410-
list(parse(text = as.expression(new_list), keep.source = TRUE))
410+
list(parse(text = as.expression(new_list), keep.source = TRUE, encoding = "UTF-8"))
411411
}
412412

413413
while (length(queue) > 0) {
@@ -416,7 +416,8 @@ extract_dependency <- function(parsed_code) {
416416
if (identical(current[[1L]], as.name("{"))) {
417417
queue <- append(queue, as.list(current)[-1L])
418418
} else {
419-
parsed_code_list[[length(parsed_code_list) + 1]] <- parse(text = as.expression(current), keep.source = TRUE)
419+
parsed_code <- parse(text = as.expression(current), keep.source = TRUE, encoding = "UTF-8")
420+
parsed_code_list[[length(parsed_code_list) + 1]] <- parsed_code
420421
}
421422
}
422423

@@ -556,7 +557,7 @@ normalize_pd <- function(pd) {
556557
#' @keywords internal
557558
#' @noRd
558559
get_call_breaks <- function(code) {
559-
parsed_code <- parse(text = code, keep.source = TRUE)
560+
parsed_code <- parse(text = code, keep.source = TRUE, encoding = "UTF-8")
560561
pd <- utils::getParseData(parsed_code)
561562
pd <- normalize_pd(pd)
562563
pd <- pd[pd$token != "';'", ]

tests/testthat/test-qenv_within.R

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -154,3 +154,15 @@ testthat::test_that("Code executed with integer shorthand (1L) is the same as or
154154
q <- within(qenv(), a <- 1L)
155155
testthat::expect_identical(get_code(q), "a <- 1L")
156156
})
157+
158+
159+
testthat::test_that("Chinese characters are handled properly (issue 284)", {
160+
q <- within(qenv(), {
161+
"无进展生存期 (月)"
162+
"总生存期 (月)"
163+
"缓解持续时间 (月)"
164+
"确认的缓解持续时间 (月)"
165+
})
166+
167+
expect_equal(lengths(strsplit(get_code(q), split = "\n", fixed = TRUE)), 4L)
168+
})

0 commit comments

Comments
 (0)