mirror of
https://github.com/ether/etherpad-lite.git
synced 2025-02-01 03:12:42 +01:00
Merge pull request #1514 from ether/dont-die-on-bad-html
dont die on bad html but only warn to api logger but dont tell client th...
This commit is contained in:
commit
7d47d91a08
3 changed files with 31 additions and 10 deletions
|
@ -294,15 +294,14 @@ returns the text of a pad formatted as HTML
|
||||||
* `{code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}}`
|
* `{code: 0, message:"ok", data: {html:"Welcome Text<br>More Text"}}`
|
||||||
* `{code: 1, message:"padID does not exist", data: null}`
|
* `{code: 1, message:"padID does not exist", data: null}`
|
||||||
|
|
||||||
#### setHTML(padID, text)
|
#### setHTML(padID, html)
|
||||||
* API >= 1
|
* API >= 1
|
||||||
|
|
||||||
sets the html of a pad
|
sets the text of a pad based on HTML, HTML must be well formed. Malformed HTML will send a warning to the API log.
|
||||||
|
|
||||||
*Example returns:*
|
*Example returns:*
|
||||||
* `{code: 0, message:"ok", data: null}`
|
* `{code: 0, message:"ok", data: null}`
|
||||||
* `{code: 1, message:"padID does not exist", data: null}`
|
* `{code: 1, message:"padID does not exist", data: null}`
|
||||||
* `{code: 1, message:"text too long", data: null}`
|
|
||||||
|
|
||||||
#### getAttributePool(padID)
|
#### getAttributePool(padID)
|
||||||
* API >= 1.2.8
|
* API >= 1.2.8
|
||||||
|
|
|
@ -361,6 +361,8 @@ exports.getHTML = function(padID, rev, callback)
|
||||||
exportHtml.getPadHTML(pad, rev, function(err, html)
|
exportHtml.getPadHTML(pad, rev, function(err, html)
|
||||||
{
|
{
|
||||||
if(ERR(err, callback)) return;
|
if(ERR(err, callback)) return;
|
||||||
|
html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head
|
||||||
|
html += "</body></html>";
|
||||||
data = {html: html};
|
data = {html: html};
|
||||||
callback(null, data);
|
callback(null, data);
|
||||||
});
|
});
|
||||||
|
@ -371,6 +373,8 @@ exports.getHTML = function(padID, rev, callback)
|
||||||
exportHtml.getPadHTML(pad, undefined, function (err, html)
|
exportHtml.getPadHTML(pad, undefined, function (err, html)
|
||||||
{
|
{
|
||||||
if(ERR(err, callback)) return;
|
if(ERR(err, callback)) return;
|
||||||
|
html = "<!DOCTYPE HTML><html><body>" +html; // adds HTML head
|
||||||
|
html += "</body></html>";
|
||||||
data = {html: html};
|
data = {html: html};
|
||||||
callback(null, data);
|
callback(null, data);
|
||||||
});
|
});
|
||||||
|
@ -378,15 +382,30 @@ exports.getHTML = function(padID, rev, callback)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
setHTML(padID, html) sets the text of a pad based on HTML
|
||||||
|
|
||||||
|
Example returns:
|
||||||
|
|
||||||
|
{code: 0, message:"ok", data: null}
|
||||||
|
{code: 1, message:"padID does not exist", data: null}
|
||||||
|
*/
|
||||||
exports.setHTML = function(padID, html, callback)
|
exports.setHTML = function(padID, html, callback)
|
||||||
{
|
{
|
||||||
|
//html is required
|
||||||
|
if(typeof html != "string")
|
||||||
|
{
|
||||||
|
callback(new customError("html is no string","apierror"));
|
||||||
|
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;
|
||||||
|
|
||||||
// add a new changeset with the new html to the pad
|
// add a new changeset with the new html to the pad
|
||||||
importHtml.setPadHTML(pad, cleanText(html));
|
importHtml.setPadHTML(pad, cleanText(html), callback);
|
||||||
|
|
||||||
//update the clients on the pad
|
//update the clients on the pad
|
||||||
padMessageHandler.updatePadClients(pad, callback);
|
padMessageHandler.updatePadClients(pad, callback);
|
||||||
|
|
|
@ -25,11 +25,6 @@ function setPadHTML(pad, html, callback)
|
||||||
{
|
{
|
||||||
var apiLogger = log4js.getLogger("ImportHtml");
|
var apiLogger = log4js.getLogger("ImportHtml");
|
||||||
|
|
||||||
// Clean the pad. This makes the rest of the code easier
|
|
||||||
// by several orders of magnitude.
|
|
||||||
pad.setText("");
|
|
||||||
var padText = pad.text();
|
|
||||||
|
|
||||||
// Parse the incoming HTML with jsdom
|
// Parse the incoming HTML with jsdom
|
||||||
try{
|
try{
|
||||||
var doc = jsdom(html.replace(/>\n+</g, '><'));
|
var doc = jsdom(html.replace(/>\n+</g, '><'));
|
||||||
|
@ -44,8 +39,15 @@ function setPadHTML(pad, html, callback)
|
||||||
// Convert a dom tree into a list of lines and attribute liens
|
// Convert a dom tree into a list of lines and attribute liens
|
||||||
// using the content collector object
|
// using the content collector object
|
||||||
var cc = contentcollector.makeContentCollector(true, null, pad.pool);
|
var cc = contentcollector.makeContentCollector(true, null, pad.pool);
|
||||||
cc.collectContent(doc.childNodes[0]);
|
try{ // we use a try here because if the HTML is bad it will blow up
|
||||||
|
cc.collectContent(doc.childNodes[0]);
|
||||||
|
}catch(e){
|
||||||
|
apiLogger.warn("HTML was not properly formed", e);
|
||||||
|
return; // We don't process the HTML because it was bad..
|
||||||
|
}
|
||||||
|
|
||||||
var result = cc.finish();
|
var result = cc.finish();
|
||||||
|
|
||||||
apiLogger.debug('Lines:');
|
apiLogger.debug('Lines:');
|
||||||
var i;
|
var i;
|
||||||
for (i = 0; i < result.lines.length; i += 1)
|
for (i = 0; i < result.lines.length; i += 1)
|
||||||
|
@ -90,6 +92,7 @@ function setPadHTML(pad, html, callback)
|
||||||
// the changeset is ready!
|
// the changeset is ready!
|
||||||
var theChangeset = builder.toString();
|
var theChangeset = builder.toString();
|
||||||
apiLogger.debug('The changeset: ' + theChangeset);
|
apiLogger.debug('The changeset: ' + theChangeset);
|
||||||
|
pad.setText("");
|
||||||
pad.appendRevision(theChangeset);
|
pad.appendRevision(theChangeset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue