diff --git a/extensions/notebook-renderers/src/index.ts b/extensions/notebook-renderers/src/index.ts index 2e3da2e6282..6fce56c4043 100644 --- a/extensions/notebook-renderers/src/index.ts +++ b/extensions/notebook-renderers/src/index.ts @@ -3,7 +3,7 @@ * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ -import type { ActivationFunction, OutputItem } from 'vscode-notebook-renderer'; +import type { ActivationFunction, OutputItem, RendererContext } from 'vscode-notebook-renderer'; import { handleANSIOutput } from './ansi'; import { truncatedArrayOfString } from './textHelper'; @@ -108,7 +108,7 @@ function renderError(outputInfo: OutputItem, container: HTMLElement): void { container.classList.add('error'); } -function renderStream(outputInfo: OutputItem, container: HTMLElement, error: boolean): void { +function renderStream(outputInfo: OutputItem, container: HTMLElement, error: boolean, ctx: RendererContext & { readonly settings: { readonly lineLimit: number } }): void { const outputContainer = container.parentElement; if (!outputContainer) { // should never happen @@ -135,7 +135,7 @@ function renderStream(outputInfo: OutputItem, container: HTMLElement, error: boo element.classList.add('output-stream'); const text = outputInfo.text(); - truncatedArrayOfString([text], 30, element); + truncatedArrayOfString([text], ctx.settings.lineLimit, element); container.appendChild(element); container.setAttribute('output-mime-type', outputInfo.mime); if (error) { @@ -143,17 +143,18 @@ function renderStream(outputInfo: OutputItem, container: HTMLElement, error: boo } } -function renderText(outputInfo: OutputItem, container: HTMLElement): void { +function renderText(outputInfo: OutputItem, container: HTMLElement, ctx: RendererContext & { readonly settings: { readonly lineLimit: number } }): void { const contentNode = document.createElement('div'); contentNode.classList.add('.output-plaintext'); const text = outputInfo.text(); - truncatedArrayOfString([text], 30, contentNode); + truncatedArrayOfString([text], ctx.settings.lineLimit, contentNode); container.appendChild(contentNode); } export const activate: ActivationFunction = (ctx) => { const disposables = new Map(); + const latestContext = ctx as (RendererContext & { readonly settings: { readonly lineLimit: number } }); return { renderOutputItem: (outputInfo, element) => { @@ -195,18 +196,18 @@ export const activate: ActivationFunction = (ctx) => { case 'application/x.notebook.stdout': case 'application/x.notebook.stream': { - renderStream(outputInfo, element, false); + renderStream(outputInfo, element, false, latestContext); } break; case 'application/vnd.code.notebook.stderr': case 'application/x.notebook.stderr': { - renderStream(outputInfo, element, true); + renderStream(outputInfo, element, true, latestContext); } break; case 'text/plain': { - renderText(outputInfo, element); + renderText(outputInfo, element, latestContext); } break; default: diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts index 340ea034325..94e8a47c7b7 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/backLayerWebView.ts @@ -35,7 +35,7 @@ import { CellEditState, ICellOutputViewModel, ICellViewModel, ICommonCellInfo, I import { preloadsScriptStr, RendererMetadata } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads'; import { transformWebviewThemeVars } from 'vs/workbench/contrib/notebook/browser/view/renderers/webviewThemeMapping'; import { MarkupCellViewModel } from 'vs/workbench/contrib/notebook/browser/viewModel/markupCellViewModel'; -import { INotebookRendererInfo, RendererMessagingSpec } from 'vs/workbench/contrib/notebook/common/notebookCommon'; +import { INotebookRendererInfo, NotebookSetting, RendererMessagingSpec } from 'vs/workbench/contrib/notebook/common/notebookCommon'; import { INotebookKernel } from 'vs/workbench/contrib/notebook/common/notebookKernelService'; import { IScopedRendererMessaging } from 'vs/workbench/contrib/notebook/common/notebookRendererMessagingService'; import { INotebookService } from 'vs/workbench/contrib/notebook/common/notebookService'; @@ -216,6 +216,7 @@ export class BackLayerWebView extends Disposable { { dragAndDropEnabled: this.options.dragAndDropEnabled }, renderersData, this.workspaceTrustManagementService.isWorkspaceTrusted(), + this.configurationService.getValue(NotebookSetting.textOutputLineLimit) ?? 30, this.nonce); const enableCsp = this.configurationService.getValue('notebook.experimental.enableCsp'); diff --git a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts index 58d19551791..5d00618772e 100644 --- a/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts +++ b/src/vs/workbench/contrib/notebook/browser/view/renderers/webviewPreloads.ts @@ -63,6 +63,7 @@ interface PreloadContext { readonly options: PreloadOptions; readonly rendererData: readonly RendererMetadata[]; readonly isWorkspaceTrusted: boolean; + readonly lineLimit: number; } declare function __import(path: string): Promise; @@ -70,6 +71,7 @@ declare function __import(path: string): Promise; async function webviewPreloads(ctx: PreloadContext) { let currentOptions = ctx.options; let isWorkspaceTrusted = ctx.isWorkspaceTrusted; + let lineLimit = ctx.lineLimit; const acquireVsCodeApi = globalThis.acquireVsCodeApi; const vscode = acquireVsCodeApi(); @@ -198,6 +200,7 @@ async function webviewPreloads(ctx: PreloadContext) { postMessage?(message: unknown): void; onDidReceiveMessage?: Event; readonly workspace: { readonly isTrusted: boolean }; + readonly settings: { readonly lineLimit: number }; } interface RendererModule { @@ -1218,6 +1221,9 @@ async function webviewPreloads(ctx: PreloadContext) { getRenderer: async (id: string) => renderers.getRenderer(id)?.api, workspace: { get isTrusted() { return isWorkspaceTrusted; } + }, + settings: { + get lineLimit() { return lineLimit; }, } }; @@ -2094,12 +2100,13 @@ export interface RendererMetadata { readonly isBuiltin: boolean; } -export function preloadsScriptStr(styleValues: PreloadStyles, options: PreloadOptions, renderers: readonly RendererMetadata[], isWorkspaceTrusted: boolean, nonce: string) { +export function preloadsScriptStr(styleValues: PreloadStyles, options: PreloadOptions, renderers: readonly RendererMetadata[], isWorkspaceTrusted: boolean, lineLimit: number, nonce: string) { const ctx: PreloadContext = { style: styleValues, options, rendererData: renderers, isWorkspaceTrusted, + lineLimit, nonce, }; // TS will try compiling `import()` in webviewPreloads, so use a helper function instead