Skip to content

Commit 66a9bd9

Browse files
committed
add transform-mime
1 parent 696d02c commit 66a9bd9

7 files changed

Lines changed: 147 additions & 111 deletions

File tree

package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -721,6 +721,7 @@
721721
"spawnteract": "^2.2.0",
722722
"tmp": "0.0.28",
723723
"transformime": "^3.1.2",
724+
"transformime-marked": "0.0.1",
724725
"tree-kill": "^1.0.0",
725726
"uint64be": "^1.0.1",
726727
"uuid": "^2.0.2",

src/client/jupyter/browser/main.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
/// <reference path="typings/index.d.ts" />
22

3-
import {Test} from './test.ts';
43
const transformime = require('transformime');
54
const MarkdownTransform = require('transformime-marked');
65
const transform = transformime.createTransform([MarkdownTransform]) as Function;

src/client/jupyter/browser/test.ts

Lines changed: 0 additions & 5 deletions
This file was deleted.

src/client/jupyter/display/main.ts

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,40 @@ import * as vscode from 'vscode';
22
import {KernelPicker} from './kernelPicker';
33
import {Commands} from '../../common/constants';
44
import {KernelspecMetadata} from '../contracts';
5+
import {TextDocumentContentProvider} from './resultView';
6+
7+
const jupyterSchema = 'jupyter-result-viewer';
8+
const previewUri = vscode.Uri.parse(jupyterSchema + '://authority/jupyter');
59

