diff --git a/gradlew b/gradlew index 9db14b92..91a7e269 100644 --- a/gradlew +++ b/gradlew @@ -12,7 +12,7 @@ DEFAULT_JVM_OPTS="" APP_NAME="Gradle" APP_BASE_NAME=`basename "$0"` -# Use the maximum available, or set MAX_FD != -1 to use that header. +# Use the maximum available, or set MAX_FD != -1 to use that value. MAX_FD="maximum" warn ( ) { 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 78d89749..4f926507 100644 --- a/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/AbstractMarkupDocBuilder.java @@ -130,13 +130,14 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder { return documentBuilder.toString(); } - protected void writeToFileWithExtension(String directory, String fileNameWithExtension, Charset charset) throws IOException { + @Override + public void writeToFileWithoutExtension(String directory, String fileName, Charset charset) throws IOException { Files.createDirectories(Paths.get(directory)); - try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(directory, fileNameWithExtension), charset)){ + try (BufferedWriter writer = Files.newBufferedWriter(Paths.get(directory, fileName), charset)){ writer.write(documentBuilder.toString()); } if (logger.isInfoEnabled()) { - logger.info("{} was written to: {}", fileNameWithExtension, directory); + logger.info("{} was written to: {}", fileName, directory); } documentBuilder = new StringBuilder(); } 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 e1b73030..3f50910b 100644 --- a/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java +++ b/src/main/java/io/github/robwin/markup/builder/MarkupDocBuilder.java @@ -58,7 +58,7 @@ public interface MarkupDocBuilder { MarkupDocBuilder table(List> cells); - MarkupDocBuilder tableWithColumnSpecs(List headers, List> cells); + MarkupDocBuilder tableWithColumnSpecs(List columnSpecs, List> cells); MarkupDocBuilder anchor(String anchor); @@ -94,21 +94,14 @@ public interface MarkupDocBuilder { */ void writeToFile(String directory, String fileName, Charset charset) throws IOException; - class TableColumnSpec { - public String header; - public Integer widthRatio = 0; - public TableColumnSpec() {} - public TableColumnSpec(String header, Integer widthRatio) { - this.header = header; - this.widthRatio = widthRatio; - } - public TableColumnSpec withHeader(String header) { - this.header = header; - return this; - } - public TableColumnSpec withWidthRatio(Integer widthRatio) { - this.widthRatio = widthRatio; - return this; - } - } + /** + * Writes the content of the builder to a file and clears the builder. + * + * @param directory the directory where the generated file should be stored + * @param fileName the name of the file + * @param charset the the charset to use for encoding + * @throws java.io.IOException if the file cannot be written + */ + void writeToFileWithoutExtension(String directory, String fileName, Charset charset) throws IOException; + } diff --git a/src/main/java/io/github/robwin/markup/builder/MarkupTableColumn.java b/src/main/java/io/github/robwin/markup/builder/MarkupTableColumn.java new file mode 100644 index 00000000..07a54106 --- /dev/null +++ b/src/main/java/io/github/robwin/markup/builder/MarkupTableColumn.java @@ -0,0 +1,24 @@ +package io.github.robwin.markup.builder; + +public class MarkupTableColumn { + public String header; + public Integer widthRatio = 0; + + public MarkupTableColumn() { + } + + public MarkupTableColumn(String header, Integer widthRatio) { + this.header = header; + this.widthRatio = widthRatio; + } + + public MarkupTableColumn withHeader(String header) { + this.header = header; + return this; + } + + public MarkupTableColumn withWidthRatio(Integer widthRatio) { + this.widthRatio = widthRatio; + return this; + } +} \ No newline at end of file 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 68b0be27..a1ff76d9 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 @@ -22,6 +22,7 @@ import com.google.common.base.Function; 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 java.io.IOException; @@ -29,7 +30,6 @@ 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,7 +39,6 @@ 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_ESCAPE_PATTERN = Pattern.compile("[^0-9a-zA-Z]+"); @Override public MarkupDocBuilder documentTitle(String title){ @@ -127,7 +126,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { } private static String normalizeReferenceAnchor(String anchor) { - return ANCHOR_ESCAPE_PATTERN.matcher(anchor).replaceAll("_"); + return anchor.trim(); } @Override @@ -164,13 +163,13 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { } @Override - public MarkupDocBuilder tableWithColumnSpecs(List columns, List> cells) { + public MarkupDocBuilder tableWithColumnSpecs(List columnSpecs, List> cells) { Boolean hasHeader = false; List options = new ArrayList<>(); List cols = new ArrayList<>(); - if (CollectionUtils.isNotEmpty(columns)) { - for (TableColumnSpec col : columns) { + if (CollectionUtils.isNotEmpty(columnSpecs)) { + for (MarkupTableColumn col : columnSpecs) { if (!hasHeader && isNotBlank(col.header)) { options.add("header"); hasHeader = true; @@ -183,8 +182,8 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { documentBuilder.append("[options=\"" + join(options, ",") + "\", cols=\"" + join(cols, ",") + "\"]").append(newLine); documentBuilder.append(AsciiDoc.TABLE).append(newLine); if (hasHeader) { - Collection headerList = Collections2.transform(columns, new Function() { - public String apply(final TableColumnSpec header) { + Collection headerList = Collections2.transform(columnSpecs, new Function() { + public String apply(final MarkupTableColumn header) { return escapeTableCell(defaultString(header.header)); } }); @@ -206,6 +205,6 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder { @Override public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - writeToFileWithExtension(directory, fileName + "." + ASCIIDOC_FILE_EXTENSION, charset); + writeToFileWithoutExtension(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 e960cdd7..2fdc4e78 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 @@ -22,6 +22,7 @@ import com.google.common.base.Function; 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; @@ -41,7 +42,8 @@ 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_ESCAPE_PATTERN = Pattern.compile("[^0-9a-zA-Z]+"); + private static final Pattern ANCHOR_FORBIDDEN_PATTERN = Pattern.compile("[^0-9a-zA-Z-_\\s]+"); + private static final Pattern ANCHOR_SPACE_PATTERN = Pattern.compile("[\\s]+"); @Override public MarkupDocBuilder documentTitle(String title){ @@ -151,7 +153,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder } private static String normalizeReferenceAnchor(String anchor) { - return ANCHOR_ESCAPE_PATTERN.matcher(anchor).replaceAll("-"); + return ANCHOR_SPACE_PATTERN.matcher(ANCHOR_FORBIDDEN_PATTERN.matcher(anchor.trim().toLowerCase()).replaceAll("")).replaceAll("-"); } @Override @@ -177,7 +179,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder public String crossReferenceAsString(String anchor, String text) { StringBuilder stringBuilder = new StringBuilder(); if (text == null) - text = anchor; + text = anchor.trim(); stringBuilder.append("[").append(text).append("](#").append(normalizeReferenceAnchor(anchor)).append(")"); return stringBuilder.toString(); } @@ -187,20 +189,20 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder } @Override - public MarkupDocBuilder tableWithColumnSpecs(List columns, List> cells) { - if (CollectionUtils.isEmpty(columns)) + public MarkupDocBuilder tableWithColumnSpecs(List columnSpecs, List> cells) { + if (CollectionUtils.isEmpty(columnSpecs)) throw new RuntimeException("Header is mandatory in Markdown"); newLine(); - Collection headerList = Collections2.transform(columns, new Function() { - public String apply(final TableColumnSpec header) { + Collection headerList = Collections2.transform(columnSpecs, new Function() { + public String apply(final MarkupTableColumn header) { return escapeTableCell(defaultString(header.header)); } }); documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER).append(join(headerList, Markdown.TABLE_COLUMN_DELIMITER.toString())).append(Markdown.TABLE_COLUMN_DELIMITER).append(newLine); documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER); - for (TableColumnSpec col : columns) { + for (MarkupTableColumn col : columnSpecs) { documentBuilder.append(StringUtils.repeat(Markdown.TABLE_ROW.toString(), 3)); documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER); } @@ -221,6 +223,6 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder @Override public void writeToFile(String directory, String fileName, Charset charset) throws IOException { - writeToFileWithExtension(directory, fileName + "." + MARKDOWN_FILE_EXTENSION, charset); + writeToFileWithoutExtension(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 7acdc9ea..398448e5 100644 --- a/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java +++ b/src/test/java/io/github/robwin/markup/builder/MarkupDocBuilderTest.java @@ -33,7 +33,7 @@ import java.util.List; public class MarkupDocBuilderTest { List tableRowsInPSV; - List tableColumns; + List tableColumns; List> tableCells; @@ -45,9 +45,9 @@ public class MarkupDocBuilderTest { tableRowsInPSV.add("Row 2, Column 1 | Row 2, Column 2 | Row 2, Column 3"); tableColumns = Arrays.asList( - new MarkupDocBuilder.TableColumnSpec().withHeader("Header1"), - new MarkupDocBuilder.TableColumnSpec().withWidthRatio(2), - new MarkupDocBuilder.TableColumnSpec().withHeader("Header3").withWidthRatio(1)); + new MarkupTableColumn().withHeader("Header1"), + new MarkupTableColumn().withWidthRatio(2), + new MarkupTableColumn().withHeader("Header3").withWidthRatio(1)); tableCells = new ArrayList<>(); tableCells.add(Arrays.asList("Row 1 | Column 1", "Row 1 | Column 2", "Row 1 | Column 3")); tableCells.add(Arrays.asList("Row 2 | Column 1", "Row 2 | Column 2", "Row 2 | Column 3")); @@ -75,10 +75,10 @@ public class MarkupDocBuilderTest { .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) .anchor("anchor").newLine() - .anchor("\u0240 & this | there").newLine() + .anchor(" \u0240 & This | There ").newLine() .crossReference("anchor").newLine() .crossReference("anchor", "text").newLine() - .crossReference("\u0240 & this | there").newLine() + .crossReference(" \u0240 & This | There ").newLine() .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); } @@ -103,10 +103,10 @@ public class MarkupDocBuilderTest { .italicTextLine("Italic text line b") .unorderedList(Arrays.asList("Entry1", "Entry2", "Entry 2")) .anchor("anchor").newLine() - .anchor("\u0240 & this | there").newLine() + .anchor(" \u0240 & This | There ").newLine() .crossReference("anchor").newLine() .crossReference("anchor", "text").newLine() - .crossReference("\u0240 & this | there").newLine() + .crossReference(" \u0240 & This | There ").newLine() .writeToFile("build/tmp", "test", StandardCharsets.UTF_8); }