The code below will get input from users (if no input, the default value is sin(x)), parsed it to function python understand, and then eval it for given variable (in this code, x=10). After computed, it's inserted to template that resembling html code. Thus, since it's displayed in html style, we could add our customization (background, css, etc)
Here's the code
#!/usr/bin/python
# -*- coding: utf-8 -*-
import BaseHTTPServer, urllib, re
import sys,parser
from math import *
class Handler(BaseHTTPServer.BaseHTTPRequestHandler):
template = u"""<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN"
"http://www.w3.org/TR/html4/strict.dtd"><html><head><title>%s</title>
</head><body><h1>%s</h1><pre>%s</pre>Function<form action="" method="POST"
class="editor"><div><textarea name="text">%s</textarea><input type="submit"
value="Compute"></div></form></body></html>"""
def escape_html(self, text):
"""Replace special HTML characters with HTML entities"""
return text.replace(
"&", "&").replace(">", ">").replace("<", "<")
def link_repl(self, match):
"""Return HTML for link"""
title = match.group(1)
if title in self.server.pages:
return u"""<a href="%s">%s</a>""" % (title, title)
return u"""%s<a href="%s">?</a>""" % (title, title)
def do_HEAD(self):
"""Send response headers"""
self.send_response(200)
self.send_header("content-type", "text/html;charset=utf-8")
self.end_headers()
def do_GET(self):
"""Send page text"""
self.do_HEAD()
page = self.escape_html(urllib.unquote(self.path.strip('/')))
text = self.escape_html(self.server.pages.get(page, "sin(x)"))
parsed = re.sub(r"\[\[([^]]+)\]\]", self.link_repl, text)
#hitung fungsi
fungsi=parser.expr(parsed).compile()
x = 10
y = eval(fungsi)
tout = 'The value of ',parsed, ' on x = ',x,' is ',y
tout = str(tout)
tout = re.sub(r",", "", tout)
tout = re.sub(r"\'", "", tout)
tout= tout[1:]
tout= tout[:-1]
self.wfile.write(self.template % (page, page, tout, text))
def do_POST(self):
"""Save new page text and display it"""
length = int(self.headers.getheader('content-length'))
if length:
text = self.rfile.read(length)
page = self.escape_html(urllib.unquote(self.path.strip('/')))
self.server.pages[page] = urllib.unquote_plus(text[5:])
self.do_GET()
if __name__ == '__main__':
server = BaseHTTPServer.HTTPServer(("", 8080), Handler)
server.pages = {}
server.serve_forever()
From python |
No comments:
Post a Comment