From 337c8ba4037e0186033fec12c794f65fd8f12cb0 Mon Sep 17 00:00:00 2001 From: Hugo de Paix de Coeur Date: Wed, 10 Feb 2016 12:13:32 +0100 Subject: [PATCH] renamed crossReference -> crossReferenceAnchor and crossReferenceTitle -> crossReference as it's the default behavior introduced addFilenameExtension (e.g. needed for inter-document cross-references) fixed anchor normalization (support for ASCII characters in AsciiDoc) Several workarounds with inter-document cross-references Removed documentTitleWithAttributes as it's no use as-is --- build.gradle | 2 + .../builder/AbstractMarkupDocBuilder.java | 48 +++++++------- .../markup/builder/MarkupDocBuilder.java | 27 +++++--- .../markup/builder/asciidoc/AsciiDoc.java | 3 +- .../builder/asciidoc/AsciiDocBuilder.java | 62 ++++++++++--------- .../markup/builder/markdown/Markdown.java | 3 +- .../builder/markdown/MarkdownBuilder.java | 26 ++++---- .../markup/builder/MarkupDocBuilderTest.java | 16 ++--- 8 files changed, 105 insertions(+), 82 deletions(-) diff --git a/build.gradle b/build.gradle index 4f5c754e..2a9705e0 100644 --- a/build.gradle +++ b/build.gradle @@ -44,6 +44,7 @@ dependencies { compile 'org.slf4j:slf4j-api' compile 'commons-collections:commons-collections' compile 'org.apache.commons:commons-lang3' + compile "commons-io:commons-io" compile 'com.google.guava:guava' testCompile 'junit:junit' testCompile 'ch.qos.logback:logback-classic' @@ -56,6 +57,7 @@ dependencyManagement { dependency "ch.qos.logback:logback-classic:1.1.2" dependency "commons-collections:commons-collections:3.2.1" dependency "org.apache.commons:commons-lang3:3.2.1" + dependency "commons-io:commons-io:2.4" dependency "com.google.guava:guava:18.0" } } 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 741347b1..81882b8f 100644 --- a/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java @@ -41,10 +41,6 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { documentBuilder.append(markup).append(title).append(newLine).append(newLine); } - protected void documentTitleWithAttributes(Markup markup, String title){ - documentBuilder.append(newLine).append(markup).append(title).append(newLine); - } - protected void sectionTitleLevel1(Markup markup, String title){ documentBuilder.append(newLine).append(markup).append(title).append(newLine); } @@ -98,11 +94,15 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { protected void unorderedList(Markup markup, List list){ documentBuilder.append(newLine); for(String listEntry : list){ - documentBuilder.append(markup).append(listEntry).append(newLine); + unorderedListItem(markup, listEntry); } documentBuilder.append(newLine); } + protected void unorderedListItem(Markup markup, String item) { + documentBuilder.append(markup).append(item).append(newLine); + } + @Override public MarkupDocBuilder anchor(String anchor, String text) { documentBuilder.append(anchorAsString(anchor, text)); @@ -115,40 +115,35 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { } @Override - public MarkupDocBuilder crossReference(String document, String anchor, String text) { - documentBuilder.append(crossReferenceAsString(document, anchor, text)); + public MarkupDocBuilder crossReferenceAnchor(String document, String anchor, String text) { + documentBuilder.append(crossReferenceAnchorAsString(document, anchor, text)); return this; } @Override - public MarkupDocBuilder crossReference(String anchor, String text) { - return crossReference(null, anchor, text); + public MarkupDocBuilder crossReferenceAnchor(String anchor, String text) { + return crossReferenceAnchor(null, anchor, text); } @Override - public MarkupDocBuilder crossReference(String anchor) { - return crossReference(null, anchor, null); + public MarkupDocBuilder crossReferenceAnchor(String anchor) { + return crossReferenceAnchor(null, anchor, null); } @Override - public MarkupDocBuilder crossReferenceTitle(String document, String anchor, String text) { - documentBuilder.append(crossReferenceTitleAsString(document, anchor, text)); + public MarkupDocBuilder crossReference(String document, String title, String text) { + documentBuilder.append(crossReferenceAsString(document, title, text)); return this; } @Override - public MarkupDocBuilder crossReferenceTitle(String anchor, String text) { - return crossReferenceTitle(null, anchor, text); + public MarkupDocBuilder crossReference(String title, String text) { + return crossReference(null, title, text); } @Override - 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); + public MarkupDocBuilder crossReference(String title) { + return crossReference(null, title, null); } @Override @@ -167,6 +162,10 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { return documentBuilder.toString(); } + protected String addfileExtension(Markup markup, String fileName) { + return fileName + "." + markup; + } + @Override public void writeToFileWithoutExtension(String directory, String fileName, Charset charset) throws IOException { Files.createDirectories(Paths.get(directory)); @@ -178,4 +177,9 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { } documentBuilder = new StringBuilder(); } + + @Override + public void writeToFile(String directory, String fileName, Charset charset) throws IOException { + writeToFileWithoutExtension(directory, addfileExtension(fileName), charset); + } } 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 ba09f701..5136fcac 100644 --- a/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java @@ -29,8 +29,6 @@ public interface MarkupDocBuilder { MarkupDocBuilder documentTitle(String title); - MarkupDocBuilder documentTitleWithAttributes(String title); - MarkupDocBuilder sectionTitleLevel1(String title); MarkupDocBuilder sectionTitleLevel2(String title); @@ -53,6 +51,8 @@ public interface MarkupDocBuilder { MarkupDocBuilder unorderedList(List list); + MarkupDocBuilder unorderedListItem(String item); + @Deprecated MarkupDocBuilder tableWithHeaderRow(List rowsInPSV); @@ -66,21 +66,21 @@ public interface MarkupDocBuilder { String anchorAsString(String anchor, String text); - MarkupDocBuilder crossReference(String document, String anchor, String text); + MarkupDocBuilder crossReferenceAnchor(String document, String anchor, String text); - MarkupDocBuilder crossReference(String anchor, String text); + MarkupDocBuilder crossReferenceAnchor(String anchor, String text); - MarkupDocBuilder crossReference(String anchor); + MarkupDocBuilder crossReferenceAnchor(String anchor); - String crossReferenceAsString(String document, String anchor, String text); + String crossReferenceAnchorAsString(String document, String anchor, String text); - MarkupDocBuilder crossReferenceTitle(String document, String anchor, String text); + MarkupDocBuilder crossReference(String document, String title, String text); - MarkupDocBuilder crossReferenceTitle(String anchor, String text); + MarkupDocBuilder crossReference(String title, String text); - MarkupDocBuilder crossReferenceTitle(String anchor); + MarkupDocBuilder crossReference(String title); - String crossReferenceTitleAsString(String document, String anchor, String text); + String crossReferenceAsString(String document, String title, String text); MarkupDocBuilder newLine(); @@ -89,6 +89,13 @@ public interface MarkupDocBuilder { */ String toString(); + /** + * Add an extension to fileName depending on markup language + * @param fileName without extension + * @return fileName with an extension + */ + String addfileExtension(String fileName); + /** * Writes the content of the builder to a file and clears the builder. * An extension will be dynamically added to fileName depending on the markup language. diff --git a/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDoc.java b/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDoc.java index f75a34d8..1c38d145 100644 --- a/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDoc.java +++ b/src/main/java/io/github/robwin/markup/builder/asciidoc/AsciiDoc.java @@ -42,7 +42,8 @@ public enum AsciiDoc implements Markup { CROSS_REFERENCE_START("<<"), CROSS_REFERENCE_END(">>"), ANCHOR_START("[["), - ANCHOR_END("]]"); + ANCHOR_END("]]"), + FILE_EXTENSION("adoc"); private final String markup; 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 f1036383..961188ab 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 @@ -25,8 +25,7 @@ import io.github.robwin.markup.builder.MarkupDocBuilder; import io.github.robwin.markup.builder.MarkupTableColumn; import org.apache.commons.collections.CollectionUtils; -import java.io.IOException; -import java.nio.charset.Charset; +import java.io.File; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -39,8 +38,7 @@ 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 ANCHOR_FORBIDDEN_PATTERN = Pattern.compile("[^\\p{ASCII}]+"); private static final Pattern SPACE_PATTERN = Pattern.compile("[\\s]+"); @@ -50,12 +48,6 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { return this; } - @Override - public MarkupDocBuilder documentTitleWithAttributes(String title) { - documentTitle(AsciiDoc.DOCUMENT_TITLE, title); - return this; - } - @Override public MarkupDocBuilder sectionTitleLevel1(String title){ sectionTitleLevel1(AsciiDoc.SECTION_TITLE_LEVEL1, title); @@ -110,6 +102,12 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { return this; } + @Override + public MarkupDocBuilder unorderedListItem(String item) { + unorderedListItem(AsciiDoc.LIST_ENTRY, item); + return this; + } + @Override public MarkupDocBuilder source(String text, String language){ documentBuilder.append(String.format("[source,%s]", language)).append(newLine); @@ -129,18 +127,28 @@ 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("_"); + private String normalizeAnchor(String anchor) { + return "_" + SPACE_PATTERN.matcher(ANCHOR_FORBIDDEN_PATTERN.matcher(anchor.trim().toLowerCase()).replaceAll("")).replaceAll("_"); } - /* - * Section title anchors normalization + private String normalizeTitle(String document, String title) { + if (document == null) + return title.trim(); + else { + // Reference to a title in another document is not yet supported in AsciiDoctor. + // The following workaround works with AsciiDoctor HTML output. + return "_" + title.trim().toLowerCase(); + } + } + + /** + * Partial workaround for https://github.com/asciidoctor/asciidoctor/issues/844 */ - private static String normalizeTitleAnchor(String anchor) { - return anchor.trim(); + private String normalizeDocument(String document) { + if (document == null) + return null; + + return new File(document).toPath().normalize().toString(); } @Override @@ -154,9 +162,6 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { } - /* - * Final crossref builder, using a pre-normalized anchor. - */ protected String normalizedCrossReferenceAsString(String document, String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); stringBuilder.append(AsciiDoc.CROSS_REFERENCE_START); @@ -170,13 +175,13 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { } @Override - public String crossReferenceAsString(String document, String anchor, String text) { - return normalizedCrossReferenceAsString(document, normalizeAnchor(anchor), text); + public String crossReferenceAnchorAsString(String document, String anchor, String text) { + return normalizedCrossReferenceAsString(normalizeDocument(document), normalizeAnchor(anchor), text); } @Override - public String crossReferenceTitleAsString(String document, String anchor, String text) { - return normalizedCrossReferenceAsString(document, normalizeTitleAnchor(anchor), text); + public String crossReferenceAsString(String document, String title, String text) { + return normalizedCrossReferenceAsString(normalizeDocument(document), normalizeTitle(document, title), text); } private String escapeTableCell(String cell) { @@ -225,7 +230,8 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { } @Override - public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - writeToFileWithoutExtension(directory, fileName + "." + ASCIIDOC_FILE_EXTENSION, charset); + public String addfileExtension(String fileName) { + return addfileExtension(AsciiDoc.FILE_EXTENSION, fileName); } + } diff --git a/src/main/java/io/github/robwin/markup/builder/markdown/Markdown.java b/src/main/java/io/github/robwin/markup/builder/markdown/Markdown.java index e290629b..6e94aef4 100644 --- a/src/main/java/io/github/robwin/markup/builder/markdown/Markdown.java +++ b/src/main/java/io/github/robwin/markup/builder/markdown/Markdown.java @@ -36,7 +36,8 @@ public enum Markdown implements Markup { SECTION_TITLE_LEVEL4("##### "), BOLD("**"), ITALIC("*"), - LIST_ENTRY("* "); + LIST_ENTRY("* "), + FILE_EXTENSION("md"); private final String markup; 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 628ab4ba..01dcaebf 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 @@ -26,8 +26,6 @@ import io.github.robwin.markup.builder.MarkupTableColumn; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.Validate; -import java.io.IOException; -import java.nio.charset.Charset; import java.util.Arrays; import java.util.Collection; import java.util.List; @@ -41,7 +39,6 @@ import static org.apache.commons.lang3.StringUtils.join; */ public class MarkdownBuilder extends AbstractMarkupDocBuilder { - private static final String MARKDOWN_FILE_EXTENSION = "md"; private static final Pattern ANCHOR_FORBIDDEN_PATTERN = Pattern.compile("[^0-9a-zA-Z-_\\s]+"); private static final Pattern ANCHOR_SPACE_PATTERN = Pattern.compile("[\\s]+"); @@ -51,12 +48,6 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder return this; } - @Override - public MarkupDocBuilder documentTitleWithAttributes(String title) { - documentTitle(Markdown.DOCUMENT_TITLE, title); - return this; - } - @Override public MarkupDocBuilder sectionTitleLevel1(String title){ sectionTitleLevel1(Markdown.SECTION_TITLE_LEVEL1, title); @@ -119,6 +110,12 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder return this; } + @Override + public MarkupDocBuilder unorderedListItem(String item) { + unorderedListItem(Markdown.LIST_ENTRY, item); + return this; + } + @Override public MarkupDocBuilder tableWithHeaderRow(List rowsInPSV){ String headersInPSV = rowsInPSV.get(0); @@ -164,7 +161,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder } @Override - public String crossReferenceAsString(String document, String anchor, String text) { + public String crossReferenceAnchorAsString(String document, String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); if (text == null) text = anchor.trim(); @@ -172,6 +169,11 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder return stringBuilder.toString(); } + @Override + public String crossReferenceAsString(String document, String title, String text) { + return crossReferenceAnchorAsString(document, title, text); + } + private String escapeTableCell(String cell) { return cell.replace(Markdown.TABLE_COLUMN_DELIMITER.toString(), Markdown.TABLE_COLUMN_DELIMITER_ESCAPE.toString()); } @@ -209,7 +211,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder } @Override - public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - writeToFileWithoutExtension(directory, fileName + "." + MARKDOWN_FILE_EXTENSION, charset); + public String addfileExtension(String fileName) { + return addfileExtension(Markdown.FILE_EXTENSION, fileName); } } diff --git a/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java b/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java index e0302530..db1fa958 100644 --- a/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java +++ b/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java @@ -75,11 +75,11 @@ public class MarkupDocBuilderTest { .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) .anchor("anchor", "text").newLine() - .anchor(" \u0240 & This | There .:/-_# ").newLine() + .anchor(" \u0240 µ&|ù This .:/-_# ").newLine() + .crossReferenceAnchor("./document.adoc", "anchor", "text").newLine() + .crossReferenceAnchor(" \u0240 µ&|ù This .:/-_ ").newLine() .crossReference("./document.adoc", "anchor", "text").newLine() - .crossReference(" \u0240 & This | There .:/-_ ").newLine() - .crossReferenceTitle("./document.adoc", "anchor", "text").newLine() - .crossReferenceTitle(" \u0240 & This | There .:/-_ ").newLine() + .crossReference(" \u0240 µ&|ù This .:/-_ ").newLine() .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); } @@ -104,11 +104,11 @@ public class MarkupDocBuilderTest { .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) .anchor("anchor", "text").newLine() - .anchor(" \u0240 & This | There .:/-_# ").newLine() + .anchor(" \u0240 µ&|ù This .:/-_# ").newLine() + .crossReferenceAnchor("./document.adoc", "anchor", "text").newLine() + .crossReferenceAnchor(" \u0240 µ&|ù This .:/-_ ").newLine() .crossReference("./document.adoc", "anchor", "text").newLine() - .crossReference(" \u0240 & This | There .:/-_ ").newLine() - .crossReferenceTitle("./document.adoc", "anchor", "text").newLine() - .crossReferenceTitle(" \u0240 & This | There .:/-_ ").newLine() + .crossReference(" \u0240 µ&|ù This .:/-_ ").newLine() .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); }