10
10
# ' * Adds `inst/doc` to `.gitignore` so built vignettes aren't tracked.
11
11
# ' * Adds `vignettes/*.html` and `vignettes/*.R` to `.gitignore` so
12
12
# ' you never accidentally track rendered vignettes.
13
- # ' @param name Base for file name to use for new vignette. Should consist only
14
- # ' of numbers, letters, `_` and `-`. Lower case is recommended.
15
- # ' @param title The title of the vignette.
16
- # ' @seealso The [vignettes chapter](https://r-pkgs.org/vignettes.html) of
17
- # ' [R Packages](https://r-pkgs.org).
13
+ # ' * For `*.qmd`, adds Quarto-related patterns to `.gitignore` and
14
+ # ' `.Rbuildignore`.
15
+ # ' @param name File name to use for new vignette. Should consist only of
16
+ # ' numbers, letters, `_` and `-`. Lower case is recommended. Can include the
17
+ # ' `".Rmd"` or `".qmd"` file extension, which also dictates whether to place
18
+ # ' an R Markdown or Quarto vignette. R Markdown (`".Rmd"`) is the current
19
+ # ' default, but it is anticipated that Quarto (`".qmd"`) will become the
20
+ # ' default in the future.
21
+ # ' @param title The title of the vignette. If not provided, a title is generated
22
+ # ' from `name`.
23
+ # ' @seealso
24
+ # ' * The [vignettes chapter](https://r-pkgs.org/vignettes.html) of
25
+ # ' [R Packages](https://r-pkgs.org)
26
+ # ' * The pkgdown vignette on Quarto:
27
+ # ' `vignette("quarto", package = "pkgdown")`
28
+ # ' * The quarto (as in the R package) vignette on HTML vignettes:
29
+ # ' `vignette("hello", package = "quarto")`
18
30
# ' @export
19
31
# ' @examples
20
32
# ' \dontrun{
21
33
# ' use_vignette("how-to-do-stuff", "How to do stuff")
34
+ # ' use_vignette("r-markdown-is-classic.Rmd", "R Markdown is classic")
35
+ # ' use_vignette("quarto-is-cool.qmd", "Quarto is cool")
22
36
# ' }
23
- use_vignette <- function (name , title = name ) {
37
+ use_vignette <- function (name , title = NULL ) {
24
38
check_is_package(" use_vignette()" )
25
39
check_required(name )
40
+ maybe_name(title )
41
+
42
+ ext <- get_vignette_extension(name )
43
+ if (ext == " qmd" ) {
44
+ check_installed(" quarto" )
45
+ check_installed(" pkgdown" , version = " 2.1.0" )
46
+ }
47
+
48
+ name <- path_ext_remove(name )
26
49
check_vignette_name(name )
50
+ title <- title %|| % name
27
51
28
52
use_dependency(" knitr" , " Suggests" )
29
- use_dependency(" rmarkdown" , " Suggests" )
30
-
31
- proj_desc_field_update(" VignetteBuilder" , " knitr" , overwrite = TRUE )
32
53
use_git_ignore(" inst/doc" )
33
54
34
- use_vignette_template(" vignette.Rmd" , name , title )
55
+ if (tolower(ext ) == " rmd" ) {
56
+ use_dependency(" rmarkdown" , " Suggests" )
57
+ proj_desc_field_update(" VignetteBuilder" , " knitr" , overwrite = TRUE , append = TRUE )
58
+ use_vignette_template(" vignette.Rmd" , name , title )
59
+ } else {
60
+ use_dependency(" quarto" , " Suggests" )
61
+ proj_desc_field_update(" VignetteBuilder" , " quarto" , overwrite = TRUE , append = TRUE )
62
+ use_vignette_template(" vignette.qmd" , name , title )
63
+ }
35
64
36
65
invisible ()
37
66
}
38
67
39
68
# ' @export
40
69
# ' @rdname use_vignette
41
- use_article <- function (name , title = name ) {
70
+ use_article <- function (name , title = NULL ) {
42
71
check_is_package(" use_article()" )
72
+ check_required(name )
73
+ maybe_name(title )
43
74
44
- deps <- proj_deps()
45
- if (! " rmarkdown" %in% deps $ package ) {
46
- proj_desc_field_update(" Config/Needs/website" , " rmarkdown" , append = TRUE )
75
+ ext <- get_vignette_extension(name )
76
+ if (ext == " qmd" ) {
77
+ check_installed(" quarto" )
78
+ check_installed(" pkgdown" , version = " 2.1.0" )
47
79
}
48
80
49
- use_vignette_template(" article.Rmd" , name , title , subdir = " articles" )
81
+ name <- path_ext_remove(name )
82
+ title <- title %|| % name
83
+
84
+ if (tolower(ext ) == " rmd" ) {
85
+ proj_desc_field_update(" Config/Needs/website" , " rmarkdown" , overwrite = TRUE , append = TRUE )
86
+ use_vignette_template(" article.Rmd" , name , title , subdir = " articles" )
87
+ } else {
88
+ use_dependency(" quarto" , " Suggests" )
89
+ proj_desc_field_update(" Config/Needs/website" , " quarto" , overwrite = TRUE , append = TRUE )
90
+ use_vignette_template(" article.qmd" , name , title , subdir = " articles" )
91
+ }
50
92
use_build_ignore(" vignettes/articles" )
51
93
52
94
invisible ()
@@ -58,18 +100,26 @@ use_vignette_template <- function(template, name, title, subdir = NULL) {
58
100
check_name(title )
59
101
maybe_name(subdir )
60
102
61
- use_directory(" vignettes" )
62
- if (! is.null(subdir )) {
63
- use_directory(path(" vignettes" , subdir ))
64
- }
65
- use_git_ignore(c(" *.html" , " *.R" ), directory = " vignettes" )
103
+ ext <- get_vignette_extension(template )
66
104
67
105
if (is.null(subdir )) {
68
- path <- path( " vignettes" , asciify( name ), ext = " Rmd " )
106
+ target_dir <- " vignettes"
69
107
} else {
70
- path <- path(" vignettes" , subdir , asciify(name ), ext = " Rmd" )
108
+ target_dir <- path(" vignettes" , subdir )
109
+ }
110
+
111
+ use_directory(target_dir )
112
+
113
+ use_git_ignore(c(" *.html" , " *.R" ), directory = target_dir )
114
+ if (ext == " qmd" ) {
115
+ use_git_ignore(" **/.quarto/" )
116
+ use_git_ignore(" *_files" , target_dir )
117
+ use_build_ignore(path(target_dir , " .quarto" ))
118
+ use_build_ignore(path(target_dir , " *_files" ))
71
119
}
72
120
121
+ path <- path(target_dir , asciify(name ), ext = ext )
122
+
73
123
data <- list (
74
124
Package = project_name(),
75
125
vignette_title = title ,
@@ -102,3 +152,28 @@ check_vignette_name <- function(name) {
102
152
valid_vignette_name <- function (x ) {
103
153
grepl(" ^[[:alpha:]][[:alnum:]_-]*$" , x )
104
154
}
155
+
156
+ check_vignette_extension <- function (ext ) {
157
+ # Quietly accept "rmd" here, tho we'll always write ".Rmd" in such a filepath
158
+ if (! ext %in% c(" Rmd" , " rmd" , " qmd" )) {
159
+ valid_exts_cli <- cli :: cli_vec(
160
+ c(" Rmd" , " qmd" ),
161
+ style = list (" vec-sep2" = " or " )
162
+ )
163
+ ui_abort(c(
164
+ " Unsupported file extension: {.val {ext}}" ,
165
+ " usethis can only create a vignette or article with one of these
166
+ extensions: {.val {valid_exts_cli}}."
167
+ ))
168
+ }
169
+ }
170
+
171
+ get_vignette_extension <- function (name ) {
172
+ ext <- path_ext(name )
173
+ if (nzchar(ext )) {
174
+ check_vignette_extension(ext )
175
+ } else {
176
+ ext <- " Rmd"
177
+ }
178
+ ext
179
+ }
0 commit comments