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 <%args> content name path uri <%method title> <%args scope="subrequest"> name Source of <% name %> Source of <% path %>/<% name %> (download)
<% content %>
""" dirlist = """ <%args> directories files name binfiles parent path <%method title> <%args scope="subrequest"> name Listing of <% name %>
Source Code Listing of <% path %>/<% name %>/

(parent directory)
% for directory in directories: <% directory %>/
% % for file in files: <% file %>
% % for file in binfiles: <% file %>
%
""" 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)