1616import * as vscode from 'vscode' ;
1717import * as hooks from 'positron' ;
1818
19- import { ExtensionHost , HostWebviewPanel , HostStatementRangeProvider } from '.' ;
19+ import { ExtensionHost , HostWebviewPanel , HostStatementRangeProvider , HostHelpTopicProvider } from '.' ;
2020import { CellExecutor , cellExecutorForLanguage , executableLanguages , isKnitrDocument , pythonWithReticulate } from './executors' ;
2121import { ExecuteQueue } from './execute-queue' ;
2222import { MarkdownEngine } from '../markdown/engine' ;
23- import { virtualDoc , virtualDocUri , adjustedPosition , unadjustedRange } from "../vdoc/vdoc" ;
23+ import { virtualDoc , virtualDocUri , adjustedPosition , unadjustedRange , withVirtualDocUri } from "../vdoc/vdoc" ;
2424import { EmbeddedLanguage } from '../vdoc/languages' ;
2525
2626declare global {
@@ -99,6 +99,15 @@ export function hooksExtensionHost(): ExtensionHost {
9999 return new vscode . Disposable ( ( ) => { } ) ;
100100 } ,
101101
102+ registerHelpTopicProvider : ( engine : MarkdownEngine ) : vscode . Disposable => {
103+ const hooks = hooksApi ( ) ;
104+ if ( hooks ) {
105+ return hooks . languages . registerHelpTopicProvider ( 'quarto' ,
106+ new EmbeddedHelpTopicProvider ( engine ) ) ;
107+ }
108+ return new vscode . Disposable ( ( ) => { } ) ;
109+ } ,
110+
102111 createPreviewPanel : (
103112 viewType : string ,
104113 title : string ,
@@ -154,20 +163,13 @@ class EmbeddedStatementRangeProvider implements HostStatementRangeProvider {
154163 token : vscode . CancellationToken ) : Promise < hooks . StatementRange | undefined > {
155164 const vdoc = await virtualDoc ( document , position , this . _engine ) ;
156165 if ( vdoc ) {
157- const vdocUri = await virtualDocUri ( vdoc , document . uri , "statementRange" ) ;
158- try {
166+ return await withVirtualDocUri ( vdoc , document . uri , "statementRange" , async ( uri : vscode . Uri ) => {
159167 return getStatementRange (
160- vdocUri . uri ,
168+ uri ,
161169 adjustedPosition ( vdoc . language , position ) ,
162170 vdoc . language
163171 ) ;
164- } catch ( error ) {
165- return undefined ;
166- } finally {
167- if ( vdocUri . cleanup ) {
168- await vdocUri . cleanup ( ) ;
169- }
170- }
172+ } ) ;
171173 } else {
172174 return undefined ;
173175 }
@@ -186,3 +188,33 @@ async function getStatementRange(
186188 ) ;
187189 return { range : unadjustedRange ( language , result . range ) , code : result . code } ;
188190}
191+
192+ class EmbeddedHelpTopicProvider implements HostHelpTopicProvider {
193+ private readonly _engine : MarkdownEngine ;
194+
195+ constructor (
196+ readonly engine : MarkdownEngine ,
197+ ) {
198+ this . _engine = engine ;
199+ }
200+
201+ async provideHelpTopic (
202+ document : vscode . TextDocument ,
203+ position : vscode . Position ,
204+ token : vscode . CancellationToken ) : Promise < string | undefined > {
205+ const vdoc = await virtualDoc ( document , position , this . _engine ) ;
206+
207+ if ( vdoc ) {
208+ return await withVirtualDocUri ( vdoc , document . uri , "helpTopic" , async ( uri : vscode . Uri ) => {
209+ return await vscode . commands . executeCommand < string > (
210+ "positron.executeHelpTopicProvider" ,
211+ uri ,
212+ adjustedPosition ( vdoc . language , position ) ,
213+ vdoc . language
214+ ) ;
215+ } ) ;
216+ } else {
217+ return undefined ;
218+ }
219+ } ;
220+ }
0 commit comments