/
main.js
122 lines (95 loc) · 3.48 KB
/
main.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
var evaluator = new Evaluator(
{ write: function(x) { writeToInteractions(x) },
writeError: function(err) { reportError(err) },
compilationServletUrl: "/servlets/standalone.ss",
scriptCompilationServletUrl: "/servlets/standalone.ss"
});
evaluator.setRootLibraryPath("/collects");
var executeButtonPressed = function() {
evaluator.compilationServletUrl = document.getElementById('compilationServletUrl').value;
var interactionText = document.getElementById('textarea');
writeToInteractions(interactionText.value);
blockInput();
evaluator.executeProgram("interactions",
interactionText.value,
function() {
unblockInput() },
function(exn) { reportError(exn);
unblockInput() });
};
var breakButtonPressed = function() {
evaluator.requestBreak();
};
var writeToInteractions = function(thing) {
var history = document.getElementById('history');
if (typeof thing === 'string' || typeof thing === 'number') {
var dom = document.createElement('div');
dom.style['white-space'] = 'pre';
dom.appendChild(document.createTextNode(thing + ''));
history.appendChild(dom);
} else {
history.appendChild(thing);
}
};
var reportError = function(exn) {
// Under google-chrome, this will produce a nice error stack
// trace that we can deal with.
if (typeof(console) !== 'undefined' && console.log &&
exn && exn.stack) {
console.log(exn.stack);
}
var domElt = document.createElement('div');
domElt.style['color'] = 'red';
if (exn.domMessage) {
domElt.appendChild(exn.domMessage);
} else {
domElt.appendChild(document.createTextNode(evaluator.getMessageFromExn(exn)+""));
}
var stacktrace = evaluator.getTraceFromExn(exn);
for (var i = 0; i < stacktrace.length; i++) {
domElt.appendChild(document.createElement("br"));
domElt.appendChild(document.createTextNode(
"in " + stacktrace[i].id +
", at offset " + stacktrace[i].offset +
", line " + stacktrace[i].line +
", column " + stacktrace[i].column +
", span " + stacktrace[i].span));
};
if(types.isExnFailContractArityWithPosition(exn.val)) {
domElt.appendChild(document.createTextNode(types.toDisplayedString(
types.exnFailContractArityWithPositionLocations(exn.val))));
}
writeToInteractions(domElt);
};
var unblockInput = function() {
var interactionText = document.getElementById('textarea');
var executeButton = document.getElementById('executeButton');
interactionText.disabled = false;
executeButton.disabled = false;
interactionText.value = '';
interactionText.focus();
};
var blockInput = function() {
var interactionText = document.getElementById('textarea');
var executeButton = document.getElementById('executeButton');
interactionText.disabled = true;
executeButton.disabled = true;
};
var mainPageLoad = function() {
var interactionText = document.getElementById('textarea');
var executeButton = document.getElementById('executeButton');
unblockInput();
};
//////////////////////////////////////////////////////////////////////
// If we're in the context of an iframe, provide an easyXDM interface to the compiler.
if (window.top !== window) {
new easyXDM.Rpc({}, {
local: {
compileProgram: {
method: function(name, programText, fn, fnError){
evaluator.compileProgram(name, programText, fn, fnError);
}
}
}
});
}