Introduce global builder configuration .withAnchorPrefix

Introduce copy() method to easily duplicate builders with configuration
This commit is contained in:
Hugo de Paix de Coeur
2016-02-18 17:32:31 +01:00
parent 52639d9907
commit c69948c78a
6 changed files with 75 additions and 19 deletions

View File

@@ -33,6 +33,8 @@ import java.text.Normalizer;
import java.util.List;
import java.util.regex.Pattern;
import static org.apache.commons.lang3.StringUtils.defaultString;
/**
* @author Robert Winkler
*/
@@ -48,6 +50,19 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
protected String newLine = System.getProperty("line.separator");
protected Logger logger = LoggerFactory.getLogger(getClass());
protected String anchorPrefix = null;
@Override
public MarkupDocBuilder withAnchorPrefix(String prefix) {
this.anchorPrefix = prefix;
return this;
}
@Override
public String getAnchorPrefix() {
return this.anchorPrefix;
}
protected void documentTitle(Markup markup, String title){
documentBuilder.append(markup).append(title).append(newLine).append(newLine);
}
@@ -196,9 +211,10 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
* - Beginning, ending separation characters [-_] are ignored, repeating separation characters are simplified (keep first one)
* - Anchor is trimmed and lower cased
* - If the anchor still contains forbidden characters (non-ASCII, ...), replace the whole anchor with an hash (MD5).
* - Add the anchor prefix if configured
*/
protected String normalizeAnchor(Markup spaceEscape, String anchor) {
String normalizedAnchor = anchor.trim();
String normalizedAnchor = defaultString(anchorPrefix) + anchor.trim();
normalizedAnchor = Normalizer.normalize(normalizedAnchor, Normalizer.Form.NFD).replaceAll("\\p{InCombiningDiacriticalMarks}+", "");
normalizedAnchor = ANCHOR_IGNORABLE_PATTERN.matcher(normalizedAnchor).replaceAll(spaceEscape.toString());
normalizedAnchor = normalizedAnchor.replaceAll(String.format("([%1$s])([%1$s]+)", ANCHOR_SEPARATION_CHARACTERS), "$1");
@@ -226,13 +242,13 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
}
@Override
public MarkupDocBuilder crossReference(String title, String text) {
return crossReference(null, title, text);
public MarkupDocBuilder crossReference(String anchor, String text) {
return crossReference(null, anchor, text);
}
@Override
public MarkupDocBuilder crossReference(String title) {
return crossReference(null, title, null);
public MarkupDocBuilder crossReference(String anchor) {
return crossReference(null, anchor, null);
}
protected void newLine(Markup markup, boolean forceLineBreak){

View File

@@ -98,11 +98,11 @@ public interface MarkupDocBuilder {
MarkupDocBuilder crossReferenceRaw(String anchor);
MarkupDocBuilder crossReference(String document, String title, String text);
MarkupDocBuilder crossReference(String document, String anchor, String text);
MarkupDocBuilder crossReference(String title, String text);
MarkupDocBuilder crossReference(String anchor, String text);
MarkupDocBuilder crossReference(String title);
MarkupDocBuilder crossReference(String anchor);
MarkupDocBuilder newLine();
@@ -113,6 +113,23 @@ public interface MarkupDocBuilder {
*/
String toString();
/**
* Configure this builder to prefix all generated anchors with {@code prefix}
* @param prefix anchor prefix
*/
MarkupDocBuilder withAnchorPrefix(String prefix);
/**
* @return anchor prefix configuration
*/
String getAnchorPrefix();
/**
* Return a new instance of this builder with the state
* @return new builder instance with a state copy
*/
MarkupDocBuilder copy();
/**
* Add an extension to fileName depending on markup language
* @param fileName without extension

View File

@@ -38,16 +38,11 @@ public final class MarkupDocBuilders {
}
/**
* Instantiate a new builder copying {@code docBuilder} characteristics.
* Instantiate a new builder from {@code docBuilder} with the same configuration.
* You can use it to build intermediate MarkupDocBuilder for composition purpose.
*/
public static MarkupDocBuilder documentBuilder(MarkupDocBuilder docBuilder){
if (docBuilder instanceof MarkdownBuilder)
return new MarkdownBuilder();
else if (docBuilder instanceof AsciiDocBuilder)
return new AsciiDocBuilder();
else
return new AsciiDocBuilder();
return docBuilder.copy();
}

View File

@@ -38,6 +38,11 @@ import static org.apache.commons.lang3.StringUtils.*;
*/
public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
@Override
public MarkupDocBuilder copy() {
return new AsciiDocBuilder().withAnchorPrefix(anchorPrefix);
}
@Override
public MarkupDocBuilder documentTitle(String title){
documentTitle(AsciiDoc.DOCUMENT_TITLE, title);
@@ -188,8 +193,8 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder crossReference(String document, String title, String text) {
return crossReferenceRaw(normalizeDocument(document), normalizeAnchor(title), text);
public MarkupDocBuilder crossReference(String document, String anchor, String text) {
return crossReferenceRaw(normalizeDocument(document), normalizeAnchor(anchor), text);
}
private String escapeTableCell(String cell) {

View File

@@ -38,6 +38,12 @@ import static org.apache.commons.lang3.StringUtils.join;
*/
public class MarkdownBuilder extends AbstractMarkupDocBuilder
{
@Override
public MarkupDocBuilder copy() {
return new MarkdownBuilder().withAnchorPrefix(anchorPrefix);
}
@Override
public MarkupDocBuilder documentTitle(String title){
documentTitle(Markdown.DOCUMENT_TITLE, title);
@@ -191,8 +197,8 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder crossReference(String document, String title, String text) {
return crossReferenceRaw(document, normalizeAnchor(title), text);
public MarkupDocBuilder crossReference(String document, String anchor, String text) {
return crossReferenceRaw(document, normalizeAnchor(anchor), text);
}
private String escapeTableCell(String cell) {

View File

@@ -27,6 +27,9 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static junit.framework.TestCase.assertEquals;
/**
* @author Robert Winkler
*/
@@ -91,6 +94,13 @@ public class MarkupDocBuilderTest {
.crossReference("./document.adoc", "anchor", "text").newLine(true)
.crossReference(" \u0240 µ&|ù This .:/-_ ").newLine(true)
.writeToFile("build/tmp", "test", StandardCharsets.UTF_8);
MarkupDocBuilder builderWithConfig = MarkupDocBuilders.documentBuilder(MarkupLanguage.ASCIIDOC).withAnchorPrefix(" mdb test- ");
String prefixMarkup = builderWithConfig.anchor("anchor", "text")
.crossReference("anchor", "text")
.toString();
assertEquals("[[_mdb_test-anchor,text]]<<_mdb_test-anchor,text>>", prefixMarkup);
}
@Test
@@ -130,6 +140,13 @@ public class MarkupDocBuilderTest {
.crossReference("./document.md", "anchor", "text").newLine(true)
.crossReference(" \u0240 µ&|ù This .:/-_ ").newLine(true)
.writeToFile("build/tmp", "test", StandardCharsets.UTF_8);
MarkupDocBuilder builderWithConfig = MarkupDocBuilders.documentBuilder(MarkupLanguage.MARKDOWN).withAnchorPrefix(" mdb test- ");
String prefixMarkup = builderWithConfig.anchor("anchor", "text")
.crossReference("anchor", "text")
.toString();
assertEquals("<a name=\"mdb-test-anchor\"></a>[text](#mdb-test-anchor)", prefixMarkup);
}
}