Giter Club home page Giter Club logo

online-ide's Introduction

(Bemerkung: Ich habe den Build-Prozess am 21.02.2023 vollständig auf das Build-Tool vite umgestellt, daher hat sich die komplette Struktur dieses Repositorys geändert.)

Online-IDE

Java-ähnliche Programmiersprache (Compiler, Interpreter, Debugger) mit IDE, die komplett im Browser ausgeführt wird.

Die IDE gibt es in zwei Varianten: als Online-IDE für Schulen zur Verwendung im Unterricht und bei den Schüler/innen zuhause sowie als kleine Embedded-IDE (Open Source, GNU GPL v3), die in beliebige Webseiten eingebunden werden kann und mit der beispielsweise Informatiklehrkräfte begleitend zum Unterricht eine interaktive Dokumentation für die Schüler/innen erstellen können, ähnlich wie LearnJ.

1. Online-IDE für Schulen

Online-IDE Mit der Online-IDE können Schüler/innen im Browser in einer Java-ähnlichen Programmiersprache programmieren. Die Programme werden auf dem Server gespeichert, so dass zuhause dieselbe Programmierumgebung bereitsteht wie in der Schule - ganz ohne Installation.

Die Lehrkraft hat Zugriff auf die Workspaces der Schüler/innen, so dass sie Hausaufgaben bequem korrigieren und bei Programmfehlern schnell helfen kann.

Weitere Features:

  • Integriertes Repository für Gruppenarbeiten
  • Code-Vervollständigung, Parameterhilfe, Refactor->Rename, Anzeige von Referenzen usw. wie in jeder modernen Entwicklungsumgebung
  • Automatisches Kompilieren und Fehleranzeige während der Eingabe
  • Schneller Programmstart ("Play-Button")
  • Ausführungsgeschwindigkeit regelbar
  • Debugger mit Breakpoints, Anzeige der lokalen Variablen, Watch-Expressions
  • Ausführung wahlweise im Einzelschritt
  • Console-Fenster zur Eingabe und sofortigen Ausführung einzelner Anweisungen
  • Schneller, bequemer Hausaufgaben-Workflow

2. Embedded-IDE

Die Java-ähnliche Programmiersprache ist im LearnJ-Wiki ausführlich beschrieben und dort ist die IDE in Embedded-Form auch vielfach zu sehen. Hier ein schönes Beispiel des vollen Funktionsumfangs!

Integration als <iframe> in Moodle

Mehr dazu auf dieser Seite.

Integration in eigene Webseiten

Nach dem Checkout des Repository können Sie den dist-Ordner mit den fertigen Programmdateien erstellen mittels:

    npm install
    npm run build

Benötigt werden

  • dist/assets/fonts
  • dist/assets/graphics
  • dist/assets/mp3
  • dist/lib
  • dist/online-ide-embedded.css
  • dist/online-ide-embedded.js

Im Header der Webseite müssen die verwendeten Bibliotheken geladen werden:

<head>
    <meta charset='utf-8'>
    <title>Embedded-Test</title>
    <meta name='viewport' content='width=device-width, initial-scale=1'>

    <link rel="preload" href="lib/monaco-editor/dev/vs/editor/editor.main.js" as="script">
    <link rel="preload" href="lib/monaco-editor/dev/vs/editor/editor.main.nls.de.js" as="script">

    <link rel='stylesheet' type='text/css' media='screen' href='assets/fonts/fonts.css'>
    
    <script src="lib/p5.js/p5.js"></script>    
    <script src="lib/pako/pako.js"></script>
    <script src="lib/jszip/jszip.js"></script>
    <script src="lib/upng/UPNG.js"></script>

    <script src="lib/markdownit/markdownit.min.js"></script>
    <script src="lib/monaco-editor/dev/vs/loader.js"></script>
    <script src="lib/howler/howler.core.min.js"></script>

    <script type="module" crossorigin src="/online-ide-embedded.js"></script>
    <link rel="stylesheet" href="/online-ide-embedded.css">

</head>

Die Bestandteile des verwendeten Monaco Editors werden dynamisch aus dem Unterverzeichnis window.javaOnlineDir + window.monacoEditorPathnachgeladen, das Spritesheet aus dem Verzeichnis window.javaOnlineDir + "assets/graphics". Der Defaultwert von window.javaOnlineDir ist "", der Defaultwert von window.monacoEditorPath ist "lib/monaco-editor/dev/vs".

