Merge pull request #20 from Kabhal/master

Added new block methods (supporting title and admonitions)
This commit is contained in:
Robert Winkler
2016-02-26 16:31:31 +01:00
7 changed files with 180 additions and 93 deletions

View File

@@ -70,11 +70,11 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return this.anchorPrefix;
}
protected void documentTitle(Markup markup, String title){
protected void documentTitle(Markup markup, String title) {
documentBuilder.append(markup).append(title).append(newLine).append(newLine);
}
protected void sectionTitleLevel1(Markup markup, String title, String anchor){
protected void sectionTitleLevel1(Markup markup, String title, String anchor) {
documentBuilder.append(newLine);
if (anchor != null)
anchor(anchor).newLine();
@@ -86,7 +86,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return sectionTitleWithAnchorLevel1(title, title);
}
protected void sectionTitleLevel2(Markup markup, String title, String anchor){
protected void sectionTitleLevel2(Markup markup, String title, String anchor) {
documentBuilder.append(newLine);
if (anchor != null)
anchor(anchor).newLine();
@@ -98,7 +98,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return sectionTitleWithAnchorLevel2(title, title);
}
protected void sectionTitleLevel3(Markup markup, String title, String anchor){
protected void sectionTitleLevel3(Markup markup, String title, String anchor) {
documentBuilder.append(newLine);
if (anchor != null)
anchor(anchor).newLine();
@@ -110,7 +110,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return sectionTitleWithAnchorLevel3(title, title);
}
protected void sectionTitleLevel4(Markup markup, String title, String anchor){
protected void sectionTitleLevel4(Markup markup, String title, String anchor) {
documentBuilder.append(newLine);
if (anchor != null)
anchor(anchor).newLine();
@@ -123,61 +123,68 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
}
@Override
public MarkupDocBuilder textLine(String text, boolean forceLineBreak){
public MarkupDocBuilder textLine(String text, boolean forceLineBreak) {
text(text);
newLine(forceLineBreak);
return this;
}
@Override
public MarkupDocBuilder textLine(String text){
public MarkupDocBuilder textLine(String text) {
textLine(text, LINE_BREAK_DEFAULT);
return this;
}
@Override
public MarkupDocBuilder text(String text){
public MarkupDocBuilder text(String text) {
documentBuilder.append(text);
return this;
}
protected void paragraph(Markup markup, String text){
protected void paragraph(Markup markup, String text) {
documentBuilder.append(markup).append(newLine).append(text).append(newLine).append(newLine);
}
protected void listing(Markup markup, String text){
delimitedBlockText(markup, text);
@Override
public MarkupDocBuilder block(String text, MarkupBlockStyle style) {
return block(text, style, null, null);
}
protected void delimitedBlockText(Markup markup, String text){
documentBuilder.append(markup).append(newLine).append(text).append(newLine).append(markup).append(newLine).append(newLine);
@Override
public MarkupDocBuilder listing(String text) {
return listing(text, null);
}
protected void delimitedTextWithoutLineBreaks(Markup markup, String text){
protected void delimitedBlockText(Markup markup, String text) {
if (markup != null)
documentBuilder.append(markup).append(newLine);
documentBuilder.append(text).append(newLine);
if (markup != null)
documentBuilder.append(markup).append(newLine);
documentBuilder.append(newLine);
}
protected void delimitedTextWithoutLineBreaks(Markup markup, String text) {
documentBuilder.append(markup).append(text).append(markup);
}
protected void preserveLineBreaks(Markup markup){
documentBuilder.append(markup).append(newLine);
}
protected void boldText(Markup markup, String text){
protected void boldText(Markup markup, String text) {
delimitedTextWithoutLineBreaks(markup, text);
}
@Override
public MarkupDocBuilder boldTextLine(String text, boolean forceLineBreak){
public MarkupDocBuilder boldTextLine(String text, boolean forceLineBreak) {
boldText(text);
newLine(forceLineBreak);
return this;
}
@Override
public MarkupDocBuilder boldTextLine(String text){
public MarkupDocBuilder boldTextLine(String text) {
return boldTextLine(text, LINE_BREAK_DEFAULT);
}
protected void italicText(Markup markup, String text){
protected void italicText(Markup markup, String text) {
delimitedTextWithoutLineBreaks(markup, text);
}
@@ -193,9 +200,9 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return italicTextLine(text, LINE_BREAK_DEFAULT);
}
protected void unorderedList(Markup markup, List<String> list){
protected void unorderedList(Markup markup, List<String> list) {
documentBuilder.append(newLine);
for(String listEntry : list){
for (String listEntry : list) {
unorderedListItem(markup, listEntry);
}
documentBuilder.append(newLine);
@@ -258,14 +265,14 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
return crossReference(null, anchor, null);
}
protected void newLine(Markup markup, boolean forceLineBreak){
protected void newLine(Markup markup, boolean forceLineBreak) {
if (forceLineBreak)
documentBuilder.append(markup);
documentBuilder.append(newLine);
}
@Override
public MarkupDocBuilder newLine(){
public MarkupDocBuilder newLine() {
newLine(LINE_BREAK_DEFAULT);
return this;
}
@@ -316,7 +323,7 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
}
@Override
public String toString(){
public String toString() {
return documentBuilder.toString();
}
@@ -336,14 +343,13 @@ public abstract class AbstractMarkupDocBuilder implements MarkupDocBuilder {
public void writeToFileWithoutExtension(Path file, Charset charset) throws IOException {
Files.createDirectories(file.getParent());
try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
writer.write(documentBuilder.toString());
writer.write(toString());
writer.write(newLine);
writer.write(newLine);
}
if (logger.isInfoEnabled()) {
logger.info("{} was written to: {}", file);
}
documentBuilder = new StringBuilder();
}
@Override

View File

@@ -0,0 +1,9 @@
package io.github.robwin.markup.builder;
public enum MarkupAdmonition {
NOTE,
TIP,
IMPORTANT,
CAUTION,
WARNING
}

View File

@@ -0,0 +1,9 @@
package io.github.robwin.markup.builder;
public enum MarkupBlockStyle {
SIDEBAR,
EXAMPLE,
LITERAL,
LISTING,
PASSTHROUGH
}

View File

@@ -181,8 +181,30 @@ public interface MarkupDocBuilder {
MarkupDocBuilder paragraph(String text);
/**
* Builds a literal text block.<br/>
* Line breaks are respected.
* Builds a block of {@code text} with specified {@code style}.
*
* @param text text
* @param style block style
* @param title an optional title for the block. No title if null.
* @param admonition an optional admonition for the block. No admonition if null.
* @return this builder
*/
MarkupDocBuilder block(String text, MarkupBlockStyle style, String title, MarkupAdmonition admonition);
/**
* Builds a block of {@code text} with specified {@code style}.<br/>
* This is an alias for {@link #block(String, MarkupBlockStyle, String, MarkupAdmonition) block(String, MarkupBlockStyle, null, null)}.
*
* @param text text
* @param style block style
* @return this builder
*/
MarkupDocBuilder block(String text, MarkupBlockStyle style);
/**
* Builds a listing text block.<br/>
* This is an alias for {@link #listing(String, String) listing(String, null)}.
* This is an alias for {@link #block(String, MarkupBlockStyle, String, MarkupAdmonition) block(String, MarkupBlockStyle.LISTING, null, null)}.
*
* @param text multi-line text
* @return this builder
@@ -194,10 +216,10 @@ public interface MarkupDocBuilder {
* Line breaks are respected.
*
* @param text multi-line text
* @param language source code language
* @param language source code language. Simple listing if {@code language} == null.
* @return this builder
*/
MarkupDocBuilder source(String text, String language);
MarkupDocBuilder listing(String text, String language);
/**
* Builds a bold text line.<br/>
@@ -453,7 +475,7 @@ public interface MarkupDocBuilder {
Path addFileExtension(Path file);
/**
* Writes the content of the builder to a file and clears the builder.<br/>
* Writes the content of the builder to a file.<br/>
* An extension will be dynamically added to fileName depending on the markup language.<br/>
* Use {@link #writeToFile(Path, Charset)} instead.
*
@@ -466,7 +488,7 @@ public interface MarkupDocBuilder {
void writeToFile(String directory, String fileName, Charset charset) throws IOException;
/**
* Writes the content of the builder to a file and clears the builder.<br/>
* Writes the content of the builder to a file.<br/>
* Use {@link #writeToFileWithoutExtension(Path, Charset)} instead.
*
* @param directory the directory where the generated file should be stored
@@ -478,7 +500,7 @@ public interface MarkupDocBuilder {
void writeToFileWithoutExtension(String directory, String fileName, Charset charset) throws IOException;
/**
* Writes the content of the builder to a file and clears the builder.<br/>
* Writes the content of the builder to a file.<br/>
* An extension will be dynamically added to fileName depending on the markup language.
*
* @param file the generated file without extension
@@ -488,7 +510,7 @@ public interface MarkupDocBuilder {
void writeToFile(Path file, Charset charset) throws IOException;
/**
* Writes the content of the builder to a file and clears the builder.
* Writes the content of the builder to a file.
*
* @param file the generated file
* @param charset the the charset to use for encoding

View File

@@ -20,18 +20,13 @@ 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 io.github.robwin.markup.builder.MarkupLanguage;
import io.github.robwin.markup.builder.MarkupTableColumn;
import io.github.robwin.markup.builder.*;
import org.apache.commons.collections.CollectionUtils;
import java.io.File;
import java.io.IOException;
import java.io.Reader;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.*;
import static org.apache.commons.lang3.StringUtils.*;
@@ -40,19 +35,27 @@ import static org.apache.commons.lang3.StringUtils.*;
*/
public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
private static final Map<MarkupBlockStyle, String> BLOCK_STYLE = new HashMap<MarkupBlockStyle, String>() {{
put(MarkupBlockStyle.EXAMPLE, "====");
put(MarkupBlockStyle.LISTING, "----");
put(MarkupBlockStyle.LITERAL, "....");
put(MarkupBlockStyle.PASSTHROUGH, "++++");
put(MarkupBlockStyle.SIDEBAR, "****");
}};
@Override
public MarkupDocBuilder copy() {
return new AsciiDocBuilder().withAnchorPrefix(anchorPrefix);
}
@Override
public MarkupDocBuilder documentTitle(String title){
public MarkupDocBuilder documentTitle(String title) {
documentTitle(AsciiDoc.DOCUMENT_TITLE, title);
return this;
}
@Override
public MarkupDocBuilder sectionTitleLevel1(String title){
public MarkupDocBuilder sectionTitleLevel1(String title) {
sectionTitleLevel1(AsciiDoc.SECTION_TITLE_LEVEL1, title, null);
return this;
}
@@ -64,7 +67,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder sectionTitleLevel2(String title){
public MarkupDocBuilder sectionTitleLevel2(String title) {
sectionTitleLevel2(AsciiDoc.SECTION_TITLE_LEVEL2, title, null);
return this;
}
@@ -76,7 +79,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder sectionTitleLevel3(String title){
public MarkupDocBuilder sectionTitleLevel3(String title) {
sectionTitleLevel3(AsciiDoc.SECTION_TITLE_LEVEL3, title, null);
return this;
}
@@ -88,7 +91,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder sectionTitleLevel4(String title){
public MarkupDocBuilder sectionTitleLevel4(String title) {
sectionTitleLevel4(AsciiDoc.SECTION_TITLE_LEVEL4, title, null);
return this;
}
@@ -100,19 +103,29 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder paragraph(String text){
public MarkupDocBuilder paragraph(String text) {
paragraph(AsciiDoc.HARDBREAKS, text);
return this;
}
@Override
public MarkupDocBuilder listing(String text){
listing(AsciiDoc.LISTING, text);
public MarkupDocBuilder block(String text, final MarkupBlockStyle style, String title, MarkupAdmonition admonition) {
if (admonition != null)
documentBuilder.append("[").append(admonition).append("]").append(newLine);
if (title != null)
documentBuilder.append(".").append(title).append(newLine);
delimitedBlockText(new Markup() {
public String toString() {
assert (BLOCK_STYLE.containsKey(style));
return BLOCK_STYLE.get(style);
}
}, text);
return this;
}
@Override
public MarkupDocBuilder boldText(String text){
public MarkupDocBuilder boldText(String text) {
boldText(AsciiDoc.BOLD, text);
return this;
}
@@ -124,7 +137,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder unorderedList(List<String> list){
public MarkupDocBuilder unorderedList(List<String> list) {
unorderedList(AsciiDoc.LIST_ENTRY, list);
return this;
}
@@ -136,18 +149,19 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
}
@Override
public MarkupDocBuilder source(String text, String language){
documentBuilder.append(String.format("[source,%s]", language)).append(newLine);
listing(AsciiDoc.LISTING, text);
public MarkupDocBuilder listing(String text, String language) {
if (language != null)
documentBuilder.append(String.format("[source,%s]", language)).append(newLine);
block(text, MarkupBlockStyle.LISTING);
return this;
}
@Override
public MarkupDocBuilder tableWithHeaderRow(List<String> rowsInPSV){
public MarkupDocBuilder tableWithHeaderRow(List<String> rowsInPSV) {
newLine();
documentBuilder.append("[options=\"header\"]").append(newLine);
documentBuilder.append(AsciiDoc.TABLE).append(newLine);
for(String row : rowsInPSV){
for (String row : rowsInPSV) {
documentBuilder.append(AsciiDoc.TABLE_COLUMN_DELIMITER).append(row).append(newLine);
}
documentBuilder.append(AsciiDoc.TABLE).append(newLine).append(newLine);
@@ -218,8 +232,7 @@ public class AsciiDocBuilder extends AbstractMarkupDocBuilder {
String languageStyle = col.markupSpecifiers.get(MarkupLanguage.ASCIIDOC);
if (languageStyle != null && isNoneBlank(languageStyle)) {
cols.add(languageStyle);
}
else {
} else {
cols.add(String.valueOf(col.widthRatio));
}
}

View File

@@ -20,18 +20,13 @@ 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 io.github.robwin.markup.builder.MarkupTableColumn;
import io.github.robwin.markup.builder.*;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.Validate;
import java.io.IOException;
import java.io.Reader;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.regex.Pattern;
import java.util.*;
import static org.apache.commons.lang3.StringUtils.defaultString;
import static org.apache.commons.lang3.StringUtils.join;
@@ -39,11 +34,15 @@ import static org.apache.commons.lang3.StringUtils.join;
/**
* @author Robert Winkler
*/
public class MarkdownBuilder extends AbstractMarkupDocBuilder
{
private static final int MAX_TITLE_LEVEL = 5;
private static final char TITLE_PREFIX = '#';
private static Pattern TITLE_PATTERN = Pattern.compile(String.format("^%c({1,%d})( .*)$", TITLE_PREFIX, MAX_TITLE_LEVEL));
public class MarkdownBuilder extends AbstractMarkupDocBuilder {
private static final Map<MarkupBlockStyle, String> BLOCK_STYLE = new HashMap<MarkupBlockStyle, String>() {{
put(MarkupBlockStyle.EXAMPLE, null);
put(MarkupBlockStyle.LISTING, Markdown.LISTING.toString());
put(MarkupBlockStyle.LITERAL, Markdown.LISTING.toString());
put(MarkupBlockStyle.PASSTHROUGH, null);
put(MarkupBlockStyle.SIDEBAR, null);
}};
@Override
public MarkupDocBuilder copy() {
@@ -51,13 +50,13 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder documentTitle(String title){
public MarkupDocBuilder documentTitle(String title) {
documentTitle(Markdown.DOCUMENT_TITLE, title);
return this;
}
@Override
public MarkupDocBuilder sectionTitleLevel1(String title){
public MarkupDocBuilder sectionTitleLevel1(String title) {
sectionTitleLevel1(Markdown.SECTION_TITLE_LEVEL1, title, null);
return this;
}
@@ -69,7 +68,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder sectionTitleLevel2(String title){
public MarkupDocBuilder sectionTitleLevel2(String title) {
sectionTitleLevel2(Markdown.SECTION_TITLE_LEVEL2, title, null);
return this;
}
@@ -81,7 +80,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder sectionTitleLevel3(String title){
public MarkupDocBuilder sectionTitleLevel3(String title) {
sectionTitleLevel3(Markdown.SECTION_TITLE_LEVEL3, title, null);
return this;
}
@@ -93,7 +92,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder sectionTitleLevel4(String title){
public MarkupDocBuilder sectionTitleLevel4(String title) {
sectionTitleLevel4(Markdown.SECTION_TITLE_LEVEL4, title, null);
return this;
}
@@ -105,27 +104,42 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder paragraph(String text){
public MarkupDocBuilder paragraph(String text) {
paragraph(Markdown.HARDBREAKS, text);
return this;
}
@Override
public MarkupDocBuilder listing(String text){
listing(Markdown.LISTING, text);
public MarkupDocBuilder block(String text, final MarkupBlockStyle style, String title, MarkupAdmonition admonition) {
if (admonition != null)
documentBuilder.append(StringUtils.capitalize(admonition.name())).append(" : ");
if (title != null) {
if (admonition != null)
documentBuilder.append(" | ");
documentBuilder.append(title).append(" : ");
}
if (admonition != null || title != null)
documentBuilder.append(newLine);
delimitedBlockText(new Markup() {
public String toString() {
String separator = BLOCK_STYLE.get(style);
return separator;
}
}, text);
return this;
}
@Override
public MarkupDocBuilder source(String text, String language){
documentBuilder.append(Markdown.LISTING).append(language).append(newLine).
append(text).append(newLine).
append(Markdown.LISTING).append(newLine).append(newLine);
public MarkupDocBuilder listing(String text, String language) {
if (language != null)
text = language + " :" + newLine + text;
block(text, MarkupBlockStyle.LISTING);
return this;
}
@Override
public MarkupDocBuilder boldText(String text){
public MarkupDocBuilder boldText(String text) {
boldText(Markdown.BOLD, text);
return this;
}
@@ -137,7 +151,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder unorderedList(List<String> list){
public MarkupDocBuilder unorderedList(List<String> list) {
unorderedList(Markdown.LIST_ENTRY, list);
return this;
}
@@ -149,7 +163,7 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
}
@Override
public MarkupDocBuilder tableWithHeaderRow(List<String> rowsInPSV){
public MarkupDocBuilder tableWithHeaderRow(List<String> rowsInPSV) {
String headersInPSV = rowsInPSV.get(0);
List<String> contentRowsInPSV = rowsInPSV.subList(1, rowsInPSV.size());
String[] headersAsArray = headersInPSV.split(String.format("\\%s", Markdown.TABLE_COLUMN_DELIMITER.toString()));
@@ -163,15 +177,15 @@ public class MarkdownBuilder extends AbstractMarkupDocBuilder
newLine();
// Header/Content separator
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER.toString());
for(String header : headers){
for(int i = 1; i<5; i++) {
for (String header : headers) {
for (int i = 1; i < 5; i++) {
documentBuilder.append(Markdown.TABLE_ROW);
}
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER.toString());
}
newLine();
// Content
for(String contentRowInPSV : contentRowsInPSV){
for (String contentRowInPSV : contentRowsInPSV) {
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER.toString());
documentBuilder.append(contentRowInPSV);
documentBuilder.append(Markdown.TABLE_COLUMN_DELIMITER.toString());

View File

@@ -77,7 +77,14 @@ public class MarkupDocBuilderTest {
.sectionTitleWithAnchorLevel4("Section with anchor Level 4a")
.paragraph("Paragraph with long text bla bla bla bla bla")
.listing("Source code listing")
.source("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.ASCIIDOC)", "java")
.listing("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.MARKDOWN)", "java")
.block("Example", MarkupBlockStyle.EXAMPLE)
.block("Example", MarkupBlockStyle.EXAMPLE, "Example", null)
.block("Example", MarkupBlockStyle.EXAMPLE, null, MarkupAdmonition.IMPORTANT)
.block("Listing", MarkupBlockStyle.LISTING, null, MarkupAdmonition.CAUTION)
.block("Literal", MarkupBlockStyle.LITERAL, null, MarkupAdmonition.NOTE)
.block("Sidebar", MarkupBlockStyle.SIDEBAR, null, MarkupAdmonition.TIP)
.block("Passthrough", MarkupBlockStyle.PASSTHROUGH, null, MarkupAdmonition.WARNING)
.tableWithHeaderRow(tableRowsInPSV)
.table(tableCells)
.tableWithColumnSpecs(tableColumns, tableCells)
@@ -128,7 +135,14 @@ public class MarkupDocBuilderTest {
.sectionTitleWithAnchorLevel4("Section with anchor Level 4a")
.paragraph("Paragraph with long text bla bla bla bla bla")
.listing("Source code listing")
.source("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.MARKDOWN)", "java")
.listing("MarkupDocBuilder builder = MarkupDocBuilders.documentBuilder(MarkupLanguage.MARKDOWN)", "java")
.block("Example", MarkupBlockStyle.EXAMPLE)
.block("Example", MarkupBlockStyle.EXAMPLE, "Example", null)
.block("Example", MarkupBlockStyle.EXAMPLE, null, MarkupAdmonition.IMPORTANT)
.block("Listing", MarkupBlockStyle.LISTING, null, MarkupAdmonition.CAUTION)
.block("Literal", MarkupBlockStyle.LITERAL, null, MarkupAdmonition.NOTE)
.block("Sidebar", MarkupBlockStyle.SIDEBAR, null, MarkupAdmonition.TIP)
.block("Passthrough", MarkupBlockStyle.PASSTHROUGH, null, MarkupAdmonition.WARNING)
.tableWithHeaderRow(tableRowsInPSV)
//.table(tableCells)
.tableWithColumnSpecs(tableColumns, tableCells)