514880: [asciidoc] support for css styled text

* #text# highlights (html: <mark>text</mark>)
* [css-class]#text# uses a <span> with "css-class"
* SpanType.HIGHLIGHT added

Task-Url: https://bugs.eclipse.org/bugs/show_bug.cgi?id=514880
Change-Id: Ic5a58b76f3b128ab6b5af9f178ad800c1b55f2f3
Signed-off-by: Fabrizio Iannetti <fabrizio.iannetti@gmail.com>
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/AsciiDocLanguage.java b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/AsciiDocLanguage.java
index deafbc2..a8a282a 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/AsciiDocLanguage.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/AsciiDocLanguage.java
@@ -34,6 +34,7 @@
 import org.eclipse.mylyn.wikitext.asciidoc.internal.block.TitleLineBlock;
 import org.eclipse.mylyn.wikitext.asciidoc.internal.block.UnderlinedHeadingBlock;
 import org.eclipse.mylyn.wikitext.asciidoc.internal.phrase.BackslashEscapePhraseModifier;
+import org.eclipse.mylyn.wikitext.asciidoc.internal.phrase.CssClassPhraseModifier;
 import org.eclipse.mylyn.wikitext.asciidoc.internal.phrase.SimplePhraseModifier;
 import org.eclipse.mylyn.wikitext.asciidoc.internal.phrase.SimplePhraseModifier.Mode;
 import org.eclipse.mylyn.wikitext.asciidoc.internal.token.AnchorLinkMacroReplacementToken;
@@ -150,11 +151,11 @@
 		phraseModifierSyntax.add(new SimplePhraseModifier("_", SpanType.EMPHASIS, Mode.NESTING)); //$NON-NLS-1$
 		phraseModifierSyntax.add(new SimplePhraseModifier("`", SpanType.CODE, Mode.NESTING)); //$NON-NLS-1$
 		phraseModifierSyntax.add(new SimplePhraseModifier("+", SpanType.SPAN, Mode.NORMAL)); //$NON-NLS-1$
+		phraseModifierSyntax.add(new CssClassPhraseModifier());
 		phraseModifierSyntax.endGroup(")(?:(?=\\W)|$)", 0);
 
 		phraseModifierSyntax.add(new SimplePhraseModifier("^", SpanType.SUPERSCRIPT, Mode.NESTING));
 		phraseModifierSyntax.add(new SimplePhraseModifier("~", SpanType.SUBSCRIPT, Mode.NESTING));
-
 	}
 
 	@Override
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/AsciiDocDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/AsciiDocDocumentBuilder.java
index b6d62db..7b8789a 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/AsciiDocDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/AsciiDocDocumentBuilder.java
@@ -280,6 +280,13 @@
 			return new ContentBlock("^", "^", 0, 0);
 		case SUBSCRIPT:
 			return new ContentBlock("~", "~", 0, 0);
+		case MARK:
+			return new ContentBlock("#", "#", 0, 0);
+		case SPAN:
+			if (attributes.getCssClass() != null) {
+				return new ContentBlock("[" + attributes.getCssClass() + "]#", "#", 0, 0);
+			}
+			return new ContentBlock("", "", 0, 0);
 		default:
 			Logger.getLogger(getClass().getName()).warning("Unexpected block type: " + type); //$NON-NLS-1$
 			return new ContentBlock("", "", 0, 0); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/phrase/CssClassPhraseModifier.java b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/phrase/CssClassPhraseModifier.java
new file mode 100644
index 0000000..e6adccd
--- /dev/null
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/main/java/org/eclipse/mylyn/wikitext/asciidoc/internal/phrase/CssClassPhraseModifier.java
@@ -0,0 +1,52 @@
+/*******************************************************************************
+ * Copyright (c) 2007, 2008 David Green and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     David Green - initial API and implementation
+ *******************************************************************************/
+
+package org.eclipse.mylyn.wikitext.asciidoc.internal.phrase;
+
+import org.eclipse.mylyn.wikitext.parser.Attributes;
+import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType;
+import org.eclipse.mylyn.wikitext.parser.markup.PatternBasedElement;
+import org.eclipse.mylyn.wikitext.parser.markup.PatternBasedElementProcessor;
+
+public class CssClassPhraseModifier extends PatternBasedElement {
+
+	@Override
+	protected String getPattern(int groupOffset) {
+		return "(?:\\[\\.*(.+?)\\])?#(.+?)#";
+	}
+
+	@Override
+	protected int getPatternGroupCount() {
+		return 2;
+	}
+
+	@Override
+	protected PatternBasedElementProcessor newProcessor() {
+		return new PatternBasedElementProcessor() {
+
+			@Override
+			public void emit() {
+				Attributes attributes = new Attributes();
+				SpanType span = SpanType.SPAN;
+				String cssClass = group(1);
+				if (cssClass != null && !cssClass.isEmpty()) {
+					attributes.setCssClass(cssClass);
+				} else {
+					span = SpanType.MARK;
+				}
+				getBuilder().beginSpan(span, attributes);
+				getBuilder().characters(group(2));
+				getBuilder().endSpan();
+			}
+		};
+	}
+
+}
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocDocumentBuilderTest.java
index 522c1bc..7890a67 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocDocumentBuilderTest.java
@@ -666,6 +666,16 @@
 	}
 
 	@Test
