fixed anchor normalization (again). Asciidoc anchor normalization differs between title and custom anchors => introducted crossReferenceTitle

This commit is contained in:
Hugo de Paix de Coeur
2016-02-04 17:17:25 +01:00
parent 732eeca873
commit 6ef0f8d28c
4 changed files with 57 additions and 48 deletions

View File

@@ -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

View File

@@ -60,21 +60,17 @@ public interface MarkupDocBuilder {
MarkupDocBuilder tableWithColumnSpecs(List<MarkupTableColumn> columnSpecs, List<List<String>> 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();

View File

@@ -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) {

View File

@@ -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("<a name=\"").append(normalizeReferenceAnchor(anchor)).append("\"></a>");
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<MarkupTableColumn> columnSpecs, List<List<String>> cells) {
if (CollectionUtils.isEmpty(columnSpecs))
throw new RuntimeException("Header is mandatory in Markdown");
Validate.notEmpty(columnSpecs);
newLine();
Collection<String> headerList = Collections2.transform(columnSpecs, new Function<MarkupTableColumn, String>() {