REditorSupport / languageserver

An implementation of the Language Server Protocol for R
Other
564 stars 91 forks source link

VSCode outline fails in Rmarkdown document if there is pseudo chunk text inside the chunks #641

Open statnmap opened 7 months ago

statnmap commented 7 months ago

I know this is a specific case. I am building functions inside a Rmarkdown document, which builds chunks.
I remarked that, as soon as there is 3 backticks in my code, the VSCode document outline is not displayed.

Here is a reprex. With this code, there is no outline available in VSCode, near the Rmd name image

---
title: "test vscode"
output: html_document
author: statnmap
---

```{r development, include=FALSE}
library(testthat)

combine_tbl_to_file

#' Create R code chunk content
#' @return A character string of R code chunk content
#' @noRd
create_r_chunk <- function() {
  paste(
    "```{r}",
    "```",
    sep = "\n"
  )
}

cat(create_r_chunk())

As soon as I remove the paste with backticks, the outline is correct:  
![image](https://github.com/REditorSupport/languageserver/assets/21193866/f9067773-5375-4b9e-88cb-545a8e7d324e)

````markdown
---
title: "test vscode"
output: html_document
author: statnmap
---

```{r development, include=FALSE}
library(testthat)

combine_tbl_to_file

#' Create R code chunk content
#' @return A character string of R code chunk content
#' @noRd
create_r_chunk <- function() {
  paste(
    "",
    sep = "\n"
  )
}

cat(create_r_chunk())

Maybe the parsing you use to detect chunks can be a little more restrictive, and only considering chunks when there is nothing or spaces before the backticks ?

You could maybe use patterns used by {knitr}:

r$> knitr:::allpatterns$md $chunk.begin [1] "^[\t >]```+\s\{([a-zA-Z0-9]+( [ ,].)?)\}\s*$"

$chunk.end [1] "^[\t >]```+\s$"

$ref.chunk [1] "^\s<<(.+)>>\s$"

$inline.code [1] "(?<!(^))(?<!(\n))r[ #]([^]+)\s*`"