Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -18,24 +18,39 @@

import javax.xml.namespace.QName;

import org.jivesoftware.smack.util.XmlStringBuilder;

public class CodeBlockElement extends MarkupElement.BlockLevelMarkupElement {

public static final String ELEMENT = "bcode";
public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

private final String codeLanguage;

/**
* Create a new Code Block element.
*
* @param start start index
* @param end end index
* @param codeLanguage programming language of the code block (e.g. "java")
*/
public CodeBlockElement(int start, int end) {
public CodeBlockElement(int start, int end, String codeLanguage) {
super(start, end);
this.codeLanguage = codeLanguage;
}

public String getCodeLanguage() {
return codeLanguage;
}

@Override
public String getElementName() {
return ELEMENT;
}

@Override
protected void afterXmlPrelude(XmlStringBuilder xml) {
xml.attribute("language", codeLanguage);
super.afterXmlPrelude(xml);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,17 +30,20 @@ public class ListElement extends MarkupElement.NonEmptyChildElement {
public static final QName QNAME = new QName(NAMESPACE, ELEMENT);

private final List<ListEntryElement> entries;
private final boolean ordered;

/**
* Create a new List element.
*
* @param start start index of the list
* @param end end index of the list
* @param entries list entries
* @param ordered the list is ordered and displaying it with numerical or alphabetical ordering instead of bullets
*/
public ListElement(int start, int end, List<ListEntryElement> entries) {
public ListElement(int start, int end, List<ListEntryElement> entries, boolean ordered) {
super(start, end);
this.entries = Collections.unmodifiableList(entries);
this.ordered = ordered;
}

/**
Expand All @@ -52,11 +55,21 @@ public List<ListEntryElement> getEntries() {
return entries;
}

public boolean isOrdered() {
return ordered;
}

@Override
public String getElementName() {
return QNAME.getLocalPart();
}

@Override
protected void afterXmlPrelude(XmlStringBuilder xml) {
xml.attribute("ordered", isOrdered());
super.afterXmlPrelude(xml);
}

@Override
public void appendInnerXml(XmlStringBuilder xml) {
xml.append(getEntries());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,7 @@ private Builder() {
*
* @param start start index
* @param end end index
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder setDeleted(int start, int end) {
return addSpan(start, end, Collections.singleton(SpanElement.SpanStyle.deleted));
Expand All @@ -107,18 +107,29 @@ public Builder setDeleted(int start, int end) {
*
* @param start start index
* @param end end index
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder setEmphasis(int start, int end) {
return addSpan(start, end, Collections.singleton(SpanElement.SpanStyle.emphasis));
}

/**
* Mark a section of a message as strongly emphasized (bold font).
*
* @param start start index
* @param end end index
* @return builder to be used for chaining.
*/
public Builder setStrong(int start, int end) {
return addSpan(start, end, Collections.singleton(SpanElement.SpanStyle.strong));
}

/**
* Mark a section of a message as inline code.
*
* @param start start index
* @param end end index
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder setCode(int start, int end) {
return addSpan(start, end, Collections.singleton(SpanElement.SpanStyle.code));
Expand All @@ -130,7 +141,7 @@ public Builder setCode(int start, int end) {
* @param start start index
* @param end end index
* @param styles list of text styles for that span
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder addSpan(int start, int end, Set<SpanElement.SpanStyle> styles) {
verifyStartEnd(start, end);
Expand All @@ -151,7 +162,7 @@ public Builder addSpan(int start, int end, Set<SpanElement.SpanStyle> styles) {
*
* @param start start index
* @param end end index
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder setBlockQuote(int start, int end) {
verifyStartEnd(start, end);
Expand All @@ -178,12 +189,13 @@ public Builder setBlockQuote(int start, int end) {
*
* @param start start index
* @param end end index
* @return builder TODO javadoc me please
* @param codeLanguage programming language of the code block (e.g. "java")
* @return builder to be used for chaining.
*/
public Builder setCodeBlock(int start, int end) {
public Builder setCodeBlock(int start, int end, String codeLanguage) {
verifyStartEnd(start, end);

codes.add(new CodeBlockElement(start, end));
codes.add(new CodeBlockElement(start, end, codeLanguage));
return this;
}

Expand All @@ -199,6 +211,7 @@ public Builder.ListBuilder beginList() {
public static final class ListBuilder {
private final Builder markup;
private final ArrayList<ListElement.ListEntryElement> entries = new ArrayList<>();
private boolean ordered;
private int end = -1;

private ListBuilder(Builder markup) {
Expand Down Expand Up @@ -228,15 +241,20 @@ public Builder.ListBuilder addEntry(int start, int end) {
return this;
}

public Builder.ListBuilder setOrdered(boolean ordered) {
this.ordered = ordered;
return this;
}

/**
* End the list.
*
* @return builder TODO javadoc me please
* @return builder to be used for chaining.
*/
public Builder endList() {
if (entries.size() > 0) {
ListElement.ListEntryElement first = entries.get(0);
ListElement list = new ListElement(first.getStart(), end, entries);
ListElement list = new ListElement(first.getStart(), end, entries, ordered);
markup.lists.add(list);
}

Expand Down Expand Up @@ -326,7 +344,7 @@ protected NonEmptyChildElement(int start, int end) {
}

@Override
protected final void afterXmlPrelude(XmlStringBuilder xml) {
protected void afterXmlPrelude(XmlStringBuilder xml) {
xml.rightAngleBracket();

appendInnerXml(xml);
Expand All @@ -348,7 +366,7 @@ protected BlockLevelMarkupElement(int start, int end) {
}

@Override
protected final void afterXmlPrelude(XmlStringBuilder xml) {
protected void afterXmlPrelude(XmlStringBuilder xml) {
xml.closeEmptyElement();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,11 +52,13 @@ public Set<SpanStyle> getStyles() {
}

public static final String emphasis = "emphasis";
public static final String strong = "strong";
public static final String code = "code";
public static final String deleted = "deleted";

public enum SpanStyle {
emphasis,
strong,
code,
deleted
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -36,13 +36,14 @@
* <p>
* Currently there are 3 styles available:
* <ul>
* <li>*emphasis*, which should be rendered by a client as *italic*, or **bold**</li>
* <li>*emphasis*, which should be rendered by a client as *italic*</li>
* <li>*strong*, which should be rendered by a client as **bold**</li>
* <li>*code*, which should be rendered in `monospace`</li>
* <li>*deleted*, which should be rendered as ~~strikethrough~~.</li>
* </ul>
* <p>
* Those styles are available by calling `builder.setEmphasis(int start, int end)`, `builder.setDeleted(int start, int
* end)` and `builder.setCode(int start, int end)`.
* Those styles are available by calling `builder.setEmphasis(int start, int end)`, `builder.setStrong(int start, int
* end)`, `builder.setDeleted(int start, int end)` and `builder.setCode(int start, int end)`.
* </p>
* <p>
* If you want to apply multiple inline styles to a section, you can do the following:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -49,6 +49,7 @@ public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironmen

int listStart = -1, listEnd = -1;
List<ListElement.ListEntryElement> lis = new ArrayList<>();
boolean listOrdered = false;

while (true) {
XmlPullParser.Event tag = parser.next();
Expand All @@ -71,7 +72,8 @@ public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironmen
"Message Markup CodeBlockElement MUST contain a 'start' attribute.");
end = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
"Message Markup CodeBlockElement MUST contain a 'end' attribute.");
markup.setCodeBlock(start, end);
String codeLanguage = parser.getAttributeValue("", "language");
markup.setCodeBlock(start, end, codeLanguage);
break;

case SpanElement.ELEMENT:
Expand All @@ -90,6 +92,10 @@ public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironmen
spanStyles.add(SpanElement.SpanStyle.emphasis);
break;

case SpanElement.strong:
spanStyles.add(SpanElement.SpanStyle.strong);
break;

case SpanElement.deleted:
spanStyles.add(SpanElement.SpanStyle.deleted);
break;
Expand All @@ -100,6 +106,7 @@ public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironmen
"Message Markup ListElement MUST contain a 'start' attribute.");
listEnd = ParserUtils.getIntegerAttributeOrThrow(parser, MarkupChildElement.ATTR_END,
"Message Markup ListElement MUST contain a 'end' attribute.");
listOrdered = ParserUtils.getBooleanAttribute(parser, "ordered", false);
break;

case ListElement.ListEntryElement.ELEMENT:
Expand All @@ -123,7 +130,8 @@ public MarkupElement parse(XmlPullParser parser, int initialDepth, XmlEnvironmen
break;

case ListElement.ELEMENT:
MarkupElement.Builder.ListBuilder listBuilder = markup.beginList();
MarkupElement.Builder.ListBuilder listBuilder = markup.beginList()
.setOrdered(listOrdered);
if (lis.size() > 0 && lis.get(0).getStart() != listStart) {
// TODO: Should be SmackParseException.
throw new IOException("Error while parsing incoming MessageMarkup ListElement: " +
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
import static org.jivesoftware.smack.test.util.XmlAssertUtil.assertXmlSimilar;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;

import java.util.List;

Expand Down Expand Up @@ -61,6 +62,30 @@ public void emphasisTest() throws Exception {
assertEquals(SpanElement.SpanStyle.emphasis, spanElement.getStyles().iterator().next());
}

@Test
public void strongTest() throws Exception {
String xml =
"<markup xmlns='urn:xmpp:markup:0'>" +
"<span start='9' end='15'>" +
"<strong/>" +
"</span>" +
"</markup>";
MarkupElement.Builder m = MarkupElement.getBuilder();
m.setStrong(9, 15);
assertXmlSimilar(xml, m.build().toXML().toString());

XmlPullParser parser = TestUtils.getParser(xml);
MarkupElement parsed = new MarkupElementProvider().parse(parser);
List<MarkupElement.MarkupChildElement> children = parsed.getChildElements();
assertEquals(1, children.size());

SpanElement spanElement = (SpanElement) children.get(0);
assertEquals(9, spanElement.getStart());
assertEquals(15, spanElement.getEnd());
assertEquals(1, spanElement.getStyles().size());
assertEquals(SpanElement.SpanStyle.strong, spanElement.getStyles().iterator().next());
}

@Test
public void codeTest() throws Exception {
String xml =
Expand Down Expand Up @@ -127,10 +152,10 @@ public void overlappingSpansTest() {
public void codeBlockTest() throws Exception {
String xml =
"<markup xmlns='urn:xmpp:markup:0'>" +
"<bcode start='23' end='48'/>" +
"<bcode start='23' end='48' language='bash' />" +
"</markup>";
MarkupElement.Builder m = MarkupElement.getBuilder();
m.setCodeBlock(23, 48);
m.setCodeBlock(23, 48, "bash");
assertXmlSimilar(xml, m.build().toXML().toString());

XmlPullParser parser = TestUtils.getParser(xml);
Expand All @@ -141,13 +166,14 @@ public void codeBlockTest() throws Exception {
CodeBlockElement codeBlock = (CodeBlockElement) children.get(0);
assertEquals(23, codeBlock.getStart());
assertEquals(48, codeBlock.getEnd());
assertEquals("bash", codeBlock.getCodeLanguage());
}

@Test
public void listTest() throws Exception {
String xml =
"<markup xmlns='urn:xmpp:markup:0'>" +
"<list start='31' end='89'>" +
"<list start='31' end='89' ordered='true'>" +
"<li start='31'/>" +
"<li start='47'/>" +
"<li start='61'/>" +
Expand All @@ -156,6 +182,7 @@ public void listTest() throws Exception {
"</markup>";
MarkupElement.Builder m = MarkupElement.getBuilder();
m = m.beginList()
.setOrdered(true)
.addEntry(31, 47)
.addEntry(47, 61)
.addEntry(61, 69)
Expand All @@ -171,6 +198,7 @@ public void listTest() throws Exception {
ListElement list = (ListElement) children.get(0);
assertEquals(31, list.getStart());
assertEquals(89, list.getEnd());
assertTrue(list.isOrdered());
assertEquals(4, list.getEntries().size());
assertEquals(list.getStart(), list.getEntries().get(0).getStart());
assertEquals(47, list.getEntries().get(1).getStart());
Expand Down
Loading