2018-02-21 20:49:01 +01:00
|
|
|
/**
|
|
|
|
*
|
|
|
|
* Copyright © 2018 Paul Schaub
|
|
|
|
*
|
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
|
|
* you may not use this file except in compliance with the License.
|
|
|
|
* You may obtain a copy of the License at
|
|
|
|
*
|
|
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
|
|
*
|
|
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
|
|
* See the License for the specific language governing permissions and
|
|
|
|
* limitations under the License.
|
|
|
|
*/
|
|
|
|
package org.jivesoftware.smackx.message_markup.provider;
|
|
|
|
|
2019-02-05 10:41:50 +01:00
|
|
|
import java.io.IOException;
|
2018-02-21 20:49:01 +01:00
|
|
|
import java.util.ArrayList;
|
|
|
|
import java.util.HashSet;
|
|
|
|
import java.util.List;
|
|
|
|
import java.util.Set;
|
|
|
|
|
2019-02-15 23:21:30 +01:00
|
|
|
import org.jivesoftware.smack.packet.XmlEnvironment;
|
2018-02-21 20:49:01 +01:00
|
|
|
import org.jivesoftware.smack.provider.ExtensionElementProvider;
|
|
|
|
import org.jivesoftware.smack.util.ParserUtils;
|
2019-05-06 22:06:13 +02:00
|
|
|
import org.jivesoftware.smack.xml.XmlPullParser;
|
|
|
|
import org.jivesoftware.smack.xml.XmlPullParserException;
|
|
|
|
|
2018-02-21 20:49:01 +01:00
|
|
|
import org.jivesoftware.smackx.message_markup.element.BlockQuoteElement;
|
|
|
|
import org.jivesoftware.smackx.message_markup.element.CodeBlockElement;
|
|
|
|
import org.jivesoftware.smackx.message_markup.element.ListElement;
|
|
|
|
import org.jivesoftware.smackx.message_markup.element.MarkupElement;
|
2020-04-12 12:08:31 +02:00
|
|
|
import org.jivesoftware.smackx.message_markup.element.MarkupElement.MarkupChildElement;
|
2018-02-21 20:49:01 +01:00
|
|
|
import org.jivesoftware.smackx.message_markup.element.SpanElement;
|
|
|
|
|
|
|
|
public class MarkupElementProvider extends ExtensionElementProvider<MarkupElement> {
|
|
|
|
|
|
|
|
@Override
|
2019-02-15 23:21:30 +01:00
|
|
|
public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironment xmlEnvironment) throws IOException, XmlPullParserException {
|
2018-02-21 20:49:01 +01:00
|
|
|
|
|
|
|
MarkupElement.Builder markup = MarkupElement.getBuilder();
|
|
|
|
|
|
|
|
int spanStart = -1, spanEnd = -1;
|
|
|
|
Set<SpanElement.SpanStyle> spanStyles = new HashSet<>();
|
|
|
|
|
|
|
|
int listStart = -1, listEnd = -1;
|
|
|
|
List<ListElement.ListEntryElement> lis = new ArrayList<>();
|
|
|
|
|
|
|
|
while (true) {
|
2019-05-06 22:06:13 +02:00
|
|
|
XmlPullParser.Event tag = parser.next();
|
2018-02-21 20:49:01 +01:00
|
|
|
String name = parser.getName();
|
|
|
|
int start, end;
|
|
|
|
switch (tag) {
|
2019-05-06 22:06:13 +02:00
|
|
|
case START_ELEMENT:
|
2018-02-21 20:49:01 +01:00
|
|
|
switch (name) {
|
|
|
|
case BlockQuoteElement.ELEMENT:
|
2020-04-12 12:08:31 +02:00
|
|
|
start = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_START,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup BlockQuoteElement MUST contain a 'start' attribute.");
|
2020-04-12 12:08:31 +02:00
|
|
|
end = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup BlockQuoteElement MUST contain a 'end' attribute.");
|
|
|
|
markup.setBlockQuote(start, end);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case CodeBlockElement.ELEMENT:
|
2020-04-12 12:08:31 +02:00
|
|
|
start = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_START,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup CodeBlockElement MUST contain a 'start' attribute.");
|
2020-04-12 12:08:31 +02:00
|
|
|
end = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup CodeBlockElement MUST contain a 'end' attribute.");
|
|
|
|
markup.setCodeBlock(start, end);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SpanElement.ELEMENT:
|
|
|
|
spanStyles = new HashSet<>();
|
2020-04-12 12:08:31 +02:00
|
|
|
spanStart = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_START,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup SpanElement MUST contain a 'start' attribute.");
|
2020-04-12 12:08:31 +02:00
|
|
|
spanEnd = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup SpanElement MUST contain a 'end' attribute.");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SpanElement.code:
|
|
|
|
spanStyles.add(SpanElement.SpanStyle.code);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SpanElement.emphasis:
|
|
|
|
spanStyles.add(SpanElement.SpanStyle.emphasis);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case SpanElement.deleted:
|
|
|
|
spanStyles.add(SpanElement.SpanStyle.deleted);
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ListElement.ELEMENT:
|
|
|
|
lis = new ArrayList<>();
|
2020-04-12 12:08:31 +02:00
|
|
|
listStart = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_START,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup ListElement MUST contain a 'start' attribute.");
|
2020-04-12 12:08:31 +02:00
|
|
|
listEnd = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup ListElement MUST contain a 'end' attribute.");
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ListElement.ELEM_LI:
|
2020-04-12 12:08:31 +02:00
|
|
|
start = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_START,
|
2018-02-21 20:49:01 +01:00
|
|
|
"Message Markup ListElement 'li' MUST contain a 'start' attribute.");
|
|
|
|
lis.add(new ListElement.ListEntryElement(start));
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
|
2019-05-06 22:06:13 +02:00
|
|
|
case END_ELEMENT:
|
2018-02-21 20:49:01 +01:00
|
|
|
switch (name) {
|
|
|
|
case SpanElement.ELEMENT:
|
|
|
|
markup.addSpan(spanStart, spanEnd, spanStyles);
|
|
|
|
spanStart = -1; spanEnd = -1;
|
|
|
|
break;
|
|
|
|
|
|
|
|
case ListElement.ELEMENT:
|
|
|
|
MarkupElement.Builder.ListBuilder listBuilder = markup.beginList();
|
|
|
|
if (lis.size() > 0 && lis.get(0).getStart() != listStart) {
|
2019-02-05 10:41:50 +01:00
|
|
|
// TODO: Should be SmackParseException.
|
|
|
|
throw new IOException("Error while parsing incoming MessageMarkup ListElement: " +
|
2018-02-21 20:49:01 +01:00
|
|
|
"'start' attribute of first 'li' element must equal 'start' attribute of list.");
|
|
|
|
}
|
|
|
|
for (int i = 0; i < lis.size(); i++) {
|
|
|
|
int elemStart = lis.get(i).getStart();
|
|
|
|
int elemEnd = i < lis.size() - 1 ? lis.get(i + 1).getStart() : listEnd;
|
|
|
|
listBuilder.addEntry(elemStart, elemEnd);
|
|
|
|
}
|
|
|
|
listBuilder.endList();
|
|
|
|
break;
|
|
|
|
|
|
|
|
case MarkupElement.ELEMENT:
|
|
|
|
return markup.build();
|
|
|
|
}
|
2019-05-06 22:06:13 +02:00
|
|
|
break;
|
2018-02-21 20:49:01 +01:00
|
|
|
|
2019-05-06 22:06:13 +02:00
|
|
|
default:
|
|
|
|
// Catch all for incomplete switch (MissingCasesInEnumSwitch) statement.
|
|
|
|
break;
|
2018-02-21 20:49:01 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
}
|