#!/usr/bin/env python """ metakey.py - Metadata Templating Author: Sean B. Palmer, inamidst.com """ import cgitb; cgitb.enable() import sys, os, re, urlparse from imp import load_source as load sitemap = load('sitemap', 'sitemap.cgi') meta = '../meta' r_template = re.compile('') def strip(start, text): if text.startswith(start): return text[len(start):] return text def urijoin(site, *parts): path = os.path.join(*parts) normpath = os.path.normpath(path) if path.endswith('/'): normpath += '/' return urlparse.urljoin(site, path) def urisplit(uri): scheme, host, path, query, fragid = urlparse.urlsplit(uri) if not scheme and not host: return '/', path return '%s://%s/' % (scheme, host), path def fileinfo(path): metadata = {} f = open(path) for line in f: line = line.rstrip('\r\n') if (not line.startswith('#')) and line: metadata.__setitem__(*line.split(': ', 1)) else: continue f.close() return metadata def makelink(uri, metadata): if metadata.has_key('keywords'): keywords = frozenset(metadata['keywords'].split(' ')) else: keywords = frozenset([]) # if 'highlight' in keywords: # link = '%s*' # else: link = '%s' result = link % (uri, metadata.get('title')) if ('cgi' in keywords) or ('svc' in keywords): site, path = urisplit(uri) srcuri = urlparse.urljoin(site, 'inside' + path) result += ' (src)' % srcuri return result + ' - ' + metadata.get('description') def bykeyword(keyword): result = [] for root, dirs, files in os.walk(meta): if root == meta: del dirs[dirs.index('meta')] files.remove('.htaccess') files.remove('index.cgi') dirname = '/' + root[len(meta):].lstrip('/') for filename in files: metafn = os.path.join(root, filename) metadata = fileinfo(metafn) path = os.path.join(dirname, filename) if path.endswith('/index'): path = path[:-5] if metadata.has_key('keywords'): keywords = frozenset(metadata['keywords'].split(' ')) if keyword in keywords: result.append((path, metafn, metadata)) return sorted(result) def getclass(metadata): return '' # @@ if metadata.has_key('keywords'): keywords = frozenset(metadata['keywords'].split(' ')) if 'act' in keywords: return ' class="act"' if 'code' in keywords: return ' class="code"' if 'doc' in keywords: return ' class="doc"' if 'pub' in keywords: return ' class="pub"' if 'svc' in keywords: return ' class="svc"' return '' def html(files): result = ['') return '\n'.join(result) def mkhtml(m): keyword = m.group(1) if keyword != 'sitemap': files = bykeyword(keyword) print html(files) else: print sitemap.sitemap() def main(): f = open(sys.argv[1]) for line in f: if r_template.match(line): print r_template.sub(mkhtml, line) else: sys.stdout.write(line) f.close() if __name__=="__main__": main()