+	public void testHighlight() {
+		builder.beginDocument();
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("highlight");
+		builder.endSpan();
+		builder.endDocument();
+		assertMarkup("#highlight#\n\n");
+	}
+
+	@Test
 	public void testCodeSpan() {
 		builder.beginDocument();
 		builder.characters("Here's a ");
@@ -695,6 +705,30 @@
 	}
 
 	@Test
+	public void testSpanSimple() {
+		builder.beginDocument();
+		builder.characters("Here's a ");
+		builder.beginSpan(SpanType.SPAN, new Attributes());
+		builder.characters("plain");
+		builder.endSpan();
+		builder.characters(" span.");
+		builder.endBlock();
+		assertMarkup("Here's a plain span.\n\n");
+	}
+
+	@Test
+	public void testSpanWithCssClass() {
+		builder.beginDocument();
+		builder.characters("Here's a ");
+		builder.beginSpan(SpanType.SPAN, new Attributes(null, "css-class", null, null));
+		builder.characters("css styled");
+		builder.endSpan();
+		builder.characters(" span.");
+		builder.endBlock();
+		assertMarkup("Here's a [css-class]#css styled# span.\n\n");
+	}
+
+	@Test
 	public void testSuperscript() {
 		builder.beginDocument();
 		builder.beginSpan(SpanType.SUPERSCRIPT, new Attributes());
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocLanguageSpanElementsTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocLanguageSpanElementsTest.java
index ea2c48d..8931e3d 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocLanguageSpanElementsTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.asciidoc/src/test/java/org/eclipse/mylyn/internal/wikitext/asciidoc/tests/AsciiDocLanguageSpanElementsTest.java
@@ -416,4 +416,39 @@
 				html);
 	}
 
+	@Test
+	public void highlightWordBoundary() {
+		String html = parseToHtml("#text#");
+		assertEquals("<p><mark>text</mark></p>\n", html);
+	}
+
+	@Test
+	public void highlightNoWordBoundary() {
+		String html = parseToHtml("nospace#text#nospace");
+		assertEquals("<p>nospace#text#nospace</p>\n", html);
+	}
+
+	@Test
+	public void customClassWordBoundary() {
+		String html = parseToHtml("[css-class]#text#");
+		assertEquals("<p><span class=\"css-class\">text</span></p>\n", html);
+	}
+
+	@Test
+	public void customClassLeadingDots() {
+		String html = parseToHtml("[..css-class]#text#");
+		assertEquals("<p><span class=\"css-class\">text</span></p>\n", html);
+	}
+
+	@Test
+	public void customClassNoWordBoundary() {
+		String html = parseToHtml("nospace[css-class]#text#nospace");
+		assertEquals("<p>nospace[css-class]#text#nospace</p>\n", html);
+	}
+
+	@Test
+	public void customClassNoWordBoundaryBefore() {
+		String html = parseToHtml("nospace[css-class]#text#");
+		assertEquals("<p>nospace[css-class]<mark>text</mark></p>\n", html);
+	}
 }
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/main/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/main/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilder.java
index ead76f9..18b6840 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/main/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/main/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilder.java
@@ -383,6 +383,7 @@
 		case DELETED:
 			block = new ContentBlock("-" + spanAttributes, "-", true, false, 0, 0); //$NON-NLS-1$//$NON-NLS-2$
 			break;
+		case MARK:
 		case EMPHASIS:
 		case ITALIC:
 			block = new ContentBlock("_" + spanAttributes, "_", true, false, 0, 0); //$NON-NLS-1$//$NON-NLS-2$
@@ -416,7 +417,6 @@
 			block = new ContentBlock("+", "+", true, false, 0, 0); //$NON-NLS-1$//$NON-NLS-2$
 			break;
 //			case QUOTE: not supported
-
 		case SPAN:
 		default:
 			block = null;
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/test/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/test/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilderTest.java
index 7a823d3..d051e91 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/test/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.confluence/src/test/java/org/eclipse/mylyn/wikitext/confluence/internal/ConfluenceDocumentBuilderTest.java
@@ -752,6 +752,26 @@
 	}
 
 	@Test
