diff --git a/R/rmarkdown/preview.R b/R/rmarkdown/preview.R index 87bdea362..e359ffb62 100644 --- a/R/rmarkdown/preview.R +++ b/R/rmarkdown/preview.R @@ -35,10 +35,12 @@ knitr::opts_knit[["set"]](root.dir = knit_dir) cat( lim, rmarkdown::render( - file_path, + input = file_path, output_format = set_html, output_file = output_file_loc, - intermediates_dir = tmp_dir + output_dir = tmp_dir, + intermediates_dir = tmp_dir, + output_options = list(self_contained = TRUE) ), lim, sep = "" diff --git a/src/rmarkdown/knit.ts b/src/rmarkdown/knit.ts index 3bf0957a3..e88ecf67a 100644 --- a/src/rmarkdown/knit.ts +++ b/src/rmarkdown/knit.ts @@ -7,6 +7,7 @@ import yaml = require('js-yaml'); import { RMarkdownManager, KnitWorkingDirectory, DisposableProcess } from './manager'; import { runTextInTerm } from '../rTerminal'; import { extensionContext, rmdPreviewManager } from '../extension'; +import { showBrowser } from '../session'; export let knitDir: KnitWorkingDirectory = util.config().get('rmarkdown.knit.defaults.knitWorkingDirectory') ?? undefined; @@ -35,14 +36,16 @@ export class RMarkdownKnitManager extends RMarkdownManager { const lim = '---vsc---'; const re = new RegExp(`.*${lim}(.*)${lim}.*`, 'gms'); + const serveReg = /(http:\/\/(localhost)?[0-9.:]*\/.*\.html)/g; const scriptValues = { 'VSCR_KNIT_DIR': knitWorkingDirText, 'VSCR_LIM': lim, 'VSCR_KNIT_COMMAND': knitCommand }; - const callback = (dat: string) => { + const callback = (dat: string, process: DisposableProcess) => { const outputUrl = re.exec(dat)?.[0]?.replace(re, '$1'); + const serveUrl = serveReg.exec(dat)?.[0]?.replace(serveReg, '$1'); if (outputUrl) { if (openOutfile) { const outFile = vscode.Uri.file(outputUrl); @@ -53,6 +56,16 @@ export class RMarkdownKnitManager extends RMarkdownManager { } } return true; + } else if (serveUrl) { + const browser = showBrowser(serveUrl, docName, 'Beside'); + void browser.then((value) => { + if (value) { + value.onDidDispose(() => { + process.kill('SIGTERM'); + }); + } + }); + return true; } else { return false; } diff --git a/src/rmarkdown/manager.ts b/src/rmarkdown/manager.ts index 490eb039c..ae23088e2 100644 --- a/src/rmarkdown/manager.ts +++ b/src/rmarkdown/manager.ts @@ -151,6 +151,11 @@ export abstract class RMarkdownManager { if (printOutput) { this.rMarkdownOutput.appendLine(dat); } + // for some reason, some knitting formats have the output + // of the file url in the stderr stream + if (args.callback(dat, childProcess)) { + resolve(childProcess); + } }); childProcess.on('exit', (code, signal) => { diff --git a/src/session.ts b/src/session.ts index 4275f6c22..32c78f525 100644 --- a/src/session.ts +++ b/src/session.ts @@ -195,7 +195,7 @@ async function updateGlobalenv() { } } -export async function showBrowser(url: string, title: string, viewer: string | boolean): Promise { +export async function showBrowser(url: string, title: string, viewer: string | boolean): Promise { console.info(`[showBrowser] uri: ${url}, viewer: ${viewer.toString()}`); const uri = Uri.parse(url); if (viewer === false) { @@ -240,6 +240,7 @@ export async function showBrowser(url: string, title: string, viewer: string | b }); panel.iconPath = new UriIcon('globe'); panel.webview.html = getBrowserHtml(externalUri); + return (panel); } console.info('[showBrowser] Done'); }