Fixed inter-document cross-references

This commit is contained in:
Hugo de Paix de Coeur
2016-02-08 16:00:47 +01:00
parent 3799cf362c
commit 5b5a58ee7f
5 changed files with 86 additions and 42 deletions

View File

@@ -109,21 +109,46 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return this;
}
@Override
public MarkupDocBuilder anchor(String anchor) {
return anchor(anchor, null);
}
@Override
public MarkupDocBuilder crossReference(String document, String anchor, String text) {
documentBuilder.append(crossReferenceAsString(document, anchor, text));
return this;
}
@Override
public MarkupDocBuilder crossReference(String anchor, String text) {
documentBuilder.append(crossReferenceAsString(anchor, text));
return crossReference(null, anchor, text);
}
@Override
public MarkupDocBuilder crossReference(String anchor) {
return crossReference(null, anchor, null);
}
@Override
public MarkupDocBuilder crossReferenceTitle(String document, String anchor, String text) {
documentBuilder.append(crossReferenceTitleAsString(document, anchor, text));
return this;
}
@Override
public MarkupDocBuilder crossReferenceTitle(String anchor, String text) {
documentBuilder.append(crossReferenceTitleAsString(anchor, text));
return this;
return crossReferenceTitle(null, anchor, text);
}
@Override
public String crossReferenceTitleAsString(String anchor, String text) {
return crossReferenceAsString(anchor, text);
public MarkupDocBuilder crossReferenceTitle(String anchor) {
return crossReferenceTitle(null, anchor, null);
}
@Override
public String crossReferenceTitleAsString(String document, String anchor, String text) {
return crossReferenceAsString(document, anchor, text);
}
@Override

View File

@@ -62,15 +62,25 @@ public interface MarkupDocBuilder {
MarkupDocBuilder anchor(String anchor, String text);
MarkupDocBuilder anchor(String anchor);
String anchorAsString(String anchor, String text);
MarkupDocBuilder crossReference(String document, String anchor, String text);
MarkupDocBuilder crossReference(String anchor, String text);
String crossReferenceAsString(String anchor, String text);
MarkupDocBuilder crossReference(String anchor);
String crossReferenceAsString(String document, String anchor, String text);
MarkupDocBuilder crossReferenceTitle(String document, String anchor, String text);
MarkupDocBuilder crossReferenceTitle(String anchor, String text);
String crossReferenceTitleAsString(String anchor, String text);
MarkupDocBuilder crossReferenceTitle(String anchor);
String crossReferenceTitleAsString(String document, String anchor, String text);
MarkupDocBuilder newLine();

View File

@@ -41,7 +41,6 @@ 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]+");
@@ -130,46 +129,54 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
return this;
}
/*
* Manual anchor normalization
*/
private static String normalizeAnchor(String anchor) {
return "_" + SPACE_PATTERN.matcher(ANCHOR_FORBIDDEN_PATTERN.matcher(anchor.trim()).replaceAll("")).replaceAll("_");
}
/*
* Section title anchors normalization
*/
private static String normalizeTitleAnchor(String anchor) {
return anchor.trim();
}
@Override
public String anchorAsString(String anchor, String text) {
StringBuilder stringBuilder = new StringBuilder();
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);
stringBuilder.append(AsciiDoc.ANCHOR_START).append(normalizeAnchor(anchor));
if (text != null)
stringBuilder.append(",").append(text);
stringBuilder.append(AsciiDoc.ANCHOR_END);
return stringBuilder.toString();
}
protected String normalizedCrossReferenceAsString(String anchor, String text) {
/*
* Final crossref builder, using a pre-normalized anchor.
*/
protected String normalizedCrossReferenceAsString(String document, 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);
stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START);
if (document != null)
stringBuilder.append(document).append("#");
stringBuilder.append(anchor);
if (text != null)
stringBuilder.append(",").append(text);
stringBuilder.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 document, String anchor, String text) {
return normalizedCrossReferenceAsString(document, normalizeAnchor(anchor), text);
}
@Override
public String crossReferenceAsString(String anchor, String text) {
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);
public String crossReferenceTitleAsString(String document, String anchor, String text) {
return normalizedCrossReferenceAsString(document, normalizeTitleAnchor(anchor), text);
}
private String escapeTableCell(String cell) {
@@ -193,7 +200,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
newLine();
documentBuilder.append("[options=\"" + join(options, ",") + "\", cols=\"" + join(cols, ",") + "\"]").append(newLine);
documentBuilder.append("[options=\"").append(join(options, ",")).append("\", cols=\"").append(join(cols, ",")).append("\"]").append(newLine);
documentBuilder.append(AsciiDoc.TABLE).append(newLine);
if (hasHeader) {
Collection<String> headerList = Collections2.transform(columnSpecs, new Function<MarkupTableColumn, String>() {

View File

@@ -164,7 +164,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public String crossReferenceAsString(String anchor, String text) {
public String crossReferenceAsString(String document, String anchor, String text) {
StringBuilder stringBuilder = new StringBuilder();
if (text == null)
text = anchor.trim();