+	public void mark() {
+		builder.beginDocument();
+
+		builder.characters("prefix ");
+
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("italic phrase");
+		builder.endBlock();
+
+		builder.characters(" suffix");
+
+		builder.endBlock();
+		builder.endDocument();
+
+		String markup = out.toString();
+
+		assertEquals("prefix _italic phrase_ suffix\n\n", markup);
+	}
+
+	@Test
 	public void emptyBoldSpan() {
 		builder.beginDocument();
 
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.html/src/main/java/org/eclipse/mylyn/wikitext/html/HtmlLanguage.java b/wikitext/core/org.eclipse.mylyn.wikitext.html/src/main/java/org/eclipse/mylyn/wikitext/html/HtmlLanguage.java
index 16a49bd..af58fa1 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.html/src/main/java/org/eclipse/mylyn/wikitext/html/HtmlLanguage.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.html/src/main/java/org/eclipse/mylyn/wikitext/html/HtmlLanguage.java
@@ -33,40 +33,53 @@
  * The {@link HtmlLanguage} maps block types as follows:
  * </p>
  * <ul>
- * <li>{@link BlockType#BULLETED_LIST} maps to HTML tag {@code 
- * <ul>
+ * <li>{@link BlockType#BULLETED_LIST} maps to HTML tag {@code
+ * 
+<ul>
  * }</li>
  * <li>{@link BlockType#CODE} maps to HTML tags <code>&lt;pre>&lt;code></code></li>
- * <li>{@link BlockType#DEFINITION_LIST} maps to HTML tag {@code 
- * <dl>
- * }</li>
- * <li>{@link BlockType#DEFINITION_ITEM} maps to HTML tag {@code 
- * <dd>}</li>
- * <li>{@link BlockType#DEFINITION_TERM} maps to HTML tag {@code 
- * <dt>}</li>
- * <li>{@link BlockType#DIV} maps to HTML tag {@code <div>}</li>
- * <li>{@link BlockType#LIST_ITEM} maps to HTML tag {@code 
- * <li>}</li>
- * <li>{@link BlockType#NUMERIC_LIST} maps to HTML tag {@code 
- * <ol>
- * }</li>
- * <li>{@link BlockType#PARAGRAPH} maps to HTML tag {@code 
- * <p>
- * }</li>
- * <li>{@link BlockType#PREFORMATTED} maps to HTML tag {@code 
+ * <li>{@link BlockType#DEFINITION_LIST} maps to HTML tag {@code
  * 
- * <pre>
+<dl>
+ * }</li>
+ * <li>{@link BlockType#DEFINITION_ITEM} maps to HTML tag {@code
+ * 
+<dd>}</li>
+ * <li>{@link BlockType#DEFINITION_TERM} maps to HTML tag {@code
+ * 
+<dt>}</li>
+ * <li>{@link BlockType#DIV} maps to HTML tag {@code <div>}</li>
+ * <li>{@link BlockType#LIST_ITEM} maps to HTML tag {@code
+ * 
+<li>}</li>
+ * <li>{@link BlockType#NUMERIC_LIST} maps to HTML tag {@code
+ * 
+<ol>
+ * }</li>
+ * <li>{@link BlockType#PARAGRAPH} maps to HTML tag {@code
+ * 
+<p>
+ * }</li>
+ * <li>{@link BlockType#PREFORMATTED} maps to HTML tag {@code
+ *
+ * 
+
+<pre>
  * }</li>
  * <li>{@link BlockType#QUOTE} maps to HTML tag {@code <blockquote>}</li>
- * <li>{@link BlockType#TABLE} maps to HTML tag {@code 
- * <table>
+ * <li>{@link BlockType#TABLE} maps to HTML tag {@code
+ * 
+<table>
  * }</li>
- * <li>{@link BlockType#TABLE_CELL_HEADER} maps to HTML tag {@code 
- * <th>}</li>
- * <li>{@link BlockType#TABLE_CELL_NORMAL} maps to HTML tag {@code 
- * <td>}</li>
- * <li>{@link BlockType#TABLE_ROW} maps to HTML tag {@code 
- * <tr>
+ * <li>{@link BlockType#TABLE_CELL_HEADER} maps to HTML tag {@code
+ * 
+<th>}</li>
+ * <li>{@link BlockType#TABLE_CELL_NORMAL} maps to HTML tag {@code
+ * 
+<td>}</li>
+ * <li>{@link BlockType#TABLE_ROW} maps to HTML tag {@code
+ * 
+<tr>
  * }</li>
  * </ul>
  * <p>
@@ -82,13 +95,15 @@
  * <li>{@link SpanType#ITALIC} maps to HTML tag {@code <i>}</li>
  * <li>{@link SpanType#LINK} maps to HTML tag {@code <a>}</li>
  * <li>{@link SpanType#MONOSPACE} maps to HTML tag {@code <tt>}</li>
- * <li>{@link SpanType#QUOTE} maps to HTML tag {@code 
- * <q>}</li>
+ * <li>{@link SpanType#QUOTE} maps to HTML tag {@code
+ * 
+<q>}</li>
  * <li>{@link SpanType#SPAN} maps to HTML tag {@code <span>}</li>
  * <li>{@link SpanType#STRONG} maps to HTML tag {@code <strong>}</li>
  * <li>{@link SpanType#SUBSCRIPT} maps to HTML tag {@code <sub>}</li>
  * <li>{@link SpanType#SUPERSCRIPT} maps to HTML tag {@code <sup>}</li>
  * <li>{@link SpanType#UNDERLINED} maps to HTML tag {@code <u>}</li>
+ * <li>{@link SpanType#MARK} maps to HTML tag {@mark <u>}</li>
  * </ul>
  * <p>
  * {@link HtmlLanguage} variants created using {@link HtmlLanguageBuilder} may map {@link SpanType} and
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.html/src/test/java/org/eclipse/mylyn/wikitext/html/internal/HtmlSubsetDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.html/src/test/java/org/eclipse/mylyn/wikitext/html/internal/HtmlSubsetDocumentBuilderTest.java
index 26cf9c7..cbd308b 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.html/src/test/java/org/eclipse/mylyn/wikitext/html/internal/HtmlSubsetDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.html/src/test/java/org/eclipse/mylyn/wikitext/html/internal/HtmlSubsetDocumentBuilderTest.java
@@ -20,12 +20,6 @@
 import java.io.StringWriter;
 import java.util.Collections;
 
-import org.eclipse.mylyn.wikitext.html.internal.FontElementStrategy;
-import org.eclipse.mylyn.wikitext.html.internal.HtmlSubsetDocumentBuilder;
-import org.eclipse.mylyn.wikitext.html.internal.SpanHtmlElementStrategy;
-import org.eclipse.mylyn.wikitext.html.internal.SupportedBlockStrategy;
-import org.eclipse.mylyn.wikitext.html.internal.SupportedSpanStrategy;
-import org.eclipse.mylyn.wikitext.html.internal.UnsupportedBlockStrategy;
 import org.eclipse.mylyn.wikitext.parser.Attributes;
 import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.BlockType;
 import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType;
@@ -533,6 +527,11 @@
 	}
 
 	@Test
+	public void spanMarkSupported() {
+		assertSupportedSpan("<mark>test</mark>", SpanType.MARK);
+	}
+
+	@Test
 	public void spanBoldUnsupported() {
 		assertUnsupportedSpan("<strong>test</strong>", SpanType.BOLD, SpanType.STRONG);
 	}
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/main/java/org/eclipse/mylyn/wikitext/markdown/internal/MarkdownDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/main/java/org/eclipse/mylyn/wikitext/markdown/internal/MarkdownDocumentBuilder.java
index 4f528d3..8c7c51c 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/main/java/org/eclipse/mylyn/wikitext/markdown/internal/MarkdownDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/main/java/org/eclipse/mylyn/wikitext/markdown/internal/MarkdownDocumentBuilder.java
@@ -327,6 +327,7 @@
 			return new ContentBlock("<", ">", 0, 0); //$NON-NLS-1$ //$NON-NLS-2$
 		case ITALIC:
 		case EMPHASIS:
+		case MARK:
 			return new ContentBlock("*", "*", 0, 0); //$NON-NLS-1$ //$NON-NLS-2$
 		case BOLD:
 		case STRONG:
@@ -356,7 +357,7 @@
 	}
 
 	private String escapeAmpersand(String text) {
-		return text.replace("&","&amp;"); //$NON-NLS-1$ //$NON-NLS-2$
+		return text.replace("&", "&amp;"); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
 	@Override
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/test/java/org/eclipse/mylyn/internal/wikitext/markdown/tests/MarkdownDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/test/java/org/eclipse/mylyn/internal/wikitext/markdown/tests/MarkdownDocumentBuilderTest.java
index 748baff..6b12896 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/test/java/org/eclipse/mylyn/internal/wikitext/markdown/tests/MarkdownDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.markdown/src/test/java/org/eclipse/mylyn/internal/wikitext/markdown/tests/MarkdownDocumentBuilderTest.java
@@ -244,7 +244,8 @@
 		builder.endBlock();
 		builder.endBlock();
 		builder.endDocument();
-		assertMarkup("> ## Header.\n\n> * First item.\n> * Second item.\n\n> Some code:\n\n>     return shell_exec(\"echo $input | $markdown_script\");\n\n");
+		assertMarkup(
+				"> ## Header.\n\n> * First item.\n> * Second item.\n\n> Some code:\n\n>     return shell_exec(\"echo $input | $markdown_script\");\n\n");
 	}
 
 	public void testBlockQuoteTripleNested() {
@@ -438,7 +439,8 @@
 		builder.endBlock();
 		builder.endBlock();
 		builder.endDocument();
-		assertMarkup("* A list item with a code block:\n\n        code goes here  \n        code second line\n\n  another para\n\n");
+		assertMarkup(
+				"* A list item with a code block:\n\n        code goes here  \n        code second line\n\n  another para\n\n");
 	}
 
 	public void testCodeBlock() {
@@ -645,7 +647,17 @@
 		builder.characters("`foo`");
 		builder.endSpan();
 		builder.endDocument();
-		assertMarkup("A single backtick in a code span: `` ` ``  \nA backtick-delimited string in a code span: `` `foo` ``\n\n");
+		assertMarkup(
+				"A single backtick in a code span: `` ` ``  \nA backtick-delimited string in a code span: `` `foo` ``\n\n");
+	}
+
+	public void testMark() {
+		builder.beginDocument();
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("emphasis");
+		builder.endSpan();
+		builder.endDocument();
+		assertMarkup("*emphasis*\n\n");
 	}
 
 	public void testImage() {
@@ -732,7 +744,8 @@
 		imageAttr.setTitle("Optional image title");
 		builder.imageLink(linkAttr, imageAttr, "http://example.net/", "/path/to/img.jpg");
 		builder.endDocument();
-		assertMarkup("[![Alt text](/path/to/img.jpg \"Optional image title\")](http://example.net/ \"Optional link title\")\n\n");
+		assertMarkup(
+				"[![Alt text](/path/to/img.jpg \"Optional image title\")](http://example.net/ \"Optional link title\")\n\n");
 	}
 
 	public void testImplicitParagrahWithSpan() {
@@ -829,8 +842,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals(
 				"* first\n* second\n  * second.1\n\n1. third\n2. fourth\n   1. fourth.1\n   2. fourth.2  \n      fourth.2 line 2\n",
 				markup);
@@ -844,7 +855,7 @@
 
 	private void assertMarkup(String expected) {
 		String markup = out.toString();
-		
+
 		assertEquals(expected, markup);
 	}
 
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/main/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/main/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilder.java
index 8e82eec..a592d9b 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/main/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/main/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilder.java
@@ -30,7 +30,6 @@
  *
  * @see HtmlParser
  * @author David Green
- * 
  * @see TextileLanguage
  * @see TextileLanguage#createDocumentBuilder(Writer)
  */
@@ -396,6 +395,7 @@
 		case DELETED:
 			block = new ContentBlock("-" + spanAttributes, "-", true, false, 0, 0); //$NON-NLS-1$//$NON-NLS-2$
 			break;
+		case MARK:
 		case EMPHASIS:
 			block = new ContentBlock("_" + spanAttributes, "_", true, false, 0, 0); //$NON-NLS-1$//$NON-NLS-2$
 			break;
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/test/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/test/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilderTest.java
index 44b10c3..ec50f7b 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/test/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext.textile/src/test/java/org/eclipse/mylyn/wikitext/textile/internal/TextileDocumentBuilderTest.java
@@ -16,7 +16,6 @@
 import org.eclipse.mylyn.wikitext.parser.Attributes;
 import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.BlockType;
 import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType;
-import org.eclipse.mylyn.wikitext.textile.internal.TextileDocumentBuilder;
 import org.eclipse.mylyn.wikitext.parser.ImageAttributes;
 import org.eclipse.mylyn.wikitext.parser.LinkAttributes;
 
@@ -56,8 +55,6 @@
 
 			String markup = out.toString();
 
-			
-
 			assertEquals("text more text\n\n", markup);
 		}
 	}
@@ -71,8 +68,6 @@
 
 			String markup = out.toString();
 
-			
-
 			assertEquals("a b\n\n", markup);
 		}
 	}
@@ -89,8 +84,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text\nmore text\n\n", markup);
 	}
 
@@ -104,8 +97,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text\nmore text\n\n", markup);
 	}
 
@@ -122,8 +113,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text\n more\n\tmore2 text\n\n", markup);
 	}
 
@@ -141,8 +130,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("first paragraph\n\nsecond paragraph\n\n", markup);
 	}
 
@@ -162,8 +149,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("some **bold** and _emphasis_\n\n", markup);
 	}
 
@@ -176,8 +161,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("p(test). text more text\n\n", markup);
 	}
 
@@ -190,8 +173,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("p{x-test: foo;}. text more text\n\n", markup);
 	}
 
@@ -204,8 +185,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("p(#123). text more text\n\n", markup);
 	}
 
@@ -218,8 +197,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("p(test#123). text more text\n\n", markup);
 	}
 
@@ -238,8 +215,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text more text \"baz\":http://example.com/foo+bar/baz.gif test\n\n", markup);
 	}
 
@@ -252,8 +227,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("bc.. text\n\nmore text\n\n", markup);
 	}
 
@@ -272,8 +245,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("bc.. text\n\nmore text\n\np. text\n\ntext2\n\n", markup);
 	}
 
