Skip to content

Instantly share code, notes, and snippets.

@jbryer
Last active February 1, 2023 09:07
Show Gist options
  • Save jbryer/11049319 to your computer and use it in GitHub Desktop.
Save jbryer/11049319 to your computer and use it in GitHub Desktop.
Functions to work with Gitbook.io and R Markdown
require(knitr)
#' Initializes a new Gitbook.
#'
#' This will initalize a new Gitbook in the given directory. When done, it will
#' also change the working directory.
#'
#' @author Jason Bryer <[email protected]>
newGitbook <- function(dir) {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
# TODO: May want to make these parameters or options
bookignore <- c('*.RMD','*.rmd','*.Rmd','log/','*.R','*.Rproj')
gitignore <- c('.Rproj.user','_book/','.rmdbuild.Rda','*.DS_Store','log/','.Rhistory')
summary.md <- c("# Summary","This is the summary of my book.",
"",
"* [section 1](section1/README.md)",
" * [example 1](section1/example1.md)",
" * [example 2](section1/example2.md)",
"* [section 2](section2/README.md)",
" * [example 1](section2/example1.md)")
readme.md <- c("# Book Title",
"#### by Your Name",
"",
"Replace with an introduction of your book.")
if(missing(dir)) { stop('dir parameter is required.') }
if(system('npm', ignore.stdout=TRUE) != 0) {
stop("Cannot find node.js. You can install it from http://nodejs.org/download/")
}
if(system('gitbook', ignore.stdout=TRUE) != 0) {
message("Installing gitbook...")
test <- system('npm install gitbook -g')
if(test != 0) { stop("gitbook installation failed.") }
}
dir <- path.expand(dir)
message(paste0('Creating ', dir))
dir.create(dir, recursive=TRUE, showWarnings=FALSE)
olddir <- setwd(dir)
message('Writing .bookignore...')
f <- file('.bookignore')
writeLines(bookignore, f)
close(f)
message('Writing .gitignore...')
f <- file('.gitignore')
writeLines(gitignore, f)
close(f)
message('Writing README.md...')
f <- file('README.md')
writeLines(readme.md, f)
close(f)
message('Writing SUMMARY.md...')
f <- file('SUMMARY.md')
writeLines(summary.md, f)
close(f)
message(
'You can now open README.md and SUMMARY.md. Once you are done
editting SUMMARY.md, initGitbook() will create the file and folder
structure for your new Gitbook.')
}
#' Create files and folders based on contents of SUMMARY.md.
#'
#' This first calls system command \code{gitbook init} but then will change
#' the all the file extensions from \code{.md} to \code{.Rmd} excluding
#' \code{SUMMARY.md} and \code{README.md}.
#'
#' @param dir source directory for the Gitbook.
initGitbook <- function(dir=getwd()) {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
test <- system(paste0('gitbook init ', dir))
if(test != 0) { stop("gitbook initalization failed") }
mdfiles <- list.files(dir, '*.md', recursive=TRUE)
mdfiles <- mdfiles[!mdfiles %in% c('README.md', 'SUMMARY.md')]
mdfiles2 <- gsub('.md$', '.Rmd', mdfiles)
file.rename(mdfiles, mdfiles2)
invisible()
}
#' Builds markdown files from all Rmarkdown files in the given directories.
#'
#' This function will build Rmarkdown files in the given directory to markdown.
#' The default is to traverse all subdirectories of the working directory
#' looking for .Rmd files to process. This function will save a file in the
#' working directory called \code{.rmdbuild.Rda} that contain the status of the
#' last successful build. This allows the function to only process changed files.
#'
#' @param dirs character vector of directors to process.
#' @param clean if TRUE, all Rmd files will be built regardless of their
#' modification date.
#' @param log.dir if specified, the output from \code{\link{kintr}} will be saved
#' to a log file in the given directory.
#' @param log.ext if log files are saved, the file extension to use.
#' @param ... other parameters.
#' @author Jason Bryer <[email protected]>
buildRmd <- function(dirs = getwd(), clean=FALSE, log.dir, log.ext='.txt', ...) {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
if(!exists('statusfile')) {
statusfile <- '.rmdbuild.Rda'
}
rmds <- list.files(dirs, '.rmd$', ignore.case=TRUE, recursive=TRUE)
finfo <- file.info(rmds)
if(!clean & file.exists(statusfile)) {
load(statusfile)
newfiles <- row.names(finfo)[!row.names(finfo) %in% row.names(rmdinfo)]
existing <- row.names(finfo)[row.names(finfo) %in% row.names(rmdinfo)]
existing <- existing[finfo[existing,]$mtime > rmdinfo[existing,]$mtime]
rmds <- c(newfiles, existing)
}
for(j in rmds) {
if(!missing(log.dir)) {
logfile <- paste0(log.dir, '/', sub('.Rmd$', log.ext, j, ignore.case=TRUE))
dir.create(dirname(logfile), recursive=TRUE, showWarnings=FALSE)
sink(logfile)
}
oldwd <- setwd(dirname(j))
tryCatch({
knit(basename(j), sub('.Rmd$', '.md', basename(j), ignore.case=TRUE))
}, finally={ setwd(oldwd) })
if(!missing(log.dir)) { sink() }
}
rmdinfo <- finfo
last.run <- Sys.time()
last.R.version <- R.version
save(rmdinfo, last.run, last.R.version, file=statusfile)
}
#' This will build a gitbook from the source markdown files.
#'
#' This function is simply a wrapper to a system call to \code{gitbook}.
#'
#' \url{https://github.com/GitbookIO/gitbook}
#'
#' @param source.dir location containing the source files.
#' @param out.dir location of the built book.
#' @param format the format of book. Options are gitbook (default website book),
#' pdf, or ebook.
#' @param title Name of the book to generate, defaults to repo name
#' @param intro Description of the book to generate
#' @param github ID of github repo like : username/repo
#' @param theme the book theme to use.
#' @author Jason Bryer <[email protected]>
buildGitbook <- function(source.dir=getwd(),
out.dir=paste0(getwd(), '/_book'),
format, title, intro, github, theme) {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
cmd <- paste0("gitbook build ", source.dir, " --output=", out.dir)
if(!missing(format)) { cmd <- paste0(cmd, " --format=", format) }
if(!missing(title)) { cmd <- paste0(cmd, " --theme=", theme) }
if(!missing(title)) { cmd <- paste0(cmd, ' --title="', title, '"') }
if(!missing(intro)) { cmd <- paste0(cmd, ' --intro="', intro, '"') }
if(!missing(github)) { cmd <- paste0(cmd, ' --github=', github) }
if(!missing(theme)) { cmd <- paste0(cmd, " --theme=", theme) }
system(cmd)
# Post-process hack to fix broken img urls.
# https://github.com/GitbookIO/gitbook/issues/99
# Will also fix links to the Introduction
# https://github.com/GitbookIO/gitbook/issues/113
dirs <- list.dirs(out.dir, recursive=FALSE, full.names=FALSE)
for(i in seq_along(dirs)) {
files <- list.files(paste0(out.dir, '/', dirs[i]), '*.html')
for(j in seq_along(files)) {
fconn <- file(paste0(out.dir, '/', dirs[i], '/', files[j]))
file <- readLines(fconn)
close(fconn)
file <- gsub(paste0(dirs[i], '/', dirs[i], '/'), '', file)
file <- gsub('./">', './index.html">', file)
fconn <- file(paste0(out.dir, '/', dirs[i], '/', files[j]))
writeLines(file, fconn)
close(fconn)
}
}
}
#' Open a built gitbook.
#'
#' This function is a wrapper to the system call of \code{open} which should
#' open the book in the system's default web browser.
#'
#' @param out.dir location of the built gitbook.
#' @author Jason Bryer <[email protected]>
openGitbook <- function(out.dir=paste0(getwd(), '/_book')) {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
browseURL(paste0(out.dir, '/index.html'))
}
#' Publish the built gitbook to Github.
#'
#' Note that this is a wrapper to system \code{git} call.
#'
#' This function assumes that the repository has already exists on Github.
#'
#' Thanks to ramnathv for the shell script.
#' https://github.com/GitbookIO/gitbook/issues/106#issuecomment-40747887
#'
#' @param repo the github repository. Should be of form username/repository
#' @param out.dir location of the built gitbook.
#' @param message commit message.
#' @author Jason Bryer <[email protected]>
publishGitbook <- function(repo,
out.dir=paste0(getwd(), '/_book'),
message='Update built gitbook') {
.Deprecated('This function has been moved to the gitbook R package. See http://jason.bryer.org/Rgitbook for more information')
cmd <- paste0(
"cd ", out.dir, " \n",
"git init \n",
"git commit --allow-empty -m '", message,"' \n",
"git checkout -b gh-pages \n",
"git add . \n",
"git commit -am '", message, "' \n",
"git push [email protected]:", repo, " gh-pages --force ")
system(cmd)
}
@mammon69bot
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment