|
59 | 59 |
|
60 | 60 |
|
61 | 61 | <script>
|
62 |
| -var gsversion = '3.2' |
63 |
| -var printpane = false |
64 |
| -var exporting = false // not currently in export mode |
65 |
| -var lastprintwidth = null |
| 62 | +const gsversion = '3.2' |
| 63 | +let printpane = false |
| 64 | +let exporting = false // not currently in export mode |
| 65 | +let lastprintwidth = null |
| 66 | +let usertext |
| 67 | +let lang |
66 | 68 |
|
67 | 69 | window.Jupyter_VPython = undefined
|
68 | 70 | if (!navigator.onLine) window.Jupyter_VPython = 'glowscript_data/' // get textures when offline
|
69 | 71 |
|
70 | 72 | // TAB at end of line should lengthen the line; implement Ctrl-1 and Ctrl-2
|
71 | 73 |
|
72 | 74 | // localCompile is a modification of https://github.com/vpython/glowscript/blob/master/ide/ide.js
|
73 |
| -function localCompile(header, compReady, errordiv) { |
74 |
| - header.source = 'GlowScript '+gsversion+' VPython\n'+header.source |
| 75 | +function localCompile(compReady, errordiv) { |
75 | 76 | errordiv.innerHTML = ""
|
76 |
| - var compiler_url |
77 |
| - if (header.lang == 'vpython') { |
78 |
| - compiler_url = "glowscript_libraries/RScompiler." + header.version + ".min.js" |
79 |
| - } else compiler_url = "glowscript_libraries/compiler." + header.version + ".min.js" |
| 77 | + let compiler_url |
| 78 | + if (lang == 'vpython') { |
| 79 | + compiler_url = "glowscript_libraries/RScompiler." + gsversion + ".min.js" |
| 80 | + } else |
| 81 | + compiler_url = "glowscript_libraries/compiler." + gsversion + ".min.js" |
80 | 82 | window.glowscript_compile = undefined
|
81 | 83 | $.ajax({
|
82 | 84 | url: compiler_url,
|
|
91 | 93 | alert("Failed to load compiler from " + compiler_url)
|
92 | 94 | return
|
93 | 95 | }
|
94 |
| - |
95 |
| - var embedScript |
| 96 | + |
| 97 | + let embedScript |
96 | 98 | try {
|
97 |
| - embedScript = window.glowscript_compile(header.source, {lang: header.lang, |
98 |
| - version: header.version.substr(0,3)}) |
| 99 | + embedScript = window.glowscript_compile(usertext, {lang: lang, version: gsversion}) |
| 100 | + // version: header.version.substr(0,3)}) |
99 | 101 | } catch(err) { // need to decrement 3 -> 2 in Error: Missing right parenthesis, see line 3: b = box(pos=37
|
100 | 102 | err = err.toString() // gets the error message
|
101 |
| - var patt = new RegExp('line(\\s*)([0-9]*):') |
102 |
| - var m = err.match(patt) |
| 103 | + const patt = new RegExp('line(\\s*)([0-9]*):') |
| 104 | + let m = err.match(patt) |
103 | 105 | if (m !== null) {
|
104 | 106 | var colonindex = m.index + 4 + m[1].length + m[2].length
|
105 | 107 | var n = parseFloat(m[2])-1
|
|
112 | 114 | })
|
113 | 115 | }
|
114 | 116 |
|
115 |
| -function parseVersionHeader( source ) { |
116 |
| - var sourceLines = source.split("\n") |
117 |
| - var header = sourceLines[0] |
118 |
| - // Remove a newline or similar character at the end of header: |
119 |
| - if (header.charCodeAt(header.length-1) < 32) |
120 |
| - header = header.substring(0,header.length-1) |
121 |
| - var rest = source.substring( header.length+1 ) |
122 |
| - var ret = { |
123 |
| - version: null, |
124 |
| - lang: '', // 'vpython' (default) or 'rapydscript' or 'javascript' or a string that is neither (e.g. when editing header) |
125 |
| - source: rest, |
126 |
| - ok: false, |
127 |
| - unpackaged: false, |
128 |
| - isCurrent: false |
129 |
| - } |
130 |
| - header = header.split(" ") |
131 |
| - if (header.length === undefined) return ret |
132 |
| - if (header[0] == ' ') return ret |
133 |
| - var elements = [] |
134 |
| - for (var i=0; i<header.length; i++) { // remove empty strings corresponding to spaces |
135 |
| - if (header[i] != '') elements.push(header[i]) |
136 |
| - } |
137 |
| - if (elements.length < 2 || elements.length > 3) return ret |
138 |
| - if (elements[0] != 'GlowScript') return ret |
139 |
| - ret.lang = 'javascript' // the default if no language is specified |
140 |
| - if (elements.length == 3) { |
141 |
| - ret.lang = elements[2].toLowerCase() |
142 |
| - if (!(ret.lang == 'javascript' || ret.lang == 'vpython')) return ret |
143 |
| - } |
144 |
| - var ver = elements[1] |
145 |
| - if (ver != gsversion) alert('The version number, '+ver+', should be '+gsversion) |
146 |
| - var okv = true |
147 |
| - return { |
148 |
| - version: ver, |
149 |
| - lang: ret.lang, |
150 |
| - source: rest, |
151 |
| - } |
152 |
| -} |
| 117 | +let wp = 'Web VPython '+gsversion |
| 118 | +let js = 'JavaScript '+gsversion |
| 119 | + |
| 120 | +const r0 = new RegExp('\\s*from\\s*vpython\\s*import\\s*\\*\\s*\n') // no version number |
| 121 | +const r1 = new RegExp('\\s*Web\\s*VPython\\s*([[1-9]\\.[1-9])\\s*\n') |
| 122 | +const r2 = new RegExp('\\s*\\sGlowScript\\s*([[1-9]\\.[1-9])\\s*VPython\\s*\n') |
| 123 | +const r3 = new RegExp('\\s*\\sGlowScript\\s*([[1-9]\\.[1-9])\\s*JavaScript\\s*\n') |
| 124 | +const r4 = new RegExp('\\s*JavaScript\\s*([[1-9]\\.[1-9])\\s*\n') |
| 125 | +const r5 = new RegExp('\\s*GlowScript\\s*([[1-9]\\.[1-9])\\s*\n') |
| 126 | +let langtype = [ [r0, wp], [r1, wp], [r2, wp], [r3, js], [r4, js], [r5,js] ] |
153 | 127 |
|
154 | 128 | function getHeader(exporting) {
|
155 |
| - var text = GSedit.getValue() |
156 |
| - var end = text.indexOf('\n') |
157 |
| - var i = text.slice(0,end).indexOf("GlowScript") // Look for "GlowScipt" in first line |
158 |
| - var j = text.slice(0,end).indexOf("vpython") // Look for "vpython" in first line |
159 |
| - if (i < 0 && j) text = "GlowScript "+gsversion+" VPython" + "\n" + text |
160 |
| - var header = parseVersionHeader(text) |
161 |
| - printpane = false |
162 |
| - if (header.source.search(/print\s*\(/) >= 0) { // if the program uses print() or GSprint(), expand 3rd pane |
163 |
| - printpane = true |
164 |
| - if (!exporting) { |
165 |
| - var end = header.source.indexOf('\n') |
166 |
| - var insert |
167 |
| - var w = (lastprintwidth === null) ? 300 : 0.01*lastprintwidth*window.innerWidth |
168 |
| - if (header.lang == 'vpython') |
169 |
| - insert = "print_options(place=$('#printing'), width="+w+", height=window.innerHeight, clear=True)\n" |
170 |
| - else insert = "print_options({place:$('#printing'), width:"+w+", height:window.innerHeight, clear:true})\n" |
171 |
| - header.source = insert + header.source |
| 129 | + usertext = GSedit.getValue() |
| 130 | + let end = usertext.indexOf('\n') |
| 131 | + let firstline = usertext.slice(0,end+1) |
| 132 | + lang = null |
| 133 | + for (let i=0; i<langtype.length; i++) { |
| 134 | + let m = firstline.match(langtype[i][0]) |
| 135 | + if (m !== null) { |
| 136 | + usertext = langtype[i][1] + usertext.slice(end) |
| 137 | + lang = 'vpython' |
| 138 | + if (i>2) lang = 'javascript' |
| 139 | + break |
172 | 140 | }
|
173 | 141 | }
|
174 |
| - // Look for mention of MathJax in program and attempt to get it (need internet access; files too big to include in package) |
175 |
| - if (header.source.indexOf('MathJax') >= 0) { |
176 |
| - alert('Cannot currently use MathJax in GlowScript Offline.') |
| 142 | + if (lang == null) { |
| 143 | + usertext = wp+'\n'+usertext |
| 144 | + lang = 'vpython' |
177 | 145 | }
|
178 |
| - return header |
| 146 | + GSedit.setValue(usertext) |
| 147 | + return usertext |
179 | 148 | }
|
180 | 149 |
|
181 |
| -var gsErrordiv |
182 |
| -var savecode = null |
| 150 | +let gsErrordiv |
| 151 | +let savecode = null |
183 | 152 |
|
184 | 153 | function runCode() {
|
185 |
| - var header = getHeader(false) |
| 154 | + usertext = getHeader(false) |
186 | 155 | splitAdjust()
|
187 | 156 | gsErrordiv = $("#gserrors")[0]
|
188 |
| - localCompile(header, ready, gsErrordiv, false) |
| 157 | + localCompile(ready, gsErrordiv) |
189 | 158 | }
|
190 | 159 |
|
191 | 160 | async function runprog(prog) {
|
|
215 | 184 |
|
216 | 185 | } else { // Export operation
|
217 | 186 | exporting = true
|
218 |
| - var header = getHeader(true) |
| 187 | + //var header = getHeader(true) |
219 | 188 | gsErrordiv = $("#gserrors")[0]
|
220 |
| - localCompile(header, showcode, gsErrordiv) |
| 189 | + localCompile(showcode, gsErrordiv) |
221 | 190 | }
|
222 | 191 | }
|
223 | 192 |
|
224 | 193 | function showcode(sc) {
|
225 | 194 | // In creating the string embedHTML it was necessary to break 'script' into 'scr'+'ipt' to avoid problems parsing GlowScript.html
|
226 |
| - var exporturl = "https://s3.amazonaws.com/glowscript/" |
227 |
| - var verdir = '2.1' |
228 |
| - var divid = "glowscript" |
229 |
| - var embedHTML = ( |
| 195 | + let exporturl = "https://www.glowscript.org/" |
| 196 | + let divid = "glowscript" |
| 197 | + let jqversion = '2.1' |
| 198 | + let embedHTML = ( |
230 | 199 | '<div id="' + divid + '" class="glowscript">\n' +
|
231 |
| - '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' + |
232 |
| - '<link type="text/css" href="'+exporturl+'css/redmond/' + verdir + '/jquery-ui.custom.css" rel="stylesheet" />\n' + |
| 200 | + '<meta http-equiv="Content-Type" content="text/html; charset=utf-8">' + '\n' + |
| 201 | + '<link type="text/css" href="'+exporturl+'css/redmond/' + jqversion + '/jquery-ui.custom.css" rel="stylesheet" />\n' + |
233 | 202 | '<link type="text/css" href="' + exporturl + 'css/ide.css" rel="stylesheet" />\n' +
|
234 |
| - '<scr'+'ipt type="text/javascript" src="' + exporturl + 'lib/jquery/' + verdir + '/jquery.min.js"></scr'+'ipt>\n' + |
235 |
| - '<scr'+'ipt type="text/javascript" src="' + exporturl + 'lib/jquery/' + verdir + '/jquery-ui.custom.min.js"></scr'+'ipt>\n' + |
| 203 | + '<scr'+'ipt type="text/javascript" src="' + exporturl + 'lib/jquery/' + jqversion + '/jquery.min.js"></scr'+'ipt>\n' + |
| 204 | + '<scr'+'ipt type="text/javascript" src="' + exporturl + 'lib/jquery/' + jqversion + '/jquery-ui.custom.min.js"></scr'+'ipt>\n' + |
236 | 205 | '<scr'+'ipt type="text/javascript" src="' + exporturl + 'package/glow.' + gsversion + '.min.js"></scr'+'ipt>\n' +
|
237 | 206 | '<scr'+'ipt type="text/javascript" src="' + exporturl + 'package/RSrun.' + gsversion + '.min.js"></scr'+'ipt>\n' +
|
238 | 207 | '<scr'+'ipt type="text/javascript"><!--//--><![CDATA[//><!--\n' +
|
|
429 | 398 | }
|
430 | 399 | }
|
431 | 400 | if (L === undefined) continue
|
432 |
| - var N = Number(L)-1 |
| 401 | + var N = Number(L) |
433 | 402 | if (first) traceback.push('At or near line '+N+': '+window.__original.text[N-1])
|
434 | 403 | else traceback.push('Called from line '+N+': '+window.__original.text[N-1])
|
435 | 404 | first = false
|
|
0 commit comments