diff options
author | Sebastian Silva <sebastian@sugarlabs.org> | 2011-11-16 07:56:19 (GMT) |
---|---|---|
committer | Sebastian Silva <sebastian@sugarlabs.org> | 2011-11-16 07:56:19 (GMT) |
commit | 82511a6fe2d29d50c1cdca4b2abb23ff681a1943 (patch) | |
tree | ff6359d68287417abfaaf49e492e2630239e60c9 /app/app.py | |
parent | 61517139f02df2ce417f465dfabdbf5dbe8f4063 (diff) |
Major improvements in IDE usability.
Diffstat (limited to 'app/app.py')
-rw-r--r-- | app/app.py | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/app/app.py b/app/app.py new file mode 100644 index 0000000..40405cb --- /dev/null +++ b/app/app.py @@ -0,0 +1,211 @@ +import os +import sys +from flask import flash,Flask,request,url_for,redirect,session +from flaskext.genshi import Genshi, render_response + +app = Flask(__name__) +app.debug = True +app.secret_key="ilovesugar" +genshi = Genshi(app) + +def shutdown_server(): + func = request.environ.get('werkzeug.server.shutdown') + if func is None: + raise RuntimeError('Not running with the Werkzeug Server') + func() + +def list_files(directory): + files=os.listdir(directory) + print "showing %s" % directory + return sorted(files) + +def identify(filename): + if not os.path.exists(filename): + raise ValueError('File not found') + icon = 'document-generic.png' + mode = '' + directory=os.path.dirname(filename) + icon = 'document-generic.png' + href = '/edit/%s' % filename + if filename.endswith('.py'): + icon = 'text-x-python.png' + mode = 'python' + if filename.endswith('.html'): + icon = 'text-uri-list.png' + mode = 'html' + if filename.endswith('.css'): + icon = 'text-uri-list.png' + mode = 'css' + if filename.endswith('.js'): + icon = 'text-uri-list.png' + mode = 'javascript' + if os.path.isdir(filename): + icon = 'folder.png' + href = '/files/%s' % filename + mode = 'dir' + if filename.endswith('.xo'): + href = '#' + return icon,mode,href + +@app.route('/') +def index(): + try: + directory=session['pwd'] + except KeyError: + directory=u"" + return vsplit(frame2="/files/%s" % directory) + +@app.route('/edit/') +@app.route('/edit/<path:filename>') +def edit(filename): + try: + if len(session['edit_history'])==6: + session['edit_history'].pop(0) + if not filename in session['edit_history']: + session['edit_history'].append(filename) + except KeyError: + session['edit_history']=[filename,] + session.modified = True + icon, mode, href = identify(filename) + content = open(filename).read().decode('utf-8') + tmpl = 'editor.html' + directory=os.path.dirname(filename) + return render_response(tmpl, dict(content=content, icon=icon,basename=os.path.basename(filename), + filename=filename, absdir=os.path.normpath(directory), mode=mode, directory=directory)) + +@app.route('/save', methods=['POST']) +def save(): + filename = request.form['filename'] + f=open(filename,"wb") + content = request.form['content'] + # Ace seems to be confused about newlines + content = content.replace('\r\n', '\n').replace('\r', '\n') + f.write(content.encode('utf-8')) + print "saving content: %s" % filename + f.close() + directory = os.path.dirname(filename) + return "saved" + +@app.route('/chdir', methods=['POST']) +def chdir(): + if request.form['oldproject']!='': + session['project_dir']=os.getenv('HOME')+'/Activities/'+request.form['oldproject'] + with open(session['project_dir']+"/activity/activity.info", 'r') as f: + for line in f: + if line.startswith('name'): + session['project_name']=line[7:-1] + session['pwd']=session['project_home_dir']="." + os.chdir(session['project_dir']) + session['project_home']='/help' + #session['edit_history']=[] + if os.path.isdir('app'): + session['pwd']=session['project_home_dir']='app' + session['project_home']='/edit/app/app.py' + elif os.path.isfile('activity.py'): + session['project_home']='/edit/activity.py' + return vsplit(frame1=session['project_home'], + frame2='/files/%s' % session['pwd']) + +@app.route('/fileshome/') +def browse_home(): + try: + home_dir = session['project_home_dir'] + except KeyError: + home_dir = "." + return browse(home_dir) + +@app.route('/files/') +@app.route('/files/<path:directory>') +def browse(directory='.'): + session['pwd']=directory + + filelist = list_files(directory) + try: + session['project_dir'] + except KeyError: + filelist=[] + files = [] + if not os.path.abspath(directory)==os.path.abspath("."): + files.append( { 'name': '..', + 'icon': 'folder.png', + 'mode': 'dir', + 'href': '/files/%s' % os.path.join(directory,"..") }) + for filename in sorted(filelist): + icon, mode, href = identify(directory + "/" + filename) + if filename.startswith('.'): #hidden files + continue + if filename.endswith('.pyc'): #lets ignore these + continue + files.append( { 'name': filename, + 'icon': icon, + 'mode': mode, + 'href': href } ) + try: + project_name=session['project_name'] + except KeyError: + project_name='None'; + return render_response('filer.html', dict(files=files, + absdir=os.path.normpath(directory), + width=len(files)*94+10,# 94px is each file and 10px margin + project_name=project_name + )) + +@app.route('/delete/<path:filename>') +def delete(filename): + os.unlink(filename) + directory = os.path.dirname(filename) + return help() + +@app.route('/shutdown') +def shutdown(): + shutdown_server() + return 'Goodbye' + +@app.route('/help') +def help(): + port=request.environ.get('SERVER_PORT') + files=list_files(os.getenv('HOME')+'/Activities') + activities = [] + for file in files: + if file.endswith("activity"): + activities.append(file) + files = [] + try: + for filename in session['edit_history']: + icon, mode, href = identify(filename) + files.append( { 'name': os.path.basename(filename), + 'icon': icon, + 'mode': mode, + 'href': href } ) + except: + pass + try: + project_name=session['project_name'] + except KeyError: + project_name='None'; + + return render_response('help.html', dict(port=port, + activities=activities, + project_name=project_name, + edit_history=files)) + +def vsplit(frame1='/help', frame2='/files/'): + return render_response('split-view.html', dict(frame1=frame1, frame2=frame2)) + +@app.route('/split') +def split(): + return vsplit() + +@app.route('/debug') +def debug(): + raise Warning("This is a traceback of the Construct IDE environment. This is what you'll see when there's an error in your program or you manually raise an exception.") + +if __name__=="__main__": + try: + port=int(sys.argv[1]) + except IndexError: + port=5000 + import webbrowser + webbrowser.open("http://localhost:%s/" % port) + #app.run(port=port) # for local only + app.run(host='0.0.0.0', port=port) # open for all |