Warning: session_start(): open(/var/lib/php/sessions/sess_m44hrjsr323qknrehnqlgocknn, O_RDWR) failed: No space left on device (28) in /var/www/tb-usercake/models/config.php on line 51
Warning: session_start(): Failed to read session data: files (path: /var/lib/php/sessions) in /var/www/tb-usercake/models/config.php on line 51
!7
sS text = [[
One node "A".
One node "B".
B to the right of A.
]];
static int interval = 250;
static new TreeSet nodes;
static SS withImage = caseInsensitiveMap();
static new LinkedHashSet relations;
static new LinkedHashSet maybes;
static Map coordinates = caseInsensitiveMap();
static Canvas canvas;
static JCheckBox cbMaybe;
static JTextArea ta;
static CirclesAndLines cal;
static ReliableSingleThread thread = new(f doIt);
sS textRendered;
p-subst-noconsole { load('text); doIt(); }
svoid doIt { loading {
if (ta != null) { text = getText(ta); save('text); }
textRendered = text;
clearAll(nodes, withImage, relations, maybes, coordinates);
for (S s : sentences(text)) {
new Matches m;
if "One node *"
nodes.add($1);
else if "One node * with image" {
nodes.add($1);
withImage.put($1, $1);
} else if "One node * with image *" {
nodes.add($1);
withImage.put($1, $2);
} else if "* to the right of *"
relations.add(Relation("to the right of", node($1), node($2)));
else if "An arrow from * to *"
relations.add(Relation("An arrow from * to *", node($1), node($2));
else if "An arrow * from * to *"
relations.add(Relation("An arrow * from * to *", $1, node($2), node($3)));
}
print("Got nodes: " + sfu(nodes));
print("Got relations: " + sfu(relations));
makeCoordinates();
print("Got coordinates: " + sfu(coordinates));
bool first = canvas == null;
CirclesAndLines newCAL = calFromCoordinates(coordinates, withImage, relations);
canvas = showCAL_2(cal, newCAL, canvas);
if (first) cal = newCAL;
if (first) swing {
increaseFrameWidth(canvas, 300);
addToFrame(canvas, withTopMargin(jcenteredline(
cbMaybe = onChange(jcheckbox(cbMaybe, "Strict interpretation"), f trigger), jbutton("Render again", f trigger))));
setSplitPaneLater(addToWindowSplitRight_aggressive(canvas, ta = typeWriterTextArea(text)), 0.6f);
//onUpdate(ta, f triggerLater);
awtEvery(canvas, interval, new Runnable {
S lastText;
public void run() {
S text = getText(ta);
if (eq(text, lastText)) {
if (neq(text, textRendered))
trigger();
} else
lastText = text;
}
});
}
}}
svoid trigger { thread.trigger(); }
svoid makeCoordinates {
for (S node : nodes) coordinates.put(node, pt(random(100), random(100)));
processRules();
if (isChecked(cbMaybe)) {
migrateList(maybes, relations);
processRules();
}
}
svoid processRules {
for (Relation r : cloneList(relations)) {
if (r.is("to the right of")) {
maybes.add(Relation("on the same height as", r.a(), r.b()));
Pt pa = coordinates.get(r.a()), pb = coordinates.get(r.b());
if (pa != null && pb != null)
pa.x = max(pa.x, pb.x+10);
}
if (r.is("on the same height as")) {
Pt pa = coordinates.get(r.a()), pb = coordinates.get(r.b());
if (pa != null && pb != null)
pa.y = pb.y;
}
}
}
// find node by first line of description
static S node(S s) {
ret s == null ? null
: nodes.contains(s) ? s
: or(firstStartingWithIC(nodes, s + "\n"), s);
}