@@ -289,8 +260,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("h1. text more text\n\ntext\n\n", markup);
 	}
 
@@ -309,8 +278,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("h1. text _emphasized_\n\ntext\n\n", markup);
 	}
 
@@ -340,7 +307,6 @@
 
 		String markup = out.toString();
 
-		
 		return markup;
 	}
 
@@ -355,8 +321,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text1\n\ntext2\n\ntext3\n\n", markup);
 	}
 
@@ -372,8 +336,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("*text1*\n\ntext2\n\n", markup);
 	}
 
@@ -391,8 +353,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("*text2* text3\n\n", markup);
 	}
 
@@ -410,8 +370,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text3 **text2**\n\n", markup);
 	}
 
@@ -430,8 +388,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("text3 **text2** text4\n\n", markup);
 	}
 
@@ -451,8 +407,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("**text2** __text3__\n\n", markup);
 	}
 
@@ -470,8 +424,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("**text2**!\n\n", markup);
 	}
 
@@ -493,8 +445,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("* text2 **text3**\n* text4\n", markup);
 	}
 
@@ -520,8 +470,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("* first\n** first.1\n** first.2\n* second\n", markup);
 	}
 
@@ -557,8 +505,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("* first\n* second\n** second.1\n\n# third\n# fourth\n## fourth.1\n", markup);
 	}
 
