Introduce global builder configuration .withAnchorPrefix
Introduce copy() method to easily duplicate builders with configuration
This commit is contained in:
@@ -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){
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user