Inspired by Karl Broman`s reader on using knitr with asciidoc (https://kbroman.org/knitr_knutshell/pages/asciidoc.html), this is a wrapper to and a slight modification of knitr.
Knitting
A Minimal Example
Suppose, you have a file that reads
file_name <- system.file("files", "minimal", "plot.Rasciidoc", package = "rasciidoc") cat(readLines(file_name), sep = "\n")
## = Some Title
## Your Name
## :toc2:
## :numbered:
## :data-uri:
## :duration: 120
##
## == A Section
##
## === A Subsection
##
## * A list with a https://en.wikipedia.org/wiki/Hyperlink[link].
## * Yet another entry in the list.
##
## == Code
## //begin.rcode
## a <- c(2, 3, 4, 10) # <1>
## value <- 0 # <2>
## for (a_i in a) { # <3>
## value <- value + a_i # <4>
## }
## print(value) # <5>
## //end.rcode
##
##
## == A new section
##
## //begin.rcode a_plot, dev = "png", fig.cap = "A Plot"
## plot(1:10)
## //end.rcode
If you run render
on this file (we use a temporary directory here)
withr::with_dir(tempdir(), {
file.copy(file_name, ".")
rasciidoc::render(basename(file_name))
})
## Warning in run_knit(file_name, knit = knit, envir = envir, write_to_disk = ## write_to_disk): Setting option knit to TRUE based on the file contents!
## Due to the CRAN policy of not writing "anywhere else on the file system apart from the R session's temporary directory" we work on a temporary copy of /tmp/RtmpVTucXi/plot.Rasciidoc. ## Thus all internal sourcing and internal links will be broken and any output is written to /tmp/RtmpVTucXi. Set the option "write_to_disk" to TRUE (using ## options("write_to_disk" = TRUE) ## ) to bypass this. You may want to include the above line into your ~/.Rprofile.
## ## ## processing file: /tmp/RtmpVTucXi/plot.Rasciidoc
## 1/4
## 2/4 [unnamed-chunk-8]
## 3/4
## 4/4 [a_plot]
## output file: /tmp/RtmpVTucXi/plot.asciidoc
## [1] TRUE
## attr(,"info")
## attr(,"info")$python
## [1] "/usr/bin/python"
##
## attr(,"info")$input
## [1] "/tmp/RtmpVTucXi/plot.asciidoc"
##
## attr(,"info")$output
## [1] "/tmp/RtmpVTucXi/plot.Rasciidoc" "/tmp/RtmpVTucXi/plot.html"
##
## attr(,"info")$asciidoc
## [1] "/usr/bin/asciidoc"
##
## attr(,"info")$`source-highlight`
## [1] TRUE
##
## attr(,"info")$`git-asciidoc`
## [1] NA
you will create an HTML file that is identical to [this file](https://fvafrcu.gitlab.io/rasciidoc/inst/files/minimal/plot.html) and that you could browse using
browseURL(file.path(tempdir(), paste0(sub("\\..*$", "", basename(file_name)), ".html")))
from your current R session (vignettes like this are not allowed to start external programs
like browsers, so you’ll have to do it yourself).
A Simple Example
Suppose you changed your file to be less minimalistic:
file_name <- system.file("files", "simple", "knit.Rasciidoc", package = "rasciidoc") cat(readLines(file_name), sep = "\n")
## = Some Title
## Your Name
## :toc2:
## :numbered:
## :data-uri:
## :duration: 120
##
## == What is this About?
##
##
## === Some simple asciidoc
##
## * A list with a https://en.wikipedia.org/wiki/Hyperlink[link].
## * Yet another entry in the list.
##
## == Including Code
## Do not use the _include_ macro provided by asciidoc!
## //begin.rcode, label = "sum", code = readLines("src/sum.R")
## //end.rcode
##
##
## == A new section
##
## //begin.rcode, label = "my_sum", code = readLines("src/my_sum.R")
## //end.rcode
## === A subsection
## //begin.rcode, label = "value"
## print(value)
## //end.rcode
##
## //begin.rcode, label = "run my_sum"
## print(my_sum(1:3))
## //end.rcode
##
## Some inline code: Object +value+ has value +r value+.
##
##
## === Second subsection
This file obviously reads code from files in a subdirectory called "src/", so if you had that subdirectory and its files, too:
my_directory <- file.path(tempdir(), "simple") dir.create(my_directory) withr::with_dir(my_directory, { file.copy(file_name, ".") file.copy(file.path(dirname(file_name), "src"), ".", recursive = TRUE) })
## [1] TRUE
dir(my_directory, recursive = TRUE, full.names = TRUE)
## [1] "/tmp/RtmpVTucXi/simple/knit.Rasciidoc"
## [2] "/tmp/RtmpVTucXi/simple/src/my_sum.R"
## [3] "/tmp/RtmpVTucXi/simple/src/sum.R"
you could render
the file
rasciidoc::render(file.path(my_directory, basename(file_name)))
## Warning in run_knit(file_name, knit = knit, envir = envir, write_to_disk = ## write_to_disk): Setting option knit to TRUE based on the file contents!
## Due to the CRAN policy of not writing "anywhere else on the file system apart from the R session's temporary directory" we work on a temporary copy of /tmp/RtmpVTucXi/simple/knit.Rasciidoc. ## Thus all internal sourcing and internal links will be broken and any output is written to /tmp/RtmpVTucXi. Set the option "write_to_disk" to TRUE (using ## options("write_to_disk" = TRUE) ## ) to bypass this. You may want to include the above line into your ~/.Rprofile.
## ## ## processing file: /tmp/RtmpVTucXi/simple/knit.Rasciidoc
## 1/9
## 2/9 [sum]
## 3/9
## 4/9 [my_sum]
## 5/9
## 6/9 [value]
## 7/9
## 8/9 [run my_sum]
## 9/9
## output file: /tmp/RtmpVTucXi/knit.asciidoc
## [1] TRUE
## attr(,"info")
## attr(,"info")$python
## [1] "/usr/bin/python"
##
## attr(,"info")$input
## [1] "/tmp/RtmpVTucXi/knit.asciidoc"
##
## attr(,"info")$output
## [1] "/tmp/RtmpVTucXi/knit.html"
##
## attr(,"info")$asciidoc
## [1] "/usr/bin/asciidoc"
##
## attr(,"info")$`source-highlight`
## [1] TRUE
##
## attr(,"info")$`git-asciidoc`
## [1] NA
and create an HTML file that is identical to [this file](https://fvafrcu.gitlab.io/rasciidoc/inst/files/simple/knit.html) and that you could browse using
browseURL(file.path(my_directory, paste0(sub("\\..*$", "", basename(file_name)), ".html")))
from your current R session .
Spinnig
You can also use a spinnig file for input:
file_name <- system.file("files", "simple", "spin.R_nolint", package = "rasciidoc") cat(readLines(file_name), sep = "\n")
## #' = Some Title
## #' Your Name
## #' :toc2:
## #' :numbered:
## #' :data-uri:
## #' :duration: 120
## #'
## #' == What is this About?
## #'
## #' //begin_no_slide
## #' This will not show up on slides.
## #' //end_no_slide
## #'
## #' === Some simple asciidoc
## #'
## #' * A list with a https://en.wikipedia.org/wiki/Hyperlink[link].
## #' * Yet another entry in the list.
## #'
## #' == Including Code
## #' Do not use the _include_ macro provided by asciidoc!
## #' Instead prefix all source statements with
## #' ----
## #' #+ code = readLines("file_to_be_sourced")
## #' #+ include = FALSE
## #' ----
## #' It est use
## #' ----
## #' #+ code = readLines("src/sum.R")
## #' #+ include = FALSE
## #' source("src/sum.R")
## #' ----
## #' to produce
## #+ code = readLines("src/sum.R")
## #+ include = FALSE
## source("src/sum.R")
## #'
## #'
## message("A message, probably different output hooks.")
## #' == A new section
## #'
## #+ code = readLines("src/my_sum.R")
## #' === A subsection
## print(value)
## #'
## print(my_sum(1:3))
## #'
## #' Inline code does not work: Object +value+ has value +r value+.
## #'
You run render
on it:
withr::with_dir(tempdir(), { file.copy(file_name, ".", overwrite = TRUE) file.copy(file.path(dirname(file_name), "src"), ".", recursive = TRUE) rasciidoc::render(basename(file_name)) })
## 1/1
## Due to the CRAN policy of not writing "anywhere else on the file system apart from the R session's temporary directory" we work on a temporary copy of /tmp/RtmpVTucXi/spin.R_nolint. ## Thus all internal sourcing and internal links will be broken and any output is written to /tmp/RtmpVTucXi. Set the option "write_to_disk" to TRUE (using ## options("write_to_disk" = TRUE) ## ) to bypass this. You may want to include the above line into your ~/.Rprofile.
## [1] TRUE
## attr(,"info")
## attr(,"info")$python
## [1] "/usr/bin/python"
##
## attr(,"info")$input
## [1] "/tmp/RtmpVTucXi/spin.asciidoc_nolint"
##
## attr(,"info")$output
## [1] "/tmp/RtmpVTucXi/spin.R_nolint" "/tmp/RtmpVTucXi/spin.html"
##
## attr(,"info")$asciidoc
## [1] "/usr/bin/asciidoc"
##
## attr(,"info")$`source-highlight`
## [1] TRUE
##
## attr(,"info")$`git-asciidoc`
## [1] NA
Vignettes Using rasciidoc
This vignette is built by rasciidoc
's vignette engine
(see https://gitlab.com/fvafrcu/rasciidoc/-/blob/master/vignettes/An_Introduction_to_rasciidoc.Rasciidoc for its input file).
Just add a
////
%\VignetteIndexEntry{Your Vignette Entry}
%\VignetteEngine{rasciidoc::rasciidoc}
////
block to your rasciidoc
input file and add rasciidoc
to
the VignetteBuilder and Suggests fields of
your package’s DESCRIPTION file.