@@ -575,8 +521,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("para 1\n\n* list item 1\n* list item 2\n\npara 2\n\n", markup);
 	}
 
@@ -608,8 +552,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("prefix **bolded** suffix\n\n", markup);
 	}
 
@@ -628,8 +570,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("prefix suffix\n\n", markup);
 	}
 
@@ -648,8 +588,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("prefix %{font-family:monospace;}text% suffix\n\n", markup);
 	}
 
@@ -672,8 +610,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("|content| |\n\n", markup);
 	}
 
@@ -701,8 +637,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("test\n\nmore **text**\n\n# text2\n", markup);
 	}
 
@@ -737,8 +671,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("|first| content content2|\n\n", markup);
 	}
 
@@ -756,8 +688,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("first second\n\n", markup);
 	}
 
@@ -777,8 +707,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("%{color:blue;}first second%\n\n", markup);
 	}
 
@@ -791,8 +719,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("line\nbreak\n\n", markup);
 	}
 
@@ -813,8 +739,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("bc.. one\n\n\ntwo\n\np. line\nbreak\n\n", markup);
 	}
 
@@ -829,8 +753,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("fn1. line\nbreak\n\n", markup);
 	}
 
@@ -846,8 +768,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("pre.. line\n\nbreak\n\n", markup);
 	}
 
@@ -862,8 +782,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("pre. line\nbreak\n\n", markup);
 	}
 
@@ -878,8 +796,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a \"link to foo\":#foo test\n\n", markup);
 	}
 
@@ -894,8 +810,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("an \"external link\":http://example.com/ test\n\n", markup);
 	}
 
@@ -910,8 +824,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a \"link text\": test\n\n", markup);
 	}
 
@@ -928,8 +840,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a \"link text\": test\n\n", markup);
 	}
 
@@ -944,8 +854,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a !fooImage.png!:#foo test\n\n", markup);
 	}
 
@@ -960,8 +868,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a !fooImage.png! test\n\n", markup);
 	}
 
@@ -973,7 +879,7 @@
 		builder.endDocument();
 
 		String markup = out.toString();
-		
+
 		assertEquals("a test\n\n", markup);
 	}
 
@@ -988,8 +894,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a (c) test\n\n", markup);
 	}
 
@@ -1002,8 +906,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a (c) test\n\n", markup);
 	}
 
@@ -1016,8 +918,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a (r) test\n\n", markup);
 	}
 
@@ -1030,8 +930,6 @@
 
 		String markup = out.toString();
 
-		
-
 		assertEquals("a test\n\n", markup);
 	}
 
@@ -1047,7 +945,6 @@
 		builder.endDocument();
 
 		String markup = out.toString();
-		
 
 		assertEquals("bc. // some code\n\n-redacted- text\n\n", markup);
 	}
@@ -1080,6 +977,10 @@
 		assertSpan("begin _span text_ end\n\n", SpanType.EMPHASIS);
 	}
 
+	public void testSpanMark() {
+		assertSpan("begin _span text_ end\n\n", SpanType.MARK);
+	}
+
 	public void testSpanInserted() {
 		assertSpan("begin +span text+ end\n\n", SpanType.INSERTED);
 	}
@@ -1118,7 +1019,6 @@
 		builder.endDocument();
 
 		String markup = out.toString();
-		
 
 		assertEquals(expected, markup);
 	}
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/internal/parser/html/AbstractSaxHtmlParser.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/internal/parser/html/AbstractSaxHtmlParser.java
index 6ffe224..a1ba392 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/internal/parser/html/AbstractSaxHtmlParser.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/internal/parser/html/AbstractSaxHtmlParser.java
@@ -116,6 +116,7 @@
 		elementNameToSpanType.put("font", SpanType.SPAN); //$NON-NLS-1$
 		elementNameToSpanType.put("code", SpanType.CODE); //$NON-NLS-1$
 		elementNameToSpanType.put("tt", SpanType.MONOSPACE); //$NON-NLS-1$
+		elementNameToSpanType.put("mark", SpanType.MARK); //$NON-NLS-1$
 	}
 
 	private static final Map<String, BlockType> elementNameToBlockType = new HashMap<String, DocumentBuilder.BlockType>();
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/DocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/DocumentBuilder.java
index f07313f..aeadebf 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/DocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/DocumentBuilder.java
@@ -55,7 +55,7 @@
 	}
 
 	public enum SpanType {
-		EMPHASIS, STRONG, ITALIC, BOLD, CITATION, DELETED, INSERTED, SUPERSCRIPT, SUBSCRIPT, SPAN, CODE, MONOSPACE, UNDERLINED,
+		EMPHASIS, STRONG, ITALIC, BOLD, CITATION, DELETED, INSERTED, SUPERSCRIPT, SUBSCRIPT, SPAN, CODE, MONOSPACE, UNDERLINED, MARK,
 		/**
 		 * a short inline quotation
 		 */
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DitaTopicDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DitaTopicDocumentBuilder.java
index e45823e..4d919be 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DitaTopicDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DitaTopicDocumentBuilder.java
@@ -395,13 +395,15 @@
 		case INSERTED:
 			// no equivalent?
 			writer.writeStartElement("ph"); //$NON-NLS-1$
-			attributes.setCssClass(attributes.getCssClass() == null ? "inserted" : attributes.getCssClass() //$NON-NLS-1$
-					+ " inserted"); //$NON-NLS-1$
+			attributes.setCssClass(attributes.getCssClass() == null
+					? "inserted" //$NON-NLS-1$
+					: attributes.getCssClass() + " inserted"); //$NON-NLS-1$
 			break;
 		case UNDERLINED:
 			writer.writeStartElement("u"); //$NON-NLS-1$
 			break;
 		case ITALIC:
+		case MARK:
 			writer.writeStartElement("i"); //$NON-NLS-1$
 			break;
 		case SPAN:
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilder.java
index de6d0d3..70eff1f 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilder.java
@@ -413,6 +413,10 @@
 			}
 		}
 			break;
