diff --git a/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java b/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java index 4f926507..93a654bc 100644 --- a/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java @@ -104,14 +104,26 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { } @Override - public MarkupDocBuilder crossReference(String anchor) { - crossReference(anchor, null); + public MarkupDocBuilder anchor(String anchor, String text) { + documentBuilder.append(anchorAsString(anchor, text)); return this; } @Override - public String crossReferenceAsString(String anchor) { - return crossReferenceAsString(anchor, null); + public MarkupDocBuilder crossReference(String anchor, String text) { + documentBuilder.append(crossReferenceAsString(anchor, text)); + return this; + } + + @Override + public MarkupDocBuilder crossReferenceTitle(String anchor, String text) { + documentBuilder.append(crossReferenceTitleAsString(anchor, text)); + return this; + } + + @Override + public String crossReferenceTitleAsString(String anchor, String text) { + return crossReferenceAsString(anchor, text); } @Override diff --git a/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java b/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java index 3f50910b..1883c993 100644 --- a/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java @@ -60,21 +60,17 @@ public interface MarkupDocBuilder { MarkupDocBuilder tableWithColumnSpecs(List columnSpecs, List> cells); - MarkupDocBuilder anchor(String anchor); + MarkupDocBuilder anchor(String anchor, String text); - String anchorAsString(String anchor); + String anchorAsString(String anchor, String text); - /** - * @param anchor Target anchor - * @param text If not null, display this text instead of anchor - */ MarkupDocBuilder crossReference(String anchor, String text); String crossReferenceAsString(String anchor, String text); - MarkupDocBuilder crossReference(String anchor); + MarkupDocBuilder crossReferenceTitle(String anchor, String text); - String crossReferenceAsString(String anchor); + String crossReferenceTitleAsString(String anchor, String text); MarkupDocBuilder newLine(); diff --git a/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDocBuilder.java b/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDocBuilder.java index a1ff76d9..8db791c5 100644 --- a/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDocBuilder.java @@ -30,6 +30,7 @@ import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.List; +import java.util.regex.Pattern; import static org.apache.commons.lang3.StringUtils.*; @@ -39,6 +40,10 @@ import static org.apache.commons.lang3.StringUtils.*; public class AsciiDocBuilder extends AbstractMarkupDocBuilder { private static final String ASCIIDOC_FILE_EXTENSION = "adoc"; + private static final Pattern ANCHOR_FORBIDDEN_PATTERN = Pattern.compile("[^0-9a-zA-Z-_:.\\s]+"); + private static final Pattern XREF_FORBIDDEN_PATTERN = Pattern.compile("[^0-9a-zA-Z-_:./#\\s]+"); + private static final Pattern SPACE_PATTERN = Pattern.compile("[\\s]+"); + @Override public MarkupDocBuilder documentTitle(String title){ @@ -125,37 +130,46 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { return this; } - private static String normalizeReferenceAnchor(String anchor) { - return anchor.trim(); + private static String normalizeAnchor(String anchor) { + return "_" + SPACE_PATTERN.matcher(ANCHOR_FORBIDDEN_PATTERN.matcher(anchor.trim()).replaceAll("")).replaceAll("_"); } @Override - public MarkupDocBuilder anchor(String anchor) { - documentBuilder.append(anchorAsString(anchor)); - return this; - } - - @Override - public String anchorAsString(String anchor) { + public String anchorAsString(String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); - stringBuilder.append(AsciiDoc.ANCHOR_START).append(normalizeReferenceAnchor(anchor)).append(AsciiDoc.ANCHOR_END); + if (text == null) + stringBuilder.append(AsciiDoc.ANCHOR_START).append(normalizeAnchor(anchor)).append(AsciiDoc.ANCHOR_END); + else + stringBuilder.append(AsciiDoc.ANCHOR_START).append(normalizeAnchor(anchor)).append(",").append(text).append(AsciiDoc.ANCHOR_END); return stringBuilder.toString(); } - @Override - public MarkupDocBuilder crossReference(String anchor, String text) { - documentBuilder.append(crossReferenceAsString(anchor, text)); - return this; + + protected String normalizedCrossReferenceAsString(String anchor, String text) { + StringBuilder stringBuilder = new StringBuilder(); + if (text == null) + stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(anchor).append(AsciiDoc.CROSS_REFERENCE_END); + else + stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(anchor).append(",").append(text).append(AsciiDoc.CROSS_REFERENCE_END); + return stringBuilder.toString(); + } + + private static String normalizeXRef(String anchor) { + return "_" + SPACE_PATTERN.matcher(XREF_FORBIDDEN_PATTERN.matcher(anchor.trim()).replaceAll("")).replaceAll("_"); } @Override public String crossReferenceAsString(String anchor, String text) { - StringBuilder stringBuilder = new StringBuilder(); - if (text == null) - stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(normalizeReferenceAnchor(anchor)).append(AsciiDoc.CROSS_REFERENCE_END); - else - stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(normalizeReferenceAnchor(anchor)).append(",").append(text).append(AsciiDoc.CROSS_REFERENCE_END); - return stringBuilder.toString(); + return normalizedCrossReferenceAsString(normalizeXRef(anchor), text); + } + + private static String normalizeTitleXRef(String anchor) { + return anchor.trim(); + } + + @Override + public String crossReferenceTitleAsString(String anchor, String text) { + return normalizedCrossReferenceAsString(normalizeTitleXRef(anchor), text); } private String escapeTableCell(String cell) { diff --git a/src/main/java/io/github/robwin/markup/builder/markdown/MarkdownBuilder.java b/src/main/java/io/github/robwin/markup/builder/markdown/MarkdownBuilder.java index 2fdc4e78..fa79fb94 100644 --- a/src/main/java/io/github/robwin/markup/builder/markdown/MarkdownBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/markdown/MarkdownBuilder.java @@ -23,8 +23,8 @@ import com.google.common.collect.Collections2; import io.github.robwin.markup.builder.AbstractMarkupDocBuilder; import io.github.robwin.markup.builder.MarkupDocBuilder; import io.github.robwin.markup.builder.MarkupTableColumn; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.commons.lang3.Validate; import java.io.IOException; import java.nio.charset.Charset; @@ -157,24 +157,12 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder } @Override - public MarkupDocBuilder anchor(String anchor) { - documentBuilder.append(anchorAsString(anchor)); - return this; - } - - @Override - public String anchorAsString(String anchor) { + public String anchorAsString(String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(""); return stringBuilder.toString(); } - @Override - public MarkupDocBuilder crossReference(String anchor, String text) { - documentBuilder.append(crossReferenceAsString(anchor, text)); - return this; - } - @Override public String crossReferenceAsString(String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); @@ -190,8 +178,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder @Override public MarkupDocBuilder tableWithColumnSpecs(List columnSpecs, List> cells) { - if (CollectionUtils.isEmpty(columnSpecs)) - throw new RuntimeException("Header is mandatory in Markdown"); + Validate.notEmpty(columnSpecs); newLine(); Collection headerList = Collections2.transform(columnSpecs, new Function() {