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/') 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/') 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/') 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