![JAR search and dependency download from the Maven repository](/logo.png)
net.java.textilej.parser.markup.textile.TextileDialect Maven / Gradle / Ivy
The newest version!
package net.java.textilej.parser.markup.textile;
import java.util.ArrayList;
import java.util.List;
import net.java.textilej.parser.DocumentBuilder.SpanType;
import net.java.textilej.parser.markup.Block;
import net.java.textilej.parser.markup.ContentState;
import net.java.textilej.parser.markup.Dialect;
import net.java.textilej.parser.markup.phrase.HtmlEndTagPhraseModifier;
import net.java.textilej.parser.markup.phrase.HtmlStartTagPhraseModifier;
import net.java.textilej.parser.markup.textile.block.CodeBlock;
import net.java.textilej.parser.markup.textile.block.FootnoteBlock;
import net.java.textilej.parser.markup.textile.block.HeadingBlock;
import net.java.textilej.parser.markup.textile.block.ListBlock;
import net.java.textilej.parser.markup.textile.block.ParagraphBlock;
import net.java.textilej.parser.markup.textile.block.PreformattedBlock;
import net.java.textilej.parser.markup.textile.block.QuoteBlock;
import net.java.textilej.parser.markup.textile.block.TableBlock;
import net.java.textilej.parser.markup.textile.block.TableOfContentsBlock;
import net.java.textilej.parser.markup.textile.block.TextileGlossaryBlock;
import net.java.textilej.parser.markup.textile.phrase.EscapeTextilePhraseModifier;
import net.java.textilej.parser.markup.textile.phrase.ImageTextilePhraseModifier;
import net.java.textilej.parser.markup.textile.phrase.SimpleTextilePhraseModifier;
import net.java.textilej.parser.markup.textile.token.FootnoteReferenceReplacementToken;
import net.java.textilej.parser.markup.textile.token.HyperlinkReplacementToken;
import net.java.textilej.parser.markup.token.AcronymReplacementToken;
import net.java.textilej.parser.markup.token.EntityReferenceReplacementToken;
import net.java.textilej.parser.markup.token.EntityWrappingReplacementToken;
import net.java.textilej.parser.markup.token.PatternEntityReferenceReplacementToken;
/**
* A textile dialect that parses Textile markup.
*
* Based on the spec available at http://textile.thresholdstate.com/,
* supports all current Textile markup constructs.
*
* Additionally supported are {toc}
and {glossary}
.
*
* @author dgreen
*/
public class TextileDialect extends Dialect {
// we use the template pattern for creating new blocks
private List blocks = new ArrayList();
private List paragraphBreakingBlocks = new ArrayList();
private static PatternBasedSyntax tokenSyntax = new PatternBasedSyntax();
private static PatternBasedSyntax phraseModifierSyntax = new PatternBasedSyntax();
@Override
protected PatternBasedSyntax getPhraseModifierSyntax() {
return phraseModifierSyntax;
}
@Override
protected PatternBasedSyntax getReplacementTokenSyntax() {
return tokenSyntax;
}
{
// IMPORTANT NOTE: Most items below have order dependencies. DO NOT REORDER ITEMS BELOW!!
blocks.add(new HeadingBlock());
ListBlock listBlock = new ListBlock();
blocks.add(listBlock);
paragraphBreakingBlocks.add(listBlock);
blocks.add(new PreformattedBlock());
blocks.add(new QuoteBlock());
blocks.add(new CodeBlock());
blocks.add(new FootnoteBlock());
TableBlock tableBlock = new TableBlock();
blocks.add(tableBlock);
paragraphBreakingBlocks.add(tableBlock);
// extensions
blocks.add(new TextileGlossaryBlock());
blocks.add(new TableOfContentsBlock());
// ~extensions
blocks.add(new ParagraphBlock()); // ORDER DEPENDENCY: this must come last
}
static {
phraseModifierSyntax.add(new HtmlEndTagPhraseModifier());
phraseModifierSyntax.add(new HtmlStartTagPhraseModifier());
phraseModifierSyntax.beginGroup("(?:(?<=[\\s\\.,\\\"'?!;:\\)\\(\\{\\}\\[\\]])|^)(?:",0);
phraseModifierSyntax.add(new EscapeTextilePhraseModifier());
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("**",SpanType.BOLD, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("??",SpanType.CITATION, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("__",SpanType.ITALIC, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("_",SpanType.EMPHASIS, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("*",SpanType.STRONG, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("+",SpanType.INSERTED, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("~",SpanType.SUBSCRIPT, false));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("^",SpanType.SUPERSCRIPT, false));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("@",SpanType.CODE, false));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("%",SpanType.SPAN, true));
phraseModifierSyntax.add(new SimpleTextilePhraseModifier("-",SpanType.DELETED, true));
phraseModifierSyntax.add(new ImageTextilePhraseModifier());
phraseModifierSyntax.endGroup(")(?=\\W|$)",0);
tokenSyntax.add(new EntityReferenceReplacementToken("(tm)","#8482"));
tokenSyntax.add(new EntityReferenceReplacementToken("(TM)","#8482"));
tokenSyntax.add(new EntityReferenceReplacementToken("(c)","#169"));
tokenSyntax.add(new EntityReferenceReplacementToken("(C)","#169"));
tokenSyntax.add(new EntityReferenceReplacementToken("(r)","#174"));
tokenSyntax.add(new EntityReferenceReplacementToken("(R)","#174"));
tokenSyntax.add(new HyperlinkReplacementToken());
tokenSyntax.add(new FootnoteReferenceReplacementToken());
tokenSyntax.add(new EntityWrappingReplacementToken("\"","#8220","#8221"));
tokenSyntax.add(new EntityWrappingReplacementToken("'","#8216","#8217"));
tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w)(')(?=\\w))","#8217")); // apostrophe
tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(--)(?=\\s\\w))","#8212")); // emdash
tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\w\\s)(-)(?=\\s\\w))","#8211")); // endash
tokenSyntax.add(new PatternEntityReferenceReplacementToken("(?:(?<=\\d\\s)(x)(?=\\s\\d))","#215")); // mul
tokenSyntax.add(new AcronymReplacementToken());
}
public List getParagraphBreakingBlocks() {
return paragraphBreakingBlocks;
}
@Override
public List getBlocks() {
return blocks;
}
@Override
protected ContentState createState() {
return new TextileContentState();
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy