Update API.js

This commit is contained in:
Cristo 2014-11-12 19:53:56 +01:00
parent f59238fe58
commit f7dd756642

View file

@ -585,105 +585,106 @@ exports.deletePad = function(padID, callback)
*/ */
exports.restoreRevision = function (padID, rev, callback) exports.restoreRevision = function (padID, rev, callback)
{ {
var Changeset = require("ep_etherpad-lite/static/js/Changeset"); var Changeset = require("ep_etherpad-lite/static/js/Changeset");
var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js"); var padMessage = require("ep_etherpad-lite/node/handler/PadMessageHandler.js");
//check if rev is a number //check if rev is a number
if (rev !== undefined && typeof rev != "number") if (rev !== undefined && typeof rev != "number")
{ {
//try to parse the number //try to parse the number
if (!isNaN(parseInt(rev))) if (!isNaN(parseInt(rev)))
{ {
rev = parseInt(rev); rev = parseInt(rev);
} }
else else
{ {
callback(new customError("rev is not a number", "apierror")); callback(new customError("rev is not a number", "apierror"));
return; return;
} }
} }
//ensure this is not a negativ number //ensure this is not a negativ number
if (rev !== undefined && rev < 0) if (rev !== undefined && rev < 0)
{ {
callback(new customError("rev is a negativ number", "apierror")); callback(new customError("rev is a negativ number", "apierror"));
return; return;
} }
//ensure this is not a float value //ensure this is not a float value
if (rev !== undefined && !is_int(rev)) if (rev !== undefined && !is_int(rev))
{ {
callback(new customError("rev is a float value", "apierror")); callback(new customError("rev is a float value", "apierror"));
return; return;
} }
//get the pad //get the pad
getPadSafe(padID, true, function (err, pad) getPadSafe(padID, true, function (err, pad)
{ {
if (ERR(err, callback)) return; if (ERR(err, callback)) return;
//check if this is a valid revision //check if this is a valid revision
if (rev > pad.getHeadRevisionNumber()) if (rev > pad.getHeadRevisionNumber())
{ {
callback(new customError("rev is higher than the head revision of the pad", "apierror")); callback(new customError("rev is higher than the head revision of the pad", "apierror"));
return; return;
} }
pad.getInternalRevisionAText(rev, function (err, atext) pad.getInternalRevisionAText(rev, function (err, atext)
{ {
if (ERR(err, callback)) return; if (ERR(err, callback)) return;
var oldText = pad.text(); var oldText = pad.text();
atext.text += "\n"; atext.text += "\n";
function eachAttribRun(attribs, func) function eachAttribRun(attribs, func)
{ {
var attribsIter = Changeset.opIterator(attribs); var attribsIter = Changeset.opIterator(attribs);
var textIndex = 0; var textIndex = 0;
var newTextStart = 0; var newTextStart = 0;
var newTextEnd = atext.text.length; var newTextEnd = atext.text.length;
while (attribsIter.hasNext()) while (attribsIter.hasNext())
{ {
var op = attribsIter.next(); var op = attribsIter.next();
var nextIndex = textIndex + op.chars; var nextIndex = textIndex + op.chars;
if (!(nextIndex <= newTextStart || textIndex >= newTextEnd)) if (!(nextIndex <= newTextStart || textIndex >= newTextEnd))
{ {
func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs); func(Math.max(newTextStart, textIndex), Math.min(newTextEnd, nextIndex), op.attribs);
} }
textIndex = nextIndex; textIndex = nextIndex;
} }
} }
// create a new changeset with a helper builder object // create a new changeset with a helper builder object
var builder = Changeset.builder(oldText.length); var builder = Changeset.builder(oldText.length);
// assemble each line into the builder // assemble each line into the builder
eachAttribRun(atext.attribs, function (start, end, attribs) eachAttribRun(atext.attribs, function (start, end, attribs)
{ {
builder.insert(atext.text.substring(start, end), attribs); builder.insert(atext.text.substring(start, end), attribs);
}); });
var lastNewlinePos = oldText.lastIndexOf('\n'); var lastNewlinePos = oldText.lastIndexOf('\n');
if (lastNewlinePos < 0) if (lastNewlinePos < 0)
{ {
builder.remove(oldText.length - 1, 0); builder.remove(oldText.length - 1, 0);
} else } else
{ {
builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1); builder.remove(lastNewlinePos, oldText.match(/\n/g).length - 1);
builder.remove(oldText.length - lastNewlinePos - 1, 0); builder.remove(oldText.length - lastNewlinePos - 1, 0);
} }
var changeset = builder.toString(); var changeset = builder.toString();
//append the changeset //append the changeset
pad.appendRevision(changeset); pad.appendRevision(changeset);
// //
padMessage.updatePadClients(pad, function () padMessage.updatePadClients(pad, function ()
{ {
}); });
callback(null, null); callback(null, null);
}); });
});
});
}; };
/** /**