/******************************************************************************* * Copyright (c) 2009, 2013 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 * Martin Kurz - initial locale support (bug 290961) *******************************************************************************/ package org.eclipse.mylyn.wikitext.parser.markup; import java.util.ArrayList; import java.util.List; import java.util.Locale; import org.eclipse.mylyn.wikitext.parser.markup.AbstractMarkupLanguage.PatternBasedSyntax; /** * A configuration for a markup language, which enables client code to modify the syntax of the markup language by * adding blocks, phrase modifiers, and tokens. Also provides a mechanism for disabling some common markup language * features. * * @author David Green * @since 3.0 */ public class MarkupLanguageConfiguration implements Cloneable { private List<Block> blocks = new ArrayList<Block>(); private List<PatternBasedElement> phraseModifiers = new ArrayList<PatternBasedElement>(); private List<PatternBasedElement> tokens = new ArrayList<PatternBasedElement>(); private boolean escapingHtmlAndXml = false; private boolean enableUnwrappedParagraphs = true; private boolean newlinesMustCauseLineBreak = false; private boolean optimizeForRepositoryUsage = false; private Boolean wikiWordLinking = true; private Locale locale; public List<PatternBasedElement> getTokens() { return tokens; } public List<PatternBasedElement> getPhraseModifiers() { return phraseModifiers; } public List<Block> getBlocks() { return blocks; } /** * Indicate if the given block should break paragraph content even if there is no blank line preceding it. The * default implementation returns true. * * @param block * the block * @return true if the block should break paragraph content */ public boolean isParagraphBreaking(Block block) { return true; } /** * Indicate if this language should escape HTML and XML tags. When HTML and XML tags are escaped they appear as * literals in the page, rather than affecting the presentation. The default is false. */ public boolean isEscapingHtmlAndXml() { return escapingHtmlAndXml; } /** * Indicate if this language should escape HTML and XML tags. When HTML and XML tags are escaped they appear as * literals in the page, rather than affecting the presentation. The default is false. */ public void setEscapingHtmlAndXml(boolean escapingHtmlAndXml) { this.escapingHtmlAndXml = escapingHtmlAndXml; } /** * indicate if unwrapped paragraphs should be supported. Unwrapped paragraphs are those that are not nested in * <p> or <div> tags. The default is true. */ public boolean isEnableUnwrappedParagraphs() { return enableUnwrappedParagraphs; } /** * indicate if unwrapped paragraphs should be supported. Unwrapped paragraphs are those that are not nested in * <p> or <div> tags. The default is true. */ public void setEnableUnwrappedParagraphs(boolean enableUnwrappedParagraphs) { this.enableUnwrappedParagraphs = enableUnwrappedParagraphs; } /** * Indicate if newlines in the markup must cause a line break. If false, then the default markup language behaviour * should be observed. The default is false. */ public boolean isNewlinesMustCauseLineBreak() { return newlinesMustCauseLineBreak; } /** * Indicate if newlines in the markup must cause a line break. If false, then the default markup language behaviour * should be observed. The default is false. */ public void setNewlinesMustCauseLineBreak(boolean newlinesMustCauseLineBreak) { this.newlinesMustCauseLineBreak = newlinesMustCauseLineBreak; } /** * Adds {@link #getPhraseModifiers() phrase modifiers} to the given syntax. * * @param phraseModifierSyntax */ public void addPhraseModifierExtensions(PatternBasedSyntax phraseModifierSyntax) { for (PatternBasedElement element : getPhraseModifiers()) { phraseModifierSyntax.add(element); } } /** * Indicates if the markup syntax should be optimized for use with a task repository. Some markup languages may * enable/disable specific markup constructs to be more suitable for use in a task description or comment. */ public boolean isOptimizeForRepositoryUsage() { return optimizeForRepositoryUsage; } /** * Indicate if the markup syntax should be optimized for use with a task repository. Some markup languages may * enable/disable specific markup constructs to be more suitable for use in a task description or comment. */ public void setOptimizeForRepositoryUsage(boolean optimizeForRepositoryUsage) { this.optimizeForRepositoryUsage = optimizeForRepositoryUsage; } /** * indicate if WikiWord linking should be enabled if the markup language supports it. If null then the default * markup language behaviour should be observed. */ public Boolean isWikiWordLinking() { return wikiWordLinking; } /** * indicate if WikiWord linking should be enabled if the markup language supports it. If null then the default * markup language behaviour should be observed. */ public void setWikiWordLinking(Boolean wikiWordLinking) { this.wikiWordLinking = wikiWordLinking; } /** * The locale to use for output, which may affect literals emitted into the output. * * @return configured locale or null if the default locale should be used */ public Locale getLocale() { return locale; } /** * The locale to use for output, which may affect literals emitted into the output. * * @param locale * the locale or null if the default locale should be used */ public void setLocale(Locale locale) { this.locale = locale; } public void addBlockExtensions(List<Block> blocks, List<Block> paragraphBreakingBlocks) { for (Block block : getBlocks()) { blocks.add(computeInsertPosition(block), block); if (isParagraphBreaking(block)) { paragraphBreakingBlocks.add(block); } } } protected int computeInsertPosition(Block block) { return 0; } /** * Adds {@link #getTokens() tokens} to the given syntax * * @param tokenSyntax * the syntax to which tokens should be added */ public void addTokenExtensions(PatternBasedSyntax tokenSyntax) { for (PatternBasedElement element : getTokens()) { tokenSyntax.add(element); } } @Override public MarkupLanguageConfiguration clone() { try { MarkupLanguageConfiguration copy = (MarkupLanguageConfiguration) super.clone(); copy.blocks = new ArrayList<Block>(blocks.size()); for (Block block : blocks) { copy.blocks.add(block.clone()); } copy.phraseModifiers = new ArrayList<PatternBasedElement>(phraseModifiers.size()); for (PatternBasedElement element : phraseModifiers) { copy.phraseModifiers.add(element.clone()); } copy.tokens = new ArrayList<PatternBasedElement>(tokens.size()); for (PatternBasedElement element : tokens) { copy.tokens.add(element.clone()); } return copy; } catch (CloneNotSupportedException e) { throw new IllegalStateException(e); } } }