+		case MARK:
+			writer.writeStartElement("emphasis");
+			writer.writeAttribute("role", "marked");
+			break;
 		default:
 			Logger.getLogger(DocBookDocumentBuilder.class.getName()).warning("No docbook mapping for " + type); //$NON-NLS-1$
 			writer.writeStartElement("phrase"); //$NON-NLS-1$
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilder.java
index 9052fdf..f31a943 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilder.java
@@ -77,6 +77,7 @@
 		spanTypeToElementNameBuilder.put(SpanType.SPAN, "span"); //$NON-NLS-1$
 		spanTypeToElementNameBuilder.put(SpanType.CODE, "code"); //$NON-NLS-1$
 		spanTypeToElementNameBuilder.put(SpanType.MONOSPACE, "tt"); //$NON-NLS-1$
+		spanTypeToElementNameBuilder.put(SpanType.MARK, "mark"); //$NON-NLS-1$
 		defaultSpanTypeToElementName = spanTypeToElementNameBuilder.build();
 	}
 
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilder.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilder.java
index 48a589a..3c8d709 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilder.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/main/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilder.java
@@ -84,6 +84,7 @@
 	static {
 		spanTypeToCssStyles.put(SpanType.STRONG, "font-weight: bold;"); //$NON-NLS-1$
 		spanTypeToCssStyles.put(SpanType.BOLD, "font-weight: bold;"); //$NON-NLS-1$
+		spanTypeToCssStyles.put(SpanType.MARK, "font-style: italic;"); //$NON-NLS-1$
 		spanTypeToCssStyles.put(SpanType.MONOSPACE, "font-family: monospace;"); //$NON-NLS-1$
 		spanTypeToCssStyles.put(SpanType.CODE, "font-family: monospace;"); //$NON-NLS-1$
 		spanTypeToCssStyles.put(SpanType.CITATION, "font-style: italic;"); //$NON-NLS-1$
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/internal/parser/html/HtmlParserTest.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/internal/parser/html/HtmlParserTest.java
index 5488ac1..0ad8c85 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/internal/parser/html/HtmlParserTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/internal/parser/html/HtmlParserTest.java
@@ -139,6 +139,11 @@
 	}
 
 	@Test
+	public void spanMark() {
+		assertParse("<mark>marked text</mark>", "<body><mark>marked text</mark></body>");
+	}
+
+	@Test
 	public void blockCodeEventOrder() {
 		assertParseEventOrder("<body><pre><code>some\ncode</code></pre></body>", BlockType.CODE, "some\ncode",
 				END_BLOCK);
@@ -199,6 +204,11 @@
 		assertParse("<p>first</p><hr/><p>second</p>", "<body><p>first</p>\n<hr/><p>second</p></body>");
 	}
 
+	@Test
+	public void blockMark() {
+		assertParseEventOrder("<body><mark>lorem</mark></body>", SpanType.MARK, "lorem", END_SPAN);
+	}
+
 	private void assertParseEventOrder(String content, Object... expectedEventTypes) {
 		final List<Object> actualEventTypes = new ArrayList<>();
 		DocumentBuilder builder = new NoOpDocumentBuilder() {
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilderTest.java
index 62056a6..7f95b1d 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/DocBookDocumentBuilderTest.java
@@ -349,4 +349,18 @@
 		assertEquals(DOCBOOK_BEGIN_CHAPTER + expectedContent + DOCBOOK_END_CHAPTER, docbook);
 	}
 
+	public void testMarked() {
+		builder.beginDocument();
+		builder.characters("normal text ");
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("marked text");
+		builder.endSpan();
+		builder.endDocument();
+
+		String docbook = out.toString();
+
+		String expectedContent = "normal text <emphasis role=\"marked\">marked text</emphasis>";
+		assertEquals(DOCBOOK_BEGIN + expectedContent + DOCBOOK_END, docbook);
+	}
+
 }
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilderTest.java
index 01343ec..76f5786 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/HtmlDocumentBuilderTest.java
@@ -203,6 +203,18 @@
 	}
 
 	@Test
+	public void spanMark() {
+		builder.setEmitAsDocument(false);
+		builder.beginDocument();
+		builder.characters("normal text ");
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("marked text");
+		builder.endSpan();
+		builder.endDocument();
+		assertEquals("normal text <mark>marked text</mark>", out.toString());
+	}
+
+	@Test
 	public void filterEntityReferences() {
 		assertEntityReferenceToNumericValue("&#160;", "nbsp");
 		assertEntityReferenceToNumericValue("&#8817;", "nge");
diff --git a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilderTest.java b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilderTest.java
index b4f40e6..afa1ede 100644
--- a/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilderTest.java
+++ b/wikitext/core/org.eclipse.mylyn.wikitext/src/test/java/org/eclipse/mylyn/wikitext/parser/builder/XslfoDocumentBuilderTest.java
@@ -12,6 +12,8 @@
 
 import java.io.StringWriter;
 
+import org.eclipse.mylyn.wikitext.parser.Attributes;
+import org.eclipse.mylyn.wikitext.parser.DocumentBuilder.SpanType;
 import org.eclipse.mylyn.wikitext.parser.ImageAttributes;
 
 import junit.framework.TestCase;
@@ -20,6 +22,9 @@
  * @author David Green
  */
 public class XslfoDocumentBuilderTest extends TestCase {
+	private static final String XSLFO_BEGIN = "<root xmlns=\"http://www.w3.org/1999/XSL/Format\"><layout-master-set><simple-page-master master-name=\"page-layout\" page-height=\"29.7cm\" page-width=\"21.0cm\" margin=\"1.5cm\"><region-body margin-bottom=\"3cm\"/><region-after extent=\"2.0cm\" precedence=\"false\" region-name=\"footer\"/></simple-page-master></layout-master-set><page-sequence master-reference=\"page-layout\"><static-content flow-name=\"footer\"><block font-size=\"10.0pt\" text-align=\"outside\"><page-number/></block></static-content><flow flow-name=\"xsl-region-body\">";
+
+	private static final String XSLFO_END = "</flow></page-sequence></root>";
 
 	private StringWriter out;
 
@@ -36,7 +41,7 @@
 		attributes.setWidth(10);
 		builder.image(attributes, "some/image.png");
 		String generatedContent = out.toString();
-		
+
 		assertTrue(generatedContent.contains("width=\"10px\""));
 	}
 
@@ -46,7 +51,7 @@
 		attributes.setWidthPercentage(true);
 		builder.image(attributes, "some/image.png");
 		String generatedContent = out.toString();
-		
+
 		assertTrue(generatedContent.contains("width=\"10%\""));
 	}
 
@@ -55,7 +60,7 @@
 		attributes.setHeight(10);
 		builder.image(attributes, "some/image.png");
 		String generatedContent = out.toString();
-		
+
 		assertTrue(generatedContent.contains("height=\"10px\""));
 	}
 
@@ -65,7 +70,21 @@
 		attributes.setHeightPercentage(true);
 		builder.image(attributes, "some/image.png");
 		String generatedContent = out.toString();
-		
+
 		assertTrue(generatedContent.contains("height=\"10%\""));
 	}
+
+	public void testMark() {
+		builder.beginDocument();
+		builder.characters("normal text ");
+		builder.beginSpan(SpanType.MARK, new Attributes());
+		builder.characters("marked text");
+		builder.endSpan();
+		builder.endDocument();
+
+		String generatedContent = out.toString();
+		String expectedContent = "normal text <inline font-style=\"italic\">marked text</inline>";
+
+		assertEquals(XSLFO_BEGIN + expectedContent + XSLFO_END, generatedContent);
+	}
 }
diff --git a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java
index 2a3b27b..710b956 100644
--- a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java
+++ b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/preferences/Preferences.java
@@ -65,6 +65,8 @@
 
 	public static final String PHRASE_QUOTE = "quote"; //$NON-NLS-1$
 
+	public static final String PHRASE_MARK = "mark"; //$NON-NLS-1$
+
 	public static final String BLOCK_QUOTE = "bq."; //$NON-NLS-1$
 
 	public static final String BLOCK_PRE = "pre."; //$NON-NLS-1$
@@ -124,6 +126,7 @@
 		cssByPhraseModifierType.put(PHRASE_MONOSPACE, "font-family: monospace;"); //$NON-NLS-1$
 		cssByPhraseModifierType.put(PHRASE_UNDERLINED, "text-decoration: underline;"); //$NON-NLS-1$
 		cssByPhraseModifierType.put(PHRASE_QUOTE, "color: rgb(38,86,145);"); //$NON-NLS-1$
+		cssByPhraseModifierType.put(PHRASE_MARK, "background-color: yellow;"); //$NON-NLS-1$
 	}
 
 	private boolean editorFolding = true;
diff --git a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java
index 016e34a..9864cfb 100644
--- a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java
+++ b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/editor/syntax/MarkupTokenScanner.java
@@ -342,6 +342,9 @@
 		case UNDERLINED:
 			key = Preferences.PHRASE_UNDERLINED;
 			break;
+		case MARK:
+			key = Preferences.PHRASE_MARK;
+			break;
 		}
 		cssStyles = preferences.getCssByPhraseModifierType().get(key);
 		if (cssStyles == null && span.getAttributes().getCssStyle() == null && span.getChildren().isEmpty()) {
diff --git a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css
index 43496b2..16b8afb 100644
--- a/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css
+++ b/wikitext/ui/org.eclipse.mylyn.wikitext.ui/src/org/eclipse/mylyn/internal/wikitext/ui/viewer/default.css
@@ -57,6 +57,10 @@
 	font-style: italic;
 }
 
+mark {
+	background-color:yellow;
+}
+
 var {
 	font-style: italic;
 }