|
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