Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
microsoft
GitHub Repository: microsoft/vscode
Path: blob/main/extensions/ipynb/src/ipynbMain.ts
3292 views
1
/*---------------------------------------------------------------------------------------------
2
* Copyright (c) Microsoft Corporation. All rights reserved.
3
* Licensed under the MIT License. See License.txt in the project root for license information.
4
*--------------------------------------------------------------------------------------------*/
5
6
import * as vscode from 'vscode';
7
import { activate as keepNotebookModelStoreInSync } from './notebookModelStoreSync';
8
import { notebookImagePasteSetup } from './notebookImagePaste';
9
import { AttachmentCleaner } from './notebookAttachmentCleaner';
10
import { serializeNotebookToString } from './serializers';
11
import { defaultNotebookFormat } from './constants';
12
13
// From {nbformat.INotebookMetadata} in @jupyterlab/coreutils
14
type NotebookMetadata = {
15
kernelspec?: {
16
name: string;
17
display_name: string;
18
[propName: string]: unknown;
19
};
20
language_info?: {
21
name: string;
22
codemirror_mode?: string | {};
23
file_extension?: string;
24
mimetype?: string;
25
pygments_lexer?: string;
26
[propName: string]: unknown;
27
};
28
orig_nbformat?: number;
29
[propName: string]: unknown;
30
};
31
32
type OptionsWithCellContentMetadata = vscode.NotebookDocumentContentOptions & { cellContentMetadata: { attachments: boolean } };
33
34
35
export function activate(context: vscode.ExtensionContext, serializer: vscode.NotebookSerializer) {
36
keepNotebookModelStoreInSync(context);
37
const notebookSerializerOptions: OptionsWithCellContentMetadata = {
38
transientOutputs: false,
39
transientDocumentMetadata: {
40
cells: true,
41
indentAmount: true
42
},
43
transientCellMetadata: {
44
breakpointMargin: true,
45
id: false,
46
metadata: false,
47
attachments: false
48
},
49
cellContentMetadata: {
50
attachments: true
51
}
52
};
53
context.subscriptions.push(vscode.workspace.registerNotebookSerializer('jupyter-notebook', serializer, notebookSerializerOptions));
54
55
const interactiveSerializeOptions: OptionsWithCellContentMetadata = {
56
transientOutputs: false,
57
transientCellMetadata: {
58
breakpointMargin: true,
59
id: false,
60
metadata: false,
61
attachments: false
62
},
63
cellContentMetadata: {
64
attachments: true
65
}
66
};
67
context.subscriptions.push(vscode.workspace.registerNotebookSerializer('interactive', serializer, interactiveSerializeOptions));
68
69
vscode.languages.registerCodeLensProvider({ pattern: '**/*.ipynb' }, {
70
provideCodeLenses: (document) => {
71
if (
72
document.uri.scheme === 'vscode-notebook-cell' ||
73
document.uri.scheme === 'vscode-notebook-cell-metadata' ||
74
document.uri.scheme === 'vscode-notebook-cell-output'
75
) {
76
return [];
77
}
78
const codelens = new vscode.CodeLens(new vscode.Range(0, 0, 0, 0), { title: 'Open in Notebook Editor', command: 'ipynb.openIpynbInNotebookEditor', arguments: [document.uri] });
79
return [codelens];
80
}
81
});
82
83
context.subscriptions.push(vscode.commands.registerCommand('ipynb.newUntitledIpynb', async () => {
84
const language = 'python';
85
const cell = new vscode.NotebookCellData(vscode.NotebookCellKind.Code, '', language);
86
const data = new vscode.NotebookData([cell]);
87
data.metadata = {
88
cells: [],
89
metadata: {},
90
nbformat: defaultNotebookFormat.major,
91
nbformat_minor: defaultNotebookFormat.minor,
92
};
93
const doc = await vscode.workspace.openNotebookDocument('jupyter-notebook', data);
94
await vscode.window.showNotebookDocument(doc);
95
}));
96
97
context.subscriptions.push(vscode.commands.registerCommand('ipynb.openIpynbInNotebookEditor', async (uri: vscode.Uri) => {
98
if (vscode.window.activeTextEditor?.document.uri.toString() === uri.toString()) {
99
await vscode.commands.executeCommand('workbench.action.closeActiveEditor');
100
}
101
const document = await vscode.workspace.openNotebookDocument(uri);
102
await vscode.window.showNotebookDocument(document);
103
}));
104
105
context.subscriptions.push(notebookImagePasteSetup());
106
107
const enabled = vscode.workspace.getConfiguration('ipynb').get('pasteImagesAsAttachments.enabled', false);
108
if (enabled) {
109
const cleaner = new AttachmentCleaner();
110
context.subscriptions.push(cleaner);
111
}
112
113
return {
114
get dropCustomMetadata() {
115
return true;
116
},
117
exportNotebook: (notebook: vscode.NotebookData): Promise<string> => {
118
return Promise.resolve(serializeNotebookToString(notebook));
119
},
120
setNotebookMetadata: async (resource: vscode.Uri, metadata: Partial<NotebookMetadata>): Promise<boolean> => {
121
const document = vscode.workspace.notebookDocuments.find(doc => doc.uri.toString() === resource.toString());
122
if (!document) {
123
return false;
124
}
125
126
const edit = new vscode.WorkspaceEdit();
127
edit.set(resource, [vscode.NotebookEdit.updateNotebookMetadata({
128
...document.metadata,
129
metadata: {
130
...(document.metadata.metadata ?? {}),
131
...metadata
132
} satisfies NotebookMetadata,
133
})]);
134
return vscode.workspace.applyEdit(edit);
135
},
136
};
137
}
138
139
export function deactivate() { }
140
141