Closed flying-sheep closed 1 year ago
Thanks. Would you mind searching for the part of the code that causes the trouble, i.e. binary search on the expression level? That is, trying if styler also fails if you only style first half of the code, if yes, first 1/4, if no 2/4 etc.
My first guess was this is #991 but my quick scroll didn't see the exact culprit.
Reprex:
styler::style_text("'\\1'")
#> Error in `value[[3L]]()`:
#> ! Styling resulted in code that isn't parsable. This should not happen. Please file a bug report on GitHub (https://github.com/r-lib/styler/issues) using a reprex.
#> Backtrace:
#> ▆
#> 1. ├─styler::style_text("'\\1'")
#> 2. │ └─styler (local) transformer(text) at styler/R/ui-styling.R:217:2
#> 3. │ └─text %>% ... at styler/R/transform-files.R:120:6
#> 4. └─styler:::parse_transform_serialize_r(...)
#> 5. └─styler:::verify_roundtrip(text, text_out, parsable_only = !parse_tree_must_be_identical(transformers)) at styler/R/transform-files.R:287:2
#> 6. └─rlang::with_handlers(...) at styler/R/transform-files.R:416:4
#> 7. └─base::tryCatch(.expr, error = `<fn>`)
#> 8. └─base (local) tryCatchList(expr, classes, parentenv, handlers)
#> 9. └─base (local) tryCatchOne(expr, names, parentenv, handlers[[1L]])
#> 10. └─value[[3L]](cond)
#> 11. └─rlang::abort(...) at styler/R/transform-files.R:419:8
Created on 2023-02-05 with reprex v2.0.2
indeed a dupe of #991.
@flying-sheep, the workaround is to use three-digit octal escapes, i.e. \001
instead of \1
.
Click here for contents of
```r has_dt <- requireNamespace('data.table', quietly = TRUE) has_tibble <- requireNamespace('tibble', quietly = TRUE) test_that('unprintables get escaped', { expect_identical(repr_html('\1'), "'\\001'") }) test_that('simple LaTeX escaping works', { expect_identical(latex_escape('\\'), '\\textbackslash{}') expect_identical(latex_escape('{}'), '\\{\\}') expect_identical(latex_escape('$'), '\\$') expect_identical(latex_escape('^'), '\\textasciicircum{}') expect_identical(latex_escape('_'), '\\_') expect_identical(latex_escape('%'), '\\%') expect_identical(latex_escape('#'), '\\#') expect_identical(latex_escape('&'), '\\&') expect_identical(latex_escape('~'), '\\textasciitilde{}') expect_identical(latex_escape('|'), '\\textbar{}') expect_identical(latex_escape('[]'), '{[}{]}') }) test_that('simple HTML escaping works', { expect_identical(html_escape('&'), '&') expect_identical(html_escape('<'), '<') expect_identical(html_escape('>'), '>') }) test_that('LaTeX escaping in vectors works', { expect_identical(repr_latex('['), "'{[}'") expect_identical(repr_latex(c('[', '|')), "\\begin{enumerate*} \\item '{[}' \\item '\\textbar{}' \\end{enumerate*} ") }) test_that('HTML escaping in vectors works', { expect_identical(repr_html('<'), "'<'") expect_identical( repr_html(c('<', '&')), paste0(list_style, "tests/testthat/test_escaping.r
- '<'
- '&'
\n") ) }) test_that('LaTeX escaping in matrices works', { expect_identical(repr_latex(matrix(c('[', '{', '%', '#'), 2, 2, TRUE)), 'A matrix: 2 \u00D7 2 of type chr \\begin{tabular}{ll} \t {[} & \\{\\\\ \t \\% & \\#\\\\ \\end{tabular} ') expect_identical(repr_latex(matrix(c(']', '}', '&', '_'), 2, 2, TRUE, list(c('$', '#'), c('%', '|')))), 'A matrix: 2 \u00D7 2 of type chr \\begin{tabular}{r|ll} & \\% & \\textbar{}\\\\ \\hline \t\\$ & {]} & \\}\\\\ \t\\# & \\& & \\_\\\\ \\end{tabular} ') }) test_that('HTML escaping in matrices works', { expect_identical(repr_html(matrix(c('[', '{', '%', '#'), 2, 2, TRUE)), '', "- 'one space'
",
"- 'two spaces'
",
'
\n' ) ) }) ```Created on 2023-01-26 with reprex v2.0.2