diff --git a/package.json b/package.json index f30220d..d870c5a 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "author": "Jairaj Sethi (http://jairaj.org/)", "name": "zerver", "description": "client-integrated webapp server", - "version": "0.5.3", + "version": "0.5.4", "repository": { "type": "git", "url": "git://github.com/jairajs89/zerver.git" diff --git a/zerver.js b/zerver.js index c8576eb..00b85de 100755 --- a/zerver.js +++ b/zerver.js @@ -11,9 +11,11 @@ var cleanCSS = require('clean-css'), var ROOT_DIR = process.cwd(), SLASH = /\//g, - GZIP_ENABLED = false, + CSS_IMAGE = /url\([\'\"]?([^\)]+)[\'\"]?\)/g, + GZIP_ENABLED = false, COMPILATION_ENABLED = false, - CACHE_ENABLED = false, + INLINING_ENABLED = false, + CACHE_ENABLED = false, GZIPPABLE = { 'application/json' : true , 'application/javascript' : true , @@ -101,6 +103,7 @@ function configureZerver (port, apiDir, apiURL, debug, refresh, manifests, produ if (!DEBUG && production) { GZIP_ENABLED = true; COMPILATION_ENABLED = true; + INLINING_ENABLED = true; CACHE_ENABLED = true; } @@ -194,6 +197,57 @@ function handleMiddlewareRequest (request, response, next) { handleRequest(request, response); } +function inlineImages (type, data, pathname, callback) { + if (!INLINING_ENABLED || DEBUG) { + callback(data); + return; + } + + data.replace(CSS_IMAGE, function (original, relativeURL) { + var urlParts; + + try { + urlParts = url.parse(relativeURL, true); + } + catch (err) { + return original; + } + + if ( !urlParts.query.inline ) { + return original; + } + + + var absoluteURL; + + try { + absoluteURL = url.resolve(pathname, urlParts.pathname); + } + catch (err) { + return original; + } + + + var fileName = path.join(ROOT_DIR, absoluteURL), + fileData; + + try { + fileData = fs.readFileSync(fileName).toString('base64'); + } + catch (err) { + return original; + } + + + var mimeType = mime.lookup(fileName), + dataURL = 'data:'+mimeType+';base64,'+fileData; + + return 'url(' + dataURL + ')'; + }); + + callback(data); +} + function compileOutput (type, data, callback) { if (!COMPILATION_ENABLED || DEBUG) { callback(data); @@ -296,9 +350,11 @@ function respond (handler, status, type, data, headers) { function respondBinary (handler, status, type, data, headers) { headers['Content-Type'] = type; - compileOutput(type, data, function (data) { - setupGZipOutput(type, data, headers, function (data, headers) { - finishResponse(handler, status, headers, data, true); + inlineImages(type, data, handler.pathname, function (data) { + compileOutput(type, data, function (data) { + setupGZipOutput(type, data, headers, function (data, headers) { + finishResponse(handler, status, headers, data, true); + }); }); }); }