610
export class JupyterDisplay extends vscode.Disposable {
711
private disposables: vscode.Disposable[];
12+
private previewWindow: TextDocumentContentProvider;
813
constructor() {
914
super(() => { });
1015
this.disposables = [];
1116
this.disposables.push(new KernelPicker());
1217
this.disposables.push(vscode.commands.registerCommand(Commands.Jupyter.Kernel_Options, this.showKernelOptions.bind(this)));
18+
this.previewWindow = new TextDocumentContentProvider();
19+
this.disposables.push(vscode.workspace.registerTextDocumentContentProvider(jupyterSchema, this.previewWindow));
20+
}
21+
22+
23+
private displayed = false;
24+
public showResults(result: string, data: any): any {
25+
this.previewWindow.setText(result, data);
26+
// Dirty hack to support instances when document has been closed
27+
if (this.displayed) {
28+
this.previewWindow.update();
29+
}
30+
this.displayed = true;
31+
return vscode.commands.executeCommand('vscode.previewHtml', previewUri, vscode.ViewColumn.Two, 'Results')
32+
.then(() => {
33+
if (this.displayed) {
34+
this.previewWindow.update();
35+
}
36+
}, reason => {
37+
vscode.window.showErrorMessage(reason);
38+
});
1339
}
1440

1541
public dispose() {
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
'use strict';
2+
3+
import * as vscode from 'vscode';
4+
import * as fs from 'fs';
5+
import * as path from 'path';
6+
7+
export class TextDocumentContentProvider implements vscode.TextDocumentContentProvider {
8+
private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
9+
private lastUri: vscode.Uri;
10+
private htmlResponse: string = '';
11+
private results: any[];
12+
public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): Thenable<string> {
13+
this.lastUri = uri;
14+
return Promise.resolve(this.generateResultsView());
15+
}
16+
17+
get onDidChange(): vscode.Event<vscode.Uri> {
18+
return this._onDidChange.event;
19+
}
20+
21+
public setText(result: string, results: any[]) {
22+
this.htmlResponse = result;
23+
this.results = results;
24+
}
25+
public update() {
26+
this._onDidChange.fire(this.lastUri);
27+
}
28+
29+
private getStyleSheetPath(resourceName: string): string {
30+
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', '..', 'resources', resourceName)).toString();
31+
}
32+
private getScriptFilePath(resourceName: string): string {
33+
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', '..', 'out', 'client', 'jupyter', 'browser', resourceName)).toString();
34+
}
35+
private getNodeModulesPath(resourceName: string): string {
36+
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', '..', 'node_modules', resourceName)).toString();
37+
}
38+
39+
private generateErrorView(error: string): string {
40+
return `<head></head><body>${error}</body>`;
41+
}
42+
43+
private generateResultsView(): string {
44+
const html = `
45+
<head>
46+
</head>
47+
<body onload="initializeResults()">
48+
<script type="text/javascript">
49+
window.JUPYTER_DATA = ${JSON.stringify(this.results)};
50+
</script>
51+
<script src="${this.getScriptFilePath('bundle.js')}"></script>
52+
</body>
53+
`;
54+
fs.writeFileSync('/Users/donjayamanne/.vscode/extensions/pythonVSCode/results.html', html);
55+
return html;
56+
}
57+
}

src/client/jupyter/main.ts

Lines changed: 13 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,31 @@
11
import {KernelManagerImpl} from './kernel-manager';
22
import {Kernel} from './kernel';
33
import * as vscode from 'vscode';
4-
import {TextDocumentContentProvider} from './resultView';
54
import {JupyterDisplay} from './display/main';
65
import {KernelStatus} from './display/kernelStatus';
76
import {Commands} from '../common/constants';
87

9-
const anser = require('anser');
8+
// const anser = require('anser');
109

11-
const jupyterSchema = 'jupyter-result-viewer';
12-
const previewUri = vscode.Uri.parse(jupyterSchema + '://authority/jupyter');
13-
14-
let previewWindow: TextDocumentContentProvider;
15-
let display: JupyterDisplay;
16-
export function activate(): vscode.Disposable[] {
17-
previewWindow = new TextDocumentContentProvider();
18-
let disposables: vscode.Disposable[] = [];
19-
disposables.push(vscode.workspace.registerTextDocumentContentProvider(jupyterSchema, previewWindow));
20-
display = new JupyterDisplay();
21-
disposables.push(display);
22-
return disposables;
23-
}
24-
25-
let displayed = false;
26-
function showResults(result: string, data: any): any {
27-
previewWindow.setText(result, data);
28-
// Dirty hack to support instances when document has been closed
29-
if (displayed) {
30-
previewWindow.update();
31-
}
32-
displayed = true;
33-
return vscode.commands.executeCommand('vscode.previewHtml', previewUri, vscode.ViewColumn.Two, 'Results')
34-
.then(() => {
35-
if (displayed) {
36-
previewWindow.update();
37-
}
38-
}, reason => {
39-
vscode.window.showErrorMessage(reason);
40-
});
41-
}
4210
export class Jupyter extends vscode.Disposable {
4311
public kernelManager: KernelManagerImpl;
4412
public kernel: Kernel = null;
4513
private status: KernelStatus;
4614
private disposables: vscode.Disposable[];
15+
private display: JupyterDisplay;
4716

4817
constructor() {
4918
super(() => { });
5019
this.disposables = [];
5120
}
5221
activate(state) {
53-
this.disposables.push(...activate());
5422
this.kernelManager = new KernelManagerImpl();
5523
this.disposables.push(this.kernelManager);
5624
this.disposables.push(vscode.window.onDidChangeActiveTextEditor(this.onEditorChanged.bind(this)));
5725
this.status = new KernelStatus();
5826
this.disposables.push(this.status);
27+
this.display = new JupyterDisplay();
28+
this.disposables.push(this.display);
5929
}
6030
public dispose() {
6131
this.disposables.forEach(d => d.dispose());
@@ -95,39 +65,39 @@ export class Jupyter extends vscode.Disposable {
9565
}
9666
private executeAndDisplay(kernel: Kernel, code: string) {
9767
return this.executeCodeInKernel(kernel, code).then(result => {
98-
if (result[0].length === 0) {
68+
if (result[1].length === 0) {
9969
return;
10070
}
101-
return showResults(result[0], result[1]);
71+
return this.display.showResults(result[0], result[1]);
10272
});
10373
}
104-
private executeCodeInKernel(kernel: Kernel, code: string): Promise<string> {
105-
return new Promise<any>((resolve, reject) => {
74+
private executeCodeInKernel(kernel: Kernel, code: string): Promise<[string, any[]]> {
75+
return new Promise<[string, any[]]>((resolve, reject) => {
10676
let htmlResponse = '';
10777
let responses = [];
10878
return kernel.execute(code, (result: { type: string, stream: string, data: { [key: string]: string } | string }) => {
10979
if ((result.type === 'text' && result.stream === 'stdout' && typeof result.data['text/plain'] === 'string') ||
11080
(result.type === 'text' && result.stream === 'pyout' && typeof result.data['text/plain'] === 'string') ||
11181
(result.type === 'text' && result.stream === 'error' && typeof result.data['text/plain'] === 'string')) {
112-
const htmlText = anser.ansiToHtml(anser.escapeForHtml(result.data['text/plain']));
113-
htmlResponse = htmlResponse + `<p><pre>${htmlText}</pre></p>`;
82+
// const htmlText = anser.ansiToHtml(anser.escapeForHtml(result.data['text/plain']));
83+
// htmlResponse = htmlResponse + `<p><pre>${htmlText}</pre></p>`;
11484
responses.push(result.data);
11585
if (result.stream === 'error') {
11686
return resolve([htmlResponse, responses]);
11787
}
11888
}
11989
if (result.type === 'text/html' && result.stream === 'pyout' && typeof result.data['text/html'] === 'string') {
120-
htmlResponse = htmlResponse + result.data['text/html'];
90+
// htmlResponse = htmlResponse + result.data['text/html'];
12191
result.data['text/html'] = result.data['text/html'].replace(/<\/script>/g, '</scripts>');
12292
responses.push(result.data);
12393
}
12494
if (result.type === 'application/javascript' && result.stream === 'pyout' && typeof result.data['application/javascript'] === 'string') {
12595
responses.push(result.data);
126-
htmlResponse = htmlResponse + `<script type="text/javascript">${result.data['application/javascript']}</script>`;
96+
// htmlResponse = htmlResponse + `<script type="text/javascript">${result.data['application/javascript']}</script>`;
12797
}
12898
if (result.type.startsWith('image/') && result.stream === 'pyout' && typeof result.data[result.type] === 'string') {
12999
responses.push(result.data);
130-
htmlResponse = htmlResponse + `<div style="background-color:white;display:inline-block;"><img src="data:${result.type};base64,${result.data[result.type]}" /></div><div></div>`;
100+
// htmlResponse = htmlResponse + `<div style="background-color:white;display:inline-block;"><img src="data:${result.type};base64,${result.data[result.type]}" /></div><div></div>`;
131101
}
132102
if (result.data === 'ok' && result.stream === 'status' && result.type === 'text') {
133103
resolve([htmlResponse, responses]);

src/client/jupyter/resultView.ts

Lines changed: 50 additions & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -1,69 +1,57 @@
1-
'use strict';
1+
// 'use strict';
22

3-
import * as vscode from 'vscode';
4-
import * as fs from 'fs';
5-
import * as path from 'path';
3+
// import * as vscode from 'vscode';
4+
// import * as fs from 'fs';
5+
// import * as path from 'path';
66

7-
export class TextDocumentContentProvider implements vscode.TextDocumentContentProvider {
8-
private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
9-
private lastUri: vscode.Uri;
10-
private htmlResponse: string = '';
11-
private jsonData: any;
12-
public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): Thenable<string> {
13-
this.lastUri = uri;
14-
return Promise.resolve(this.generateResultsView());
15-
}
7+
// export class TextDocumentContentProvider implements vscode.TextDocumentContentProvider {
8+
// private _onDidChange = new vscode.EventEmitter<vscode.Uri>();
9+
// private lastUri: vscode.Uri;
10+
// private htmlResponse: string = '';
11+
// private jsonData: any;
12+
// public provideTextDocumentContent(uri: vscode.Uri, token: vscode.CancellationToken): Thenable<string> {
13+
// this.lastUri = uri;
14+
// return Promise.resolve(this.generateResultsView());
15+
// }
1616

17-
get onDidChange(): vscode.Event<vscode.Uri> {
18-
return this._onDidChange.event;
19-
}
17+
// get onDidChange(): vscode.Event<vscode.Uri> {
18+
// return this._onDidChange.event;
19+
// }
2020

21-
public setText(result: string, data: any) {
22-
this.htmlResponse = result;
23-
this.jsonData = data;
24-
}
25-
public update() {
26-
this._onDidChange.fire(this.lastUri);
27-
}
21+
// public setText(result: string, data: any) {
22+
// this.htmlResponse = result;
23+
// this.jsonData = data;
24+
// }
25+
// public update() {
26+
// this._onDidChange.fire(this.lastUri);
27+
// }
2828

29-
private getStyleSheetPath(resourceName: string): string {
30-
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'resources', resourceName)).toString();
31-
}
32-
private getScriptFilePath(resourceName: string): string {
33-
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'out', 'client', 'jupyter', 'browser', resourceName)).toString();
34-
}
35-
private getNodeModulesPath(resourceName: string): string {
36-
return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'node_modules', resourceName)).toString();
37-
}
29+
// private getStyleSheetPath(resourceName: string): string {
30+
// return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'resources', resourceName)).toString();
31+
// }
32+
// private getScriptFilePath(resourceName: string): string {
33+
// return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'out', 'client', 'jupyter', 'browser', resourceName)).toString();
34+
// }
35+
// private getNodeModulesPath(resourceName: string): string {
36+
// return vscode.Uri.file(path.join(__dirname, '..', '..', '..', 'node_modules', resourceName)).toString();
37+
// }
3838

39-
private generateErrorView(error: string): string {
40-
return `<head></head><body>${error}</body>`;
41-
}
39+
// private generateErrorView(error: string): string {
40+
// return `<head></head><body>${error}</body>`;
41+
// }
4242

43-
private generateResultsView(): string {
44-
const innerHtml = ''; // this.htmlResponse;
45-
const customScripts = '';
46-
const html = `
47-
<head>
48-
<script src="${this.getScriptFilePath('bundle.js')}"></script>
49-
</head>
50-
<body onload="initializeResults()">
51-
${innerHtml}
52-
<div style="display:none">
53-
<script type="text/javascript">
54-
window.JUPYTER_DATA = ${JSON.stringify(this.jsonData)};
55-
function testClick(){
56-
document.getElementById('xx').innerHTML = 'one';
57-
}
58-
</script>
59-
<button onclick="testClick(); return false;">Test</button>
60-
<div id="xx">wow</div>
61-
<div class="script">${this.getNodeModulesPath(path.join('jquery', 'dist', 'jquery.min.js'))}</div>
62-
${customScripts}
63-
</div>
64-
</body>
65-
`;
66-
fs.writeFileSync('/Users/donjayamanne/.vscode/extensions/pythonVSCode/results.html', html);
67-
return html;
68-
}
69-
}
43+
// private generateResultsView(): string {
44+
// const html = `
45+
// <head>
46+
// </head>
47+
// <body onload="initializeResults()">
48+
// <script type="text/javascript">
49+
// window.JUPYTER_DATA = ${JSON.stringify(this.jsonData)};
50+
// </script>
51+
// <script src="${this.getScriptFilePath('bundle.js')}"></script>
52+
// </body>
53+
// `;
54+
// fs.writeFileSync('/Users/donjayamanne/.vscode/extensions/pythonVSCode/results.html', html);
55+
// return html;
56+
// }
57+
// }

0 commit comments

Comments
 (0)