@dodona/papyros 0.1.8-rc → 0.1.8
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +37 -12
- package/dist/{Main.d.ts → App.d.ts} +0 -0
- package/dist/Backend.d.ts +3 -3
- package/dist/CodeEditor.d.ts +14 -3
- package/dist/Constants.d.ts +7 -3
- package/dist/InputManager.d.ts +32 -0
- package/dist/InputServiceWorker.d.ts +1 -0
- package/dist/OutputManager.d.ts +23 -0
- package/dist/Papyros.d.ts +32 -20
- package/dist/PapyrosEvent.d.ts +1 -0
- package/dist/ProgrammingLanguage.d.ts +0 -2
- package/dist/StatusPanel.d.ts +17 -0
- package/dist/examples/Examples.d.ts +6 -0
- package/dist/examples/JavaScriptExamples.d.ts +5 -0
- package/dist/examples/PythonExamples.d.ts +11 -0
- package/dist/index.js +2 -0
- package/dist/index.js.LICENSE.txt +7 -0
- package/dist/inputServiceWorker.js +1 -0
- package/dist/library.d.ts +9 -0
- package/dist/util/HTMLShapes.d.ts +2 -0
- package/dist/util/Util.d.ts +21 -0
- package/dist/workers/input/InputWorker.d.ts +6 -0
- package/dist/workers/javascript/JavaScriptWorker.worker.d.ts +2 -1
- package/dist/workers/python/Pyodide.d.ts +9 -0
- package/dist/workers/python/PythonWorker.worker.d.ts +2 -1
- package/package.json +32 -30
- package/dist/Backend.js +0 -133
- package/dist/Backend.js.map +0 -1
- package/dist/BackendManager.js +0 -39
- package/dist/BackendManager.js.map +0 -1
- package/dist/CodeEditor.js +0 -146
- package/dist/CodeEditor.js.map +0 -1
- package/dist/Constants.js +0 -16
- package/dist/Constants.js.map +0 -1
- package/dist/Main.js +0 -42
- package/dist/Main.js.map +0 -1
- package/dist/Papyros.css +0 -9
- package/dist/Papyros.js +0 -390
- package/dist/Papyros.js.map +0 -1
- package/dist/PapyrosEvent.js +0 -2
- package/dist/PapyrosEvent.js.map +0 -1
- package/dist/ProgrammingLanguage.js +0 -23
- package/dist/ProgrammingLanguage.js.map +0 -1
- package/dist/Translations.d.ts +0 -40
- package/dist/Translations.js +0 -39
- package/dist/Translations.js.map +0 -1
- package/dist/util/Logging.js +0 -48
- package/dist/util/Logging.js.map +0 -1
- package/dist/workers/javascript/JavaScriptWorker.worker.js +0 -91
- package/dist/workers/javascript/JavaScriptWorker.worker.js.map +0 -1
- package/dist/workers/python/PythonWorker.worker.js +0 -161
- package/dist/workers/python/PythonWorker.worker.js.map +0 -1
- package/dist/workers/python/init.py.d.ts +0 -1
- package/dist/workers/python/init.py.js +0 -2
- package/dist/workers/python/init.py.js.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
!function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.Papyros=t():e.Papyros=t()}(self,(function(){return(()=>{var e={137:e=>{self,e.exports=(()=>{"use strict";var e={d:(t,r)=>{for(var n in r)e.o(r,n)&&!e.o(t,n)&&Object.defineProperty(t,n,{enumerable:!0,get:r[n]})},o:(e,t)=>Object.prototype.hasOwnProperty.call(e,t),r:e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})}},t={};e.r(t),e.d(t,{serviceWorkerFetchListener:()=>u,asyncSleep:()=>c,ServiceWorkerError:()=>f,writeMessageAtomics:()=>p,writeMessageServiceWorker:()=>d,writeMessage:()=>y,makeChannel:()=>h,makeAtomicsChannel:()=>v,makeServiceWorkerChannel:()=>b,readMessage:()=>w,syncSleep:()=>g,uuidv4:()=>l});var r,n=(r=function(e,t){return r=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},r(e,t)},function(e,t){if("function"!=typeof t&&null!==t)throw new TypeError("Class extends value "+String(t)+" is not a constructor or null");function n(){this.constructor=e}r(e,t),e.prototype=null===t?Object.create(t):(n.prototype=t.prototype,new n)}),o=function(e,t,r,n){return new(r||(r=Promise))((function(o,i){function a(e){try{u(n.next(e))}catch(e){i(e)}}function s(e){try{u(n.throw(e))}catch(e){i(e)}}function u(e){var t;e.done?o(e.value):(t=e.value,t instanceof r?t:new r((function(e){e(t)}))).then(a,s)}u((n=n.apply(e,t||[])).next())}))},i=function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}},a="__SyncMessageServiceWorkerInput__",s="__sync-message-v2__";function u(){var e={},t={};return function(r){var n=r.request.url;return!!n.includes(a)&&(r.respondWith(function(){return o(this,void 0,void 0,(function(){function o(e){var t={message:e,version:s};return new Response(JSON.stringify(t),{status:200})}var a,u,c,l,f,p,d,y;return i(this,(function(i){switch(i.label){case 0:return n.endsWith("/read")?[4,r.request.json()]:[3,5];case 1:return a=i.sent(),u=a.messageId,c=a.timeout,(l=e[u])?(delete e[u],[2,o(l)]):[3,2];case 2:return[4,new Promise((function(e){t[u]=e,setTimeout((function(){delete t[u],e(new Response("",{status:408}))}),c)}))];case 3:return[2,i.sent()];case 4:return[3,8];case 5:return n.endsWith("/write")?[4,r.request.json()]:[3,7];case 6:return f=i.sent(),p=f.message,d=f.messageId,(y=t[d])?(y(o(p)),delete t[d]):e[d]=p,[2,o({early:!y})];case 7:if(n.endsWith("/version"))return[2,new Response(s,{status:200})];i.label=8;case 8:return[2]}}))}))}()),!0)}}function c(e){return new Promise((function(t){return setTimeout(t,e)}))}var l,f=function(e){function t(r,n){var o=e.call(this,"Received status ".concat(n," from ").concat(r,". Ensure the service worker is registered and active."))||this;return o.url=r,o.status=n,Object.setPrototypeOf(o,t.prototype),o}return n(t,e),t}(Error);function p(e,t){var r=(new TextEncoder).encode(JSON.stringify(t)),n=e.data,o=e.meta;if(r.length>n.length)throw"Input is too long";n.set(r,0),Atomics.store(o,0,r.length),Atomics.store(o,1,1),Atomics.notify(o,1)}function d(e,t,r){return o(this,void 0,void 0,(function(){var n,o,a,u,l;return i(this,(function(i){switch(i.label){case 0:return[4,navigator.serviceWorker.ready];case 1:i.sent(),n=e.baseUrl+"/write",o=Date.now(),i.label=2;case 2:return a={message:t,messageId:r},[4,fetch(n,{method:"POST",body:JSON.stringify(a)})];case 3:return u=i.sent(),(l=200===u.status)?[4,u.json()]:[3,5];case 4:l=i.sent().version===s,i.label=5;case 5:return l?[2]:Date.now()-o<e.timeout?[4,c(100)]:[3,7];case 6:return i.sent(),[3,2];case 7:throw new f(n,u.status);case 8:return[2]}}))}))}function y(e,t,r){return o(this,void 0,void 0,(function(){return i(this,(function(n){switch(n.label){case 0:return"atomics"!==e.type?[3,1]:(p(e,t),[3,3]);case 1:return[4,d(e,t,r)];case 2:n.sent(),n.label=3;case 3:return[2]}}))}))}function h(e){return void 0===e&&(e={}),"undefined"!=typeof SharedArrayBuffer?v(e.atomics):"serviceWorker"in navigator?b(e.serviceWorker):null}function v(e){var t=(void 0===e?{}:e).bufferSize;return{type:"atomics",data:new Uint8Array(new SharedArrayBuffer(t||131072)),meta:new Int32Array(new SharedArrayBuffer(2*Int32Array.BYTES_PER_ELEMENT))}}function b(e){return void 0===e&&(e={}),{type:"serviceWorker",baseUrl:(e.scope||"/")+a,timeout:e.timeout||5e3}}function m(e,t){return e>0?+e:t}function w(e,t,r){var n=void 0===r?{}:r,o=n.checkInterrupt,i=n.checkTimeout,a=n.timeout,u=performance.now();i=m(i,o?100:5e3);var c,l=m(a,Number.POSITIVE_INFINITY);if("atomics"===e.type){var p=e.data,d=e.meta;c=function(){if("timed-out"===Atomics.wait(d,1,0,i))return null;var e=Atomics.exchange(d,0,0),t=p.slice(0,e);Atomics.store(d,1,0);var r=(new TextDecoder).decode(t);return JSON.parse(r)}}else c=function(){var r=new XMLHttpRequest,n=e.baseUrl+"/read";r.open("POST",n,!1);var o={messageId:t,timeout:i};r.send(JSON.stringify(o));var a=r.status;if(408===a)return null;if(200===a){var c=JSON.parse(r.responseText);return c.version!==s?null:c.message}if(performance.now()-u<e.timeout)return null;throw new f(n,a)};for(;;){var y=l-(performance.now()-u);if(y<=0)return null;i=Math.min(i,y);var h=c();if(null!==h)return h;if(null==o?void 0:o())return null}}function g(e,t){if(e=m(e,0))if("undefined"!=typeof SharedArrayBuffer){var r=new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));r[0]=0,Atomics.wait(r,0,0,e)}else w(t,"sleep ".concat(e," ").concat(l()),{timeout:e})}return l="randomUUID"in crypto?function(){return crypto.randomUUID()}:function(){return"10000000-1000-4000-8000-100000000000".replace(/[018]/g,(function(e){var t=Number(e);return(t^crypto.getRandomValues(new Uint8Array(1))[0]&15>>t/4).toString(16)}))},t})()}},t={};function r(n){var o=t[n];if(void 0!==o)return o.exports;var i=t[n]={exports:{}};return e[n](i,i.exports,r),i.exports}r.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var n={};return(()=>{"use strict";r.r(n);var e=r(137),t=function(){function t(t){this.syncMessageListener=(0,e.serviceWorkerFetchListener)(),this.hostName=t}return t.prototype.handleInputRequest=function(e){return t=this,r=void 0,o=function(){var t;return function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}(this,(function(r){return this.syncMessageListener(e)?[2,!0]:e.request.url.includes(this.hostName)?(t=fetch(e.request).then((function(e){var t=new Headers(e.headers);return t.set("Cross-Origin-Embedder-Policy","require-corp"),t.set("Cross-Origin-Opener-Policy","same-origin"),t.set("Cross-Origin-Resource-Policy","cross-origin"),new Response(e.body,{status:e.status||200,statusText:e.statusText,headers:t})})),e.respondWith(t),[2,!0]):[2,!1]}))},new((n=void 0)||(n=Promise))((function(e,i){function a(e){try{u(o.next(e))}catch(e){i(e)}}function s(e){try{u(o.throw(e))}catch(e){i(e)}}function u(t){var r;t.done?e(t.value):(r=t.value,r instanceof n?r:new n((function(e){e(r)}))).then(a,s)}u((o=o.apply(t,r||[])).next())}));var t,r,n,o},t}(),o=location.href,i=new t(o=o.slice(0,o.lastIndexOf("/")+1));addEventListener("fetch",(function(e){return t=this,r=void 0,o=function(){return function(e,t){var r,n,o,i,a={label:0,sent:function(){if(1&o[0])throw o[1];return o[1]},trys:[],ops:[]};return i={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(i[Symbol.iterator]=function(){return this}),i;function s(i){return function(s){return function(i){if(r)throw new TypeError("Generator is already executing.");for(;a;)try{if(r=1,n&&(o=2&i[0]?n.return:i[0]?n.throw||((o=n.return)&&o.call(n),0):n.next)&&!(o=o.call(n,i[1])).done)return o;switch(n=0,o&&(i=[2&i[0],o.value]),i[0]){case 0:case 1:o=i;break;case 4:return a.label++,{value:i[1],done:!1};case 5:a.label++,n=i[1],i=[0];continue;case 7:i=a.ops.pop(),a.trys.pop();continue;default:if(!((o=(o=a.trys).length>0&&o[o.length-1])||6!==i[0]&&2!==i[0])){a=0;continue}if(3===i[0]&&(!o||i[1]>o[0]&&i[1]<o[3])){a.label=i[1];break}if(6===i[0]&&a.label<o[1]){a.label=o[1],o=i;break}if(o&&a.label<o[2]){a.label=o[2],a.ops.push(i);break}o[2]&&a.ops.pop(),a.trys.pop();continue}i=t.call(e,a)}catch(e){i=[6,e],n=0}finally{r=o=0}if(5&i[0])throw i[1];return{value:i[0]?i[1]:void 0,done:!0}}([i,s])}}}(this,(function(t){switch(t.label){case 0:return[4,i.handleInputRequest(e)];case 1:return t.sent()||e.respondWith(fetch(e.request)),[2]}}))},new((n=void 0)||(n=Promise))((function(e,i){function a(e){try{u(o.next(e))}catch(e){i(e)}}function s(e){try{u(o.throw(e))}catch(e){i(e)}}function u(t){var r;t.done?e(t.value):(r=t.value,r instanceof n?r:new n((function(e){e(r)}))).then(a,s)}u((o=o.apply(t,r||[])).next())}));var t,r,n,o})),addEventListener("install",(function(e){e.waitUntil(skipWaiting())})),addEventListener("activate",(function(e){e.waitUntil(clients.claim())}))})(),n})()}));
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { CodeEditor } from "./CodeEditor";
|
|
2
|
+
import { InputManager, InputMode } from "./InputManager";
|
|
3
|
+
import { OutputManager } from "./OutputManager";
|
|
4
|
+
import { Papyros } from "./Papyros";
|
|
5
|
+
import { PapyrosEvent } from "./PapyrosEvent";
|
|
6
|
+
import { StatusPanel } from "./StatusPanel";
|
|
7
|
+
export * from "./ProgrammingLanguage";
|
|
8
|
+
export type { PapyrosEvent };
|
|
9
|
+
export { Papyros, CodeEditor, StatusPanel, InputManager, InputMode, OutputManager, };
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import I18n from "i18n-js";
|
|
2
|
+
export declare const t: typeof I18n.t;
|
|
3
|
+
export declare function loadTranslations(): void;
|
|
4
|
+
export declare function getLocales(): Array<string>;
|
|
5
|
+
export declare function getSelectOptions<T>(options: Array<T>, optionText: (option: T) => string, selected?: T): string;
|
|
6
|
+
export declare function renderSelect<T>(selectId: string, options: Array<T>, optionText: (option: T) => string, selected?: T, labelText?: string): string;
|
|
7
|
+
export interface ButtonOptions {
|
|
8
|
+
id: string;
|
|
9
|
+
buttonText: string;
|
|
10
|
+
extraClasses?: string;
|
|
11
|
+
}
|
|
12
|
+
export declare function renderButton(options: ButtonOptions): string;
|
|
13
|
+
export declare function addListener<T extends string>(elementId: string, onEvent: (e: T) => void, eventType?: string, attribute?: string): void;
|
|
14
|
+
export declare function removeSelection(selectId: string): void;
|
|
15
|
+
export interface RenderOptions {
|
|
16
|
+
parentElementId: string;
|
|
17
|
+
classNames?: string;
|
|
18
|
+
attributes?: Map<string, string>;
|
|
19
|
+
}
|
|
20
|
+
export declare function getElement(element: string | HTMLElement): HTMLElement;
|
|
21
|
+
export declare function renderWithOptions(options: RenderOptions, content: string | HTMLElement): HTMLElement;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: any;
|
|
2
|
+
export default _default;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface Pyodide {
|
|
2
|
+
runPython: (code: string, globals?: any) => any;
|
|
3
|
+
runPythonAsync: (code: string) => Promise<void>;
|
|
4
|
+
loadPackagesFromImports: (code: string) => Promise<void>;
|
|
5
|
+
loadPackage: (names: string | string[]) => Promise<void>;
|
|
6
|
+
globals: Map<string, any>;
|
|
7
|
+
}
|
|
8
|
+
export declare const PYODIDE_INDEX_URL: string;
|
|
9
|
+
export declare const PYODIDE_JS_URL: string;
|
|
@@ -1 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
declare const _default: any;
|
|
2
|
+
export default _default;
|
package/package.json
CHANGED
|
@@ -1,34 +1,16 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@dodona/papyros",
|
|
3
|
-
"version": "0.1.8
|
|
4
|
-
"
|
|
5
|
-
"
|
|
6
|
-
"start": "webpack serve",
|
|
7
|
-
"build": "scripts/build.sh",
|
|
8
|
-
"test": "echo No tests defined yet",
|
|
9
|
-
"lint": "eslint --ext '.js' --ext '.ts' src"
|
|
10
|
-
},
|
|
11
|
-
"keywords": [
|
|
12
|
-
"programming",
|
|
13
|
-
"scratchpad"
|
|
14
|
-
],
|
|
15
|
-
"author": {
|
|
16
|
-
"name": "Winnie De Ridder",
|
|
17
|
-
"email": "Winnie.DeRidder@Ugent.be",
|
|
18
|
-
"url": "https://github.com/winniederidder"
|
|
19
|
-
},
|
|
20
|
-
"homepage": "https://docs.dodona.be/papyros/",
|
|
21
|
-
"type": "module",
|
|
22
|
-
"main": "./dist/Papyros.js",
|
|
23
|
-
"license": "MIT",
|
|
3
|
+
"version": "0.1.8",
|
|
4
|
+
"private": false,
|
|
5
|
+
"homepage": ".",
|
|
24
6
|
"devDependencies": {
|
|
25
|
-
"@
|
|
26
|
-
"@types/
|
|
7
|
+
"@babel/traverse": "^7.16.3",
|
|
8
|
+
"@types/escape-html": "^1.0.1",
|
|
27
9
|
"@types/i18n-js": "^3.8.2",
|
|
10
|
+
"@types/serviceworker": "^0.0.36",
|
|
28
11
|
"@typescript-eslint/eslint-plugin": "^4.5.0",
|
|
29
12
|
"@typescript-eslint/parser": "^4.5.0",
|
|
30
13
|
"autoprefixer": "^10.4.0",
|
|
31
|
-
"babel-eslint": "^10.1.0",
|
|
32
14
|
"bootstrap": "^5.1.2",
|
|
33
15
|
"css-loader": "^6.5.1",
|
|
34
16
|
"eslint": "^7.11.0",
|
|
@@ -37,18 +19,22 @@
|
|
|
37
19
|
"eslint-plugin-import": "^2.22.1",
|
|
38
20
|
"eslint-plugin-jest": "^25.2.4",
|
|
39
21
|
"eslint-webpack-plugin": "^2.5.2",
|
|
22
|
+
"i18n-extract": "^0.6.7",
|
|
40
23
|
"jest": "^27.3.1",
|
|
41
24
|
"jest-junit": "^13.0.0",
|
|
42
25
|
"postcss": "^8.3.11",
|
|
43
26
|
"postcss-import": "^14.0.2",
|
|
44
27
|
"postcss-loader": "^6.2.0",
|
|
28
|
+
"raw-loader": "^4.0.2",
|
|
45
29
|
"style-loader": "^3.3.1",
|
|
30
|
+
"tailwindcss": "^2.2.19",
|
|
46
31
|
"ts-jest": "^27.0.7",
|
|
47
32
|
"ts-loader": "^9.2.6",
|
|
48
33
|
"typescript": "^4.1.2",
|
|
49
34
|
"webpack": "^5.64.0",
|
|
50
35
|
"webpack-cli": "^4.9.1",
|
|
51
|
-
"webpack-dev-server": "
|
|
36
|
+
"webpack-dev-server": "^4.6.0",
|
|
37
|
+
"worker-loader": "^3.0.8"
|
|
52
38
|
},
|
|
53
39
|
"dependencies": {
|
|
54
40
|
"@codemirror/autocomplete": "^0.19.8",
|
|
@@ -59,27 +45,43 @@
|
|
|
59
45
|
"@codemirror/history": "^0.19.0",
|
|
60
46
|
"@codemirror/lang-javascript": "^0.19.3",
|
|
61
47
|
"@codemirror/lang-python": "^0.19.2",
|
|
48
|
+
"@codemirror/language": "^0.19.5",
|
|
49
|
+
"@codemirror/panel": "^0.19.0",
|
|
62
50
|
"@codemirror/rectangular-selection": "^0.19.1",
|
|
63
51
|
"@codemirror/search": "^0.19.3",
|
|
64
52
|
"@codemirror/state": "^0.19.6",
|
|
65
53
|
"comlink": "^4.3.1",
|
|
54
|
+
"escape-html": "^1.0.3",
|
|
66
55
|
"i18n-js": "^3.8.0",
|
|
67
|
-
"
|
|
56
|
+
"sync-message": "^0.0.8"
|
|
57
|
+
},
|
|
58
|
+
"scripts": {
|
|
59
|
+
"start": "webpack serve --mode development",
|
|
60
|
+
"build:package": "webpack build --mode production --env=entry=./src/Library.ts",
|
|
61
|
+
"build:app": "webpack build --mode production --env=entry=./src/App.ts",
|
|
62
|
+
"test": "echo No tests defined yet",
|
|
63
|
+
"lint": "eslint --ext '.js' --ext '.ts' src",
|
|
64
|
+
"validate:translations": "node scripts/ValidateTranslations.js"
|
|
68
65
|
},
|
|
69
66
|
"babel": {
|
|
70
67
|
"presets": [
|
|
71
68
|
"@babel/preset-typescript"
|
|
72
69
|
]
|
|
73
70
|
},
|
|
71
|
+
"description": "Scratchpad for multiple programming languages in the browser.",
|
|
74
72
|
"repository": {
|
|
75
73
|
"type": "git",
|
|
76
74
|
"url": "git+https://github.com/dodona-edu/papyros.git"
|
|
77
75
|
},
|
|
76
|
+
"keywords": [
|
|
77
|
+
"programming",
|
|
78
|
+
"scratchpad"
|
|
79
|
+
],
|
|
80
|
+
"author": "Winnie De Ridder",
|
|
81
|
+
"license": "MIT",
|
|
78
82
|
"bugs": {
|
|
79
83
|
"url": "https://github.com/dodona-edu/papyros/issues"
|
|
80
84
|
},
|
|
81
|
-
"
|
|
82
|
-
|
|
83
|
-
"access": "public"
|
|
84
|
-
}
|
|
85
|
+
"main": "./dist/index.js",
|
|
86
|
+
"types": "./dist/library.d.ts"
|
|
85
87
|
}
|
package/dist/Backend.js
DELETED
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
|
-
var __generator = (this && this.__generator) || function (thisArg, body) {
|
|
11
|
-
var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
|
|
12
|
-
return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
|
|
13
|
-
function verb(n) { return function (v) { return step([n, v]); }; }
|
|
14
|
-
function step(op) {
|
|
15
|
-
if (f) throw new TypeError("Generator is already executing.");
|
|
16
|
-
while (_) try {
|
|
17
|
-
if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
|
|
18
|
-
if (y = 0, t) op = [op[0] & 2, t.value];
|
|
19
|
-
switch (op[0]) {
|
|
20
|
-
case 0: case 1: t = op; break;
|
|
21
|
-
case 4: _.label++; return { value: op[1], done: false };
|
|
22
|
-
case 5: _.label++; y = op[1]; op = [0]; continue;
|
|
23
|
-
case 7: op = _.ops.pop(); _.trys.pop(); continue;
|
|
24
|
-
default:
|
|
25
|
-
if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
|
|
26
|
-
if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
|
|
27
|
-
if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
|
|
28
|
-
if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
|
|
29
|
-
if (t[2]) _.ops.pop();
|
|
30
|
-
_.trys.pop(); continue;
|
|
31
|
-
}
|
|
32
|
-
op = body.call(thisArg, _);
|
|
33
|
-
} catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
|
|
34
|
-
if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
|
|
35
|
-
}
|
|
36
|
-
};
|
|
37
|
-
import { INPUT_RELATIVE_URL } from "./Constants";
|
|
38
|
-
import { LogType, papyrosLog } from "./util/Logging";
|
|
39
|
-
function getInputCallback(inputTextArray, inputMetaData) {
|
|
40
|
-
if (inputTextArray && inputMetaData) {
|
|
41
|
-
var textDecoder_1 = new TextDecoder();
|
|
42
|
-
return function () {
|
|
43
|
-
// eslint-disable-next-line no-constant-condition
|
|
44
|
-
while (true) {
|
|
45
|
-
if (Atomics.wait(inputMetaData, 0, 0, 100) === "timed-out") {
|
|
46
|
-
// papyrosLog.log("waiting on input");
|
|
47
|
-
// if (interruptBuffer[0] === 2) {
|
|
48
|
-
// return null;
|
|
49
|
-
// }
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
break;
|
|
53
|
-
}
|
|
54
|
-
}
|
|
55
|
-
Atomics.store(inputMetaData, 0, 0);
|
|
56
|
-
var size = Atomics.exchange(inputMetaData, 1, 0);
|
|
57
|
-
var bytes = inputTextArray.slice(0, size);
|
|
58
|
-
return textDecoder_1.decode(bytes);
|
|
59
|
-
};
|
|
60
|
-
}
|
|
61
|
-
else {
|
|
62
|
-
return function () {
|
|
63
|
-
var request = new XMLHttpRequest();
|
|
64
|
-
do {
|
|
65
|
-
// `false` makes the request synchronous
|
|
66
|
-
request.open("GET", INPUT_RELATIVE_URL, false);
|
|
67
|
-
request.send(null);
|
|
68
|
-
} while (request.status >= 400); // todo better error handling
|
|
69
|
-
return request.responseText;
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
var Backend = /** @class */ (function () {
|
|
74
|
-
function Backend() {
|
|
75
|
-
// eslint-disable-next-line @typescript-eslint/no-empty-function
|
|
76
|
-
this.onEvent = function () { };
|
|
77
|
-
this.runId = 0;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Initialize the backend, setting up any globals required
|
|
81
|
-
* @param {function(PapyrosEvent):void} onEvent Callback for when events occur
|
|
82
|
-
* @param {Uint8Array} inputTextArray Optional shared buffer for input
|
|
83
|
-
* @param {Int32Array} inputMetaData Optional shared buffer for metadata about input
|
|
84
|
-
* @return {Promise<void>} Promise of launching
|
|
85
|
-
*/
|
|
86
|
-
Backend.prototype.launch = function (onEvent, inputTextArray, inputMetaData) {
|
|
87
|
-
var _this = this;
|
|
88
|
-
var inputCallback = getInputCallback(inputTextArray, inputMetaData);
|
|
89
|
-
this.onEvent = function (e) {
|
|
90
|
-
e.runId = _this.runId;
|
|
91
|
-
onEvent(e);
|
|
92
|
-
if (e.type === "input") {
|
|
93
|
-
return inputCallback();
|
|
94
|
-
}
|
|
95
|
-
};
|
|
96
|
-
return Promise.resolve();
|
|
97
|
-
};
|
|
98
|
-
/**
|
|
99
|
-
* Validate and run arbitrary code
|
|
100
|
-
* @param {string} code The code to run
|
|
101
|
-
* @param {string} runId The uuid for this execution
|
|
102
|
-
* @return {Promise<void>} Promise of execution
|
|
103
|
-
*/
|
|
104
|
-
Backend.prototype.runCode = function (code, runId) {
|
|
105
|
-
return __awaiter(this, void 0, void 0, function () {
|
|
106
|
-
var data, error_1, errorString;
|
|
107
|
-
return __generator(this, function (_a) {
|
|
108
|
-
switch (_a.label) {
|
|
109
|
-
case 0:
|
|
110
|
-
this.runId = runId;
|
|
111
|
-
papyrosLog(LogType.Debug, "Running code in worker: ", code);
|
|
112
|
-
_a.label = 1;
|
|
113
|
-
case 1:
|
|
114
|
-
_a.trys.push([1, 3, , 4]);
|
|
115
|
-
return [4 /*yield*/, this._runCodeInternal(code)];
|
|
116
|
-
case 2:
|
|
117
|
-
data = _a.sent();
|
|
118
|
-
papyrosLog(LogType.Important, "ran code: " + code + " and received: ", data);
|
|
119
|
-
return [2 /*return*/, this.onEvent({ type: "success", data: data, runId: runId })];
|
|
120
|
-
case 3:
|
|
121
|
-
error_1 = _a.sent();
|
|
122
|
-
errorString = "toString" in error_1 ? error_1.toString() : JSON.stringify(error_1);
|
|
123
|
-
papyrosLog(LogType.Error, "Error during execution: ", error_1, errorString);
|
|
124
|
-
return [2 /*return*/, this.onEvent({ type: "error", data: errorString, runId: runId })];
|
|
125
|
-
case 4: return [2 /*return*/];
|
|
126
|
-
}
|
|
127
|
-
});
|
|
128
|
-
});
|
|
129
|
-
};
|
|
130
|
-
return Backend;
|
|
131
|
-
}());
|
|
132
|
-
export { Backend };
|
|
133
|
-
//# sourceMappingURL=Backend.js.map
|
package/dist/Backend.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Backend.js","sourceRoot":"","sources":["../src/Backend.ts"],"names":[],"mappings":"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"}
|
package/dist/BackendManager.js
DELETED
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
/* eslint-disable max-len */
|
|
2
|
-
import { releaseProxy, wrap } from "comlink";
|
|
3
|
-
import { ProgrammingLanguage } from "./ProgrammingLanguage";
|
|
4
|
-
// Store Worker per Backend as Comlink proxy has no explicit reference to the Worker
|
|
5
|
-
// We need the Worker itself to be able to terminate it (@see stopBackend)
|
|
6
|
-
var BACKEND_MAP = new Map();
|
|
7
|
-
export function getBackend(language) {
|
|
8
|
-
var worker;
|
|
9
|
-
switch (language) {
|
|
10
|
-
// Requires switch to have actual string constants and make webpack bundle the workers
|
|
11
|
-
case ProgrammingLanguage.Python: {
|
|
12
|
-
worker = new Worker(new URL("./workers/python/PythonWorker.worker.ts", import.meta.url));
|
|
13
|
-
break;
|
|
14
|
-
}
|
|
15
|
-
case ProgrammingLanguage.JavaScript: {
|
|
16
|
-
worker = new Worker(new URL("./workers/javascript/JavaScriptWorker.worker.ts", import.meta.url));
|
|
17
|
-
break;
|
|
18
|
-
}
|
|
19
|
-
default: {
|
|
20
|
-
throw new Error(language + " is not yet supported.");
|
|
21
|
-
}
|
|
22
|
-
}
|
|
23
|
-
var backend = wrap(worker);
|
|
24
|
-
// store worker itself in the map
|
|
25
|
-
BACKEND_MAP.set(backend, worker);
|
|
26
|
-
return backend;
|
|
27
|
-
}
|
|
28
|
-
export function stopBackend(backend) {
|
|
29
|
-
if (BACKEND_MAP.has(backend)) {
|
|
30
|
-
var toStop = BACKEND_MAP.get(backend);
|
|
31
|
-
toStop.terminate();
|
|
32
|
-
backend[releaseProxy]();
|
|
33
|
-
BACKEND_MAP.delete(backend);
|
|
34
|
-
}
|
|
35
|
-
else {
|
|
36
|
-
throw new Error("Unknown backend supplied for backend " + JSON.stringify(backend));
|
|
37
|
-
}
|
|
38
|
-
}
|
|
39
|
-
//# sourceMappingURL=BackendManager.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"BackendManager.js","sourceRoot":"","sources":["../src/BackendManager.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,OAAO,EAAE,YAAY,EAAU,IAAI,EAAE,MAAM,SAAS,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,oFAAoF;AACpF,0EAA0E;AAC1E,IAAM,WAAW,GAAiC,IAAI,GAAG,EAAE,CAAC;AAE5D,MAAM,UAAU,UAAU,CAAC,QAA6B;IACpD,IAAI,MAAM,CAAC;IACX,QAAQ,QAAQ,EAAE;QACd,sFAAsF;QACtF,KAAK,mBAAmB,CAAC,MAAM,CAAC,CAAC;YAC7B,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,yCAAyC,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACzF,MAAM;SACT;QAED,KAAK,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACjC,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,GAAG,CAAC,iDAAiD,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjG,MAAM;SACT;QAED,OAAO,CAAC,CAAC;YACL,MAAM,IAAI,KAAK,CAAI,QAAQ,2BAAwB,CAAC,CAAC;SACxD;KACJ;IACD,IAAM,OAAO,GAAG,IAAI,CAAU,MAAM,CAAC,CAAC;IACtC,iCAAiC;IACjC,WAAW,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACjC,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,OAAwB;IAChD,IAAI,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;QAC1B,IAAM,MAAM,GAAG,WAAW,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC;QACzC,MAAM,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;QACxB,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;KAC/B;SAAM;QACH,MAAM,IAAI,KAAK,CAAC,0CAAwC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAG,CAAC,CAAC;KACtF;AACL,CAAC"}
|
package/dist/CodeEditor.js
DELETED
|
@@ -1,146 +0,0 @@
|
|
|
1
|
-
var __read = (this && this.__read) || function (o, n) {
|
|
2
|
-
var m = typeof Symbol === "function" && o[Symbol.iterator];
|
|
3
|
-
if (!m) return o;
|
|
4
|
-
var i = m.call(o), r, ar = [], e;
|
|
5
|
-
try {
|
|
6
|
-
while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);
|
|
7
|
-
}
|
|
8
|
-
catch (error) { e = { error: error }; }
|
|
9
|
-
finally {
|
|
10
|
-
try {
|
|
11
|
-
if (r && !r.done && (m = i["return"])) m.call(i);
|
|
12
|
-
}
|
|
13
|
-
finally { if (e) throw e.error; }
|
|
14
|
-
}
|
|
15
|
-
return ar;
|
|
16
|
-
};
|
|
17
|
-
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
18
|
-
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
19
|
-
if (ar || !(i in from)) {
|
|
20
|
-
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
|
|
21
|
-
ar[i] = from[i];
|
|
22
|
-
}
|
|
23
|
-
}
|
|
24
|
-
return to.concat(ar || Array.prototype.slice.call(from));
|
|
25
|
-
};
|
|
26
|
-
import { indentWithTab } from "@codemirror/commands";
|
|
27
|
-
import { javascript } from "@codemirror/lang-javascript";
|
|
28
|
-
import { indentUnit } from "@codemirror/language";
|
|
29
|
-
import { Compartment, EditorState } from "@codemirror/state";
|
|
30
|
-
import { ProgrammingLanguage } from "./ProgrammingLanguage";
|
|
31
|
-
import { python } from "@codemirror/lang-python";
|
|
32
|
-
import { EditorView, keymap, highlightSpecialChars, drawSelection, highlightActiveLine } from "@codemirror/view";
|
|
33
|
-
import { history, historyKeymap } from "@codemirror/history";
|
|
34
|
-
import { foldGutter, foldKeymap } from "@codemirror/fold";
|
|
35
|
-
import { indentOnInput } from "@codemirror/language";
|
|
36
|
-
import { lineNumbers, highlightActiveLineGutter } from "@codemirror/gutter";
|
|
37
|
-
import { defaultKeymap } from "@codemirror/commands";
|
|
38
|
-
import { bracketMatching } from "@codemirror/matchbrackets";
|
|
39
|
-
import { closeBrackets, closeBracketsKeymap } from "@codemirror/closebrackets";
|
|
40
|
-
import { searchKeymap, highlightSelectionMatches } from "@codemirror/search";
|
|
41
|
-
import { autocompletion, completionKeymap } from "@codemirror/autocomplete";
|
|
42
|
-
import { commentKeymap } from "@codemirror/comment";
|
|
43
|
-
import { rectangularSelection } from "@codemirror/rectangular-selection";
|
|
44
|
-
import { defaultHighlightStyle } from "@codemirror/highlight";
|
|
45
|
-
import { lintKeymap } from "@codemirror/lint";
|
|
46
|
-
function getLanguageSupport(language) {
|
|
47
|
-
switch (language) {
|
|
48
|
-
case ProgrammingLanguage.Python: {
|
|
49
|
-
return python();
|
|
50
|
-
}
|
|
51
|
-
case ProgrammingLanguage.JavaScript: {
|
|
52
|
-
return javascript();
|
|
53
|
-
}
|
|
54
|
-
default: {
|
|
55
|
-
throw new Error(language + " is not yet supported.");
|
|
56
|
-
}
|
|
57
|
-
}
|
|
58
|
-
}
|
|
59
|
-
/*
|
|
60
|
-
* - [syntax highlighting depending on the language](#getLanguageSupport)
|
|
61
|
-
* - [line numbers](#gutter.lineNumbers)
|
|
62
|
-
* - [special character highlighting](#view.highlightSpecialChars)
|
|
63
|
-
* - [the undo history](#history.history)
|
|
64
|
-
* - [a fold gutter](#fold.foldGutter)
|
|
65
|
-
* - [custom selection drawing](#view.drawSelection)
|
|
66
|
-
* - [multiple selections](#state.EditorState^allowMultipleSelections)
|
|
67
|
-
* - [reindentation on input](#language.indentOnInput)
|
|
68
|
-
* - [the default highlight style](#highlight.defaultHighlightStyle) (as fallback)
|
|
69
|
-
* - [bracket matching](#matchbrackets.bracketMatching)
|
|
70
|
-
* - [bracket closing](#closebrackets.closeBrackets)
|
|
71
|
-
* - [autocompletion](#autocomplete.autocompletion)
|
|
72
|
-
* - [rectangular selection](#rectangular-selection.rectangularSelection)
|
|
73
|
-
* - [active line highlighting](#view.highlightActiveLine)
|
|
74
|
-
* - [active line gutter highlighting](#gutter.highlightActiveLineGutter)
|
|
75
|
-
* - [selection match highlighting](#search.highlightSelectionMatches)
|
|
76
|
-
* Keymaps:
|
|
77
|
-
* - [the default command bindings](#commands.defaultKeymap)
|
|
78
|
-
* - [search](#search.searchKeymap)
|
|
79
|
-
* - [commenting](#comment.commentKeymap)
|
|
80
|
-
* - [linting](#lint.lintKeymap)
|
|
81
|
-
* - [indenting with tab](#commands.indentWithTab)
|
|
82
|
-
*/
|
|
83
|
-
function getExtensions() {
|
|
84
|
-
return [
|
|
85
|
-
lineNumbers(),
|
|
86
|
-
highlightActiveLineGutter(),
|
|
87
|
-
highlightSpecialChars(),
|
|
88
|
-
history(),
|
|
89
|
-
foldGutter(),
|
|
90
|
-
drawSelection(),
|
|
91
|
-
EditorState.allowMultipleSelections.of(true),
|
|
92
|
-
indentOnInput(),
|
|
93
|
-
defaultHighlightStyle.fallback,
|
|
94
|
-
bracketMatching(),
|
|
95
|
-
closeBrackets(),
|
|
96
|
-
autocompletion(),
|
|
97
|
-
rectangularSelection(),
|
|
98
|
-
highlightActiveLine(),
|
|
99
|
-
highlightSelectionMatches(),
|
|
100
|
-
keymap.of(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], __read(closeBracketsKeymap), false), __read(defaultKeymap), false), __read(searchKeymap), false), __read(historyKeymap), false), __read(foldKeymap), false), __read(commentKeymap), false), __read(completionKeymap), false), __read(lintKeymap), false)),
|
|
101
|
-
keymap.of([indentWithTab])
|
|
102
|
-
];
|
|
103
|
-
}
|
|
104
|
-
function getEditorView(parentElement, initialCode, extensions) {
|
|
105
|
-
if (initialCode === void 0) { initialCode = ""; }
|
|
106
|
-
if (extensions === void 0) { extensions = []; }
|
|
107
|
-
return new EditorView({
|
|
108
|
-
state: EditorState.create({
|
|
109
|
-
doc: initialCode,
|
|
110
|
-
extensions: extensions
|
|
111
|
-
}),
|
|
112
|
-
parent: parentElement
|
|
113
|
-
});
|
|
114
|
-
}
|
|
115
|
-
function getIndentUnit(indentLength) {
|
|
116
|
-
return new Array(indentLength).fill(" ").join("");
|
|
117
|
-
}
|
|
118
|
-
var CodeEditor = /** @class */ (function () {
|
|
119
|
-
function CodeEditor(element, language, initialCode, indentLength) {
|
|
120
|
-
if (indentLength === void 0) { indentLength = 4; }
|
|
121
|
-
this.languageCompartment = new Compartment();
|
|
122
|
-
this.indentCompartment = new Compartment();
|
|
123
|
-
this.editorView = getEditorView(element, initialCode, __spreadArray([
|
|
124
|
-
this.languageCompartment.of(getLanguageSupport(language)),
|
|
125
|
-
this.indentCompartment.of(indentUnit.of(getIndentUnit(indentLength))),
|
|
126
|
-
keymap.of([indentWithTab])
|
|
127
|
-
], __read(getExtensions()), false));
|
|
128
|
-
element.replaceChildren(this.editorView.dom);
|
|
129
|
-
}
|
|
130
|
-
CodeEditor.prototype.setLanguage = function (language) {
|
|
131
|
-
this.editorView.dispatch({
|
|
132
|
-
effects: this.languageCompartment.reconfigure(getLanguageSupport(language))
|
|
133
|
-
});
|
|
134
|
-
};
|
|
135
|
-
CodeEditor.prototype.setIndentLength = function (indentLength) {
|
|
136
|
-
this.editorView.dispatch({
|
|
137
|
-
effects: this.indentCompartment.reconfigure(indentUnit.of(getIndentUnit(indentLength)))
|
|
138
|
-
});
|
|
139
|
-
};
|
|
140
|
-
CodeEditor.prototype.getCode = function () {
|
|
141
|
-
return this.editorView.state.doc.toString();
|
|
142
|
-
};
|
|
143
|
-
return CodeEditor;
|
|
144
|
-
}());
|
|
145
|
-
export { CodeEditor };
|
|
146
|
-
//# sourceMappingURL=CodeEditor.js.map
|
package/dist/CodeEditor.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"CodeEditor.js","sourceRoot":"","sources":["../src/CodeEditor.ts"],"names":[],"mappings":"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"}
|
package/dist/Constants.js
DELETED
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { ProgrammingLanguage } from "./ProgrammingLanguage";
|
|
2
|
-
export var MAIN_APP_ID = "papyros";
|
|
3
|
-
export var OUTPUT_TA_ID = "code-output-area";
|
|
4
|
-
export var INPUT_TA_ID = "code-input-area";
|
|
5
|
-
export var EDITOR_WRAPPER_ID = "code-area";
|
|
6
|
-
export var STATE_SPINNER_ID = "state-spinner";
|
|
7
|
-
export var APPLICATION_STATE_TEXT_ID = "application-state-text";
|
|
8
|
-
export var RUN_BTN_ID = "run-code-btn";
|
|
9
|
-
export var TERMINATE_BTN_ID = "terminate-btn";
|
|
10
|
-
export var PROGRAMMING_LANGUAGE_SELECT_ID = "programming-language-select";
|
|
11
|
-
export var DEFAULT_PROGRAMMING_LANGUAGE = ProgrammingLanguage.Python;
|
|
12
|
-
export var LOCALE_SELECT_ID = "locale-select";
|
|
13
|
-
export var DEFAULT_LOCALE = "nl";
|
|
14
|
-
export var INPUT_RELATIVE_URL = "/__papyros_input";
|
|
15
|
-
export var SERVICE_WORKER_PATH = "./inputServiceWorker.js";
|
|
16
|
-
//# sourceMappingURL=Constants.js.map
|
package/dist/Constants.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Constants.js","sourceRoot":"","sources":["../src/Constants.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D,MAAM,CAAC,IAAM,WAAW,GAAG,SAAS,CAAC;AAErC,MAAM,CAAC,IAAM,YAAY,GAAG,kBAAkB,CAAC;AAC/C,MAAM,CAAC,IAAM,WAAW,GAAG,iBAAiB,CAAC;AAC7C,MAAM,CAAC,IAAM,iBAAiB,GAAG,WAAW,CAAC;AAE7C,MAAM,CAAC,IAAM,gBAAgB,GAAG,eAAe,CAAC;AAChD,MAAM,CAAC,IAAM,yBAAyB,GAAG,wBAAwB,CAAC;AAElE,MAAM,CAAC,IAAM,UAAU,GAAG,cAAc,CAAC;AACzC,MAAM,CAAC,IAAM,gBAAgB,GAAG,eAAe,CAAC;AAEhD,MAAM,CAAC,IAAM,8BAA8B,GAAG,6BAA6B,CAAC;AAC5E,MAAM,CAAC,IAAM,4BAA4B,GAAG,mBAAmB,CAAC,MAAM,CAAC;AAEvE,MAAM,CAAC,IAAM,gBAAgB,GAAG,eAAe,CAAC;AAChD,MAAM,CAAC,IAAM,cAAc,GAAG,IAAI,CAAC;AAEnC,MAAM,CAAC,IAAM,kBAAkB,GAAG,kBAAkB,CAAC;AACrD,MAAM,CAAC,IAAM,mBAAmB,GAAG,yBAAyB,CAAC"}
|
package/dist/Main.js
DELETED
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
import { DEFAULT_LOCALE, DEFAULT_PROGRAMMING_LANGUAGE, MAIN_APP_ID, SERVICE_WORKER_PATH } from "./Constants";
|
|
2
|
-
import { Papyros } from "./Papyros";
|
|
3
|
-
import { papyrosLog, LogType } from "./util/Logging";
|
|
4
|
-
import { plFromString } from "./ProgrammingLanguage";
|
|
5
|
-
var RELOAD_STORAGE_KEY = "__papyros_reloading";
|
|
6
|
-
if (window.localStorage.getItem(RELOAD_STORAGE_KEY)) {
|
|
7
|
-
// We are the result of the page reload, so we can start
|
|
8
|
-
window.localStorage.removeItem(RELOAD_STORAGE_KEY);
|
|
9
|
-
startPapyros();
|
|
10
|
-
}
|
|
11
|
-
else {
|
|
12
|
-
if (typeof SharedArrayBuffer === "undefined") {
|
|
13
|
-
papyrosLog(LogType.Important, "SharedArrayBuffers are not available. ");
|
|
14
|
-
if ("serviceWorker" in navigator) {
|
|
15
|
-
papyrosLog(LogType.Important, "Registering service worker.");
|
|
16
|
-
// Store that we are reloading, to prevent the next load from doing all this again
|
|
17
|
-
window.localStorage.setItem(RELOAD_STORAGE_KEY, RELOAD_STORAGE_KEY);
|
|
18
|
-
navigator.serviceWorker.register(SERVICE_WORKER_PATH, { scope: "" })
|
|
19
|
-
// service worker adds new headers that may allow SharedArrayBuffers to be used
|
|
20
|
-
.then(function () { return window.location.reload(); });
|
|
21
|
-
}
|
|
22
|
-
else {
|
|
23
|
-
document.getElementById(MAIN_APP_ID).innerHTML =
|
|
24
|
-
"Your browser is unsupported. \n Please use a modern version of Chrome, Safari, Firefox, ...";
|
|
25
|
-
}
|
|
26
|
-
}
|
|
27
|
-
else {
|
|
28
|
-
startPapyros();
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function startPapyros() {
|
|
32
|
-
var rootElement = document.getElementById("root");
|
|
33
|
-
var urlParams = new URLSearchParams(window.location.search);
|
|
34
|
-
var language = plFromString(urlParams.get("language") || DEFAULT_PROGRAMMING_LANGUAGE);
|
|
35
|
-
var locale = urlParams.get("locale") || DEFAULT_LOCALE;
|
|
36
|
-
Papyros.fromElement(rootElement, {
|
|
37
|
-
standAlone: true,
|
|
38
|
-
programmingLanguage: language,
|
|
39
|
-
locale: locale
|
|
40
|
-
});
|
|
41
|
-
}
|
|
42
|
-
//# sourceMappingURL=Main.js.map
|
package/dist/Main.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"Main.js","sourceRoot":"","sources":["../src/Main.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,cAAc,EAAE,4BAA4B,EAC5C,WAAW,EAAE,mBAAmB,EACnC,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,IAAM,kBAAkB,GAAG,qBAAqB,CAAC;AAGjD,IAAI,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,CAAC,EAAE;IACjD,wDAAwD;IACxD,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,kBAAkB,CAAC,CAAC;IACnD,YAAY,EAAE,CAAC;CAClB;KAAM;IACH,IAAI,OAAO,iBAAiB,KAAK,WAAW,EAAE;QAC1C,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,wCAAwC,CAAC,CAAC;QACxE,IAAI,eAAe,IAAI,SAAS,EAAE;YAC9B,UAAU,CAAC,OAAO,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;YAC7D,kFAAkF;YAClF,MAAM,CAAC,YAAY,CAAC,OAAO,CAAC,kBAAkB,EAAE,kBAAkB,CAAC,CAAC;YACpE,SAAS,CAAC,aAAa,CAAC,QAAQ,CAAC,mBAAmB,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,CAAC;gBAChE,+EAA+E;iBAC9E,IAAI,CAAC,cAAM,OAAA,MAAM,CAAC,QAAQ,CAAC,MAAM,EAAE,EAAxB,CAAwB,CAAC,CAAC;SAC7C;aAAM;YACH,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAE,CAAC,SAAS;gBAC3C,6GAC6D,CAAC;SACrE;KACJ;SAAM;QACH,YAAY,EAAE,CAAC;KAClB;CACJ;AAGD,SAAS,YAAY;IACjB,IAAM,WAAW,GAAG,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAE,CAAC;IACrD,IAAM,SAAS,GAAG,IAAI,eAAe,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAM,QAAQ,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,4BAA4B,CAAC,CAAC;IACzF,IAAM,MAAM,GAAG,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,cAAc,CAAC;IACzD,OAAO,CAAC,WAAW,CAAC,WAAW,EAAE;QAC7B,UAAU,EAAE,IAAI;QAChB,mBAAmB,EAAE,QAAQ;QAC7B,MAAM,EAAE,MAAM;KACjB,CAAC,CAAC;AACP,CAAC"}
|
package/dist/Papyros.css
DELETED
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
@import "tailwindcss/base";
|
|
2
|
-
@import "tailwindcss/components";
|
|
3
|
-
@import "tailwindcss/utilities";
|
|
4
|
-
|
|
5
|
-
/* Styling elements generated by CodeMirror */
|
|
6
|
-
|
|
7
|
-
.cm-scroller, .cm-gutters { /* Min height of the editor via both gutter and scroller */
|
|
8
|
-
min-height: 20vh !important;
|
|
9
|
-
}
|