自定义 bookdown 中的 "edit" link

Customize the "edit" link in bookdown

我使用 bookdown 和 gitbook 输出来构建一本书。用于构建本书的 .Rmd 文件依次从以下工作流中的其他源文件自动生成:R 脚本采用 folder1/file.txt 并生成文件 folder2/file.Rmd,它位于转用来建书。

到目前为止,还不错。但是,当我在 _bookdown.yaml 中使用 the edit option 时,link(自然地)指的是 folder2/file.Rmd。将 folder2 替换为 folder1 并将 .Rmd 替换为 .txt 是一件简单的事情,但我不知道应该从哪里开始。

R/html.R(在 bookdown 包中)中,link 是在函数 build_chapter 中生成的,使用 rmd_cur 作为输入(即“当前章节的Rmd文件名") 和函数source_link.

source_link = function(target, type) {
  if (length(target) == 0) return()
  setting = source_link_setting(type = type)
  if (is.null(setting)) return()
  button_link(sprintf(setting$link, target), setting$text)
}

如何使用此信息生成指向 folder1/file.txt 而不是 folder2/file.Rmd 的自定义 link?

如果您希望历史记录和视图也link到文本文件

source_link = function(target, type) {
  if (length(target) == 0) return()
  setting = source_link_setting(type = type)
  if (is.null(setting)) return()
  button_link(sprintf(setting$link, sub("folder2/(.+?)\.[Rr]md$", "folder1/\1.txt", target)), setting$text)
}

否则重载 build_chapter 函数:

build_chapter = function(
  head, toc, chapter, link_prev, link_next, rmd_cur, html_cur, foot
) {
  # add a has-sub class to the <li> items that has sub lists
  toc = gsub('^(<li>)(.+<ul>)$', '<li class="has-sub">\2', toc)
  paste(c(
    head,
    '<div class="row">',
    '<div class="col-sm-12">',
    toc,
    '</div>',
    '</div>',
    '<div class="row">',
    '<div class="col-sm-12">',
    chapter,
    '<p style="text-align: center;">',
    button_link(link_prev, 'Previous'),
    source_link(sub("folder2/(.+?)\.[Rr]md$", "folder1/\1.txt", rmd_cur), type = 'edit'),
    source_link(rmd_cur, type = 'history'),
    source_link(rmd_cur, type = 'view'),
    button_link(link_next, 'Next'),
    '</p>',
    '</div>',
    '</div>',
    foot
  ), collapse = '\n')
}