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 36622cd1..685ca28f 100644 --- a/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java @@ -38,27 +38,27 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { protected Logger logger = LoggerFactory.getLogger(getClass()); protected void documentTitle(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine).append(newLine); } protected void documentTitleWithAttributes(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine); } protected void sectionTitleLevel1(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine); } protected void sectionTitleLevel2(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine); } protected void sectionTitleLevel3(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine); } protected void sectionTitleLevel4(Markup markup, String title){ - documentBuilder.append(markup).append(title).append(newLine); + documentBuilder.append(newLine).append(markup).append(title).append(newLine); } @Override @@ -103,6 +103,12 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { documentBuilder.append(newLine); } + @Override + public MarkupDocBuilder crossReference(String anchor) { + crossReference(anchor, null); + return this; + } + @Override public MarkupDocBuilder newLine(){ documentBuilder.append(newLine); @@ -114,8 +120,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { return documentBuilder.toString(); } - @Override - public void writeToFile(String directory, String fileNameWithExtension, Charset charset) throws IOException { + protected void writeToFileWithExtension(String directory, String fileNameWithExtension, Charset charset) throws IOException { Files.createDirectories(Paths.get(directory)); try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(directory, fileNameWithExtension), charset)){ writer.write(documentBuilder.toString()); 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 e3d7772a..928229a1 100644 --- a/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java @@ -26,6 +26,7 @@ import java.util.List; * @author Robert Winkler */ public interface MarkupDocBuilder { + MarkupDocBuilder documentTitle(String title); MarkupDocBuilder documentTitleWithAttributes(String title); @@ -52,9 +53,18 @@ public interface MarkupDocBuilder { MarkupDocBuilder unorderedList(List list); + @Deprecated MarkupDocBuilder tableWithHeaderRow(List rowsInPSV); - MarkupDocBuilder crossReference(String text); + MarkupDocBuilder anchor(String anchor); + + /** + * @param anchor Target anchor + * @param text If not null, display this text instead of anchor + */ + MarkupDocBuilder crossReference(String anchor, String text); + + MarkupDocBuilder crossReference(String anchor); MarkupDocBuilder newLine(); @@ -65,11 +75,13 @@ public interface MarkupDocBuilder { /** * 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. * * @param directory the directory where the generated file should be stored - * @param fileName the name of the file + * @param fileName the base name of the file without extension * @param charset the the charset to use for encoding * @throws java.io.IOException if the file cannot be written */ void writeToFile(String directory, String fileName, Charset charset) throws IOException; + } 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 0faa9537..b2b6192b 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 @@ -39,7 +39,9 @@ public enum AsciiDoc implements Markup { ITALIC("_"), LIST_ENTRY("* "), CROSS_REFERENCE_START("<<"), - CROSS_REFERENCE_END(">>"); + CROSS_REFERENCE_END(">>"), + ANCHOR_START("[["), + ANCHOR_END("]]"); 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 f9311ffc..85b6d753 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 @@ -24,12 +24,16 @@ import io.github.robwin.markup.builder.MarkupDocBuilder; import java.io.IOException; import java.nio.charset.Charset; import java.util.List; +import java.util.regex.Pattern; /** * @author Robert Winkler */ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { + private static final String ASCIIDOC_FILE_EXTENSION = "adoc"; + private static final Pattern ANCHOR_ESCAPE_PATTERN = Pattern.compile("[^0-9a-zA-Z]"); + @Override public MarkupDocBuilder documentTitle(String title){ documentTitle(AsciiDoc.DOCUMENT_TITLE, title); @@ -62,7 +66,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { @Override public MarkupDocBuilder sectionTitleLevel4(String title){ - sectionTitleLevel3(AsciiDoc.SECTION_TITLE_LEVEL4, title); + sectionTitleLevel4(AsciiDoc.SECTION_TITLE_LEVEL4, title); return this; } @@ -105,6 +109,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { @Override public MarkupDocBuilder tableWithHeaderRow(List rowsInPSV){ + newLine(); documentBuilder.append("[options=\"header\"]").append(newLine); documentBuilder.append(AsciiDoc.TABLE).append(newLine); for(String row : rowsInPSV){ @@ -114,16 +119,27 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { return this; } + private static String normalizeReferenceAnchor(String anchor) { + return ANCHOR_ESCAPE_PATTERN.matcher(anchor).replaceAll("_"); + } + @Override - public MarkupDocBuilder crossReference(String text) { - documentBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(text).append(AsciiDoc.CROSS_REFERENCE_END); + public MarkupDocBuilder anchor(String anchor) { + documentBuilder.append(AsciiDoc.ANCHOR_START).append(normalizeReferenceAnchor(anchor)).append(AsciiDoc.ANCHOR_END); + return this; + } + + @Override + public MarkupDocBuilder crossReference(String anchor, String text) { + if (text == null) + documentBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(normalizeReferenceAnchor(anchor)).append(AsciiDoc.CROSS_REFERENCE_END); + else + documentBuilder.append(AsciiDoc.CROSS_REFERENCE_START).append(normalizeReferenceAnchor(anchor)).append(",").append(text).append(AsciiDoc.CROSS_REFERENCE_END); return this; } @Override public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - String fileNameWithExtension = fileName + ".adoc"; - super.writeToFile(directory, fileNameWithExtension, charset); + writeToFileWithExtension(directory, fileName + "." + ASCIIDOC_FILE_EXTENSION, charset); } - } 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 904e9c54..5e748a03 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 @@ -31,6 +31,8 @@ import java.util.List; */ public class MarkdownBuilder extends AbstractMarkupDocBuilder { + private static final String MARKDOWN_FILE_EXTENSION = "md"; + @Override public MarkupDocBuilder documentTitle(String title){ documentTitle(Markdown.DOCUMENT_TITLE, title); @@ -63,7 +65,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder @Override public MarkupDocBuilder sectionTitleLevel4(String title){ - sectionTitleLevel3(Markdown.SECTION_TITLE_LEVEL4, title); + sectionTitleLevel4(Markdown.SECTION_TITLE_LEVEL4, title); return this; } @@ -111,6 +113,8 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder List contentRowsInPSV = rowsInPSV.subList(1, rowsInPSV.size()); String[] headersAsArray = headersInPSV.split(String.format("\\%s", Markdown.TABLE_COLUMN_DELIMITER.toString())); List headers = Arrays.asList(headersAsArray); + + newLine(); // Header documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER.toString()); documentBuilder.append(headersInPSV); @@ -136,15 +140,24 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder return this; } - @Override // TODO - public MarkupDocBuilder crossReference(String text) { - throw new UnsupportedOperationException("Not yet supported"); + @Override + public MarkupDocBuilder anchor(String anchor) { + return this; + } + + // TODO + @Override + public MarkupDocBuilder crossReference(String anchor, String text) { + if (text == null) + documentBuilder.append(anchor); + else + documentBuilder.append(text); + return this; } @Override public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - String fileNameWithExtension = fileName + ".md"; - super.writeToFile(directory, fileNameWithExtension, charset); + writeToFileWithExtension(directory, fileName + "." + MARKDOWN_FILE_EXTENSION, charset); } } 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 e4a729e6..59d51c2b 100644 --- a/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java +++ b/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java @@ -50,15 +50,20 @@ public class MarkupDocBuilderTest { .sectionTitleLevel1("Section Level 1a") .sectionTitleLevel2("Section Level 2a") .sectionTitleLevel3("Section Level 3a") + .sectionTitleLevel4("Section Level 4a") .paragraph("Paragraph with long text bla bla bla bla bla") .listing("Source code listing") .source("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.ASCIIDOC)", "java") .tableWithHeaderRow(tableRowsInPSV) .sectionTitleLevel1("Section Level 1b") .sectionTitleLevel2("Section Level 2b") + .textLine("text line b") .boldTextLine("Bold text line b") .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) + .anchor("anchor") + .crossReference("anchor") + .crossReference("anchor", "text") .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); } @@ -69,15 +74,20 @@ public class MarkupDocBuilderTest { .sectionTitleLevel1("Section Level 1a") .sectionTitleLevel2("Section Level 2a") .sectionTitleLevel3("Section Level 3a") + .sectionTitleLevel4("Section Level 4a") .paragraph("Paragraph with long text bla bla bla bla bla") .listing("Source code listing") .source("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.MARKDOWN)", "java") .tableWithHeaderRow(tableRowsInPSV) .sectionTitleLevel1("Section Level 1b") .sectionTitleLevel2("Section Level 2b") + .textLine("text line b") .boldTextLine("Bold text line b") .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) + .anchor("anchor") + .crossReference("anchor") + .crossReference("anchor", "text") .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); }