-
-
Save thomasjo/88fe80102f6acceada98 to your computer and use it in GitHub Desktop.
Modified Rweave driver and functions to use minted
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
RweaveLatexMinted <- function() | |
{ | |
list(setup = RweaveLatexSetup, | |
runcode = RweaveLatexRuncodeMinted, | |
writedoc = RweaveLatexWritedocMinted, | |
finish = RweaveLatexFinish, | |
checkopts = RweaveLatexOptions) | |
} | |
makeRweaveLatexCodeRunnerMinted <- function(evalFunc=RweaveEvalWithOpt) | |
{ | |
## Return a function suitable as the 'runcode' element | |
## of an Sweave driver. evalFunc will be used for the | |
## actual evaluation of chunk code. | |
RweaveLatexRuncode <- function(object, chunk, options) { | |
if (!(options$engine %in% c("R", "S"))){ | |
return(object) | |
} | |
if (!object$quiet){ | |
cat(formatC(options$chunknr, width=2), ":") | |
if (options$echo) cat(" echo") | |
if (options$keep.source) cat(" keep.source") | |
if (options$eval){ | |
if (options$print) cat(" print") | |
if (options$term) cat(" term") | |
cat("", options$results) | |
if (options$fig){ | |
if (options$eps) cat(" eps") | |
if (options$pdf) cat(" pdf") | |
} | |
} | |
if (!is.null(options$label)) | |
cat(" (label=", options$label, ")", sep="") | |
cat("\n") | |
} | |
chunkprefix <- RweaveChunkPrefix(options) | |
if(options$split){ | |
## [x][[1L]] avoids partial matching of x | |
chunkout <- object$chunkout[chunkprefix][[1L]] | |
if(is.null(chunkout)){ | |
chunkout <- file(paste(chunkprefix, "tex", sep="."), "w") | |
if(!is.null(options$label)) | |
object$chunkout[[chunkprefix]] <- chunkout | |
} | |
} else { | |
chunkout <- object$output | |
} | |
srcfile <- object$srcfile | |
SweaveHooks(options, run=TRUE) | |
# Note that we edit the error message below, so change both | |
# if you change this line: | |
chunkexps <- try(parse(text=chunk, srcfile=srcfile), silent=TRUE) | |
if (inherits(chunkexps, "try-error")) | |
chunkexps[1L] <- sub(" parse(text = chunk, srcfile = srcfile) : \n ", | |
"", chunkexps[1L], fixed = TRUE) | |
Sinput.begin = "" | |
Sinput.end = "\n" | |
Soutput.begin = "" | |
Soutput.end = "\n" | |
Schunk.begin = "\\begin{minted}{r}" | |
Schunk.end = "\n\\end{minted}\n" | |
RweaveTryStop(chunkexps, options) | |
openSinput <- FALSE | |
openSchunk <- FALSE | |
if(length(chunkexps) == 0L) | |
return(object) | |
srclines <- attr(chunk, "srclines") | |
linesout <- integer(0L) | |
srcline <- srclines[1L] | |
srcrefs <- attr(chunkexps, "srcref") | |
lastshown <- NA | |
thisline <- 0L | |
chunkregexp <- "(.*)#from line#([[:digit:]]+)#" | |
for(nce in seq_along(chunkexps)) { | |
ce <- chunkexps[[nce]] | |
if (options$keep.source && nce <= length(srcrefs) && !is.null(srcref <- srcrefs[[nce]])) { | |
srcfile <- attr(srcref, "srcfile") | |
showfrom <- srcref[1L] | |
showto <- srcref[3L] | |
refline <- srcfile$refline | |
if (is.null(refline)) { | |
if (grepl(chunkregexp, srcfile$filename)) { | |
refline <- as.integer(sub(chunkregexp, "\\2", srcfile$filename)) | |
srcfile$filename <- sub(chunkregexp, "\\1", srcfile$filename) | |
} else { | |
refline <- NA | |
} | |
srcfile$refline <- refline | |
} | |
if (!options$expand && !is.na(refline)) | |
showfrom <- showto <- refline | |
if (!is.na(refline) || is.na(lastshown)) { | |
# Did we expand a named chunk for this expression or the previous | |
# one? | |
dce <- getSrcLines(srcfile, showfrom, showto) | |
leading <- 1L | |
if (!is.na(refline)) { | |
lastshown <- NA | |
} else { | |
lastshown <- showto | |
} | |
} else { | |
dce <- getSrcLines(srcfile, lastshown+1L, showto) | |
leading <- showfrom-lastshown | |
lastshown <- showto | |
} | |
srcline <- showto | |
while (length(dce) && length(grep("^[[:blank:]]*$", dce[1L]))) { | |
dce <- dce[-1L] | |
leading <- leading - 1L | |
} | |
} else { | |
dce <- deparse(ce, width.cutoff=0.75*getOption("width")) | |
leading <- 1L | |
} | |
if(object$debug) | |
cat("\nRnw> ", paste(dce, collapse="\n+ "),"\n") | |
if(options$echo && length(dce)){ | |
if(!openSinput){ | |
if(!openSchunk){ | |
cat(Schunk.begin, file=chunkout, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
openSchunk <- TRUE | |
} | |
cat(Sinput.begin, file=chunkout, append=TRUE) | |
openSinput <- TRUE | |
} | |
cat("\n", paste(getOption("prompt"), dce[1L:leading], sep="", collapse="\n"), | |
file=chunkout, append=TRUE, sep="") | |
if (length(dce) > leading) | |
cat("\n", paste(getOption("continue"), dce[-(1L:leading)], sep="", collapse="\n"), | |
file=chunkout, append=TRUE, sep="") | |
linesout[thisline + seq_along(dce)] <- srcline | |
thisline <- thisline + length(dce) | |
} | |
# tmpcon <- textConnection("output", "w") | |
# avoid the limitations (and overhead) of output text connections | |
tmpcon <- file() | |
sink(file=tmpcon) | |
err <- NULL | |
if(options$eval) err <- evalFunc(ce, options) | |
cat("\n") # make sure final line is complete | |
sink() | |
output <- readLines(tmpcon) | |
close(tmpcon) | |
## delete empty output | |
if(length(output) == 1L & output[1L] == "") output <- NULL | |
RweaveTryStop(err, options) | |
if(object$debug) | |
cat(paste(output, collapse="\n")) | |
if(length(output) & (options$results != "hide")){ | |
if(openSinput){ | |
cat(Sinput.end, file=chunkout, append=TRUE) | |
linesout[thisline + 1L:2L] <- srcline | |
thisline <- thisline + 2L | |
openSinput <- FALSE | |
} | |
if(options$results=="verbatim"){ | |
if(!openSchunk){ | |
cat(Schunk.begin, file=chunkout, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
openSchunk <- TRUE | |
} | |
cat(Soutput.begin, file=chunkout, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
} | |
output <- paste(output,collapse="\n") | |
if(options$strip.white %in% c("all", "true")){ | |
output <- sub("^[[:space:]]*\n", "", output) | |
output <- sub("\n[[:space:]]*$", "", output) | |
if(options$strip.white=="all") | |
output <- sub("\n[[:space:]]*\n", "\n", output) | |
} | |
cat(output, file=chunkout, append=TRUE) | |
count <- sum(strsplit(output, NULL)[[1L]] == "\n") | |
if (count > 0L) { | |
linesout[thisline + 1L:count] <- srcline | |
thisline <- thisline + count | |
} | |
remove(output) | |
if(options$results=="verbatim"){ | |
cat(Soutput.end, file=chunkout, append=TRUE) | |
linesout[thisline + 1L:2L] <- srcline | |
thisline <- thisline + 2L | |
} | |
} | |
} | |
if(openSinput){ | |
cat(Sinput.end, file=chunkout, append=TRUE) | |
linesout[thisline + 1L:2L] <- srcline | |
thisline <- thisline + 2L | |
} | |
if(openSchunk){ | |
cat(Schunk.end, file=chunkout, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
} | |
if(is.null(options$label) & options$split) | |
close(chunkout) | |
if(options$split & options$include){ | |
cat("\\input{", chunkprefix, "}\n", sep="", file=object$output, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
} | |
if(options$fig && options$eval){ | |
if(options$eps){ | |
grDevices::postscript(file=paste(chunkprefix, "eps", sep="."), | |
width=options$width, height=options$height, | |
paper="special", horizontal=FALSE) | |
err <- try({SweaveHooks(options, run=TRUE) | |
eval(chunkexps, envir=.GlobalEnv)}) | |
grDevices::dev.off() | |
if(inherits(err, "try-error")) stop(err) | |
} | |
if(options$pdf){ | |
grDevices::pdf( file=paste(chunkprefix, "pdf", sep="."), | |
width=options$width, height=options$height, | |
version=options$pdf.version, | |
encoding=options$pdf.encoding) | |
err <- try({SweaveHooks(options, run=TRUE) | |
eval(chunkexps, envir=.GlobalEnv)}) | |
grDevices::dev.off() | |
if(inherits(err, "try-error")) stop(err) | |
} | |
if(options$include) { | |
cat("\\begin{center} \\includegraphics{", chunkprefix, "}\n \\end{center}\n", sep="", | |
file=object$output, append=TRUE) | |
linesout[thisline + 1L] <- srcline | |
thisline <- thisline + 1L | |
} | |
} | |
object$linesout <- c(object$linesout, linesout) | |
return(object) | |
} | |
RweaveLatexRuncode | |
} | |
RweaveLatexRuncodeMinted <- makeRweaveLatexCodeRunnerMinted() | |
RweaveLatexWritedocMinted <- function(object, chunk) { | |
linesout <- attr(chunk, "srclines") | |
if(length(grep("\\usepackage[^\\}]*Sweave.*\\}", chunk))) | |
object$havesty <- TRUE | |
if(!object$havesty){ | |
begindoc <- "^[[:space:]]*\\\\begin\\{document\\}" | |
which <- grep(begindoc, chunk) | |
repstr = paste("\\\\usepackage{",object$styfile,"}\n\n", | |
"\\\\begin{document}", sep="") | |
if(length(grep("\\usepackage\\{minted\\}", chunk)) == 0){ | |
repstr = paste("\\\\usepackage{minted}\n\n", repstr,sep="") | |
} | |
if (length(which)) { | |
chunk[which] <- sub(begindoc, | |
repstr, | |
chunk[which]) | |
linesout <- linesout[c(1L:which, which, seq(from=which+1L, length.out=length(linesout)-which))] | |
object$havesty <- TRUE | |
} | |
} | |
while(length(pos <- grep(object$syntax$docexpr, chunk))) { | |
cmdloc <- regexpr(object$syntax$docexpr, chunk[pos[1L]]) | |
cmd <- substr(chunk[pos[1L]], cmdloc, | |
cmdloc+attr(cmdloc, "match.length")-1L) | |
cmd <- sub(object$syntax$docexpr, "\\1", cmd) | |
if(object$options$eval){ | |
val <- as.character(eval(parse(text=cmd), envir=.GlobalEnv)) | |
## protect against character(0L), because sub() will fail | |
if(length(val) == 0L) val <- "" | |
} | |
else | |
val <- paste("\\\\verb{<<", cmd, ">>{", sep="") | |
chunk[pos[1L]] <- sub(object$syntax$docexpr, val, chunk[pos[1L]]) | |
} | |
while(length(pos <- grep(object$syntax$docopt, chunk))) { | |
opts <- sub(paste(".*", object$syntax$docopt, ".*", sep=""), | |
"\\1", chunk[pos[1L]]) | |
object$options <- SweaveParseOptions(opts, object$options, | |
RweaveLatexOptions) | |
if (isTRUE(object$options$concordance) && !object$haveconcordance) { | |
savelabel <- object$options$label | |
object$options$label <- "concordance" | |
prefix <- RweaveChunkPrefix(object$options) | |
object$options$label <- savelabel | |
object$concordfile <- paste(prefix, "tex", sep=".") | |
chunk[pos[1L]] <- sub(object$syntax$docopt, | |
paste("\\\\input{", prefix, "}", sep=""), | |
chunk[pos[1L]]) | |
object$haveconcordance <- TRUE | |
} else { | |
chunk[pos[1L]] <- sub(object$syntax$docopt, "", chunk[pos[1L]]) | |
} | |
} | |
cat(chunk, sep="\n", file=object$output, append=TRUE) | |
object$linesout <- c(object$linesout, linesout) | |
return(object) | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment