// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/list/ListBuilder.java
// public class ListBuilder extends MarkdownBuilder<ListBuilder, UnorderedList> {
// 
//     public ListBuilder() {
//         super();
//     }
// 
//     public ListBuilder(MarkdownBuilder parentBuilder) {
//         super(parentBuilder);
//     }
// 
//     @Override
//     protected ListBuilder getBuilder() {
//         return this;
//     }
// 
//     @Override
//     protected UnorderedList createMarkdownElement() {
//         return new UnorderedList();
//     }
// 
//     @Override
//     public ListBuilder append(Object value) {
//         markdownElement.getItems().add(value);
//         return this;
//     }
// 
//     @Override
//     public ListBuilder append(MarkdownSerializable value) {
//         if (value instanceof ListBuilder) {
//             UnorderedList unorderedList = ((ListBuilder) value).markdownElement;
//             unorderedList.incrementIndentationLevel();
//             markdownElement.getItems().add(unorderedList);
//             return this;
//         }
//         return super.append(value);
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/text/TextBuilder.java
// public class TextBuilder extends MarkdownBuilder<TextBuilder, Text> {
// 
//     public TextBuilder() {
//     }
// 
//     public TextBuilder(MarkdownBuilder parentBuilder) {
//         super(parentBuilder);
//     }
// 
//     @Override
//     protected TextBuilder getBuilder() {
//         return this;
//     }
// 
//     @Override
//     protected Text createMarkdownElement() {
//         return new Text("");
//     }
// 
//     @Override
//     public TextBuilder append(Object value) {
//         StringBuilder sb = new StringBuilder();
//         if (markdownElement.getValue() != null) {
//             sb.append(markdownElement.getValue());
//         }
//         sb.append(value);
//         markdownElement.setValue(sb);
//         return this;
//     }
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/text/code/CodeBlock.java
// public class CodeBlock extends Text {
// 
//     public static final String LANGUAGE_UNKNOWN = "";
//     public static final String LANGUAGE_JAVA = "java";
//     public static final String LANGUAGE_MARKDOWN = "markdown";
// 
//     private String language = LANGUAGE_UNKNOWN;
// 
//     public CodeBlock(Object value) {
//         this(value, "");
//     }
// 
//     public CodeBlock(Object value, String language) {
//         super(value);
//         this.language = language;
//     }
// 
//     @Override
//     public String getPredecessor() {
//         return "```" + language + System.lineSeparator();
//     }
// 
//     @Override
//     public String getSuccessor() {
//         return System.lineSeparator() + "```";
//     }
// 
//     public String getLanguage() {
//         return language;
//     }
// 
//     public void setLanguage(String language) {
//         this.language = language;
//         invalidateSerialized();
//     }
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static BoldText bold(String value) {
//     return new BoldText(value);
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static ItalicText italic(String value) {
//     return new ItalicText(value);
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static TaskListItem task(String value) {
//     return new TaskListItem(value);
// }


import net.steppschuh.markdowngenerator.list.ListBuilder;
import net.steppschuh.markdowngenerator.text.TextBuilder;
import net.steppschuh.markdowngenerator.text.code.CodeBlock;
import org.junit.Test;
import static net.steppschuh.markdowngenerator.Markdown.bold;
import static net.steppschuh.markdowngenerator.Markdown.italic;
import static net.steppschuh.markdowngenerator.Markdown.task;
                        .bold("Item 2.2.2")
                        .text("Item 2.2.3")
                    .end()
                    .text("Item 2.3")
                .end()
                .text("Item 3");

        System.out.println(builder.toString());
    }

    @Test
    public void example3() throws Exception {
        MarkdownBuilder builder = new TextBuilder()
                .heading("Markdown Builder")
                .text("Demonstrating: ").bold("Bold Text")
                .newParagraph()
                .quote("I should be a quote\nI should still be a quote")
                .beginQuote()
                        .text("I should be a quote").newLine()
                        .text("I should still be a quote")
                .end()
                .newParagraph()
                .code("INLINE_CODE")
                .beginCodeBlock(CodeBlock.LANGUAGE_JAVA)
                        .text("// some comment").newLine()
                        .text("dummyMethod(this);")
                .end()
                .subHeading("Lists")
                .unorderedList(
                        "I should be an item",
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/list/ListBuilder.java
// public class ListBuilder extends MarkdownBuilder<ListBuilder, UnorderedList> {
// 
//     public ListBuilder() {
//         super();
//     }
// 
//     public ListBuilder(MarkdownBuilder parentBuilder) {
//         super(parentBuilder);
//     }
// 
//     @Override
//     protected ListBuilder getBuilder() {
//         return this;
//     }
// 
//     @Override
//     protected UnorderedList createMarkdownElement() {
//         return new UnorderedList();
//     }
// 
//     @Override
//     public ListBuilder append(Object value) {
//         markdownElement.getItems().add(value);
//         return this;
//     }
// 
//     @Override
//     public ListBuilder append(MarkdownSerializable value) {
//         if (value instanceof ListBuilder) {
//             UnorderedList unorderedList = ((ListBuilder) value).markdownElement;
//             unorderedList.incrementIndentationLevel();
//             markdownElement.getItems().add(unorderedList);
//             return this;
//         }
//         return super.append(value);
//     }
// 
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/text/TextBuilder.java
// public class TextBuilder extends MarkdownBuilder<TextBuilder, Text> {
// 
//     public TextBuilder() {
//     }
// 
//     public TextBuilder(MarkdownBuilder parentBuilder) {
//         super(parentBuilder);
//     }
// 
//     @Override
//     protected TextBuilder getBuilder() {
//         return this;
//     }
// 
//     @Override
//     protected Text createMarkdownElement() {
//         return new Text("");
//     }
// 
//     @Override
//     public TextBuilder append(Object value) {
//         StringBuilder sb = new StringBuilder();
//         if (markdownElement.getValue() != null) {
//             sb.append(markdownElement.getValue());
//         }
//         sb.append(value);
//         markdownElement.setValue(sb);
//         return this;
//     }
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/text/code/CodeBlock.java
// public class CodeBlock extends Text {
// 
//     public static final String LANGUAGE_UNKNOWN = "";
//     public static final String LANGUAGE_JAVA = "java";
//     public static final String LANGUAGE_MARKDOWN = "markdown";
// 
//     private String language = LANGUAGE_UNKNOWN;
// 
//     public CodeBlock(Object value) {
//         this(value, "");
//     }
// 
//     public CodeBlock(Object value, String language) {
//         super(value);
//         this.language = language;
//     }
// 
//     @Override
//     public String getPredecessor() {
//         return "```" + language + System.lineSeparator();
//     }
// 
//     @Override
//     public String getSuccessor() {
//         return System.lineSeparator() + "```";
//     }
// 
//     public String getLanguage() {
//         return language;
//     }
// 
//     public void setLanguage(String language) {
//         this.language = language;
//         invalidateSerialized();
//     }
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static BoldText bold(String value) {
//     return new BoldText(value);
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static ItalicText italic(String value) {
//     return new ItalicText(value);
// }
// 
// Path: Source/MarkdownGenerator/src/main/java/net/steppschuh/markdowngenerator/Markdown.java
// public static TaskListItem task(String value) {
//     return new TaskListItem(value);
// }


// Path: Source/MarkdownGenerator/src/test/java/net/steppschuh/markdowngenerator/MarkdownBuilderTest.java
import net.steppschuh.markdowngenerator.list.ListBuilder;
import net.steppschuh.markdowngenerator.text.TextBuilder;
import net.steppschuh.markdowngenerator.text.code.CodeBlock;
import org.junit.Test;
import static net.steppschuh.markdowngenerator.Markdown.bold;
import static net.steppschuh.markdowngenerator.Markdown.italic;
import static net.steppschuh.markdowngenerator.Markdown.task;

                        .bold("Item 2.2.2")
                        .text("Item 2.2.3")
                    .end()
                    .text("Item 2.3")
                .end()
                .text("Item 3");

        System.out.println(builder.toString());
    }

    @Test
    public void example3() throws Exception {
        MarkdownBuilder builder = new TextBuilder()
                .heading("Markdown Builder")
                .text("Demonstrating: ").bold("Bold Text")
                .newParagraph()
                .quote("I should be a quote\nI should still be a quote")
                .beginQuote()
                        .text("I should be a quote").newLine()
                        .text("I should still be a quote")
                .end()
                .newParagraph()
                .code("INLINE_CODE")
                .beginCodeBlock(CodeBlock.LANGUAGE_JAVA)
                        .text("// some comment").newLine()
                        .text("dummyMethod(this);")
                .end()
                .subHeading("Lists")
                .unorderedList(
                        "I should be an item",
                        italic("I should be an italic item")