connect-include
Version:
Adds SSI-style include functionality to connect/grunt
68 lines (51 loc) • 1.98 kB
JavaScript
module.exports = function shtmlEmulator(rootDir) {
return function(req, res, next) {
var WritableStream = require('stream-buffers').WritableStreamBuffer;
var fs = require('fs');
var path = require('path');
var _ = require('underscore');
if(req.url !== '/' && !req.url.match(/\.s?html(?:#|\?)?/)) {
return next();
}
var buffer = new WritableStream();
res.write = function(chunk) {
buffer.write(chunk);
return true;
};
var oldEnd = res.end;
res.end = function(data) {
if(data) {
buffer.write(data);
}
if (!buffer.size()) {
return oldEnd.call(this, buffer.getContents());
}
var body = buffer.getContentsAsString();
var includes = body.match(/<!--\s?#include (?:virtual|file)=\"(.+)\"\s?-->/g);
if (!includes) {
return oldEnd.call(this, body);
}
var remaining = includes.length;
_.each(includes, function(include) {
var pathDirName = path.dirname(req.url);
if(include.match(/<!--\s?#include (?:virtual|file)=\"(.+)\"\s?-->/)[1] === 'virtual'){
pathDirName = '';
}
var file = path.join(rootDir, pathDirName, include.match(/<!--\s?#include (?:virtual|file)=\"(.+)\"\s?-->/)[1]);
fs.readFile(file, 'utf8', function(err, readData) {
if(err) {
console.log('ERROR including file ' + file + ': ' + err);
}
else {
body = body.replace(include, readData);
}
if (!--remaining) {
oldEnd.call(this, body);
}
});
});
};
next();
};
};
;