Alle divs innerhalb des <body>-Elements, die die Klasse java-online tragen, werden nach dem DOMContentLoaded-Event automatisch in Embedded-IDEs umgewandelt. Die Java-Quelltexte werden in <script>-Tags innerhalb der divs verpackt.

Minimal-Beispiel

<div class="java-online" style="width: calc(100% - 10px); height: 150px; margin-left: 5px"
data-java-online="{
    'id': 'Beispiel_1',
    'withBottomPanel': false
}">

<script type="text/plain" title="Test1">
for(int i = 0; i < 10; i++){
    println("Das ist Zeile " + (i + 1));
}
</script>

</div>

Dieses Beispiel erscheint so im Browser: Beispiel 1

Beispiel mit Dateiliste, Console, Fehlerliste und Tipp

<div class="java-online" style="width: 80%; height: 400px; margin-left: 5px" 
data-java-online="{
    'id': 'Vererbung_Beispiel_1',  
    'withBottomPanel': true, 
    'withFileList': true,
    'withPCode': true,
    'withConsole': true,
    'withErrorList': true,
    'speed': 'max'
}">

<script type="text/plain" title="Hauptprogramm.java">
World w = new World();
new Quadrat(40, 20, 300);
</script>

<script type="text/plain" title="Quadrat.java">
class Quadrat extends Rectangle {
    public Quadrat(double left, double top, double width){
        super(left, top, width, width); 
    }
}
</script>

<script type="text/plain" title="Tipp" data-type="hint">
## Tipp:
Tipps werden in einer einfachen Markdown-Syntax 
verfasst, die **Fettschrift** u.ä. ermöglicht, aber
 auch Syntax-Highlighting im Fließtext (``class Quadrat extends Rectangle { }``) 
 und in ganzen Absätzen:
/```  (den / weglassen!)
double v = Math.random()*8 + 2; // Betrag der Geschwindigkeit zwischen 2 und 10
double w = Math.random()*2*Math.PI; // Winkel zwischen 0 und 2*PI
vx = v * Math.cos(w);
vy = v * Math.sin(w);
/``` (den / weglassen!)            
</script>

</div>

Dieses Beispiel erscheint so im Browser: Beispiel 2

Das Attribut data-java-online

Im Attribut data-java-online kann die Embedded-IDE konfiguriert werden:

data-java-online="{
    'id': 'Vererbung_Beispiel_1',   // eindeutige id je URL und Embedded-IDE in der IndexedDB des Browsers  
    'withBottomPanel': true,        // mit unterem Panel 
    'withFileList': true,           // falls mit unterem Panel: mit/ohne Dateiliste links
    'withPCode': true,              // falls mit unterem Panel: mit/ohne PCode-Tab
    'withConsole': true,            // falls mit unterem Panel: mit/ohne Console-Tab
    'withErrorList': true,          // falls mit unterem Panel: mit/ohne Fehlerliste
    'speed': 20000                  // Geschwindigkeit in Steps/s oder 'max'
}"

Ändert ein Benutzer den angezeigten Quelltext in einer Embedded-IDE, so werden die Änderungen in der IndexedDB des Browsers gespeichert. Ruft der Benutzer dieselbe Seite später mit demselben Browser erneut auf, so erscheinen seine Änderungen wieder. Rechts unten im Editor-Bereich erscheint zusätzlich ein Button "Code-Reset". Ein Klick darauf stellt den ursprünglichen Quelltext wieder her.

online-ide's People

Contributors

bensofficial avatar informa-tiger avatar knorrke avatar martin-pabst avatar ralf1307 avatar rozek avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

online-ide's Issues

Trennung von IDE und Programmiersprache

Erst einmal vielen Dank für dieses tolle Projekt.

Ich habe auch schon länger mit dem Gedanken gespielt, eine auf JavaScript basierende Sprache zu entwickelt, die Java sehr ähnelt, um das Ausführen von "Java"-Programmen im Browser zu ermöglichen. Ich finde die Implementierung hier wirklich gelungen.

Daher meine Frage: Ist es angedacht, die Sprache von der IDE zu trennen, sodass sie in anderen Projekten verwendet werden kann?

Zum Beispiel in der Form, dass der Compiler und Interpreter eigene npm-Pakete wären und die Runtime Libraries vielleicht auch eigene npm-Pakete wären, sodass man diese wahlweise dazu schalten könnte.

Move `@types/*` dependencies to devDependencies

