Gabriel wrote:
> so i was thinking php has the "exec" comand that executes a program
> and gets his answer if sage has some way to execute his function
> by a pseudo-tty interface will be great like that:
> ./sage --40+8
> sage: 48
One way that I know of to allow a language to access SAGE is to use
the following simple SAGE server program:
====
#
# Alex Clemesha <[EMAIL PROTECTED]> 2007
# Modified by Ted Kosan to use the SAGE preparser and to accept
# multiple line input.
#
from twisted.web2 import resource
from twisted.web2 import http_headers
from twisted.web2 import http
from twisted.web2 import channel
from twisted.web2 import server
#from sage.interfaces import sage0
# SAGE libraries
import sage.interfaces.sage0
from sage.misc.misc import word_wrap
import sage.misc.preparser
from sage.misc.viewer import browser
from sage.structure.sage_object import load, SageObject
global sage0
sage0 = sage.interfaces.sage0.Sage()
HTML = """
<html>
<head>
<script type="text/javascript">
var axajObject = createRequestObject();
function createRequestObject() {
var xmlhttp;
try { xmlhttp=new ActiveXObject("Msxml2.XMLHTTP"); }
catch(e) {
try {
xmlhttp=new ActiveXObject("Microsoft.XMLHTTP");
}
catch(e) {
xmlhttp=null;
}
}
if(!xmlhttp&&typeof XMLHttpRequest!="undefined") {
xmlhttp=new XMLHttpRequest();
}
return xmlhttp;
}
function sendRequest(event) {
var code = document.getElementById("code").value;
if (code.length > 0 && event.keyCode == 13) {
var ecode = encodeURIComponent(code);
//alert(ecode)
var req = "/eval?code=" + ecode;
try{
axajObject.open("POST", req, true);
axajObject.setRequestHeader('Content-Type', "text/html");
axajObject.onreadystatechange = handleResponse;
axajObject.send("");
}
catch(e){
// caught an error
alert('Request send failed.');
}
finally{}
}
}
function handleResponse() {
if(axajObject.readyState == 4){
var response = axajObject.responseText;
//alert(response);
var code = document.getElementById("code").value;
var res = "<p>Result of " + code + ": " + response + "</p>";
document.getElementById("output").innerHTML = res;
}
}
</script>
<style type="text/css">
#container{text-align:center;width:550px;border:1px solid #387CAF}
#output{text-align:center;font-size:14px;font-weight:bold}
</style>
</head>
<body>
<div id="container">
<h3>Simplest possible AJAX SAGE calculator.</h3>
<p>Type in some valid SAGE code and hit enter.</p><br/><br/>
Code: <input type="text" id="code" name="code"
onkeypress="sendRequest(event)"></label>
<br/><br/>
<span id="output"></span>
<br/><br/><br/><br/>
<h3>If you run SAGEIDE on the same machine that the simple server is
running on, SAGEIDE can be used to send requests to the server
too.</h3>
</div>
</body>
</html>
"""
class Root(resource.Resource):
addSlash = True
def __init__(self):
self.child_eval = EvalSomeSAGECode()
def render(self, request):
return http.Response(200, {'content-type':
http_headers.MimeType('text', 'html')}, HTML)
class EvalSomeSAGECode(resource.PostableResource):
def render(self, request):
code_to_eval = request.args.get('code')[0]
print code_to_eval
directory = '/tmp'
try:
#code_to_eval = code_to_eval.replace('\\','')
s = sage.misc.preparser.preparse_file(code_to_eval,
magic=False,
do_time=True, ignore_prompts=True)
s = [x for x in s.split('\n') if len(x.split()) > 0 and
\
x.lstrip()[0] != '#'] # remove all blank
lines and comment lines
if len(s) > 0:
t = s[-1]
if len(t) > 0 and not ':' in t and \
not t[0].isspace() and not
t[:3] == '"""':
t = t.replace("'","\\'")
s[-1] = "exec compile('%s', '',
'single')"%t
s = '\n'.join(s) + '\n'
open('%s/_temp_.py'%directory, 'w').write(s)
result =
sage0._eval_line('execfile("%s/_temp_.py")'%directory)
#o = word_wrap(o, ncols=numcols)
print result
return http.Response(200, {'content-type':
http_headers.MimeType('text', 'html')}, result)
except (RuntimeError, TypeError), msg:
print "ERROR!!!", msg
if __name__ == "__main__":
from twisted.internet import reactor
site = server.Site(Root())
factory = channel.HTTPFactory(site)
reactor.listenTCP(8000, factory)
print "\nOpen your browser to 'http://localhost:8000'\n"
reactor.run()
====
Save this program (lets call it php_server.py), set the "/tmp" string
to a directory of your choice, and then execute the program as
follows:
sage php_server.py
You can then test the program by pointing a web browser to
"http://localhost:8000".
import java.beans.PropertyChangeEvent
import java.beans.PropertyChangeListener
import java.io.ByteArrayInputStream
import java.net.URL as URL
import java.net.URI as URI
import java.net.URLEncoder as URLEncoder
import javax.xml.parsers.DocumentBuilderFactory
import javax.xml.xpath.XPath
import javax.xml.xpath.XPathConstants
import javax.xml.xpath.XPathExpression
import javax.xml.xpath.XPathFactory
import org.jdesktop.http.async.AsyncHttpRequest.ReadyState as ReadyState
import org.jdesktop.http.async.AsyncHttpRequest as AsyncHttpRequest
import org.w3c.dom.Document
import org.w3c.dom.NodeList
import org.jdesktop.http.async.XmlHttpRequest
import org.jdesktop.http.Method as Method
import java.io.ByteArrayOutputStream
import java.lang.System as System
import pickle
#System.out.println(buffer.getText(0,buffer.length))
clazz =
jEdit.getPlugin("org.sageide.SAGEIDEPlugin").getPluginJAR().getClassLoader().loadClass("org.sageide.SAGEIDE",1)
class ReadyListener( java.beans.PropertyChangeListener ):
def __init__(self, request):
self.req = request
self.response = None
self.obj = None
def propertyChange(self, evt ):
if evt.getNewValue() == ReadyState.LOADED:
clazz.displayText.append("New------------------\n ")
self.response = self.req.getResponseText()
#System.out.println(self.response)
if self.response != None:
clazz.displayText.append(self.response + "\n\n ")
else:
clazz.displayText.append("No response from
server\n\n ")
clazz.displayText.setCaretPosition(clazz.displayText.getDocument().getLength())
req = AsyncHttpRequest()
si = ReadyListener(req)
req.addReadyStateChangeListener( si )
try:
code = URLEncoder.encode(buffer.getText(0,buffer.length),"UTF8")
#code = "2^3"
#uri = URI("http", None,"localhost", 8000, "/eval", "code="+code, None)
uri = "http://localhost:8000/eval?code="+code
req.open(Method.POST, uri, 1 )
req.setRequestHeader("Content-Type", "text/html")
req.send("")
except Exception, e:
print "exception",e
--~--~---------~--~----~------------~-------~--~----~
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at
http://groups.google.com/group/sage-support
URLs: http://sage.math.washington.edu/sage/ and http://sage.scipy.org/sage/
-~----------~----~----~----~------~----~------~--~---