import myghty.component
import myghty.request as request
import highlight
import os
import posixpath as unixpath
"""module components for source code viewing, path translation dhandler.
this package illustrates how to create small template-based components
within a module component, and also how to write a dhandler as a module
component."""
class ViewSource(myghty.component.ModuleComponent):
def do_component_init(self, **params):
comp = """
<%global>
import posixpath as unixpath
%global>
<%args>
content
name
path
uri
%args>
<%method title>
<%args scope="subrequest">
name
%args>
Source of <% name %>
%method>
(download)
<% content %>
"""
dirlist = """
<%args>
directories
files
name
binfiles
parent
path
%args>
<%method title>
<%args scope="subrequest">
name
%args>
Listing of <% name %>
%method>
"""
self.viewsource = request.instance().interpreter.make_component(comp)
self.dirlisting = request.instance().interpreter.make_component(dirlist)
def do_run_component(self, m, r, ARGS, **params):
filename = r.filename
source_uri = m.interpreter.attributes['source_uri']
if filename.endswith('/index'):
(filename, index) = unixpath.split(filename)
fileuri = filename[len(unixpath.commonprefix([m.interpreter.attributes['source_root'], filename])):]
if os.path.isdir(filename):
listing = os.listdir(filename)
files = filter(lambda f: not f.endswith(".pyc") and os.path.isfile(os.path.join(filename, f)), listing)
binfiles = filter(lambda f: f.endswith(".pyc") and os.path.isfile(os.path.join(filename, f)), listing)
directories = filter(lambda f: os.path.isdir(os.path.join(filename, f)), listing)
(path, name) = unixpath.split(fileuri)
(parent, n2) = unixpath.split(m.get_request_path())
parent = unixpath.join(parent, '..', 'index')
m.subexec(self.dirlisting, directories = directories, files = files, binfiles = binfiles, path=path, name=name, parent = parent)
else:
try:
f = file(filename)
except IOError:
m.abort(404)
r.content_type = 'text/html'
s = f.read()
if ARGS.get('type', None) == 'plain':
r.content_type = 'text/plain'
m.write(s)
return
s = highlight.highlight(s, filename = fileuri)
(path, name) = unixpath.split(fileuri)
(uri, n2) = unixpath.split(m.get_request_path())
uri = unixpath.join(uri, 'index')
m.subexec(self.viewsource, content = s, uri = uri, path = path, name=name)