#!/bin/env python # -*- coding: UTF-8 -*- import os import os.path import sys import cherrypy from genshi.template import TemplateLoader loader = TemplateLoader( os.path.join(os.path.dirname(__file__), 'templates'), auto_reload=True) class Root(object): def __init__(self, data): self.data = data @cherrypy.expose def index(self): port = cherrypy.config['server.socket_port'] return '''Server is running on port %s.
Try pointing a browser at http://localhost:%s/www/index.html''' % (port, port, port) @cherrypy.expose def debug(self): port = cherrypy.config['server.socket_port'] return '''Try right clicking on any element on the main canvas and choosing "Inspect Element".
Return to main''' % (port) @cherrypy.expose def candy(self): return '''Not yet implemented.
Return to main''' % (port) @cherrypy.expose def journal(self): port = cherrypy.config['server.socket_port'] return '''Not yet implemented.
Return to main''' % (port) @cherrypy.expose def collaboration(self): port = cherrypy.config['server.socket_port'] return '''Not yet implemented.
Return to main''' % (port) def list_files(self, directory): files=os.listdir(directory) print "showing %s" % directory return files @cherrypy.expose def browse(self, directory="."): filelist = self.list_files(directory) files = [] if not os.path.abspath(directory)==os.path.abspath("."): files.append( { 'name': '..', 'icon': 'folder.svg', 'href': 'browse?directory=%s' % os.path.join(directory,"..") }) for filename in sorted(filelist): fullname = os.path.join(directory,filename) icon = 'document-generic.svg' href = 'edit?filename=%s&directory=%s' % (fullname,directory) if filename.endswith('.py'): icon = 'text-x-python.svg' if filename.endswith('.html'): icon = 'text-uri-list.svg' if filename.endswith('.css'): icon = 'text-uri-list.svg' if filename.endswith('.js'): icon = 'text-uri-list.svg' if os.path.isdir(fullname): icon = 'folder.svg' href = 'browse?directory=%s' % fullname if filename.endswith('.xo'): href = '#' if filename.startswith('.'): continue if filename.endswith('.pyc'): continue files.append( { 'name': filename, 'icon': icon, 'href': href } ) tmpl = loader.load('filer.html') return tmpl.generate(files=files, absdir=os.path.normpath(directory) ).render('html', doctype='html') @cherrypy.expose def vsplit(self, frame1="/browse", frame2="/browse"): tmpl = loader.load('split-view.html') return tmpl.generate(frame1=frame1, frame2=frame2 ).render('html', doctype='html') @cherrypy.expose def edit(self, directory=".", filename="activity.py"): icon = 'document-generic.svg' mode = '' if filename.endswith('.py'): icon = 'text-x-python.svg' mode = 'python' if filename.endswith('.html'): icon = 'text-uri-list.svg' mode = 'html' if filename.endswith('.css'): icon = 'text-uri-list.svg' mode = 'css' if filename.endswith('.js'): icon = 'text-uri-list.svg' mode = 'javascript' content = open(filename).read().decode('utf-8') tmpl = loader.load('editor.html') return tmpl.generate(content=content, icon=icon,basename=os.path.basename(filename), filename=filename, directory=directory, absdir=os.path.normpath(directory), mode=mode).render('html', doctype='html', encoding='utf-8') @cherrypy.expose def save(self, filename, content, directory): f=open(filename,"wb") content = content.replace('\r\n', '\n').replace('\r', '\n') # HACK f.write(content) print "saving content: %s" % filename f.close() href = "/browse?directory=%s" % directory cherrypy.tools.redirect.callable(url=href, internal=False) return "content saved: %s" % content @cherrypy.expose def delete(self, filename): os.unlink(filename) cherrypy.tools.redirect.callable(url='/browse', internal=True) def start(port=8080): data = {} # We'll replace this later # Some global configuration; note that this could be moved into a # configuration file cherrypy.config.update({ 'server.socket_port': port, 'tools.encode.on': True, 'tools.encode.encoding': 'utf-8', 'tools.decode.on': True, 'tools.trailing_slash.on': True, 'tools.staticdir.root': os.path.abspath(os.path.dirname(__file__)), }) cherrypy.quickstart(Root(data), '/', { '/www': { 'tools.staticdir.on': True, 'tools.staticdir.dir': 'www' } }) if __name__ == '__main__': start(int(sys.argv[1]))