mirror of
https://codeberg.org/Mercury-IM/Smack
synced 2024-11-23 14:52:06 +01:00
Fixed several xhtml processing bugs:
1) <br/> will no longer produce <br/><br/>. SMACK-93 2) XML entities inside of the xhtml bodies should now be properly escaped. SMACK-145 3) XHTML processing keeps track of depth. SMACK-65 git-svn-id: http://svn.igniterealtime.org/svn/repos/smack/trunk@4342 b35dd754-fafc-0310-a699-88a17e54d16e
This commit is contained in:
parent
c49356052f
commit
c4168bf3d7
1 changed files with 23 additions and 7 deletions
|
@ -22,6 +22,7 @@ package org.jivesoftware.smackx.provider;
|
||||||
|
|
||||||
import org.jivesoftware.smack.packet.PacketExtension;
|
import org.jivesoftware.smack.packet.PacketExtension;
|
||||||
import org.jivesoftware.smack.provider.PacketExtensionProvider;
|
import org.jivesoftware.smack.provider.PacketExtensionProvider;
|
||||||
|
import org.jivesoftware.smack.util.StringUtils;
|
||||||
import org.jivesoftware.smackx.packet.XHTMLExtension;
|
import org.jivesoftware.smackx.packet.XHTMLExtension;
|
||||||
import org.xmlpull.v1.XmlPullParser;
|
import org.xmlpull.v1.XmlPullParser;
|
||||||
|
|
||||||
|
@ -50,25 +51,40 @@ public class XHTMLExtensionProvider implements PacketExtensionProvider {
|
||||||
throws Exception {
|
throws Exception {
|
||||||
XHTMLExtension xhtmlExtension = new XHTMLExtension();
|
XHTMLExtension xhtmlExtension = new XHTMLExtension();
|
||||||
boolean done = false;
|
boolean done = false;
|
||||||
StringBuffer buffer = new StringBuffer();;
|
StringBuffer buffer = new StringBuffer();
|
||||||
|
int startDepth = parser.getDepth();
|
||||||
|
int depth = parser.getDepth();
|
||||||
|
String lastTag = "";
|
||||||
while (!done) {
|
while (!done) {
|
||||||
int eventType = parser.next();
|
int eventType = parser.next();
|
||||||
if (eventType == XmlPullParser.START_TAG) {
|
if (eventType == XmlPullParser.START_TAG) {
|
||||||
if (parser.getName().equals("body"))
|
if (parser.getName().equals("body")) {
|
||||||
buffer = new StringBuffer();
|
buffer = new StringBuffer();
|
||||||
|
depth = parser.getDepth();
|
||||||
|
}
|
||||||
|
lastTag = parser.getText();
|
||||||
buffer.append(parser.getText());
|
buffer.append(parser.getText());
|
||||||
} else if (eventType == XmlPullParser.TEXT) {
|
} else if (eventType == XmlPullParser.TEXT) {
|
||||||
if (buffer != null) buffer.append(parser.getText());
|
if (buffer != null) {
|
||||||
|
// We need to return valid XML so any inner text needs to be re-escaped
|
||||||
|
buffer.append(StringUtils.escapeForXML(parser.getText()));
|
||||||
|
}
|
||||||
} else if (eventType == XmlPullParser.END_TAG) {
|
} else if (eventType == XmlPullParser.END_TAG) {
|
||||||
if (parser.getName().equals("body")) {
|
if (parser.getName().equals("body") || parser.getDepth() <= depth) {
|
||||||
buffer.append(parser.getText());
|
buffer.append(parser.getText());
|
||||||
xhtmlExtension.addBody(buffer.toString());
|
xhtmlExtension.addBody(buffer.toString());
|
||||||
}
|
}
|
||||||
else if (parser.getName().equals(xhtmlExtension.getElementName())) {
|
else if (parser.getName().equals(xhtmlExtension.getElementName())
|
||||||
|
|| parser.getDepth() <= startDepth) {
|
||||||
done = true;
|
done = true;
|
||||||
}
|
}
|
||||||
else
|
else {
|
||||||
buffer.append(parser.getText());
|
// This is a check for tags that are both a start and end tag like <br/>
|
||||||
|
// So that they aren't doubled
|
||||||
|
if(!lastTag.equals(parser.getText())) {
|
||||||
|
buffer.append(parser.getText());
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue