Skip to content

Commit 6eeb904

Browse files
committed
Clean up some errors in preprocessing of quote marks.
1 parent e660f61 commit 6eeb904

8 files changed

Lines changed: 1341 additions & 66 deletions

File tree

‎GlowScriptOffline/GlowScript.html‎

Lines changed: 76 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<html>
33
<head>
44
<!-- Using GlowScript locally, based on the work of Vesa Lappalainen vesal@jyu.fi -->
5-
<title>Local GlowScript</title>
5+
<title>GlowScript Offline</title>
66
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
77

88
<style>
@@ -37,22 +37,26 @@
3737
</head>
3838

3939
<body class="GlowScriptBody">
40+
<link type="text/css" href="glowscript_libraries/jquery-ui.custom.css" rel="stylesheet" />
4041
<link type="text/css" href="glowscript_libraries/ide.css" rel="stylesheet" />
42+
<script type="text/javascript" src="glowscript_libraries/MathJax2.7.0-TeX-MML-AM_CHTML.js"></script>
4143
<script type="text/javascript" src="glowscript_libraries/jquery.min.js"></script>
4244
<script type="text/javascript" src="glowscript_libraries/jquery-ui.custom.min.js"></script>
4345
<script type="text/javascript" src="glowscript_libraries/editor.js"></script>
4446
<script type="text/javascript" src="glowscript_libraries/RSrun.2.7.min.js"></script>
4547
<script type="text/javascript" src="glowscript_libraries/glow.2.7.min.js"></script>
48+
<script type="text/javascript" src="glowscript_libraries/split.min.js"></script>
4649
</body>
4750

4851
<script>
4952
var gsversion = 2.7
53+
var printpane = false
5054

5155
var glowscript_run = undefined
5256

5357
// localCompile is a modification of https://github.com/BruceSherwood/glowscript/blob/master/ide/ide.js
5458
function localCompile(header, compReady, errordiv) {
55-
errordiv.innerHTML = ""
59+
errordiv.innerHTML = ""
5660
var compiler_url
5761
if (header.lang == 'vpython' || header.lang == 'rapydscript') {
5862
compiler_url = "glowscript_libraries/RScompiler." + header.version + ".min.js"
@@ -64,15 +68,15 @@
6468
cache: true,
6569
crossDomain: true // use script tag rather than xhr
6670
}).fail(function (xhr, err, exc) {
67-
(xhr);
71+
(xhr)
6872
alert(err + " getting " + xhr.url + ": " + exc)
6973
}).done(function () {
7074
if (!window.glowscript_compile) {
7175
alert("Failed to load compiler from " + compiler_url)
7276
return
7377
}
7478

75-
var embedScript;
79+
var embedScript
7680
try {
7781
embedScript = window.glowscript_compile(header.source, {lang: header.lang,
7882
version: header.version.substr(0,3)})
@@ -89,14 +93,13 @@
8993
})
9094
}
9195