"@types/*" dependencies are only required for Typescript. I would recommend moving them into the devDependencies (that's where they are usually). However, this project doesn't seem to be a Typescript project, why are they installed at all?

FYI: Online-IDE auf GitHub Pages

Falls es Sie interessiert: da ich plane, meine Erstsemester (die an der HfT Stuttgart u.a. Java erlernen) auf LearnJ und die Online-IDE hinzuweisen, die Studenten aber eher mit GitHub arbeiten und dort ggfs. auch eigene Arbeiten veröffentlichen sollen, habe ich ein wenig herumexperimentiert um herauszufinden, wie man die "Embedded IDE" in "GitHub Pages" integriert.

Die gefundene Vorgehensweise finden Sie in einem GitHub Repository erklärt, das Ergebnis können Sie auf der zugehörigen GitHub Page einsehen.

Nochmals vielen Dank für Ihre großartige Arbeit!

[Bug] Error when calling `destroy()` of a `Group`

When the bug occurs

It sometimes randomly occurs, when calling destroy() of an Group object,
or as reported by my classmate @Benedikt27, when calling destroy() of an element in a Group.

Expected Behaviour

The complete group and all elements should be destroyed (or in my classmate's case the destroyed child removed) and the executed programme should continue to run.

Bug

The execution of the programme stops, while the IDE still shows, that it is running. In the webconsole, the following error is thrown:

Uncaught Error: getChildAt: Index (0) does not exist.
    at Container.getChildAt (display.js:1570:19)
    at Container.removeChildAt (display.js:1619:26)
    at mt.deregister (Group.ts:454:46)
    at mt.remove (Group.ts:445:18)
    at st.destroy (Shape.ts:1187:33)
    at mt.destroyChildren (Group.ts:480:16)
    at mt.destroy (Group.ts:473:14)
    at k.invoke (Actor.ts:69:20)
    at _e.executeNode (Interpreter.ts:1099:46)
    at _e.nextStep (Interpreter.ts:807:30)

@Benedikt27 reported an error, where the wrong child disappeared, when calling destroy(), which caused an error as result of that.

How to reproduce this bug

Well, unfortunately, I was not able to make a minimal example. It seemed a bit random to me, when exactly this error occurs.
I uploaded our whole school project here on GitHub, so that you can reproduce it.
For that you have to start the file Main, click on the Spielen-button to go to the game description and the click the green button to start the game.
When the ball leaves the view, the View-Object (View extends Group) of the game should be destroyed.
That is when the error occurs.

Analysis

The error occurs in Group.deregister:

private deregister(shape: RuntimeObject, index: number) {
let shapeHelper: ShapeHelper = shape.intrinsicData['Actor'];
let transform = new PIXI.Matrix().copyFrom(shapeHelper.displayObject.transform.worldTransform);
(<PIXI.Container>this.displayObject).removeChildAt(index);
let inverseStageTransform = new PIXI.Matrix().copyFrom(this.worldHelper.stage.localTransform);
inverseStageTransform.invert();
shapeHelper.displayObject.localTransform.identity();
shapeHelper.displayObject.localTransform.append(transform.prepend(inverseStageTransform));
//@ts-ignore
shapeHelper.displayObject.transform.onChange();
this.worldHelper.stage.addChild(shapeHelper.displayObject);
shapeHelper.displayObject.updateTransform();
shapeHelper.belongsToGroup = null;
}

It seems, that the order of the elements get mixed up, so that the order of this.shapes is not the same as of this.displayObject.children.
Thus when removing e.g. this.shapes[0] it will remove the wrong displayObject from this.displayObject.children (line 454)
and after that add the right displayObject to this.worldHelper.stage in line 462,
which automatically removes it from this.displayObject.children, so that it is empty now.
When the Group now tries to remove the remaining element of this.shapes there will be an error in line (line 454),
since this.displayObject.children is already ampty.

Suggestion

I suggest changing (line 454) to

        (<PIXI.Container>this.displayObject).removeChild(shapeHelper.displayObject);

This should fix the error, because derigister won't rely on having the lists in the same order anymore.

Multiple calls of super(...) possible

super() does not have to be the first statement of a subclass constructor.
Even multiple calls of super-constructors are possible.

Example:

new Pferd();

public class Pferd extends Tier{
public Pferd() {
// implicit call: super()
setName("Kleiner Onkel");
super("Jolly Jumper");
super("Fury");
}
}

public class Tier{
private String name;
public Tier() {
setName("N.N.");
}
public Tier(String name) {
setName(name);
}
public void setName(String neuerName) {
name = neuerName;
}
}

List of languages that compile to JS

Auf GitHub gibt es eine Liste von Programmiersprachen, die nach JavaScript übersetzt oder von einem in JS geschriebenen Interpreter ausgeführt werden. Im Abschnitt Java/JVM werden auch Java-Transpiler und -Interpreter geführt.

Möchten Sie Ihre Arbeit dort nicht auch eintragen? Sie wäre allemal einen Eintrag wert!

Calling a Method of an Interface directly is possible

public interface BigRegister {
   Register getIndividual(int which);
}
// Calling this crashes the interpreter
BigRegister.getIndividual(1);

I think this is something that should be catched by the compiler. (I dont know the Java-specification, what should be done in such a case?)

Error in `executeNode`

Some time ago I found another error.
I ran the following code:

float myfloat = 1.0;
float[] test = { myfloat };
test[0] = 2.0;
println("myfloat: " + myfloat);

and to my suprise the output wasn't

myfloat: 1

like I expected, but actually:

myfloat: 2

I sent it to my teacher Ms. Roth, but I don't know whether she has already reported you that bug. After looking in your code, I could find out, that the bug is probably caused by an error in the method executeNode in ./src/client/interpreter/Interpreter.ts.

case TokenType.addToArray:
stackTop -= node.numberOfElementsToAdd;
let values: Value[] = stack.splice(stackTop + 1, node.numberOfElementsToAdd);
stack[stackTop].value = (<any[]>stack[stackTop].value).concat(values);
break;

Maybe line 1313 should be changed to something like:

     let values: Value[] = stack.splice(stackTop + 1, node.numberOfElementsToAdd).map(tvo => ({type: tvo.type, value: tvo.value}));

Then the the type-value-object of the variable isn't the same like the type-value-object in the array and it's value wouldn't change any more, when the value of the other one is changed.

Front-end problem during save & exit

When quitting through the save end exit button, some elements of the IDE are still visible, for example the scaling points and parts of the console.
image

I also had some problems saving my project earlier (it hadn't been saved after multiple minutes), but that might be because it was too much at once.

ein paar Anmerkungen

Zunächst einmal vielen Dank für diese tolle Java-Umgebung - dahinter steckt ganz offensichtlich eine ganze Menge Arbeit.

Beim Versuch, die Online-IDE auf eine eigene Webseite zu packen, bin ich jedoch auf eine Reihe von Problemen gestoßen:

  • "EmbeddedStarter.ts" lädt eine Datei "assets/spritesheet.json" - relativ zum Verzeichnis mit der aktuellen HTML-Datei, nicht aber relativ zum Installationsort der Online-IDE. Eine mögliche Abhilfe scheint wohl zu sein, neben "window.monacoEditorPath" auch noch "window.javaOnlineDir" zu setzen (und "window.monacoEditorPath" relativ dazu)
  • von "javaOnlineEmbedded.css" werden eine ganze Reihe von Fonts aus dem "assets"-Verzeichnis angefordert, die dort aber nicht liegen und auch nicht im Repository zu finden sind
  • "MainEmbedded.ts" liefert in Zeile 217 einen "TypeError: Cannot read properties of null (reading 'model')". Mangels Zeit konnte ich dem Fehler noch nicht näher auf den Grund gehen

Für einen Fehler in der Beschreibung werde ich gleich einen (winzigen) Pull Request stellen - weitere falls ich die o.g. Fehler beheben kann (soweit es meine Zeit erlaubt)

Child-Interface doesnt inherit methods from Parent-Interface

public interface Register {
   int getSize();

   String getString();
   int getInt();

}
public interface BigRegister extends Register {
   Register getIndividual(int which);

   void storeString(String in);
   void storeInt(int in);
}
public class Test {
   Test(BigRegister reg){
      reg.getString(); // Should be valid, but is not
   }
}

compiler/types/Class.ts: canCastTo doesnt look at the child-interfaces

Example code:

Iterable<Object> ab  = new ArrayList<Object>();

The method only looks at the subclasses. Another loop is needed to look at all the klass.implements.extends :(

        if (type instanceof Interface) {

            let klass: Klass = this;
            while (klass != null) {
                for (let i of klass.implements) {
                    if (type.getNonGenericIdentifier() == i.getNonGenericIdentifier()) {
                        return true;
                    }
                }
                klass = klass.baseClass;
            }
        }

Compiler doesn't allow calling interface method of an reference attribute

Hier ist ein kleines Code-Beispiel:

interface MyInterface {
   public void myMethod();
}

class MyImplementation implements MyInterface {
   public void myMethod() {
      println("Hello");
   }
}

class TestClass {
   public MyInterface element;

   TestClass() {
      element = new MyImplementation();
   }

   public void testMethod() {
      element.myMethod();
   }
}

TestClass test = new TestClass();
test.testMethod(); // this works
test.element.myMethod(); // this fails, but should work

Bei der letzten Zeile meldet der Compiler leider folgendes: "Methodendefinitionen eines Interfaces können nicht statisch aufgerufen werden." - wenn man das Beispiel in JAVA nachprogrammiert, dann funktioniert die letzte Zeile.

Könnten Sie sich bei Gelegenheit diesen Fehler einmal anschauen und prüfen, was hier schief läuft? Vielen Dank!

Ellipsis in enum-constructor wont work

public enum Test {
   t(12, 53, 34)

   private Test(int... i) {
      println(i[0]);
   }
}

// Sample function for the interpreter to run
println("test");

The problem is, that 12, 53 and 34 just get pushed to the stack and not get grouped together to an array like the callers of an ellipsis method do (with makeEllipsisArray).
I think it needs a fix in processEnumConstructorCall in CodeGenerator to check for ellipsis.

Integer.toString

Guten Morgen!

Ich habe gerade im Rahmen eines Beispiels für meine Studenten die Funktion Integer.toString(n,2) ausprobiert, um eine ganze Zahl in einen Binär-String umzuwandeln - dabei bleibt das Programm aber offenbar in der Funktion hängen...

println("before");
println(Integer.toString(123,2));
println("after");

Bug - ungewollte automatische Ergänzung von ;

Wird an der Stelle A z.B. if(isKey ...) eingeben oder auch nur if () und dann Leerzeichen, entsteht am Methodenkopf Stelle B automatisch ein Strichpunkt, scheinbar nur, weil die Methode move im Methodenrumpf steht.

Grafik g = new Grafik();

class Grafik extends Actor {

   Rectangle kiste = new Rectangle(300, 300, 100, 100); 
   Grafik() { }
  
   void act() 
   {
      bewegeKiste(); 
      //A//<== Fehler bei Eingabe von z.B. if(isKeyD...)
      
   }

   void bewegeKiste() //B//<== hier entsteht ein ; weil die Methode move ausgeführt wird
   {
      kiste.move(0, 10);
   }
}

Collision detection fails after world scrolling

My school class and I are currently building a jump and run game with the editor and noticed that collision detection stops working after transforming the World (e.g. move or rotate).

I think the problem is, that hitPolygonDirty isn't set when moving the world, since removing the check in the following line resolves the issue:

if (this.hitPolygonDirty) this.transformHitPolygon();

I didn't find an easy way to update the hitPolygonDirty flag, do you have an idea?

Test example

Some code to test this (slightly changed from https://learnj.de/doku.php?id=api:documentation:spiele:worldtransformations):
Rectangles colliding with the ship should get deleted. With Line 40 getWorld().move(-dx, -dy) the collisions don't work, after removing the line it does work again.

World world = new World(600, 500);
ScrollingDemo sd = new ScrollingDemo();

class ScrollingDemo extends Actor {

   Sprite ship;
   int time = 0;
   Group rs = new Group();

   ScrollingDemo() {
      super();
      
      double w = 10000;

      for(int i = 0; i < 500; i++) {
         
         double x = Math.random() * w - w / 2;
         double y = Math.random() * w - w / 2;
         
         Rectangle r = new Rectangle(x, y, Math.random() * 300 + 100, Math.random() * 300 + 100);
         r.rotate(Math.random() * 180);
         r.setFillColor(Color.randomColor(100), Math.random() * 0.5 + 0.5); 
         rs.add(r);
      }

      ship = new Sprite(400, 300, SpriteLibrary.Ship_1, 0);
      ship.scale(0.3);
      ship.rotate(90);
      getWorld().scale(0.3, ship.getCenterX(), ship.getCenterY());
   }

   public void act() {
      time++;

      double v = 6;
      double dx = v * Math.cos(ship.getAngle() * Math.PI / 180);
      double dy = -v * Math.sin(ship.getAngle() * Math.PI / 180);

      ship.move(dx, dy);
      getWorld().move(-dx, -dy);
      for(Shape s : ship.getCollidingShapes(rs)) {
         s.destroy();
      }

      double centerX = ship.getCenterX();
      double centerY = ship.getCenterY();

      if(isKeyDown(Key.ArrowLeft)) {
         ship.rotate(2);
      }

      if(isKeyDown(Key.ArrowRight)) {
         ship.rotate(-2);
      }

      if(time % 10 == 0) {
         new Circle(centerX, centerY, 20);
         ship.bringToFront();
      }
   }
}

More problems regarding groups and world scaling

The position of the group still seems to be off by quite a bit with a custom world size

new Test();
public class Test extends Actor {
   World world = new World(800, 1600);
   Group g = new Group();
   public Test() {
      super();
      g.add(new Rectangle(400, 1500, 50, 50));
      println(g.getCenterX());
      println(this.getWorld().getWidth());
      
   }
}

Expected output:
400
800

Actual output:
850
800

isOutsideView broken with high resolutions

public class TestRect extends Rectangle {
   TestRect() {
      super(Math.random() * (getWorld().getWidth() + 1), 0, 90, 100);
   }

   public void act() {
      if(isOutsideView()) {
         destroy();
         return;
      }

      move(0, 5);
   }
}
new World(800, 2000);
while(true) {
   new TestRect();
}

r.istMarke() is crashing interpreter

This program is crashing the interpreter:

Robot r = new Robot();
r.istMarke(); // exception in console
r.schritt();

details:

image

workaround:

use r.istMarke("gelb")

Calling super constructor with varargs results in error

Calling the constructor public Polygon(boolean closeAndFill, double... points) in a sub class using super results in the following error:

Uncaught TypeError: parameters1[((i - parameterBegin) - 1)] is undefined
    executeNode Interpreter.ts:1019
    nextStep Interpreter.ts:757
    timerFunction Interpreter.ts:494
    periodicFunction Interpreter.ts:138

Test example:

new Test();
class Test extends Polygon {
    public Test(){
        // this works: 
        // super(true, new double[]{ 10, 10, 300, 10, 150, 200 });
        
        // this results in error:
        super(true, 10, 10, 300, 10, 150, 200);
    }
}

Log in loading animation keeps playing after failed log in attempt

As a registered user, when you input wrong user credentials while logging into the web service, the log in animation keeps playing even though the log in attempt has been concluded unsuccessfully.

Expected behaviour: the log in animation stops after the log in attempt has failed.

Actual behaviour: the log in animation keeps playing.

Device information: Windows 11, Chrome 97.0.4692.99

[Bug] CORS error when trying to access database

When the bug occurs

It occurs when trying to get a database connection from https://online-ide.de/.

Expected Behaviour

Loading the database or throwing an error, if the access code isn't correct.

Bug

The IDE holds on the line with the DatabaseManager.getConnection statement and shows, that it is loading the database, until you terminate the program.

How to reproduce this bug

Go on https://online-ide.de/ and call DatabaseManager.getConnection with an valid access code.

Analysis

In the web console you can see, that a CORS error occurs with the request to https://www.sql-ide.de/servlet/jGetDatabase.

Suggestion

In the header of its response to the preflight request the https://www.sql-ide.de server allows only https://www.online-ide.de as access-control-allow-origin. I suggest adding the domain https://online-ide.de.

String.matches und Integer.parseInt

Reguläre Ausdrücke sind ein mächtiges Werkzeug für die Analyse von (Eingabe-)Texten. String.replace ist bereits implementiert - aber es wäre schön, auch String.matches zu haben!

Bisweilen wäre es praktisch, nicht nur komplette Eingaben, sondern auch Teile von Zeichenketten in Zahlen umwandeln zu können (z.B. durch Integer.parseInt)

Embedded IDE without console doesn't show parameter hints

When loading the Embedded IDE with param 'withConsole': false, you don't see the usual parameter hints. e.g. after typing new Circle( in the IDE including console you see parameter hints.
But in IDE without console nothing happens and the following error is thrown:

Uncaught Error: o.editor is undefined

value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:1:418318
provideSignatureHelp/</<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:87878:44
loop@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6729:43
first@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6737:16
provideSignatureHelp@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:87877:24
ParameterHintsModel</ParameterHintsModel.prototype.doTrigger/</</this.state<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88113:63
createCancelablePromise@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6580:32
ParameterHintsModel</ParameterHintsModel.prototype.doTrigger/</<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88112:81
step@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6269:23
verb/<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6250:53
__awaiter</<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6244:71
__awaiter<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6240:12
ParameterHintsModel</ParameterHintsModel.prototype.doTrigger@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88088:20
ParameterHintsModel</ParameterHintsModel.prototype.trigger/<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88046:30
Delayer</Delayer.prototype.trigger/this.completionPromise<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6663:32
promise callback*Delayer</Delayer.prototype.trigger@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:6657:20
ParameterHintsModel</ParameterHintsModel.prototype.trigger@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88045:35
ParameterHintsModel</ParameterHintsModel.prototype.onDidType@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88190:22
ParameterHintsModel/<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:88013:83
Emitter</Emitter.prototype.fire@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:4836:38
CodeEditorWidget</CodeEditorWidget.prototype.trigger@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:98900:37
EditorHandlerCommand</EditorHandlerCommand.prototype.runCommand@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:82794:20
handler@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:81037:71
exports.CommandsRegistry</class_1.prototype.registerCommand/idOrCommand.handler@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:72890:44
InstantiationService</InstantiationService.prototype.invokeFunction@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:74665:27
StandaloneCommandService</StandaloneCommandService.prototype.executeCommand@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:119743:72
type@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:99313:47
ViewController</ViewController.prototype.type@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:83151:34
TextAreaHandler/<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:96778:43
Emitter</Emitter.prototype.fire@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:4836:38
TextAreaInput/<@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:27996:39
EventListener.handleEvent*DomListener@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:15452:24
addDisposableListener@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:15467:16
TextAreaInput@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:27981:33
TextAreaHandler@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:96752:52
View@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:97895:38
CodeEditorWidget</CodeEditorWidget.prototype._createView@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:99349:24
CodeEditorWidget</CodeEditorWidget.prototype._attachModel@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:99253:27
StandaloneEditor</StandaloneEditor.prototype._attachModel@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:120233:43
CodeEditorWidget</CodeEditorWidget.prototype.setModel@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:98523:18
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:374770
v/<@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:375891
value/n.onsuccess@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:371689
EventHandlerNonNull*value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:371642
v@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:375507
value/</<@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:375969
value/<@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:376056
value/n.onsuccess@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:371689
EventHandlerNonNull*value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:371642
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:375017
e/<@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:372318
value/t.onsuccess@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:371032
EventHandlerNonNull*value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:370912
e@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:372280
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:390772
value/<@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:390719
each@https://code.jquery.com/jquery-3.5.1.min.js:2:2976
each@https://code.jquery.com/jquery-3.5.1.min.js:2:1454
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:390502
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:390402
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:390201
value@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:389445
@https://learnj.de/javaonline/js.webpack/javaOnline-embedded.js:2:391226
Module._invokeFactory@https://learnj.de/doku.php?id=start line 2 > injectedScript:1043:41
Module.prototype.complete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1053:36
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1673:20
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._resolve@https://learnj.de/doku.php?id=start line 2 > injectedScript:1633:22
ModuleManager.prototype.defineModule@https://learnj.de/doku.php?id=start line 2 > injectedScript:1284:18
load@https://learnj.de/doku.php?id=start line 2 > injectedScript:1562:23
messagesLoaded_1@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.js:261:25
Module._invokeFactory@https://learnj.de/doku.php?id=start line 2 > injectedScript:1043:41
Module.prototype.complete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1053:36
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1673:20
ModuleManager.prototype._onModuleComplete@https://learnj.de/doku.php?id=start line 2 > injectedScript:1685:30
ModuleManager.prototype._resolve@https://learnj.de/doku.php?id=start line 2 > injectedScript:1633:22
ModuleManager.prototype.defineModule@https://learnj.de/doku.php?id=start line 2 > injectedScript:1284:18
DefineFunc@https://learnj.de/doku.php?id=start line 2 > injectedScript:1723:27
@https://learnj.de/javaonline/lib/monaco-editor/dev/vs/editor/editor.main.nls.de.js:8:7
    unexpectedErrorHandler errors.ts:22
    setTimeout handler*ErrorHandler/this.unexpectedErrorHandler errors.ts:20
    onUnexpectedError errors.ts:37
    onUnexpectedError errors.ts:52
    promise callback*ParameterHintsModel</ParameterHintsModel.prototype.trigger parameterHintsModel.ts:118
    onDidType parameterHintsModel.ts:269
    ParameterHintsModel parameterHintsModel.ts:82
    fire event.ts:572
    trigger codeEditorWidget.ts:915
    runCommand coreCommands.ts:1742
    handler editorExtensions.ts:108
    handler commands.ts:79
    invokeFunction instantiationService.ts:67
    executeCommand simpleServices.ts:213
    type codeEditorWidget.ts:1400
    type viewController.ts:77
    TextAreaHandler textAreaHandler.ts:247
    fire event.ts:572
    TextAreaInput textAreaInput.ts:307
    DomListener dom.ts:216
    addDisposableListener dom.ts:237
    TextAreaInput textAreaInput.ts:289
    TextAreaHandler textAreaHandler.ts:217
    View viewImpl.ts:129
    _createView codeEditorWidget.ts:1438
    _attachModel codeEditorWidget.ts:1337
    _attachModel standaloneCodeEditor.ts:399
    setModel codeEditorWidget.ts:418
    value MainEmbedded.ts:200
    v MainEmbedded.ts:259
    onsuccess EmbeddedIndexedDB.ts:80
    value EmbeddedIndexedDB.ts:76
    v MainEmbedded.ts:237
    value MainEmbedded.ts:234
errors.ts:22:11
    unexpectedErrorHandler errors.ts:22
    (Async: setTimeout handler)
    unexpectedErrorHandler errors.ts:20
    onUnexpectedError errors.ts:37
    onUnexpectedError errors.ts:52
    (Async: promise callback)
    trigger parameterHintsModel.ts:118
    onDidType parameterHintsModel.ts:269
    ParameterHintsModel parameterHintsModel.ts:82
    fire event.ts:572
    trigger codeEditorWidget.ts:915
    runCommand coreCommands.ts:1742
    handler editorExtensions.ts:108
    handler commands.ts:79
    invokeFunction instantiationService.ts:67
    executeCommand simpleServices.ts:213
    type codeEditorWidget.ts:1400
    type viewController.ts:77
    TextAreaHandler textAreaHandler.ts:247
    fire event.ts:572
    TextAreaInput textAreaInput.ts:307
    (Async: EventListener.handleEvent)
    DomListener dom.ts:216
    addDisposableListener dom.ts:237
    TextAreaInput textAreaInput.ts:289
    TextAreaHandler textAreaHandler.ts:217
    View viewImpl.ts:129
    _createView codeEditorWidget.ts:1438
    _attachModel codeEditorWidget.ts:1337
    _attachModel standaloneCodeEditor.ts:399
    setModel codeEditorWidget.ts:418
    value MainEmbedded.ts:200
    v MainEmbedded.ts:259
    onsuccess EmbeddedIndexedDB.ts:80
    (Async: EventHandlerNonNull)
    value EmbeddedIndexedDB.ts:76
    v MainEmbedded.ts:237
    value MainEmbedded.ts:234

Multiline-comments: Problems with starting a comment after a tab

When creating a multiline-comment, every new line starts with an asterisk, however by not creating the comment at the beginning of the line, the start of the comment '/*' gets formatted to the beginning of the line and thisway breaks the comment and new lines don't start with an asterisk anymore.

Please add a License file!

Ohne Open-Source oder Freie-Software Lizenz andere Leute dürfen den Code nicht nutzen oder den anschauen aufgrund der Standard-Copyright Gebung. Leider reicht die Erwähung der MIT-Lizenz nicht, sonder es braucht eine extra Datei mit dem Lizenztext.

Und vielen Dank das Sie sich dafür entschieden haben die Embedded-Variante offen zu veröffentlichen

Mit freundlichen Grüßen
Ralf Rachinger

Web client randomly disconnects from the server

Looking at your last commits, I don't know whether the bug bash for this issue has already started. I'm facing the issue that using the Online-IDE, the client disconnects from the server without an apparent reason. It happens randomly every 10 - 20 minutes and to fix it, you have to reload the page, dismissing all your work that didn't have the chance to synchronize since the last server callback.

You can see that the client has been disconnected from the server by looking at the synchronization bar in the top right corner of the console which turns red. I wish there was a way to log this issue, but I can't seem to find any possibility regarding client logs.

Device: Windows 10 and 11, macOS Monterey 12.4, multiple Chrome versions (e. g. 101.0.4951.67)

Float.isNan() doensn't works

We're working with your online IDE in our lessons. I noticed, that Float.isNaN will always return false. This happens because in java- or typescript NaN == NaN is false. I think, you should change the line

return parameters[1].value == NaN;

to

 return isNaN(parameters[1].value); 

The same should be done here:

return parameters[0].value == NaN;

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.