#! /usr/bin/python import sys import BaseHTTPServer import libxml2 import libxslt import re import urllib from dbxml import * class myHTTPRequestHandler(BaseHTTPServer.BaseHTTPRequestHandler): def query(self,q): css = getCss() script = getScript() preamble = getPreamble(q) try: container = XmlContainer(None, db) container.open(None) xmlResults = container.queryWithXPath(None, q) except: print "QueryFailure" container.close() return "bad query: %s" % q if ( xmlResults.size() == 0 ): return """XPath query of Jon's feeds%s no results """ % (css, script, preamble) l = [] for i in range(xmlResults.size()): result = xmlResults.next().asString(None) try: xmlFragment = libxml2.parseDoc( result ) except: print "NotWellFormed" xmlFragment.freeDoc() container.close() return "bad query: %s" % q xpathChannel = "//item/@channel" xpathTitle = "//title" xpathDate = "//date" xpathLink = "//link" xpathHits = q try: channel = xmlFragment.xpathEval(xpathChannel)[0].content title = xmlFragment.xpathEval(xpathTitle)[0].content date = xmlFragment.xpathEval(xpathDate)[0].content link = urllib.unquote(xmlFragment.xpathEval(xpathLink)[0].content) hits = xmlFragment.xpathEval(xpathHits) except: print "CannotSearchWithinFoundDocument" xmlFragment.freeDoc() container.close() return "bad query: %s" % q try: frags = '' for j in range(len(hits)): frags = frags + '
' + hits[j].serialize() + '

' except: print "CannotSerializeHits" xmlFragment.freeDoc() container.close() return "bad query: %s" % q xmlFragment.freeDoc() xhtml = '

%s (%s, %s)

%s' % ( link, title, channel, date, frags ) l.append ( ( date, xhtml ) ) container.close() l.sort( lambda x, y: cmp ( y[0], x[0] ) ) xhtml = '' for i in range(len(l)): xhtml = xhtml + l[i][1] page = """ XPath query of Jon's feeds %s %s """ % (css, script, preamble, xhtml) return page def do_GET(self): xhtml = self.send_head() self.wfile.write(xhtml) def send_head(self): q = self.requestline.split()[1] q = re.sub('^/\?','',q) q = urllib.unquote(q) xhtml = self.query(q) if ( len (xhtml) > maxchars ): xhtml = "query returned more than %d characters" % maxchars self.send_response(200) self.send_header("Content-type", "text/html") self.send_header("Content-Length", len(xhtml)) self.end_headers() return xhtml def getPreamble(q): preamble = '''
choose xpath query from list, modify/reenter below all paragraphs containing phrase
''' preamble = preamble.replace('__QUERY__', q) option = '