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 >
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 >
4952var gsversion = 2.7
53+ var printpane = false
5054
5155var glowscript_run = undefined
5256
5357// localCompile is a modification of https://github.com/BruceSherwood/glowscript/blob/master/ide/ide.js
5458function 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"
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 ) } )
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)
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 ,
130134
131135var 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-
144137function 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
150158function ready ( sc ) {
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 ( )
178186< input type ="file " id ="read_local_file "/>
179187
180188< script >
189+
181190function 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}
193210document . getElementById ( 'read_local_file' ) . addEventListener ( 'change' , readSingleFile , false )
194211</ script >
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
206224var 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
212230function 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 >
0 commit comments