Skip to content

Commit

Permalink
switch to TypeScript
Browse files Browse the repository at this point in the history
  • Loading branch information
Joeyonng committed Mar 28, 2022
1 parent 36da745 commit deddebc
Show file tree
Hide file tree
Showing 15 changed files with 13,981 additions and 15,290 deletions.
5 changes: 0 additions & 5 deletions .babelrc

This file was deleted.

28,238 changes: 13,410 additions & 14,828 deletions package-lock.json

Large diffs are not rendered by default.

32 changes: 19 additions & 13 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
"name": "react-jupyter-notebook",
"version": "0.3.2",
"homepage": "https://Joeyonng.github.io/react-jupyter-notebook",
"license" : "MIT",
"license": "MIT",
"private": false,
"description": "A simple React component that renders .ipynb files just like how they are rendered by Jupyter Lab",
"repository": {
Expand All @@ -22,12 +22,15 @@
"files": [
"dist"
],
"main": "dist/JupyterViewer.js",
"main": "dist/index.js",
"module": "dist/index.mjs",
"typeings": "dist/index.d.ts",
"dependencies": {
"@babel/runtime": "^7.14.0",
"@codemirror/gutter": "^0.19.9",
"@codemirror/lang-javascript": "^0.19.7",
"@codemirror/view": "^0.19.47",
"ansi-to-react": "^6.1.4",
"katex": "^0.13.2",
"prop-types": "^15.7.2",
"react": "^17.0.1",
"react-dom": "^17.0.1",
"react-markdown": "^6.0.2",
Expand All @@ -37,18 +40,21 @@
"remark-math": "^4.0.0"
},
"devDependencies": {
"@babel/cli": "^7.14.3",
"@babel/core": "^7.14.3",
"babel-preset-react-app": "^10.0.0",
"@types/node": "^17.0.23",
"@types/react": "^17.0.42",
"@types/react-dom": "^17.0.14",
"@types/react-syntax-highlighter": "^13.5.2",
"gh-pages": "^3.2.0",
"node-sass": "^6.0.0",
"react-scripts": "4.0.3",
"rimraf": "^3.0.2"
"node-sass": "^6.0.1",
"react-scripts": "5.0.0",
"rimraf": "^3.0.2",
"rollup": "^2.70.1",
"rollup-plugin-dts": "^4.2.0",
"rollup-plugin-postcss": "^4.0.2",
"rollup-plugin-typescript2": "^0.31.2",
"typescript": "^4.6.2"
},
"scripts": {
"predeploy": "npm run build",
"deploy": "gh-pages -d build",
"prepublish": "set NODE_ENV=production&& rimraf dist && mkdir dist && babel src/lib -d dist --copy-files",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
Expand Down
33 changes: 33 additions & 0 deletions rollup.config.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import externals from "rollup-plugin-node-externals";
import typescript from 'rollup-plugin-typescript2';
import postcss from "rollup-plugin-postcss";
import dts from "rollup-plugin-dts";

import packageJson from "./package.json";

export default [
{
input: "src/lib/JupyterViewer.tsx",
output: [
{
file: packageJson.main,
format: "cjs",
sourcemap: true,
},
],
plugins: [
externals(),
typescript({
tsconfig: "tsconfig.json",
tsconfigOverride: {compilerOptions: {declaration: true}},
}),
postcss(),
],
},
{
input: "dist/JupyterViewer.d.ts",
output: [{file: packageJson.typeings, format: "es"}],
external: [/\.scss$/],
plugins: [dts()],
},
];
3 changes: 1 addition & 2 deletions src/App.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,7 @@ import nb_test from "./nb_test.json"
import JupyterViewer from "./lib/JupyterViewer";
import hljsStyles from "./lib/hljsStyles";


function App(props) {
function App() {
const [state, setState] = useState({
rawIpynb: nb_test,
mediaAlign: "left",
Expand Down
152 changes: 152 additions & 0 deletions src/lib/BlockOutput.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,152 @@
import React, {useCallback, useState} from "react";
import Ansi from "ansi-to-react";

import {BlockOutputPropsType} from "./types";

function BlockOutput(props:BlockOutputPropsType) {
const metadata = props.cell['metadata'];
const outputs = props.cell['outputs']

const [state, setState] = useState({
highlighted: false,
prevDisplay: 1,
display: 1,
contentHeight: 0,
})
const contentRef = useCallback((node) => {
if (node) {
setState(state => ({...state, contentHeight: node.offsetHeight}));
}
}, [])

if (props.display !== state.prevDisplay) {
let newDisplay = props.display;
if (newDisplay === -1) {
if (metadata['collapsed'] || (metadata['jupyter'] !== undefined && metadata['jupyter']['outputs_hidden'])) {
newDisplay = 0;
}
else if (metadata['scrolled']) {
newDisplay = 2;
}
}

setState({...state, prevDisplay: props.display, display: newDisplay});
}

return (
<div
className="block-output"
>
<div
className={props.highlighted ? "block-light-selected" : "block-light"}
onClick={() => {
setState({...state, display: (state.display + 1) % 3})
}}
/>
{state.display === 0 ? <div className="block-hidden"/> :
<div
className="block-output-content"
style={state.display !== 2 ? undefined : {
maxHeight: state.contentHeight,
height: 200,
boxShadow: "inset 0 0 6px 2px rgb(0 0 0 / 30%)",
resize: "vertical",
}}
>
<div ref={contentRef}>
{!outputs ? null : outputs.map((output, index) => {
let executionCount;
let htmlContent;
if ('output_type' in output) {
let output_type = output['output_type'];
switch (output_type) {
// Stdout and stderr
case 'stream':
htmlContent = (
<pre className={`cell-content ${output['name'] === 'stdout' ? 'output-std' : 'output-err'}`}>
{!output['text'] ? '' : output['text'].join('')}
</pre>
)

break;
// Output with execution_count
// @ts-expect-error
case 'execute_result':
executionCount = output['execution_count']

// Output without execution_count
case 'display_data':
const output_data = output['data'];
if (output_data) {
if ('image/png' in output_data) {
let output_metadata = output['metadata'];
let size = output_metadata && output_metadata['image/png'];
htmlContent = (
<div
className="cell-content output-display"
style={{
justifyContent: props.mediaAlign,
}}
>
<img
src={`data:image/png;base64,${output_data['image/png']}`}
width={size ? size['width'] : 'auto'}
height={size ? size['height'] : 'auto'}
alt=""
/>
</div>
)
}
else if ('text/html' in output_data) {
htmlContent = (
<div
className="cell-content output-display"
style={{
justifyContent: props.mediaAlign,
}}
dangerouslySetInnerHTML={{__html: output_data['text/html'].join('')}}
/>
)
}
else if ('text/plain' in output_data) {
htmlContent = (
<pre className="cell-content output-std">{output_data['text/plain'].join('')}</pre>
)
}
}

break;
// Exceptions
case 'error':
htmlContent = (
<pre className="cell-content output-err">
<Ansi>
{!output.traceback ? undefined : output.traceback.join('\n')}
</Ansi>
</pre>
)

break;
default:
console.log('Unexpected output_type: ', output_type);
}
}

return (
<div
key={index}
className="cell-row"
>
<pre className="cell-header output">{executionCount ? `[${executionCount}]: ` : null}</pre>
{htmlContent}
</div>
);
})}
</div>
</div>
}
</div>
)
}

export default BlockOutput;
Loading

0 comments on commit deddebc

Please sign in to comment.