92-
function parseVersionHeader( source ) { // null if sourceLines already exists
93-
if (source !== null) sourceLines = source.split("\n")
94-
else source = 'already exists\n'
96+
function parseVersionHeader( source ) {
97+
var sourceLines = source.split("\n")
9598
var header = sourceLines[0]
9699
// Remove a newline or similar character at the end of header:
97100
if (header.charCodeAt(header.length-1) < 32)
98101
header = header.substring(0,header.length-1)
99-
var rest = source.substr( header.length+1 )
102+
var rest = source.substring( header.length+1 )
100103
var ret = {
101104
version: null,
102105
lang: '', // 'vpython' (default) or 'rapydscript' or 'javascript' or a string that is neither (e.g. when editing header)
@@ -120,7 +123,8 @@
120123
if (!(ret.lang == 'javascript' || ret.lang == 'rapydscript' || ret.lang == 'vpython')) return ret
121124
}
122125
var ver = elements[1]
123-
var okv = true;
126+
if (ver != gsversion) alert('The version number, '+ver+', should be '+gsversion)
127+
var okv = true
124128
return {
125129
version: ver,
126130
lang: ret.lang,
@@ -130,21 +134,25 @@
130134

131135
var gsErrordiv
132136

133-
function runJavaScript(text,userargs,userinput, wantsConsole) {
134-
var i = text.indexOf("GlowScript")
135-
if ( i > 0 ) text = text.substring(i)
136-
if ( text.indexOf("//\n") == 0 ) text = text.substring(3)
137-
if ( i < 0 ) text = "GlowScript "+gsversion+" VPython" + "\n" + text
138-
var csHeader = parseVersionHeader(text)
139-
gsErrordiv = $("#gserrors")[0]
140-
localCompile(csHeader, ready, gsErrordiv)
141-
return ""
142-
}
143-
144137
function runCode() {
145-
//var sc = $("#sourcetext").val()
146-
var sc = GSedit.getValue()
147-
runJavaScript(sc);
138+
var text = GSedit.getValue()
139+
var end = text.indexOf('\n')
140+
var i = text.slice(0,end).indexOf("GlowScript") // Look for "GlowScipt" in first line
141+
if (i < 0 && text.indexOf('from vpython') === 0) text = "GlowScript "+gsversion+" VPython" + "\n" + text
142+
var header = parseVersionHeader(text)
143+
printpane = false
144+
if (header.source.indexOf('print(') >= 0) { // if the program uses print() or GSprint(), expand 3rd pane
145+
printpane = true
146+
var end = header.source.indexOf('\n')
147+
var insert
148+
if (header.lang == 'vpython' || header.lang == 'rapydscript')
149+
insert = "print_options(place=$('#printing'), width=300, height=500, clear=True)\n"
150+
else insert = "print_options({place:$('#printing'), width:300, height:500, clear:true})\n"
151+
header.source = header.source.slice(0,end+1) + insert + header.source.slice(end+1)
152+
}
153+
splitAdjust()
154+
gsErrordiv = $("#gserrors")[0]
155+
localCompile(header, ready, gsErrordiv)
148156
}
149157

150158
function ready(sc) {
@@ -154,7 +162,7 @@
154162
window.__context = { glowscript_container: $(".glowscript").removeAttr("id") }
155163

156164
// TODO: how to set an error handler???
157-
window.__context.errorHandler =gsErrorHandler
165+
window.__context.errorHandler = gsErrorHandler
158166

159167
runScript = new Function(sc)
160168
runScript()
@@ -178,17 +186,26 @@
178186
<input type="file" id="read_local_file"/>
179187

180188
<script>
189+
181190
function readSingleFile(evt) {
182-
var f, reader
183-
f = evt.target.files[0];
184-
if (f) {
185-
reader = new FileReader();
186-
reader.onload = function(e) {
187-
var content = e.target.result
188-
GSedit.setValue(content)
189-
}
190-
reader.readAsText(f)
191-
}
191+
var ok = true
192+
if (GSedit.changed()) {
193+
var s = "To continue without saving, click OK.\nTo save, click Cancel, then copy and paste into an application such as Notepad or TextEdit."
194+
if (confirm(s)) ok = true
195+
else ok = false
196+
}
197+
if (ok) {
198+
var f, reader
199+
f = evt.target.files[0]
200+
if (f) {
201+
reader = new FileReader()
202+
reader.onload = function(e) {
203+
var content = e.target.result
204+
GSedit.setValue(content)
205+
}
206+
reader.readAsText(f)
207+
}
208+
}
192209
}
193210
document.getElementById('read_local_file').addEventListener('change', readSingleFile, false)
194211
</script>
@@ -198,28 +215,45 @@
198215

199216
<div class='api'>
200217
<div id='sourcetext' class="split split-horizontal"></div>
201-
<div id ="glows" class="split split-horizontal"></div>
218+
<div id='glows' class="split split-horizontal"></div>
219+
<div id='printing' class="split split-horizontal"></div>
202220
</div>
203221

204-
<script type="text/javascript" src="glowscript_libraries/split.min.js"></script>
205222
<script>
223+
// Splits library: https://github.com/nathancahill/Split.js
206224
var lastwindowwidth = window.innerWidth
207-
var splits = Split(['#sourcetext', '#glows'], {sizes: [50,50], onDrag:splitdrag})
225+
var splits = Split(['#sourcetext', '#glows', "#printing"], {sizes: [50,50,0], onDrag:splitdrag})
208226
// splits.getSizes() returns current percentage widths; splits.setSizes([w1,w2]) resets them
209-
var s = 'from vpython import *\nbox()'
210-
GSedit.init("#sourcetext", s, 0.5*lastwindowwidth, false) // not readonly
227+
var source = 'from vpython import *\nbox()'
228+
GSedit.init("#sourcetext", source, 0.5*lastwindowwidth, false) // not readonly
211229

212230
function splitdrag() {
213-
var s = splits.getSizes() // returns [width1, width2]
231+
var s = splits.getSizes() // returns [width1, width2, width3]
214232
GSedit.setwidth(0.01*s[0]*window.innerWidth)
215233
}
216234

217-
$(window).resize(function () {
235+
function splitAdjust() { // p is true if print pane shouold be open
218236
var current = splits.getSizes()
219237
var w1 = current[0]*lastwindowwidth/window.innerWidth
238+
var w2 = current[1]
239+
var w3 = current[2]
240+
var rest = 100-w1
220241
lastwindowwidth = window.innerWidth
221-
splits.setSizes([w1,100-w1])
242+
if (printpane) splits.setSizes([w1,0.7*rest,0.3*rest])
243+
else splits.setSizes([w1,rest,0])
222244
GSresize(0.01*w1*window.innerWidth)
245+
}
246+
247+
$(window).resize(function () {
248+
splitAdjust()
223249
})
250+
251+
window.onbeforeunload = function(e) { // Some browsers just say "Do you want to leave this site? Changes you made may not be saved."
252+
var s = "To continue without saving, click OK.\nTo save, click Cancel, then copy and paste into an application such as Notepad or TextEdit."
253+
e.returnValue = s
254+
if (GSedit.changed()) return s
255+
else return
256+
}
257+
224258
</script>
225259
</html>

‎GlowScriptOffline/glowscript_libraries/editor.js‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,19 +21,24 @@ var wmargin = 50 // from right edge of text to right edge of window
2121
var hmargin = 50 // from bottom of text to bottom of window
2222
var numberwidth = 50 // width of line number area
2323
var initialized = false
24+
var original
2425

2526
var GSedit = {linenumbersarea:null, editarea: null, readonly:true, source:null, change:null}
2627

2728
GSedit.getValue = function () { return GSedit.editarea.val() }
2829

2930
GSedit.setValue = function (source) {
3031
GSedit.editarea.val(source)
32+
original = GSedit.editarea.val() // important to save in the form it has in the textarea, else GSedit.changed() fails
3133
GSupdate()
3234
GSedit.editarea.scrollTop(0)
3335
}
3436

37+
GSedit.changed = function () {
38+
return GSedit.editarea.val() != original
39+
}
40+
3541
GSedit.setwidth = function(w) { // w is the width used by the program text; affected by dragging divider between text and display
36-
console.log('GSedit.setwidth', w)
3742
GSedit.editarea.css('width', w-numberwidth-wmargin)
3843
}
3944

@@ -52,6 +57,7 @@ GSedit.init = function(placement, source, width, readonly) {
5257
'monospace').css('font-size', '13px').css('width', w).css('height', h).css('border', '0').css('outline', 'none').css('line-height', '15px')
5358
GSedit.linenumbersarea.val('1')
5459
GSedit.editarea.val(source)
60+
original = GSedit.editarea.val() // important to save in the form it has in the textarea, else GSedit.changed() fails
5561
GSedit.editarea.attr('readonly', GSedit.readonly)
5662
GSedit.editarea[0].addEventListener('keyup', GScheck)
5763
GSedit.editarea[0].addEventListener('cut', GScutpaste)

‎GlowScriptOffline/glowscript_libraries/glow.2.7.min.js‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)