diff --git a/src-backend/interpreter.ts b/src-backend/interpreter.ts index c4489e1..cc871db 100644 --- a/src-backend/interpreter.ts +++ b/src-backend/interpreter.ts @@ -132,24 +132,68 @@ export class ContentHelpers{ // The output is rich } else if('data' in content){ let data = content.data; - let chosenType = this.chooseTypeFromComplexData(data); - let output = data[chosenType]; - if(typeof output === 'string'){ - this.contentTmp.push(new CardOutput(chosenType, output)); - } + this.contentTmp.push(this.interpretRich(data)); // The code could not be executed, an error was returned } else if(['ename', 'evalue', 'traceback'].every(value => value in content)) { let ename = content['ename']; let evalue = content['evalue']; + this.getMissingModule(evalue as string); let traceback = (content['traceback'] as string[]).join('\n'); this.contentTmp.push(new CardOutput('error', traceback)); } } + static interpretRich(data: JSONValue): CardOutput{ + let chosenType = this.chooseTypeFromComplexData(data); + let output: string = ''; + + if(chosenType === 'application/vnd.plotly.v1+json'){ + let plotlyJson = data[chosenType]; + if(ContentHelpers.validateData(plotlyJson, 'data')){ + let guid = this.generateGuid(); + output = + '
' + + '
'; + } + chosenType = 'text/html'; + } + else{ + output = data[chosenType]; + } + return new CardOutput(chosenType, output); + } + + static getMissingModule(evalue: string){ + let moduleMatch = evalue.match(/No module named \'(.+?)\'/); + if(moduleMatch){ + let module = moduleMatch[1].replace(/\'/g, ''); + vscode.window.showInformationMessage('Jupyter requires the module \'' + moduleMatch[1] + '\' to be installed. Install now?', 'Install') + .then(data => { + if(data) { + this.installMissingModule(module); + } + }); + } + } + + static installMissingModule(module: string){ + if (module) { + let terminal = vscode.window.createTerminal('pip'); + terminal.show(); + terminal.sendText('pip install '+module, true); + } + } + static chooseTypeFromComplexData(data: JSONValue) { let validDataTypes = - ['text/html', 'image/svg+xml', 'image/png', 'image/jpeg', 'text/markdown', 'application/pdf', - 'text/latex', 'application/javascript', 'application/json', 'text/plain'] + ['application/vnd.jupyter', 'application/vnd.jupyter.cells', + 'application/vnd.jupyter.dragindex', 'application/x-ipynb+json', + 'application/geo+json', 'application/vnd.plotly.v1+json', + 'application/vdom.v1+json', 'text/html', 'image/svg+xml', + 'image/png', 'image/jpeg', 'text/markdown', 'application/pdf', + 'text/latex', 'application/json', 'text/plain'] .filter(dataType => this.validateData(data, dataType)); return validDataTypes[0]; } @@ -159,4 +203,13 @@ export class ContentHelpers{ this.contentTmp = []; this.id++; } + + static generateGuid() { + function s4() { + return Math.floor((1 + Math.random()) * 0x10000) + .toString(16) + .substring(1); + } + return s4() + s4() + '-' + s4() + '-' + s4() + '-' + s4() + '-' + s4() + s4() + s4(); + } } diff --git a/src-frontend/src/index.html b/src-frontend/src/index.html index d88ba94..2cc62ef 100644 --- a/src-frontend/src/index.html +++ b/src-frontend/src/index.html @@ -8,6 +8,7 @@ + diff --git a/test/samples/python_samples.py b/test/samples/python_samples.py new file mode 100644 index 0000000..3b90117 --- /dev/null +++ b/test/samples/python_samples.py @@ -0,0 +1,75 @@ +from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot + +from plotly.graph_objs import Scatter, Figure, Layout + +init_notebook_mode(connected=True) + +iplot([{"x": [1, 2, 3], "y": [3, 1, 6]}]) + + + +from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot + +import plotly.graph_objs as go + +import pandas as pd + +# Read data from a csv +z_data = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/api_docs/mt_bruno_elevation.csv') + +data = [ + go.Surface( + z=z_data.as_matrix() + ) +] +layout = go.Layout( + title='Mt Bruno Elevation', + autosize=False, + width=500, + height=500, + margin=dict( + l=65, + r=50, + b=65, + t=90 + ) +) +fig = go.Figure(data=data, layout=layout) +iplot(fig) + + + +from plotly.offline import download_plotlyjs, init_notebook_mode, plot, iplot + +import plotly.graph_objs as go + + +z1 = [ + [8.83,8.89,8.81,8.87,8.9,8.87], + [8.89,8.94,8.85,8.94,8.96,8.92], + [8.84,8.9,8.82,8.92,8.93,8.91], + [8.79,8.85,8.79,8.9,8.94,8.92], + [8.79,8.88,8.81,8.9,8.95,8.92], + [8.8,8.82,8.78,8.91,8.94,8.92], + [8.75,8.78,8.77,8.91,8.95,8.92], + [8.8,8.8,8.77,8.91,8.95,8.94], + [8.74,8.81,8.76,8.93,8.98,8.99], + [8.89,8.99,8.92,9.1,9.13,9.11], + [8.97,8.97,8.91,9.09,9.11,9.11], + [9.04,9.08,9.05,9.25,9.28,9.27], + [9,9.01,9,9.2,9.23,9.2], + [8.99,8.99,8.98,9.18,9.2,9.19], + [8.93,8.97,8.97,9.18,9.2,9.18] +] + +z2 = [[zij+1 for zij in zi] for zi in z1] +z3 = [[zij-1 for zij in zi] for zi in z1] + +data = [ + go.Surface(z=z1), + go.Surface(z=z2, showscale=False, opacity=0.9), + go.Surface(z=z3, showscale=False, opacity=0.9) + +] + +iplot(data,filename='python-docs/multiple-surfaces') \ No newline at end of file