#! /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 = '