Enhanced support for tables

This commit is contained in:
Hugo de Paix de Coeur
2016-02-03 17:22:24 +01:00
parent 48c48ba56b
commit 74bd2b0d2e
9 changed files with 154 additions and 8 deletions

View File

@@ -38,7 +38,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
protected Logger logger = LoggerFactory.getLogger(getClass());
protected void documentTitle(Markup markup, String title){
documentBuilder.append(newLine).append(markup).append(title).append(newLine).append(newLine);
documentBuilder.append(markup).append(title).append(newLine).append(newLine);
}
protected void documentTitleWithAttributes(Markup markup, String title){
@@ -115,6 +115,11 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return this;
}
@Override
public MarkupDocBuilder table(List<List<String>> cells) {
return tableWithColumnSpecs(null, cells);
}
@Override
public String toString(){
return documentBuilder.toString();

View File

@@ -56,6 +56,10 @@ public interface MarkupDocBuilder {
@Deprecated
MarkupDocBuilder tableWithHeaderRow(List<String> rowsInPSV);
MarkupDocBuilder table(List<List<String>> cells);
MarkupDocBuilder tableWithColumnSpecs(List<TableColumnSpec> headers, List<List<String>> cells);
MarkupDocBuilder anchor(String anchor);
/**
@@ -84,4 +88,21 @@ 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;
}
}
}

View File

@@ -28,6 +28,7 @@ public enum AsciiDoc implements Markup {
LABELED(":: "),
TABLE("|==="),
TABLE_COLUMN_DELIMITER("|"),
TABLE_COLUMN_DELIMITER_ESCAPE("\\|"), // AsciiDoctor supports both \| and {vbar}
LISTING("----"),
HARDBREAKS(":hardbreaks:"),
DOCUMENT_TITLE("= "),

View File

@@ -18,14 +18,21 @@
*/
package io.github.robwin.markup.builder.asciidoc;
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 org.apache.commons.collections.CollectionUtils;
import java.io.IOException;
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.*;
/**
* @author Robert Winkler
*/
@@ -138,6 +145,51 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
return this;
}
private String escapeTableCell(String cell) {
return cell.replace(AsciiDoc.TABLE_COLUMN_DELIMITER.toString(), AsciiDoc.TABLE_COLUMN_DELIMITER_ESCAPE.toString());
}
@Override
public MarkupDocBuilder tableWithColumnSpecs(List<TableColumnSpec> columns, List<List<String>> cells) {
Boolean hasHeader = false;
List<String> options = new ArrayList<>();
List<String> cols = new ArrayList<>();
if (CollectionUtils.isNotEmpty(columns)) {
for (TableColumnSpec col : columns) {
if (!hasHeader && isNotBlank(col.header)) {
options.add("header");
hasHeader = true;
}
cols.add(String.valueOf(col.widthRatio));
}
}
newLine();
documentBuilder.append("[options=\"" + join(options, ",") + "\", cols=\"" + join(cols, ",") + "\"]").append(newLine);
documentBuilder.append(AsciiDoc.TABLE).append(newLine);
if (hasHeader) {
Collection<String> headerList = Collections2.transform(columns, new Function<TableColumnSpec, String>() {
public String apply(final TableColumnSpec header) {
return escapeTableCell(defaultString(header.header));
}
});
documentBuilder.append(AsciiDoc.TABLE_COLUMN_DELIMITER).append(join(headerList, AsciiDoc.TABLE_COLUMN_DELIMITER.toString())).append(newLine);
}
for (List<String> row : cells) {
Collection<String> cellList = Collections2.transform(row, new Function<String, String>() {
public String apply(final String cell) {
return escapeTableCell(cell);
}
});
documentBuilder.append(AsciiDoc.TABLE_COLUMN_DELIMITER).append(join(cellList, AsciiDoc.TABLE_COLUMN_DELIMITER.toString())).append(newLine);
}
documentBuilder.append(AsciiDoc.TABLE).append(newLine);
newLine();
return this;
}
@Override
public void writeToFile(String directory, String fileName, Charset charset) throws IOException {
writeToFileWithExtension(directory, fileName + "." + ASCIIDOC_FILE_EXTENSION, charset);

View File

@@ -26,6 +26,7 @@ import io.github.robwin.markup.builder.Markup;
public enum Markdown implements Markup {
HARDBREAKS(""),
TABLE_COLUMN_DELIMITER("|"),
TABLE_COLUMN_DELIMITER_ESCAPE("\\|"),
TABLE_ROW("-"),
LISTING("```"),
DOCUMENT_TITLE("# "),

View File

@@ -18,14 +18,22 @@
*/
package io.github.robwin.markup.builder.markdown;
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 org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import static org.apache.commons.lang3.StringUtils.defaultString;
import static org.apache.commons.lang3.StringUtils.join;
/**
* @author Robert Winkler
*/
@@ -156,6 +164,43 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
return this;
}
private String escapeTableCell(String cell) {
return cell.replace(Markdown.TABLE_COLUMN_DELIMITER.toString(), Markdown.TABLE_COLUMN_DELIMITER_ESCAPE.toString());
}
@Override
public MarkupDocBuilder tableWithColumnSpecs(List<TableColumnSpec> columns, List<List<String>> cells) {
if (CollectionUtils.isEmpty(columns))
throw new RuntimeException("Header is mandatory in Markdown");
newLine();
Collection<String> headerList = Collections2.transform(columns, new Function<TableColumnSpec, String>() {
public String apply(final TableColumnSpec 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) {
documentBuilder.append(StringUtils.repeat(Markdown.TABLE_ROW.toString(), 3));
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER);
}
documentBuilder.append(newLine);
for (List<String> row : cells) {
Collection<String> cellList = Collections2.transform(row, new Function<String, String>() {
public String apply(final String cell) {
return escapeTableCell(cell);
}
});
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER).append(join(cellList, Markdown.TABLE_COLUMN_DELIMITER.toString())).append(Markdown.TABLE_COLUMN_DELIMITER).append(newLine);
}
newLine();
return this;
}
@Override
public void writeToFile(String directory, String fileName, Charset charset) throws IOException {
writeToFileWithExtension(directory, fileName + "." + MARKDOWN_FILE_EXTENSION, charset);