d3
Version:
A small, free JavaScript library for manipulating documents based on data.
462 lines (390 loc) • 12.7 kB
JavaScript
/*
* Envjs rhino-env.1.3.pre03
* Pure JavaScript Browser Environment
* By John Resig <http://ejohn.org/> and the Envjs Team
* Copyright 2008-2010 John Resig, under the MIT License
*/
var Envjs = Envjs ||
require('./core').Envjs;
require('local_settings');
var __context__ = Packages.org.mozilla.javascript.Context.getCurrentContext();
Envjs.platform = "Rhino";
Envjs.revision = "1.7.0.rc2";
Envjs.argv = [];
if(__argv__ && __argv__.length){
for(var i = 0; i < __argv__.length; i++){
Envjs.argv[i] = __argv__[i];
}
}
Envjs.exit = function(){
java.lang.System.exit(0);
};
/*
* Envjs rhino-env.1.3.pre03
* Pure JavaScript Browser Environment
* By John Resig <http://ejohn.org/> and the Envjs Team
* Copyright 2008-2010 John Resig, under the MIT License
*/
//CLOSURE_START
(function(){
/**
* @author john resig
*/
// Helper method for extending one object with another.
function __extend__(a,b) {
for ( var i in b ) {
if(b.hasOwnProperty(i)){
var g = b.__lookupGetter__(i), s = b.__lookupSetter__(i);
if ( g || s ) {
if ( g ) { a.__defineGetter__(i, g); }
if ( s ) { a.__defineSetter__(i, s); }
} else {
a[i] = b[i];
}
}
}
return a;
}
/**
* Writes message to system out.
*
* @param {Object} message
*/
(function(){
Envjs.log = print;
Envjs.lineSource = function(e){
return e&&e.rhinoException?e.rhinoException.lineSource():"(line ?)";
};
var $in, log;
Envjs.readConsole = function(){
log = log||Envjs.logger('Envjs.Rhino');
$in = $in||new java.io.BufferedReader(
new java.io.InputStreamReader(java.lang.System['in'])
);
return $in.readLine()+'';
};
Envjs.prompt = function(){
java.lang.System.out.print(Envjs.CURSOR+' ');
java.lang.System.out.flush();
};
}());
(function(){
var log = Envjs.logger('Envjs.HTML.Rhino');
Envjs.eval = function(context, source, name){
//console.log('evaluating javascript source %s', source.substring(0,64));
return __context__.evaluateString(
context,
source,
name,
0,
null
);
};
}());Envjs.renderSVG = function(svgstring, url){
//console.log("svg template url %s", templateSVG);
// Create a JPEG transcoder
var t = new Packages.org.apache.batik.transcoder.image.JPEGTranscoder();
// Set the transcoding hints.
t.addTranscodingHint(
Packages.org.apache.batik.transcoder.image.JPEGTranscoder.KEY_QUALITY,
new java.lang.Float(1.0));
// Create the transcoder input.
var input = new Packages.org.apache.batik.transcoder.TranscoderInput(
new java.io.StringReader(svgstring));
// Create the transcoder output.
var ostream = new java.io.ByteArrayOutputStream();
var output = new Packages.org.apache.batik.transcoder.TranscoderOutput(ostream);
// Save the image.
t.transcode(input, output);
// Flush and close the stream.
ostream.flush();
ostream.close();
var out = new java.io.FileOutputStream(new java.io.File(new java.net.URI(url.toString())));
try{
out.write( ostream.toByteArray() );
}catch(e){
}finally{
out.flush();
out.close();
}
};
(function(){
var log = Envjs.logger('Envjs.Timer.Rhino');
/**
* Rhino provides a very succinct 'sync'
* @param {Function} fn
*/
try{
Envjs.sync = sync;
Envjs.spawn = spawn;
//print('sync and spawn are available');
} catch(e){
//print('sync and spawn are not available : ' + e);
//sync unavailable on AppEngine
Envjs.sync = function(fn){
console.log('Threadless platform, sync is safe');
return fn;
};
Envjs.spawn = function(fn){
console.log('Threadless platform, spawn shares main thread.');
return fn();
};
};
/**
* sleep thread for specified duration
* @param {Object} milliseconds
*/
Envjs.sleep = function(milliseconds){
try{
return java.lang.Thread.currentThread().sleep(milliseconds);
}catch(e){
console.log('Threadless platform, cannot sleep.');
}
};
/**
* provides callback hook for when the system exits
*/
Envjs.onExit = function(callback){
var rhino = Packages.org.mozilla.javascript,
contextFactory = __context__.getFactory(),
listener = new rhino.ContextFactory.Listener({
contextReleased: function(context){
if(context === __context__)
console.log('context released', context);
contextFactory.removeListener(this);
if(callback)
callback();
}
});
contextFactory.addListener(listener);
};
}());
(function(){
var log = Envjs.logger('Envjs.XMLHttpRequest.Rhino');
/**
* Get 'Current Working Directory'
*/
Envjs.getcwd = function() {
return java.lang.System.getProperty('user.dir');
}
/**
* Used to write to a local file
* @param {Object} text
* @param {Object} url
*/
Envjs.writeToFile = function(text, url){
//Envjs.debug("writing text to url : " + url);
var out = new java.io.FileWriter(
new java.io.File(
new java.net.URI(url.toString())));
out.write( text, 0, text.length );
out.flush();
out.close();
};
/**
* Used to write to a local file
* @param {Object} text
* @param {Object} suffix
*/
Envjs.writeToTempFile = function(text, suffix){
//console.log("writing text to temp url : %s");
// Create temp file.
var temp = java.io.File.createTempFile("envjs-tmp", suffix);
// Delete temp file when program exits.
temp.deleteOnExit();
// Write to temp file
var out = new java.io.FileWriter(temp);
out.write(text, 0, text.length);
out.close();
return temp.getAbsolutePath().toString()+'';
};
/**
* Used to read the contents of a local file
* @param {Object} url
*/
Envjs.readFromFile = function( url ){
if(typeof url == 'string')
url = Envjs.uri(url);
//console.log("reading from url : %s", url);
var fileReader = new java.io.FileReader(
new java.io.File(
new java.net.URI( url )));
var stringwriter = new java.io.StringWriter(),
buffer = java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 1024),
length;
while ((length = fileReader.read(buffer, 0, 1024)) != -1) {
stringwriter.write(buffer, 0, length);
}
stringwriter.close();
return stringwriter.toString()+"";
};
/**
* Used to delete a local file
* @param {Object} url
*/
Envjs.deleteFile = function(url){
var file = new java.io.File( new java.net.URI( url ) );
file["delete"]();
};
/**
* establishes connection and calls responsehandler
* @param {Object} xhr
* @param {Object} responseHandler
* @param {Object} data
*/
Envjs.connection = function(xhr, responseHandler, data){
var url = java.net.URL(xhr.url),
connection,
header,
outstream,
buffer,
length,
binary = false,
name, value,
contentEncoding,
instream,
responseXML,
i;
if ( /^file\:/.test(url) ) {
Envjs.localXHR(url, xhr, connection, data);
} else {
connection = url.openConnection();
//handle redirects manually since cookie support sucks out of the box
connection.setFollowRedirects(false);
connection.setRequestMethod( xhr.method );
// Add headers to Java connection
for (header in xhr.headers){
connection.addRequestProperty(header+'', xhr.headers[header]+'');
}
connection.addRequestProperty("Accept-Encoding", 'gzip');
//write data to output stream if required
//TODO: if they have set the request header for a chunked
//request body, implement a chunked output stream
if(data){
if(data instanceof Document){
if ( xhr.method == "PUT" || xhr.method == "POST" ) {
connection.setDoOutput(true);
outstream = connection.getOutputStream(),
xml = (new XMLSerializer()).serializeToString(data);
buffer = new java.lang.String(xml).getBytes('UTF-8');
outstream.write(buffer, 0, buffer.length);
outstream.close();
}
}else if(data.length&&data.length>0){
if ( xhr.method == "PUT" || xhr.method == "POST" ) {
connection.setDoOutput(true);
outstream = connection.getOutputStream();
buffer = new java.lang.String(data).getBytes('UTF-8');
outstream.write(buffer, 0, buffer.length);
outstream.close();
}
}
connection.connect();
}else{
connection.connect();
}
}
if(connection){
try{
length = connection.getHeaderFields().size();
// Stick the response headers into responseHeaders
for (i = 0; i < length; i++) {
name = connection.getHeaderFieldKey(i);
value = connection.getHeaderField(i);
if (name)
xhr.responseHeaders[name+''] = value+'';
}
}catch(e){
console.log('failed to load response headers \n%s',e);
}
xhr.readyState = 4;
xhr.status = parseInt(connection.responseCode,10) || undefined;
xhr.statusText = connection.responseMessage || "";
contentEncoding = connection.getContentEncoding() || "utf-8";
instream = null;
responseXML = null;
try{
//console.log('contentEncoding %s', contentEncoding);
if( contentEncoding.equalsIgnoreCase("gzip") ||
contentEncoding.equalsIgnoreCase("decompress")){
//zipped content
binary = true;
outstream = new java.io.ByteArrayOutputStream();
buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 1024);
instream = new java.util.zip.GZIPInputStream(connection.getInputStream())
}else{
//this is a text file
outstream = new java.io.StringWriter();
buffer = java.lang.reflect.Array.newInstance(java.lang.Character.TYPE, 1024);
instream = new java.io.InputStreamReader(connection.getInputStream());
}
}catch(e){
if (connection.getResponseCode() == 404){
console.log('failed to open connection stream \n %s %s',
e.toString(), e);
}else{
console.log('failed to open connection stream \n %s %s',
e.toString(), e);
}
instream = connection.getErrorStream();
}
while ((length = instream.read(buffer, 0, 1024)) != -1) {
outstream.write(buffer, 0, length);
}
outstream.close();
instream.close();
if(binary){
xhr.responseText = new java.lang.String(outstream.toByteArray(), 'UTF-8')+'';
}else{
xhr.responseText = outstream.toString()+'';
}
}
if(responseHandler){
//console.log('calling ajax response handler');
if(!xhr.async){
responseHandler();
}else{
//console.log('synchronizing ajax response handler via setTimeout');
setTimeout(responseHandler, 1);
}
}
};
}());
(function(){
var log = Envjs.logger('Envjs.Window.Rhino');
//Since we're running in rhino I guess we can safely assume
//java is 'enabled'. I'm sure this requires more thought
//than I've given it here
Envjs.javaEnabled = true;
Envjs.homedir = java.lang.System.getProperty("user.home");
Envjs.tmpdir = java.lang.System.getProperty("java.io.tmpdir");
Envjs.os_name = java.lang.System.getProperty("os.name");
Envjs.os_arch = java.lang.System.getProperty("os.arch");
Envjs.os_version = java.lang.System.getProperty("os.version");
Envjs.lang = java.lang.System.getProperty("user.lang");
Envjs.gc = function(){ gc(); };
/**
* Makes an object window-like by proxying object accessors
* @param {Object} scope
* @param {Object} parent
*/
Envjs.proxy = function(scope, parent) {
try{
if(scope+'' == '[object global]'){
return scope;
}else{
return __context__.initStandardObjects();
}
}catch(e){
console.log('failed to init standard objects %s %s \n%s', scope, parent, e);
}
};
}());
/**
* @author john resig & the envjs team
* @uri http://www.envjs.com/
* @copyright 2008-2010
* @license MIT
*/
//CLOSURE_END
}());