From eff7341d98b401ddcfb286ed4cbf800c5a3f7149 Mon Sep 17 00:00:00 2001 From: Oliver Becker Date: Fri, 15 Nov 2013 16:15:30 +0100 Subject: [PATCH] added base 64 encoding for rhino, fixes urls.less test case --- build/rhino-modules.js | 211 +++++++++++++++++++++++------------------ lib/less/encoder.js | 4 + lib/less/functions.js | 3 +- 3 files changed, 124 insertions(+), 94 deletions(-) create mode 100644 lib/less/encoder.js diff --git a/build/rhino-modules.js b/build/rhino-modules.js index 92caf065..0709f270 100644 --- a/build/rhino-modules.js +++ b/build/rhino-modules.js @@ -1,101 +1,128 @@ -console = function() { - var stdout = java.lang.Systen.out; - var stderr = java.lang.System.err; +(function() { - function doLog(out, type) { - return function() { - var args = java.lang.reflect.Array.newInstance(java.lang.Object, arguments.length - 1); - var format = arguments[0]; - var conversionIndex = 0; - // need to look for %d (integer) conversions because in Javascript all numbers are doubles - for (var i = 1; i < arguments.length; i++) { - var arg = arguments[i]; - if (conversionIndex != -1) { - conversionIndex = format.indexOf('%', conversionIndex); - } - if (conversionIndex >= 0 && conversionIndex < format.length) { - var conversion = format.charAt(conversionIndex + 1); - if (conversion === 'd' && typeof arg === 'number') { - arg = new java.lang.Integer(new java.lang.Double(arg).intValue()); + console = function() { + var stdout = java.lang.Systen.out; + var stderr = java.lang.System.err; + + function doLog(out, type) { + return function() { + var args = java.lang.reflect.Array.newInstance(java.lang.Object, arguments.length - 1); + var format = arguments[0]; + var conversionIndex = 0; + // need to look for %d (integer) conversions because in Javascript all numbers are doubles + for (var i = 1; i < arguments.length; i++) { + var arg = arguments[i]; + if (conversionIndex != -1) { + conversionIndex = format.indexOf('%', conversionIndex); } - conversionIndex++; + if (conversionIndex >= 0 && conversionIndex < format.length) { + var conversion = format.charAt(conversionIndex + 1); + if (conversion === 'd' && typeof arg === 'number') { + arg = new java.lang.Integer(new java.lang.Double(arg).intValue()); + } + conversionIndex++; + } + args[i-1] = arg; + } + try { + out.println(type + java.lang.String.format(format, args)); + } catch(ex) { + stderr.println(ex); } - args[i-1] = arg; - } - try { - out.println(type + java.lang.String.format(format, args)); - } catch(ex) { - stderr.println(ex); } } - } - return { - log: doLog(stdout, ''), - info: doLog(stdout, 'INFO: '), - error: doLog(stderr, 'ERROR: '), - warn: doLog(stderr, 'WARN: ') - }; -}(); - -less.modules = {}; - -less.modules.path = { - join: function() { - var parts = []; - for (i in arguments) { - parts = parts.concat(arguments[i].split('/')); - } - var result = []; - for (i in parts) { - var part = parts[i]; - if (part === '..' && result.length > 0) { - result.pop(); - } else if (part === '' && result.length > 0) { - // skip - } else if (part !== '.') { - result.push(part); - } - } - return result.join('/'); - }, - dirname: function(p) { - var path = p.split('/'); - path.pop(); - return path.join('/'); - }, - basename: function(p, ext) { - var base = p.split('/').pop(); - if (ext) { - var index = base.lastIndexOf(ext); - if (base.length === index + ext.length) { - base = base.substr(0, index); - } - } - return base; - }, - extname: function(p) { - var index = p.lastIndexOf('.'); - return index > 0 ? p.substring(index) : ''; - } -}; - -less.modules.fs = { - readFileSync: function(name) { - var file = new java.io.File(name); - var stream = new java.io.FileInputStream(file); - var buffer = []; - var c; - while ((c = stream.read()) != -1) { - buffer.push(c); - } - stream.close(); return { - length: buffer.length, - toString: function(enc) { - if (enc === 'base64') { - return javax.xml.bind.DatatypeConverter.printBase64Binary(buffer); + log: doLog(stdout, ''), + info: doLog(stdout, 'INFO: '), + error: doLog(stderr, 'ERROR: '), + warn: doLog(stderr, 'WARN: ') + }; + }(); + + less.modules = {}; + + less.modules.path = { + join: function() { + var parts = []; + for (i in arguments) { + parts = parts.concat(arguments[i].split('/')); + } + var result = []; + for (i in parts) { + var part = parts[i]; + if (part === '..' && result.length > 0) { + result.pop(); + } else if (part === '' && result.length > 0) { + // skip + } else if (part !== '.') { + result.push(part); } } - }; + return result.join('/'); + }, + dirname: function(p) { + var path = p.split('/'); + path.pop(); + return path.join('/'); + }, + basename: function(p, ext) { + var base = p.split('/').pop(); + if (ext) { + var index = base.lastIndexOf(ext); + if (base.length === index + ext.length) { + base = base.substr(0, index); + } + } + return base; + }, + extname: function(p) { + var index = p.lastIndexOf('.'); + return index > 0 ? p.substring(index) : ''; + } + }; + + less.modules.fs = { + readFileSync: function(name) { + // read a file into a byte array + var file = new java.io.File(name); + var stream = new java.io.FileInputStream(file); + var buffer = []; + var c; + while ((c = stream.read()) != -1) { + buffer.push(c); + } + stream.close(); + return { + length: buffer.length, + toString: function(enc) { + if (enc === 'base64') { + return encodeBase64Bytes(buffer); + } else if (enc) { + return java.lang.String["(byte[],java.lang.String)"](buffer, enc); + } else { + return java.lang.String["(byte[])"](buffer); + } + } + }; + } + }; + + less.encoder = { + encodeBase64: function(str) { + return encodeBase64String(str); + } + }; + + // --------------------------------------------------------------------------------------------- + // private helper functions + // --------------------------------------------------------------------------------------------- + + function encodeBase64Bytes(bytes) { + // requires at least a JRE Platform 6 (or JAXB 1.0 on the classpath) + return javax.xml.bind.DatatypeConverter.printBase64Binary(bytes) } -}; + function encodeBase64String(str) { + return encodeBase64Bytes(new java.lang.String(str).getBytes()); + } + +})(); diff --git a/lib/less/encoder.js b/lib/less/encoder.js new file mode 100644 index 00000000..65902f7a --- /dev/null +++ b/lib/less/encoder.js @@ -0,0 +1,4 @@ +// base64 encoder implementation for node +exports.encodeBase64 = function(str) { + return new Buffer(str).toString('base64'); +}; diff --git a/lib/less/functions.js b/lib/less/functions.js index 157e7c1b..0208c49f 100644 --- a/lib/less/functions.js +++ b/lib/less/functions.js @@ -579,9 +579,8 @@ tree.functions = { ''; if (useBase64) { - // only works in node, needs interface to what is supported in environment try { - returner = new Buffer(returner).toString('base64'); + returner = require('./encoder').encodeBase64(returner); // TODO browser implementation } catch(e) { useBase64 = false; }