update pad clients

pull/2300/head
Cristo 2014-11-12 19:46:50 +01:00
parent 46bc328896
commit 9d39c9591a
1 changed files with 88 additions and 82 deletions

View File

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