mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-05-05 14:47:12 -04:00
Merge branch 'master' of ../etherpad-lite
This commit is contained in:
commit
2fd4789013
47 changed files with 496 additions and 159 deletions
|
@ -516,7 +516,12 @@ exports.updatePadClients = function(pad, callback)
|
|||
], function(err)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
// next if session has not been deleted
|
||||
if(sessioninfos[session] == null)
|
||||
{
|
||||
callback(null);
|
||||
return;
|
||||
}
|
||||
if(author == sessioninfos[session].author)
|
||||
{
|
||||
socketio.sockets.sockets[session].json.send({"type":"COLLABROOM","data":{type:"ACCEPT_COMMIT", newRev:r}});
|
||||
|
@ -538,7 +543,10 @@ exports.updatePadClients = function(pad, callback)
|
|||
callback
|
||||
);
|
||||
|
||||
sessioninfos[session].rev = pad.getHeadRevisionNumber();
|
||||
if(sessioninfos[session] != null)
|
||||
{
|
||||
sessioninfos[session].rev = pad.getHeadRevisionNumber();
|
||||
}
|
||||
},callback);
|
||||
}
|
||||
|
||||
|
|
|
@ -45,8 +45,9 @@ var socketIORouter;
|
|||
var version = "";
|
||||
try
|
||||
{
|
||||
var ref = fs.readFileSync("../.git/HEAD", "utf-8");
|
||||
var refPath = "../.git/" + ref.substring(5, ref.indexOf("\n"));
|
||||
var rootPath = path.normalize(__dirname + "/../")
|
||||
var ref = fs.readFileSync(rootPath + ".git/HEAD", "utf-8");
|
||||
var refPath = rootPath + ".git/" + ref.substring(5, ref.indexOf("\n"));
|
||||
version = fs.readFileSync(refPath, "utf-8");
|
||||
version = version.substring(0, 7);
|
||||
console.log("Your Etherpad Lite git version is " + version);
|
||||
|
@ -79,7 +80,12 @@ async.waterfall([
|
|||
{
|
||||
//create server
|
||||
var app = express.createServer();
|
||||
|
||||
|
||||
app.use(function (req, res, next) {
|
||||
res.header("Server", serverName);
|
||||
next();
|
||||
});
|
||||
|
||||
//load modules that needs a initalized db
|
||||
readOnlyManager = require("./db/ReadOnlyManager");
|
||||
exporthtml = require("./utils/ExportHtml");
|
||||
|
@ -110,31 +116,24 @@ async.waterfall([
|
|||
gracefulShutdown();
|
||||
});
|
||||
|
||||
//serve minified files
|
||||
app.get('/minified/:filename', minify.minifyJS);
|
||||
|
||||
//serve static files
|
||||
app.get('/static/js/require-kernel.js', function (req, res, next) {
|
||||
res.header("Content-Type","application/javascript; charset: utf-8");
|
||||
res.write(minify.requireDefinition());
|
||||
res.end();
|
||||
});
|
||||
app.get('/static/*', function(req, res)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/.." +
|
||||
req.url.replace(/\.\./g, '').split("?")[0]);
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge });
|
||||
});
|
||||
|
||||
//serve minified files
|
||||
app.get('/minified/:id', function(req, res, next)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
|
||||
var id = req.params.id;
|
||||
|
||||
if(id == "pad.js" || id == "timeslider.js")
|
||||
{
|
||||
minify.minifyJS(req,res,id);
|
||||
}
|
||||
else
|
||||
{
|
||||
next();
|
||||
}
|
||||
});
|
||||
app.get('/minified/:filename', minify.minifyJS);
|
||||
|
||||
//checks for padAccess
|
||||
function hasPadAccess(req, res, callback)
|
||||
|
@ -179,8 +178,6 @@ async.waterfall([
|
|||
//serve read only pad
|
||||
app.get('/ro/:id', function(req, res)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
|
||||
var html;
|
||||
var padId;
|
||||
var pad;
|
||||
|
@ -265,7 +262,6 @@ async.waterfall([
|
|||
app.get('/p/:pad', function(req, res, next)
|
||||
{
|
||||
goToPad(req, res, function() {
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/../static/pad.html");
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge });
|
||||
});
|
||||
|
@ -275,7 +271,6 @@ async.waterfall([
|
|||
app.get('/p/:pad/timeslider', function(req, res, next)
|
||||
{
|
||||
goToPad(req, res, function() {
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/../static/timeslider.html");
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge });
|
||||
});
|
||||
|
@ -302,7 +297,6 @@ async.waterfall([
|
|||
}
|
||||
|
||||
res.header("Access-Control-Allow-Origin", "*");
|
||||
res.header("Server", serverName);
|
||||
|
||||
hasPadAccess(req, res, function()
|
||||
{
|
||||
|
@ -322,8 +316,6 @@ async.waterfall([
|
|||
return;
|
||||
}
|
||||
|
||||
res.header("Server", serverName);
|
||||
|
||||
hasPadAccess(req, res, function()
|
||||
{
|
||||
importHandler.doImport(req, res, req.params.pad);
|
||||
|
@ -336,7 +328,6 @@ async.waterfall([
|
|||
//This is for making an api call, collecting all post information and passing it to the apiHandler
|
||||
var apiCaller = function(req, res, fields)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
res.header("Content-Type", "application/json; charset=utf-8");
|
||||
|
||||
apiLogger.info("REQUEST, " + req.params.func + ", " + JSON.stringify(fields));
|
||||
|
@ -397,7 +388,6 @@ async.waterfall([
|
|||
//serve index.html under /
|
||||
app.get('/', function(req, res)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/../static/index.html");
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge });
|
||||
});
|
||||
|
@ -405,7 +395,6 @@ async.waterfall([
|
|||
//serve robots.txt
|
||||
app.get('/robots.txt', function(req, res)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/../static/robots.txt");
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge });
|
||||
});
|
||||
|
@ -413,7 +402,6 @@ async.waterfall([
|
|||
//serve favicon.ico
|
||||
app.get('/favicon.ico', function(req, res)
|
||||
{
|
||||
res.header("Server", serverName);
|
||||
var filePath = path.normalize(__dirname + "/../static/custom/favicon.ico");
|
||||
res.sendfile(filePath, { maxAge: exports.maxAge }, function(err)
|
||||
{
|
||||
|
|
|
@ -29,9 +29,14 @@ var pro = require("uglify-js").uglify;
|
|||
var path = require('path');
|
||||
var Buffer = require('buffer').Buffer;
|
||||
var gzip = require('gzip');
|
||||
var RequireKernel = require('require-kernel');
|
||||
var server = require('../server');
|
||||
var os = require('os');
|
||||
|
||||
var ROOT_DIR = path.normalize(__dirname + "/../" );
|
||||
var JS_DIR = ROOT_DIR + '../static/js/';
|
||||
var CSS_DIR = ROOT_DIR + '../static/css/';
|
||||
var CACHE_DIR = ROOT_DIR + '../var/';
|
||||
var TAR_PATH = path.join(__dirname, 'tar.json');
|
||||
var tar = JSON.parse(fs.readFileSync(TAR_PATH, 'utf8'));
|
||||
|
||||
|
@ -40,17 +45,30 @@ var tar = JSON.parse(fs.readFileSync(TAR_PATH, 'utf8'));
|
|||
* @param req the Express request
|
||||
* @param res the Express response
|
||||
*/
|
||||
exports.minifyJS = function(req, res, jsFilename)
|
||||
exports.minifyJS = function(req, res, next)
|
||||
{
|
||||
res.header("Content-Type","text/javascript");
|
||||
var jsFilename = req.params['filename'];
|
||||
|
||||
//choose the js files we need
|
||||
var jsFiles = undefined;
|
||||
if (Object.prototype.hasOwnProperty.call(tar, jsFilename)) {
|
||||
jsFiles = tar[jsFilename];
|
||||
_handle(req, res, jsFilename, jsFiles)
|
||||
} else {
|
||||
throw new Error("there is no profile for creating " + name);
|
||||
// Not in tar list, but try anyways, if it fails, pass to `next`.
|
||||
jsFiles = [jsFilename];
|
||||
fs.stat(JS_DIR + jsFilename, function (error, stats) {
|
||||
if (error || !stats.isFile()) {
|
||||
next();
|
||||
} else {
|
||||
_handle(req, res, jsFilename, jsFiles);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
function _handle(req, res, jsFilename, jsFiles) {
|
||||
res.header("Content-Type","text/javascript");
|
||||
|
||||
//minifying is enabled
|
||||
if(settings.minify)
|
||||
|
@ -63,7 +81,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
//find out the highest modification date
|
||||
function(callback)
|
||||
{
|
||||
var folders2check = ["../static/css","../static/js"];
|
||||
var folders2check = [CSS_DIR, JS_DIR];
|
||||
|
||||
//go trough this two folders
|
||||
async.forEach(folders2check, function(path, callback)
|
||||
|
@ -102,7 +120,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
function(callback)
|
||||
{
|
||||
//check the modification time of the minified js
|
||||
fs.stat("../var/minified_" + jsFilename, function(err, stats)
|
||||
fs.stat(CACHE_DIR + "/minified_" + jsFilename, function(err, stats)
|
||||
{
|
||||
if(err && err.code != "ENOENT")
|
||||
{
|
||||
|
@ -127,7 +145,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
{
|
||||
async.forEach(jsFiles, function (item, callback)
|
||||
{
|
||||
fs.readFile("../static/js/" + item, "utf-8", function(err, data)
|
||||
fs.readFile(JS_DIR + item, "utf-8", function(err, data)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
fileValues[item] = data;
|
||||
|
@ -145,7 +163,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
return;
|
||||
}
|
||||
|
||||
var founds = fileValues["ace.js"].match(/\$\$INCLUDE_[a-zA-Z_]+\([a-zA-Z0-9.\/_"]+\)/gi);
|
||||
var founds = fileValues["ace.js"].match(/\$\$INCLUDE_[a-zA-Z_]+\([a-zA-Z0-9.\/_"-]+\)/gi);
|
||||
|
||||
//go trough all includes
|
||||
async.forEach(founds, function (item, callback)
|
||||
|
@ -156,21 +174,31 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
var type = item.match(/INCLUDE_[A-Z]+/g)[0].substr("INCLUDE_".length);
|
||||
|
||||
//read the included file
|
||||
fs.readFile(filename, "utf-8", function(err, data)
|
||||
var shortFilename = filename.replace(/^..\/static\/js\//, '');
|
||||
if (shortFilename == 'require-kernel.js') {
|
||||
// the kernel isn’t actually on the file system.
|
||||
handleEmbed(null, requireDefinition());
|
||||
} else {
|
||||
fs.readFile(ROOT_DIR + filename, "utf-8", handleEmbed);
|
||||
}
|
||||
function handleEmbed(err, data)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
if(type == "JS")
|
||||
{
|
||||
embeds[filename] = compressJS([data]);
|
||||
if (shortFilename == 'require-kernel.js') {
|
||||
embeds[filename] = compressJS([data]);
|
||||
} else {
|
||||
embeds[filename] = compressJS([isolateJS(data, shortFilename)]);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
embeds[filename] = compressCSS([data]);
|
||||
}
|
||||
|
||||
callback();
|
||||
});
|
||||
}
|
||||
}, function(err)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
|
@ -191,21 +219,16 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
//put all together and write it into a file
|
||||
function(callback)
|
||||
{
|
||||
//put all javascript files in an array
|
||||
var values = [];
|
||||
for(var i in jsFiles)
|
||||
{
|
||||
values.push(fileValues[jsFiles[i]]);
|
||||
}
|
||||
|
||||
//minify all javascript files to one
|
||||
var values = [];
|
||||
tarCode(jsFiles, fileValues, function (content) {values.push(content)});
|
||||
var result = compressJS(values);
|
||||
|
||||
async.parallel([
|
||||
//write the results plain in a file
|
||||
function(callback)
|
||||
{
|
||||
fs.writeFile("../var/minified_" + jsFilename, result, "utf8", callback);
|
||||
fs.writeFile(CACHE_DIR + "minified_" + jsFilename, result, "utf8", callback);
|
||||
},
|
||||
//write the results compressed in a file
|
||||
function(callback)
|
||||
|
@ -219,7 +242,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
|
||||
if(ERR(err, callback)) return;
|
||||
|
||||
fs.writeFile("../var/minified_" + jsFilename + ".gz", compressedResult, callback);
|
||||
fs.writeFile(CACHE_DIR + "minified_" + jsFilename + ".gz", compressedResult, callback);
|
||||
});
|
||||
}
|
||||
//skip this step on windows
|
||||
|
@ -243,12 +266,12 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
var pathStr;
|
||||
if(gzipSupport && os.type().indexOf("Windows") == -1)
|
||||
{
|
||||
pathStr = path.normalize(__dirname + "/../../var/minified_" + jsFilename + ".gz");
|
||||
pathStr = path.normalize(CACHE_DIR + "minified_" + jsFilename + ".gz");
|
||||
res.header('Content-Encoding', 'gzip');
|
||||
}
|
||||
else
|
||||
{
|
||||
pathStr = path.normalize(__dirname + "/../../var/minified_" + jsFilename );
|
||||
pathStr = path.normalize(CACHE_DIR + "minified_" + jsFilename );
|
||||
}
|
||||
|
||||
res.sendfile(pathStr, { maxAge: server.maxAge });
|
||||
|
@ -262,7 +285,7 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
//read all js files
|
||||
async.forEach(jsFiles, function (item, callback)
|
||||
{
|
||||
fs.readFile("../static/js/" + item, "utf-8", function(err, data)
|
||||
fs.readFile(JS_DIR + item, "utf-8", function(err, data)
|
||||
{
|
||||
if(ERR(err, callback)) return;
|
||||
fileValues[item] = data;
|
||||
|
@ -274,18 +297,44 @@ exports.minifyJS = function(req, res, jsFilename)
|
|||
{
|
||||
if(ERR(err)) return;
|
||||
|
||||
for(var i=0;i<jsFiles.length;i++)
|
||||
{
|
||||
var fileName = jsFiles[i];
|
||||
res.write("\n\n\n/*** File: static/js/" + fileName + " ***/\n\n\n");
|
||||
res.write(fileValues[fileName]);
|
||||
}
|
||||
tarCode(jsFiles, fileValues, function (content) {res.write(content)});
|
||||
|
||||
res.end();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
exports.requireDefinition = requireDefinition;
|
||||
function requireDefinition() {
|
||||
return 'var require = ' + RequireKernel.kernelSource + ';\n';
|
||||
}
|
||||
|
||||
function tarCode(filesInOrder, files, write) {
|
||||
for(var i = 0, ii = filesInOrder.length; i < filesInOrder.length; i++) {
|
||||
var filename = filesInOrder[i];
|
||||
write("\n\n\n/*** File: static/js/" + filename + " ***/\n\n\n");
|
||||
write(isolateJS(files[filename], filename));
|
||||
}
|
||||
|
||||
for(var i = 0, ii = filesInOrder.length; i < filesInOrder.length; i++) {
|
||||
var filename = filesInOrder[i];
|
||||
write('require(' + JSON.stringify('/' + filename.replace(/^\/+/, '')) + ');\n');
|
||||
}
|
||||
}
|
||||
|
||||
// Wrap the following code in a self executing function and assign exports to
|
||||
// global. This is a first step towards removing symbols from the global scope.
|
||||
// exports is global and require is a function that returns global.
|
||||
function isolateJS(code, filename) {
|
||||
var srcPath = JSON.stringify('/' + filename);
|
||||
var srcPathAbbv = JSON.stringify('/' + filename.replace(/\.js$/, ''));
|
||||
return 'require.define({'
|
||||
+ srcPath + ': '
|
||||
+ 'function (require, exports, module) {' + code + '}'
|
||||
+ (srcPath != srcPathAbbv ? '\n,' + srcPathAbbv + ': null' : '')
|
||||
+ '});\n';
|
||||
}
|
||||
|
||||
function compressJS(values)
|
||||
{
|
||||
var complete = values.join("\n");
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
|
||||
var fs = require("fs");
|
||||
var os = require("os");
|
||||
var path = require('path');
|
||||
|
||||
/**
|
||||
* The IP ep-lite should listen to
|
||||
|
@ -88,7 +89,8 @@ exports.abiwordAvailable = function()
|
|||
}
|
||||
|
||||
//read the settings sync
|
||||
var settingsStr = fs.readFileSync("../settings.json").toString();
|
||||
var settingsPath = path.normalize(__dirname + "/../../");
|
||||
var settingsStr = fs.readFileSync(settingsPath + "settings.json").toString();
|
||||
|
||||
//remove all comments
|
||||
settingsStr = settingsStr.replace(/\*([^*]|[\r\n]|(\*+([^*/]|[\r\n])))*\*+/gm,"").replace(/#.*/g,"").replace(/\/\/.*/g,"");
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"pad.js": [
|
||||
"jquery.min.js"
|
||||
"jquery.js"
|
||||
, "pad_utils.js"
|
||||
, "plugins.js"
|
||||
, "undo-xpopup.js"
|
||||
|
@ -23,7 +23,7 @@
|
|||
, "farbtastic.js"
|
||||
]
|
||||
, "timeslider.js": [
|
||||
"jquery.min.js"
|
||||
"jquery.js"
|
||||
, "plugins.js"
|
||||
, "undo-xpopup.js"
|
||||
, "json2.js"
|
||||
|
@ -35,6 +35,7 @@
|
|||
, "pad_editbar.js"
|
||||
, "pad_docbar.js"
|
||||
, "pad_modals.js"
|
||||
, "pad_savedrevs.js"
|
||||
, "pad_impexp.js"
|
||||
, "easysync2_client.js"
|
||||
, "domline_client.js"
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue