Message Markup


Message Markup (XEP-0394) can be used as an alternative to XHTML-IM to style messages, while keeping the body and markup information strictly separated. This implementation can not be used to render message bodies, but will offer a simple to use interface for creating ExtensionElements which encode the markup information.


The most important class is the MarkupElement class, which contains a Builder.

To start creating a Message Markup Extension, call MarkupElement.getBuilder(). (Almost) all method calls documented below will be made on the builder.

Whenever a method call receives a start and end index, start represents the first character, which is affected by the styling, while end is the character after the last affected character.

Inline styling

Currently there are 3 styles available: * emphasis, which should be rendered by a client as italic, or bold * code, which should be rendered in monospace * deleted, which should be rendered as ~~strikethrough~~.

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).

If you want to apply multiple inline styles to a section, you can do the following: Set<SpanElement.SpanStyle> spanStyles = new HashSet<>(); styles.add(SpanElement.SpanStyle.emphasis); styles.add(SpanElement.SpanStyle.deleted); builder.addSpan(start, end, spanStyles);

Note, that spans cannot overlap one another.

Block Level Styling

Available block level styles are: * Code blocks, which should be rendered as blocks of code

To mark a section as code block, call builder.setCodeBlock(start, end).

To create a list, call MarkupElement.Builder.ListBuilder lbuilder = builder.beginList(), which will return a list builder. On this you can call lbuilder.addEntry(start, end) to add an entry.

Note: If you add an entry, the start value MUST be equal to the end value of the previous added entry!

To end the list, call lbuilder.endList(), which will return the MessageElement builder.

To create a block quote, call builder.setBlockQuote(start, end).

Note that block level elements MUST NOT overlap each other boundaries, but may be fully contained (nested) within each other.