diff --git a/.idea/markdown-exported-files.xml b/.idea/markdown-exported-files.xml
index a404d7591..9319bc56a 100644
--- a/.idea/markdown-exported-files.xml
+++ b/.idea/markdown-exported-files.xml
@@ -2,52 +2,53 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
+
diff --git a/.idea/markdown-navigator/COPY_HTML_MIME.xml b/.idea/markdown-navigator/COPY_HTML_MIME.xml
index bc8aaad07..b53f944f9 100644
--- a/.idea/markdown-navigator/COPY_HTML_MIME.xml
+++ b/.idea/markdown-navigator/COPY_HTML_MIME.xml
@@ -1,6 +1,6 @@
-
+
@@ -55,10 +55,12 @@
+
+
-
+
@@ -78,6 +80,7 @@
code { background-color:#f0f0f0;border-radius:2px;padding:1px 2px 0 2px;border:1px solid #e0e0e0;font-family:Consolas,Inconsolata,Courier,monospace;font-size:0.9em;color:#bb002f; }
+
diff --git a/.idea/markdown-navigator/GitHub_Templates.xml b/.idea/markdown-navigator/GitHub_Templates.xml
index fb3a1e3d2..a54e43ed1 100644
--- a/.idea/markdown-navigator/GitHub_Templates.xml
+++ b/.idea/markdown-navigator/GitHub_Templates.xml
@@ -1,6 +1,6 @@
-
+
@@ -55,10 +55,12 @@
+
+
-
+
@@ -105,6 +107,7 @@ code {
}
+
diff --git a/.idea/markdown-navigator/OVERVIEW.xml b/.idea/markdown-navigator/OVERVIEW.xml
index 314b9b6a5..f037b2d46 100644
--- a/.idea/markdown-navigator/OVERVIEW.xml
+++ b/.idea/markdown-navigator/OVERVIEW.xml
@@ -1,6 +1,6 @@
-
+
@@ -55,10 +55,12 @@
+
+
-
+
@@ -103,6 +105,7 @@ code {
}
+
diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml
index 33a1ecc7e..5f9d0cd4e 100644
--- a/.idea/markdown-navigator/profiles_settings.xml
+++ b/.idea/markdown-navigator/profiles_settings.xml
@@ -1,5 +1,5 @@
-
+
diff --git a/README.md b/README.md
index 2ab81aa91..e73139ab9 100644
--- a/README.md
+++ b/README.md
@@ -43,7 +43,7 @@ following sample:
com.vladsch.flexmark
flexmark-all
- 0.35.6
+ 0.35.8
```
@@ -86,7 +86,7 @@ public class BasicSample {
#### Building via Gradle
```shell
-compile 'com.vladsch.flexmark:flexmark-all:0.35.6'
+compile 'com.vladsch.flexmark:flexmark-all:0.35.8'
```
#### Building with Android Studio
diff --git a/VERSION.md b/VERSION.md
index 67c44e780..c88e941c2 100644
--- a/VERSION.md
+++ b/VERSION.md
@@ -7,6 +7,8 @@ flexmark-java
- [To Do](#to-do)
- [Docx Converter](#docx-converter)
+- [0.35.10](#03510)
+- [0.35.8](#0358)
- [0.35.6](#0356)
- [0.35.4](#0354)
- [0.35.2](#0352)
@@ -265,6 +267,16 @@ flexmark-java
+0.35.10
+-------
+
+* Add: compound enum refs and enum refs in headings without element reference.
+
+0.35.8
+------
+
+* Fix: add missing test-scope to flexmark-test-util dependencies
+
0.35.6
------
diff --git a/flexmark-all/pom.xml b/flexmark-all/pom.xml
index 10aca0c9f..dbc35528f 100644
--- a/flexmark-all/pom.xml
+++ b/flexmark-all/pom.xml
@@ -7,7 +7,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-all
@@ -21,192 +21,192 @@
com.vladsch.flexmark
flexmark
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-abbreviation
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-admonition
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-anchorlink
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-aside
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-attributes
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-autolink
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-definition
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-emoji
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-enumerated-reference
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-escaped-character
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-footnotes
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gfm-issues
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gfm-strikethrough
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gfm-tables
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gfm-tasklist
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gfm-users
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-gitlab
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-jekyll-front-matter
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-jekyll-tag
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-media-tags
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-macros
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-ins
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-xwiki-macros
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-superscript
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-tables
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-toc
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-typographic
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-wikilink
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-yaml-front-matter
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-ext-youtube-embedded
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-formatter
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-html-parser
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-jira-converter
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-pdf-converter
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-profile-pegdown
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-util
- 0.35.6
+ 0.35.10
com.vladsch.flexmark
flexmark-youtrack-converter
- 0.35.6
+ 0.35.10
diff --git a/flexmark-docx-converter/pom.xml b/flexmark-docx-converter/pom.xml
index 0c7426013..c63c42a67 100644
--- a/flexmark-docx-converter/pom.xml
+++ b/flexmark-docx-converter/pom.xml
@@ -5,7 +5,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-docx-converter
diff --git a/flexmark-docx-converter/src/main/java/com/vladsch/flexmark/docx/converter/internal/CoreNodeDocxRenderer.java b/flexmark-docx-converter/src/main/java/com/vladsch/flexmark/docx/converter/internal/CoreNodeDocxRenderer.java
index 93ed6ef0c..d0005dfbb 100644
--- a/flexmark-docx-converter/src/main/java/com/vladsch/flexmark/docx/converter/internal/CoreNodeDocxRenderer.java
+++ b/flexmark-docx-converter/src/main/java/com/vladsch/flexmark/docx/converter/internal/CoreNodeDocxRenderer.java
@@ -15,10 +15,7 @@
import com.vladsch.flexmark.ext.emoji.EmojiExtension;
import com.vladsch.flexmark.ext.emoji.internal.EmojiOptions;
import com.vladsch.flexmark.ext.emoji.internal.EmojiResolvedShortcut;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceBlock;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceLink;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceText;
+import com.vladsch.flexmark.ext.enumerated.reference.*;
import com.vladsch.flexmark.ext.enumerated.reference.internal.EnumRefTextCollectingVisitor;
import com.vladsch.flexmark.ext.enumerated.reference.internal.EnumeratedReferenceRepository;
import com.vladsch.flexmark.ext.enumerated.reference.internal.EnumeratedReferences;
@@ -36,9 +33,7 @@
import com.vladsch.flexmark.ext.toc.SimTocBlock;
import com.vladsch.flexmark.ext.toc.TocBlock;
import com.vladsch.flexmark.ext.toc.TocBlockBase;
-import com.vladsch.flexmark.html.renderer.AttributablePart;
-import com.vladsch.flexmark.html.renderer.LinkType;
-import com.vladsch.flexmark.html.renderer.ResolvedLink;
+import com.vladsch.flexmark.html.renderer.*;
import com.vladsch.flexmark.parser.ListOptions;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.superscript.Superscript;
@@ -110,6 +105,7 @@ public class CoreNodeDocxRenderer implements PhasedNodeDocxRenderer {
private long[] bulletLists = new long[128];
private EnumeratedReferences enumeratedOrdinals;
int ordinal;
+ private final HtmlIdGenerator headerIdGenerator; // used for enumerated text reference
private void ensureNumberedListLength(int level) {
if (numberedLists.length < level) {
@@ -147,6 +143,7 @@ public CoreNodeDocxRenderer(DataHolder options) {
final MutableScopedDataSet options1 = new MutableScopedDataSet(options);
options1.set(EmojiExtension.ROOT_IMAGE_PATH, DocxRenderer.DOC_EMOJI_ROOT_IMAGE_PATH.getFrom(options));
emojiOptions = new EmojiOptions(options1);
+ headerIdGenerator = new HeaderIdGenerator.Factory().create();
}
@Override
@@ -161,6 +158,7 @@ public void renderDocument(final DocxRendererContext docx, final Document docume
case COLLECT:
// get resolved styles
options = docx.getDocxRendererOptions();
+ headerIdGenerator.generateIds(document);
break;
case DOCUMENT_TOP:
@@ -1699,39 +1697,57 @@ private void render(SimTocBlock node, final DocxRendererContext docx) {
}
private void render(EnumeratedReferenceText node, final DocxRendererContext docx) {
- final String text = node.getText().toString();
+ String text = node.getText().toString();
if (text.isEmpty()) {
// placeholder for ordinal
docx.text(String.valueOf(ordinal));
} else {
- Node referenceFormat = enumeratedOrdinals.getFormatNode(text);
+ String type = EnumeratedReferenceRepository.getType(text.toString());
+ if (type.isEmpty() || text.equals(type + ":")) {
+ Node parent = node.getAncestorOfType(Heading.class);
- int wasOrdinal = ordinal;
- ordinal = enumeratedOrdinals.getOrdinal(text);
- if (referenceFormat != null) {
- docx.renderChildren(referenceFormat);
- } else {
- // no format, just output ordinal
- docx.text(String.valueOf(ordinal));
+ if (parent instanceof Heading) {
+ text = (type.isEmpty() ? text : type) + ":" + headerIdGenerator.getId(parent);
+ }
}
- ordinal = wasOrdinal;
+
+ enumeratedOrdinals.renderReferenceOrdinals(text, null, new EnumeratedOrdinalRenderer() {
+ @Override
+ public void startRendering(final EnumeratedReferenceRendering[] renderings) {
+
+ }
+
+ @Override
+ public void render(final int referenceOrdinal, final EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator) {
+ if (needSeparator) docx.text(".");
+
+ if (referenceFormat != null) {
+ CoreNodeDocxRenderer.this.ordinal = referenceOrdinal;
+ docx.renderChildren(referenceFormat);
+ } else {
+ docx.text(defaultText.toString());
+ }
+ }
+
+ @Override
+ public void endRendering() {
+
+ }
+ });
}
}
- private void render(EnumeratedReferenceLink node, final DocxRendererContext docx) {
+ private void render(final EnumeratedReferenceLink node, final DocxRendererContext docx) {
final String text = node.getText().toString();
if (text.isEmpty()) {
// placeholder for ordinal
docx.text(String.valueOf(ordinal));
} else {
- final Node referenceFormat = enumeratedOrdinals.getFormatNode(text);
- int wasOrdinal = ordinal;
- ordinal = enumeratedOrdinals.getOrdinal(text);
+ final EnumeratedReferenceRendering[] renderings = enumeratedOrdinals.getEnumeratedReferenceOrdinals(text);
- final String defaultText = String.format("%s %d", EnumeratedReferenceRepository.getType(text), ordinal);
- String title = referenceFormat != null ? new EnumRefTextCollectingVisitor(ordinal).collectAndGetText(referenceFormat) : defaultText;
+ String title = new EnumRefTextCollectingVisitor().collectAndGetText(node.getChars().getBaseSequence(), renderings, null);
Attributes attributes = new Attributes();
if (title != null) {
@@ -1739,8 +1755,35 @@ private void render(EnumeratedReferenceLink node, final DocxRendererContext docx
}
attributes = docx.extendRenderingNodeAttributes(AttributablePart.NODE, attributes);
- renderURL(node.getText(), docx, "#" + text, attributes, new EnumeratedReferenceRenderer(docx, referenceFormat, defaultText));
- ordinal = wasOrdinal;
+ renderURL(node.getText(), docx, "#" + text, attributes, new Runnable() {
+ @Override
+ public void run() {
+ EnumeratedReferences.renderReferenceOrdinals(renderings, null, new EnumeratedOrdinalRenderer() {
+ @Override
+ public void startRendering(final EnumeratedReferenceRendering[] renderings) {
+
+ }
+
+ @Override
+ public void render(final int referenceOrdinal, final EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator) {
+ if (needSeparator) docx.text(".");
+
+ if (referenceFormat != null) {
+ CoreNodeDocxRenderer.this.ordinal = referenceOrdinal;
+ docx.renderChildren(referenceFormat);
+ } else {
+ // no format, just output ordinal
+ docx.text(defaultText);
+ }
+ }
+
+ @Override
+ public void endRendering() {
+
+ }
+ });
+ }
+ });
}
}
@@ -1875,28 +1918,6 @@ public void addContentElement(final Object element) {
}
}
- private static class EnumeratedReferenceRenderer implements Runnable {
- private final DocxRendererContext myDocx;
- private final Node myReferenceFormat;
- private final String myDefaultText;
-
- public EnumeratedReferenceRenderer(final DocxRendererContext docx, final Node referenceFormat, final String defaultText) {
- myDocx = docx;
- myReferenceFormat = referenceFormat;
- myDefaultText = defaultText;
- }
-
- @Override
- public void run() {
- if (myReferenceFormat != null) {
- myDocx.renderChildren(myReferenceFormat);
- } else {
- // no format, just output ordinal
- myDocx.text(myDefaultText);
- }
- }
- }
-
private static class TableCaptionRenderer implements Runnable {
private final DocxRendererContext myDocx;
private final TableCaption myNode;
diff --git a/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDeDocxConverterSpec2Test.java b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDeDocxConverterSpec2Test.java
new file mode 100644
index 000000000..3119335ef
--- /dev/null
+++ b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDeDocxConverterSpec2Test.java
@@ -0,0 +1,333 @@
+package com.vladsch.flexmark.docx.converter;
+
+import com.vladsch.flexmark.IRender;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.docx.converter.internal.DocxRenderer;
+import com.vladsch.flexmark.docx.converter.util.DocxContextImpl;
+import com.vladsch.flexmark.docx.converter.util.RunFormatProvider;
+import com.vladsch.flexmark.docx.converter.util.XmlDocxSorter;
+import com.vladsch.flexmark.ext.aside.AsideExtension;
+import com.vladsch.flexmark.ext.attributes.AttributesExtension;
+import com.vladsch.flexmark.ext.definition.DefinitionExtension;
+import com.vladsch.flexmark.ext.emoji.EmojiExtension;
+import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
+import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
+import com.vladsch.flexmark.ext.gitlab.GitLabExtension;
+import com.vladsch.flexmark.ext.ins.InsExtension;
+import com.vladsch.flexmark.ext.macros.MacrosExtension;
+import com.vladsch.flexmark.ext.tables.TablesExtension;
+import com.vladsch.flexmark.ext.toc.SimTocExtension;
+import com.vladsch.flexmark.ext.toc.TocExtension;
+import com.vladsch.flexmark.ext.wikilink.WikiLinkExtension;
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.html.renderer.AttributablePart;
+import com.vladsch.flexmark.parser.Parser;
+import com.vladsch.flexmark.spec.SpecExample;
+import com.vladsch.flexmark.spec.SpecReader;
+import com.vladsch.flexmark.superscript.SuperscriptExtension;
+import com.vladsch.flexmark.test.ComboSpecTestCase;
+import com.vladsch.flexmark.util.html.Attributes;
+import com.vladsch.flexmark.util.options.DataHolder;
+import com.vladsch.flexmark.util.options.MutableDataSet;
+import org.apache.log4j.Logger;
+import org.apache.log4j.varia.NullAppender;
+import org.docx4j.Docx4J;
+import org.docx4j.openpackaging.exceptions.Docx4JException;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.docx4j.wml.Text;
+import org.junit.runners.Parameterized;
+
+import java.io.*;
+import java.util.*;
+
+public class ComboDeDocxConverterSpec2Test extends ComboSpecTestCase {
+ // set to false to dump DOCX and XML files to pre-determined location
+ // RELEASE : change to true for release
+ static final boolean SKIP_IGNORED_TESTS = ComboDocxConverterSpecTest.SKIP_IGNORED_TESTS;
+ private static final boolean DUMP_TEST_CASE_FILES = !SKIP_IGNORED_TESTS;
+ private static final boolean DUMP_ALL_TESTS_FILES = !SKIP_IGNORED_TESTS;
+ private static final String PROJECT_ROOT_DIRECTORY = ComboDocxConverterSpecTest.PROJECT_ROOT_DIRECTORY;
+ private static final String FILE_TEST_CASE_DUMP_LOCATION = "/flexmark-docx-converter/src/test/resources/docx_converter_de_ast_spec/";
+ private static final String FILE_ALL_TESTS_DUMP_NAME = FILE_TEST_CASE_DUMP_LOCATION + "AllTests2";
+
+ private static final String SPEC_RESOURCE = "/docx_converter_ast_spec2.md";
+ private static final DataHolder OPTIONS = new MutableDataSet()
+ .set(HtmlRenderer.INDENT_SIZE, 2)
+ .set(Parser.EXTENSIONS, Arrays.asList(
+ AsideExtension.create(),
+ AttributesExtension.create(),
+ DefinitionExtension.create(),
+ EmojiExtension.create(),
+ EnumeratedReferenceExtension.create(),
+ FootnoteExtension.create(),
+ GitLabExtension.create(),
+ InsExtension.create(),
+ MacrosExtension.create(),
+ StrikethroughSubscriptExtension.create(),
+ SuperscriptExtension.create(),
+ TablesExtension.create(),
+ TocExtension.create(),
+ SimTocExtension.create(),
+ WikiLinkExtension.create()
+ ))
+ .set(DocxRenderer.RENDER_BODY_ONLY, true)
+ .set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.DOC_ROOT_URL, String.format("file://%s/assets", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.SUPPRESS_HTML, true)
+ //.set(HtmlRenderer.PERCENT_ENCODE_URLS, true)
+ ;
+
+ private static final Map optionsMap = new HashMap();
+ //private static WordprocessingMLPackage ourPackage = new WordprocessingMLPackage();;
+
+ private static final Parser PARSER = Parser.builder(OPTIONS).build();
+ // The spec says URL-escaping is optional, but the examples assume that it's enabled.
+ private static final DocxRenderer RENDERER = DocxRenderer.builder(OPTIONS).build();
+ private static final String TEMPLATE_XML = "/DE-Template.xml";
+
+ static {
+ //optionsMap.put("src-pos", new MutableDataSet().set(HtmlRenderer.SOURCE_POSITION_ATTRIBUTE, "md-pos"));
+ //optionsMap.put("option1", new MutableDataSet().set(DocxConverterExtension.DOCX_CONVERTER_OPTION1, true));
+ optionsMap.put("IGNORED", new MutableDataSet().set(IGNORE, SKIP_IGNORED_TESTS));
+ optionsMap.put("url", new MutableDataSet().set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY)));
+ optionsMap.put("caption-before", new MutableDataSet().set(DocxRenderer.TABLE_CAPTION_BEFORE_TABLE, true));
+ optionsMap.put("highlight-code", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "yellow"));
+ optionsMap.put("highlight-shade", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "shade"));
+ optionsMap.put("hyperlink-suffix", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_SUFFIX, "_1"));
+ optionsMap.put("yellow-missing-hyperlink", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_MISSING_HIGHLIGHT, ""));
+ optionsMap.put("table-no-span", new MutableDataSet().set(TablesExtension.COLUMN_SPANS, false));
+ //optionsMap.put("heading-id-suffix", new MutableDataSet().set(DocxRenderer.FIRST_HEADING_ID_SUFFIX, "_1"));
+
+ // Set up a simple configuration that logs on the console.
+ //BasicConfigurator.configure();
+ Logger root = Logger.getRootLogger();
+ root.addAppender(new NullAppender());
+ }
+ private static DataHolder optionsSet(String optionSet) {
+ if (optionSet == null) return null;
+ return optionsMap.get(optionSet);
+ }
+
+ public ComboDeDocxConverterSpec2Test(SpecExample example) {
+ super(example);
+ }
+
+ @Parameterized.Parameters(name = "{0}")
+ public static List data() {
+ List examples = SpecReader.readExamples(SPEC_RESOURCE);
+ List data = new ArrayList();
+
+ // NULL example runs full spec test
+ data.add(new Object[] { SpecExample.NULL });
+
+ for (SpecExample example : examples) {
+ data.add(new Object[] { example });
+ }
+ return data;
+ }
+
+ @Override
+ public DataHolder options(String optionSet) {
+ return optionsSet(optionSet);
+ }
+
+ @Override
+ public String getSpecResourceName() {
+ return SPEC_RESOURCE;
+ }
+
+ @Override
+ public Parser parser() {
+ return PARSER;
+ }
+
+ @Override
+ public IRender renderer() {
+ return RENDERER;
+ }
+
+ @Override
+ protected void testCase(final Node node, final DataHolder options) {
+ if (!DUMP_TEST_CASE_FILES) return;
+
+ final SpecExample specExample = example();
+ if (!specExample.isFullSpecExample() && !specExample.getSection().isEmpty()) {
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s%s_%d.docx", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ File file2 = new File(String.format("%s%s%s_%d.xml", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ WordprocessingMLPackage mlPackage = DocxRenderer.getDefaultTemplate(TEMPLATE_XML);
+ RENDERER.withOptions(options).render(node, mlPackage);
+
+ File parentDir = file.getParentFile();
+ if (!parentDir.exists()) {
+ parentDir.mkdirs();
+ }
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try {
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void addSpecExample(SpecExample example, Node node, DataHolder options, boolean ignoredCase, String actualHTML, String actualAST) {
+ if (!DUMP_ALL_TESTS_FILES) return;
+
+ final boolean failed = !ignoredCase && !actualHTML.equals(example.getHtml());
+
+ // add source information
+ myDocxContext.createP(myDocxContext.getRenderingOptions().HEADING_3);
+
+ if (ignoredCase) {
+ // does not match, need more stuff
+
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Ignored ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else if (failed) {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Failed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("008000");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Passed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ StringBuilder header = new StringBuilder();
+ final String section = example.getSection();
+
+ header.append(section == null ? "" : section.trim()).append(": ").append(example.getExampleNumber());
+ final String optionsSet = example.getOptionsSet();
+ myDocxContext.text(header.toString());
+
+ if (optionsSet != null) {
+ myDocxContext.createHpsMeasure(28);
+ myDocxContext.createColor().setVal("7B56A0");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue((SpecReader.OPTIONS_STRING + "(") + optionsSet + ")");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ myDocxContext.createHorizontalLine();
+ RENDERER.withOptions(options).render(node, myPackage);
+ myDocxContext.createHorizontalLine();
+
+ if (example.hasComment()) {
+ final String comment = example.getComment();
+ String[] lines = comment.split("\n\\s*\n");
+ for (String line : lines) {
+ String trimmed = line.trim();
+ if (!trimmed.isEmpty()) {
+ myDocxContext.createP(myDocxContext.getRenderingOptions().LOOSE_PARAGRAPH_STYLE);
+ myDocxContext.createColor().setVal("808080");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue(trimmed);
+ }
+ }
+ }
+
+ myDocxContext.renderFencedCodeLines(example.getSource().split("\n"));
+
+ //noinspection StatementWithEmptyBody
+ if (failed) {
+ // could add expected and actual text but that would be too much
+ }
+ }
+
+ private DocxContextImpl myDocxContext;
+ private WordprocessingMLPackage myPackage;
+ private String myVisibleLineBreak;
+
+ @Override
+ public boolean fullTestSpecStarting() {
+ if (!DUMP_ALL_TESTS_FILES) return true;
+
+ myPackage = DocxRenderer.getDefaultTemplate(TEMPLATE_XML);
+ if (myPackage == null) return true;
+
+ myDocxContext = new DocxContextImpl(myPackage, null) {
+ @Override
+ public Attributes extendRenderingNodeAttributes(final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public Attributes extendRenderingNodeAttributes(final Node node, final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public String getNodeId(final Node node) {
+ return null;
+ }
+
+ @Override
+ public String getValidBookmarkName(final String id) {
+ return null;
+ }
+
+ @Override
+ public Node getNodeFromId(final String nodeId) {
+ return null;
+ }
+ };
+ myVisibleLineBreak = "¶";
+ return true;
+ }
+
+ @Override
+ protected void fullTestSpecComplete() {
+ if (!DUMP_ALL_TESTS_FILES || myPackage == null) return;
+
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s.docx", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ File file2 = new File(String.format("%s%s.xml", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ WordprocessingMLPackage mlPackage = myPackage;
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDocxConverterSpec2Test.java b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDocxConverterSpec2Test.java
new file mode 100644
index 000000000..fb296d39c
--- /dev/null
+++ b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboDocxConverterSpec2Test.java
@@ -0,0 +1,331 @@
+package com.vladsch.flexmark.docx.converter;
+
+import com.vladsch.flexmark.IRender;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.docx.converter.internal.DocxRenderer;
+import com.vladsch.flexmark.docx.converter.util.DocxContextImpl;
+import com.vladsch.flexmark.docx.converter.util.RunFormatProvider;
+import com.vladsch.flexmark.docx.converter.util.XmlDocxSorter;
+import com.vladsch.flexmark.ext.aside.AsideExtension;
+import com.vladsch.flexmark.ext.attributes.AttributesExtension;
+import com.vladsch.flexmark.ext.definition.DefinitionExtension;
+import com.vladsch.flexmark.ext.emoji.EmojiExtension;
+import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
+import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
+import com.vladsch.flexmark.ext.gitlab.GitLabExtension;
+import com.vladsch.flexmark.ext.ins.InsExtension;
+import com.vladsch.flexmark.ext.macros.MacrosExtension;
+import com.vladsch.flexmark.ext.tables.TablesExtension;
+import com.vladsch.flexmark.ext.toc.SimTocExtension;
+import com.vladsch.flexmark.ext.toc.TocExtension;
+import com.vladsch.flexmark.ext.wikilink.WikiLinkExtension;
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.html.renderer.AttributablePart;
+import com.vladsch.flexmark.parser.Parser;
+import com.vladsch.flexmark.spec.SpecExample;
+import com.vladsch.flexmark.spec.SpecReader;
+import com.vladsch.flexmark.superscript.SuperscriptExtension;
+import com.vladsch.flexmark.test.ComboSpecTestCase;
+import com.vladsch.flexmark.util.html.Attributes;
+import com.vladsch.flexmark.util.options.DataHolder;
+import com.vladsch.flexmark.util.options.MutableDataSet;
+import org.apache.log4j.Logger;
+import org.apache.log4j.varia.NullAppender;
+import org.docx4j.Docx4J;
+import org.docx4j.openpackaging.exceptions.Docx4JException;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.docx4j.wml.Text;
+import org.junit.runners.Parameterized;
+
+import java.io.*;
+import java.util.*;
+
+public class ComboDocxConverterSpec2Test extends ComboSpecTestCase {
+ // set to false to dump DOCX and XML files to pre-determined location
+ // RELEASE : change to true for release
+ static final boolean SKIP_IGNORED_TESTS = ComboDocxConverterSpecTest.SKIP_IGNORED_TESTS;
+ static final boolean DUMP_TEST_CASE_FILES = !SKIP_IGNORED_TESTS;
+ static final boolean DUMP_ALL_TESTS_FILES = !SKIP_IGNORED_TESTS;
+ static final String PROJECT_ROOT_DIRECTORY = "/Users/vlad/src/projects/flexmark-java";
+ static final String FILE_TEST_CASE_DUMP_LOCATION = "/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec/";
+ static final String FILE_ALL_TESTS_DUMP_NAME = FILE_TEST_CASE_DUMP_LOCATION + "AllTests2";
+
+ private static final String SPEC_RESOURCE = "/docx_converter_ast_spec2.md";
+ private static final DataHolder OPTIONS = new MutableDataSet()
+ .set(HtmlRenderer.INDENT_SIZE, 2)
+ .set(Parser.EXTENSIONS, Arrays.asList(
+ AsideExtension.create(),
+ AttributesExtension.create(),
+ DefinitionExtension.create(),
+ EmojiExtension.create(),
+ EnumeratedReferenceExtension.create(),
+ FootnoteExtension.create(),
+ GitLabExtension.create(),
+ InsExtension.create(),
+ MacrosExtension.create(),
+ StrikethroughSubscriptExtension.create(),
+ SuperscriptExtension.create(),
+ TablesExtension.create(),
+ TocExtension.create(),
+ SimTocExtension.create(),
+ WikiLinkExtension.create()
+ ))
+ .set(DocxRenderer.RENDER_BODY_ONLY, true)
+ .set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.DOC_ROOT_URL, String.format("file://%s/assets", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.SUPPRESS_HTML, true)
+ //.set(HtmlRenderer.PERCENT_ENCODE_URLS, true)
+ ;
+
+ private static final Map optionsMap = new HashMap();
+ //private static WordprocessingMLPackage ourPackage = new WordprocessingMLPackage();;
+
+ private static final Parser PARSER = Parser.builder(OPTIONS).build();
+ // The spec says URL-escaping is optional, but the examples assume that it's enabled.
+ private static final DocxRenderer RENDERER = DocxRenderer.builder(OPTIONS).build();
+ static {
+ //optionsMap.put("src-pos", new MutableDataSet().set(HtmlRenderer.SOURCE_POSITION_ATTRIBUTE, "md-pos"));
+ //optionsMap.put("option1", new MutableDataSet().set(DocxConverterExtension.DOCX_CONVERTER_OPTION1, true));
+ optionsMap.put("IGNORED", new MutableDataSet().set(IGNORE, SKIP_IGNORED_TESTS));
+ optionsMap.put("url", new MutableDataSet().set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY)));
+ optionsMap.put("caption-before", new MutableDataSet().set(DocxRenderer.TABLE_CAPTION_BEFORE_TABLE, true));
+ optionsMap.put("highlight-code", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "yellow"));
+ optionsMap.put("highlight-shade", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "shade"));
+ optionsMap.put("hyperlink-suffix", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_SUFFIX, "_1"));
+ optionsMap.put("yellow-missing-hyperlink", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_MISSING_HIGHLIGHT, ""));
+ optionsMap.put("table-no-span", new MutableDataSet().set(TablesExtension.COLUMN_SPANS, false));
+ //optionsMap.put("heading-id-suffix", new MutableDataSet().set(DocxRenderer.FIRST_HEADING_ID_SUFFIX, "_1"));
+
+ // Set up a simple configuration that logs on the console.
+ //BasicConfigurator.configure();
+ Logger root = Logger.getRootLogger();
+ root.addAppender(new NullAppender());
+ }
+ private static DataHolder optionsSet(String optionSet) {
+ if (optionSet == null) return null;
+ return optionsMap.get(optionSet);
+ }
+
+ public ComboDocxConverterSpec2Test(SpecExample example) {
+ super(example);
+ }
+
+ @Parameterized.Parameters(name = "{0}")
+ public static List data() {
+ List examples = SpecReader.readExamples(SPEC_RESOURCE);
+ List data = new ArrayList();
+
+ // NULL example runs full spec test
+ data.add(new Object[] { SpecExample.NULL });
+
+ for (SpecExample example : examples) {
+ data.add(new Object[] { example });
+ }
+ return data;
+ }
+
+ @Override
+ public DataHolder options(String optionSet) {
+ return optionsSet(optionSet);
+ }
+
+ @Override
+ public String getSpecResourceName() {
+ return SPEC_RESOURCE;
+ }
+
+ @Override
+ public Parser parser() {
+ return PARSER;
+ }
+
+ @Override
+ public IRender renderer() {
+ return RENDERER;
+ }
+
+ @Override
+ protected void testCase(final Node node, final DataHolder options) {
+ if (!DUMP_TEST_CASE_FILES) return;
+
+ final SpecExample specExample = example();
+ if (!specExample.isFullSpecExample() && !specExample.getSection().isEmpty()) {
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s%s_%d.docx", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ File file2 = new File(String.format("%s%s%s_%d.xml", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ WordprocessingMLPackage mlPackage = DocxRenderer.getDefaultTemplate();
+ RENDERER.withOptions(options).render(node, mlPackage);
+
+ File parentDir = file.getParentFile();
+ if (!parentDir.exists()) {
+ parentDir.mkdirs();
+ }
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try {
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void addSpecExample(SpecExample example, Node node, DataHolder options, boolean ignoredCase, String actualHTML, String actualAST) {
+ if (!DUMP_ALL_TESTS_FILES) return;
+
+ final boolean failed = !ignoredCase && !actualHTML.equals(example.getHtml());
+
+ // add source information
+ myDocxContext.createP(myDocxContext.getRenderingOptions().HEADING_3);
+
+ if (ignoredCase) {
+ // does not match, need more stuff
+
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Ignored ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else if (failed) {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Failed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("008000");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Passed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ StringBuilder header = new StringBuilder();
+ final String section = example.getSection();
+
+ header.append(section == null ? "" : section.trim()).append(": ").append(example.getExampleNumber());
+ final String optionsSet = example.getOptionsSet();
+ myDocxContext.text(header.toString());
+
+ if (optionsSet != null) {
+ myDocxContext.createHpsMeasure(28);
+ myDocxContext.createColor().setVal("7B56A0");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue((SpecReader.OPTIONS_STRING + "(") + optionsSet + ")");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ myDocxContext.createHorizontalLine();
+ RENDERER.withOptions(options).render(node, myPackage);
+ myDocxContext.createHorizontalLine();
+
+ if (example.hasComment()) {
+ final String comment = example.getComment();
+ String[] lines = comment.split("\n\\s*\n");
+ for (String line : lines) {
+ String trimmed = line.trim();
+ if (!trimmed.isEmpty()) {
+ myDocxContext.createP(myDocxContext.getRenderingOptions().LOOSE_PARAGRAPH_STYLE);
+ myDocxContext.createColor().setVal("808080");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue(trimmed);
+ }
+ }
+ }
+
+ myDocxContext.renderFencedCodeLines(example.getSource().split("\n"));
+
+ //noinspection StatementWithEmptyBody
+ if (failed) {
+ // could add expected and actual text but that would be too much
+ }
+ }
+
+ private DocxContextImpl myDocxContext;
+ private WordprocessingMLPackage myPackage;
+ private String myVisibleLineBreak;
+
+ @Override
+ public boolean fullTestSpecStarting() {
+ if (!DUMP_ALL_TESTS_FILES) return true;
+
+ myPackage = DocxRenderer.getDefaultTemplate();
+ if (myPackage == null) return true;
+
+ myDocxContext = new DocxContextImpl(myPackage, null) {
+ @Override
+ public Attributes extendRenderingNodeAttributes(final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public Attributes extendRenderingNodeAttributes(final Node node, final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public String getNodeId(final Node node) {
+ return null;
+ }
+
+ @Override
+ public String getValidBookmarkName(final String id) {
+ return null;
+ }
+
+ @Override
+ public Node getNodeFromId(final String nodeId) {
+ return null;
+ }
+ };
+ myVisibleLineBreak = "¶";
+ return true;
+ }
+
+ @Override
+ protected void fullTestSpecComplete() {
+ if (!DUMP_ALL_TESTS_FILES || myPackage == null) return;
+
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s.docx", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ File file2 = new File(String.format("%s%s.xml", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ WordprocessingMLPackage mlPackage = myPackage;
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboEnDocxConverterSpec2Test.java b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboEnDocxConverterSpec2Test.java
new file mode 100644
index 000000000..243ea1113
--- /dev/null
+++ b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/ComboEnDocxConverterSpec2Test.java
@@ -0,0 +1,333 @@
+package com.vladsch.flexmark.docx.converter;
+
+import com.vladsch.flexmark.IRender;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.docx.converter.internal.DocxRenderer;
+import com.vladsch.flexmark.docx.converter.util.DocxContextImpl;
+import com.vladsch.flexmark.docx.converter.util.RunFormatProvider;
+import com.vladsch.flexmark.docx.converter.util.XmlDocxSorter;
+import com.vladsch.flexmark.ext.aside.AsideExtension;
+import com.vladsch.flexmark.ext.attributes.AttributesExtension;
+import com.vladsch.flexmark.ext.definition.DefinitionExtension;
+import com.vladsch.flexmark.ext.emoji.EmojiExtension;
+import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.footnotes.FootnoteExtension;
+import com.vladsch.flexmark.ext.gfm.strikethrough.StrikethroughSubscriptExtension;
+import com.vladsch.flexmark.ext.gitlab.GitLabExtension;
+import com.vladsch.flexmark.ext.ins.InsExtension;
+import com.vladsch.flexmark.ext.macros.MacrosExtension;
+import com.vladsch.flexmark.ext.tables.TablesExtension;
+import com.vladsch.flexmark.ext.toc.SimTocExtension;
+import com.vladsch.flexmark.ext.toc.TocExtension;
+import com.vladsch.flexmark.ext.wikilink.WikiLinkExtension;
+import com.vladsch.flexmark.html.HtmlRenderer;
+import com.vladsch.flexmark.html.renderer.AttributablePart;
+import com.vladsch.flexmark.parser.Parser;
+import com.vladsch.flexmark.spec.SpecExample;
+import com.vladsch.flexmark.spec.SpecReader;
+import com.vladsch.flexmark.superscript.SuperscriptExtension;
+import com.vladsch.flexmark.test.ComboSpecTestCase;
+import com.vladsch.flexmark.util.html.Attributes;
+import com.vladsch.flexmark.util.options.DataHolder;
+import com.vladsch.flexmark.util.options.MutableDataSet;
+import org.apache.log4j.Logger;
+import org.apache.log4j.varia.NullAppender;
+import org.docx4j.Docx4J;
+import org.docx4j.openpackaging.exceptions.Docx4JException;
+import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
+import org.docx4j.wml.Text;
+import org.junit.runners.Parameterized;
+
+import java.io.*;
+import java.util.*;
+
+public class ComboEnDocxConverterSpec2Test extends ComboSpecTestCase {
+ // set to false to dump DOCX and XML files to pre-determined location
+ // RELEASE : change to true for release
+ static final boolean SKIP_IGNORED_TESTS = ComboDocxConverterSpecTest.SKIP_IGNORED_TESTS;
+ private static final boolean DUMP_TEST_CASE_FILES = !SKIP_IGNORED_TESTS;
+ private static final boolean DUMP_ALL_TESTS_FILES = !SKIP_IGNORED_TESTS;
+ private static final String PROJECT_ROOT_DIRECTORY = ComboDocxConverterSpecTest.PROJECT_ROOT_DIRECTORY;
+ private static final String FILE_TEST_CASE_DUMP_LOCATION = "/flexmark-docx-converter/src/test/resources/docx_converter_en_ast_spec/";
+ private static final String FILE_ALL_TESTS_DUMP_NAME = FILE_TEST_CASE_DUMP_LOCATION + "AllTests2";
+
+ private static final String SPEC_RESOURCE = "/docx_converter_ast_spec2.md";
+ private static final DataHolder OPTIONS = new MutableDataSet()
+ .set(HtmlRenderer.INDENT_SIZE, 2)
+ .set(Parser.EXTENSIONS, Arrays.asList(
+ AsideExtension.create(),
+ AttributesExtension.create(),
+ DefinitionExtension.create(),
+ EmojiExtension.create(),
+ EnumeratedReferenceExtension.create(),
+ FootnoteExtension.create(),
+ GitLabExtension.create(),
+ InsExtension.create(),
+ MacrosExtension.create(),
+ StrikethroughSubscriptExtension.create(),
+ SuperscriptExtension.create(),
+ TablesExtension.create(),
+ TocExtension.create(),
+ SimTocExtension.create(),
+ WikiLinkExtension.create()
+ ))
+ .set(DocxRenderer.RENDER_BODY_ONLY, true)
+ .set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.DOC_ROOT_URL, String.format("file://%s/assets", PROJECT_ROOT_DIRECTORY))
+ .set(DocxRenderer.SUPPRESS_HTML, true)
+ //.set(HtmlRenderer.PERCENT_ENCODE_URLS, true)
+ ;
+
+ private static final Map optionsMap = new HashMap();
+ //private static WordprocessingMLPackage ourPackage = new WordprocessingMLPackage();;
+
+ private static final Parser PARSER = Parser.builder(OPTIONS).build();
+ // The spec says URL-escaping is optional, but the examples assume that it's enabled.
+ private static final DocxRenderer RENDERER = DocxRenderer.builder(OPTIONS).build();
+ private static final String TEMPLATE_XML = "/EN-Template.xml";
+
+ static {
+ //optionsMap.put("src-pos", new MutableDataSet().set(HtmlRenderer.SOURCE_POSITION_ATTRIBUTE, "md-pos"));
+ //optionsMap.put("option1", new MutableDataSet().set(DocxConverterExtension.DOCX_CONVERTER_OPTION1, true));
+ optionsMap.put("IGNORED", new MutableDataSet().set(IGNORE, SKIP_IGNORED_TESTS));
+ optionsMap.put("url", new MutableDataSet().set(DocxRenderer.DOC_RELATIVE_URL, String.format("file://%s", PROJECT_ROOT_DIRECTORY)));
+ optionsMap.put("caption-before", new MutableDataSet().set(DocxRenderer.TABLE_CAPTION_BEFORE_TABLE, true));
+ optionsMap.put("highlight-code", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "yellow"));
+ optionsMap.put("highlight-shade", new MutableDataSet().set(DocxRenderer.CODE_HIGHLIGHT_SHADING, "shade"));
+ optionsMap.put("hyperlink-suffix", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_SUFFIX, "_1"));
+ optionsMap.put("yellow-missing-hyperlink", new MutableDataSet().set(DocxRenderer.LOCAL_HYPERLINK_MISSING_HIGHLIGHT, ""));
+ optionsMap.put("table-no-span", new MutableDataSet().set(TablesExtension.COLUMN_SPANS, false));
+ //optionsMap.put("heading-id-suffix", new MutableDataSet().set(DocxRenderer.FIRST_HEADING_ID_SUFFIX, "_1"));
+
+ // Set up a simple configuration that logs on the console.
+ //BasicConfigurator.configure();
+ Logger root = Logger.getRootLogger();
+ root.addAppender(new NullAppender());
+ }
+ private static DataHolder optionsSet(String optionSet) {
+ if (optionSet == null) return null;
+ return optionsMap.get(optionSet);
+ }
+
+ public ComboEnDocxConverterSpec2Test(SpecExample example) {
+ super(example);
+ }
+
+ @Parameterized.Parameters(name = "{0}")
+ public static List data() {
+ List examples = SpecReader.readExamples(SPEC_RESOURCE);
+ List data = new ArrayList();
+
+ // NULL example runs full spec test
+ data.add(new Object[] { SpecExample.NULL });
+
+ for (SpecExample example : examples) {
+ data.add(new Object[] { example });
+ }
+ return data;
+ }
+
+ @Override
+ public DataHolder options(String optionSet) {
+ return optionsSet(optionSet);
+ }
+
+ @Override
+ public String getSpecResourceName() {
+ return SPEC_RESOURCE;
+ }
+
+ @Override
+ public Parser parser() {
+ return PARSER;
+ }
+
+ @Override
+ public IRender renderer() {
+ return RENDERER;
+ }
+
+ @Override
+ protected void testCase(final Node node, final DataHolder options) {
+ if (!DUMP_TEST_CASE_FILES) return;
+
+ final SpecExample specExample = example();
+ if (!specExample.isFullSpecExample() && !specExample.getSection().isEmpty()) {
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s%s_%d.docx", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ File file2 = new File(String.format("%s%s%s_%d.xml", PROJECT_ROOT_DIRECTORY, FILE_TEST_CASE_DUMP_LOCATION, specExample.getSection(), specExample.getExampleNumber()));
+ WordprocessingMLPackage mlPackage = DocxRenderer.getDefaultTemplate(TEMPLATE_XML);
+ RENDERER.withOptions(options).render(node, mlPackage);
+
+ File parentDir = file.getParentFile();
+ if (!parentDir.exists()) {
+ parentDir.mkdirs();
+ }
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ try {
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+
+ @Override
+ public void addSpecExample(SpecExample example, Node node, DataHolder options, boolean ignoredCase, String actualHTML, String actualAST) {
+ if (!DUMP_ALL_TESTS_FILES) return;
+
+ final boolean failed = !ignoredCase && !actualHTML.equals(example.getHtml());
+
+ // add source information
+ myDocxContext.createP(myDocxContext.getRenderingOptions().HEADING_3);
+
+ if (ignoredCase) {
+ // does not match, need more stuff
+
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Ignored ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else if (failed) {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("BB002F");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Failed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ } else {
+ // does not match, need more stuff
+ myDocxContext.createColor().setVal("008000");
+ myDocxContext.addBold();
+ Text text = myDocxContext.addWrappedText();
+ text.setValue("Passed ");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ StringBuilder header = new StringBuilder();
+ final String section = example.getSection();
+
+ header.append(section == null ? "" : section.trim()).append(": ").append(example.getExampleNumber());
+ final String optionsSet = example.getOptionsSet();
+ myDocxContext.text(header.toString());
+
+ if (optionsSet != null) {
+ myDocxContext.createHpsMeasure(28);
+ myDocxContext.createColor().setVal("7B56A0");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue((SpecReader.OPTIONS_STRING + "(") + optionsSet + ")");
+ text.setSpace(RunFormatProvider.SPACE_PRESERVE);
+ }
+
+ myDocxContext.createHorizontalLine();
+ RENDERER.withOptions(options).render(node, myPackage);
+ myDocxContext.createHorizontalLine();
+
+ if (example.hasComment()) {
+ final String comment = example.getComment();
+ String[] lines = comment.split("\n\\s*\n");
+ for (String line : lines) {
+ String trimmed = line.trim();
+ if (!trimmed.isEmpty()) {
+ myDocxContext.createP(myDocxContext.getRenderingOptions().LOOSE_PARAGRAPH_STYLE);
+ myDocxContext.createColor().setVal("808080");
+ Text text = myDocxContext.addWrappedText();
+ text.setValue(trimmed);
+ }
+ }
+ }
+
+ myDocxContext.renderFencedCodeLines(example.getSource().split("\n"));
+
+ //noinspection StatementWithEmptyBody
+ if (failed) {
+ // could add expected and actual text but that would be too much
+ }
+ }
+
+ private DocxContextImpl myDocxContext;
+ private WordprocessingMLPackage myPackage;
+ private String myVisibleLineBreak;
+
+ @Override
+ public boolean fullTestSpecStarting() {
+ if (!DUMP_ALL_TESTS_FILES) return true;
+
+ myPackage = DocxRenderer.getDefaultTemplate(TEMPLATE_XML);
+ if (myPackage == null) return true;
+
+ myDocxContext = new DocxContextImpl(myPackage, null) {
+ @Override
+ public Attributes extendRenderingNodeAttributes(final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public Attributes extendRenderingNodeAttributes(final Node node, final AttributablePart part, final Attributes attributes) {
+ return null;
+ }
+
+ @Override
+ public String getNodeId(final Node node) {
+ return null;
+ }
+
+ @Override
+ public String getValidBookmarkName(final String id) {
+ return null;
+ }
+
+ @Override
+ public Node getNodeFromId(final String nodeId) {
+ return null;
+ }
+ };
+ myVisibleLineBreak = "¶";
+ return true;
+ }
+
+ @Override
+ protected void fullTestSpecComplete() {
+ if (!DUMP_ALL_TESTS_FILES || myPackage == null) return;
+
+ // write it out to file, hard-coded for now IGNORE
+ File file = new File(String.format("%s%s.docx", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ File file2 = new File(String.format("%s%s.xml", PROJECT_ROOT_DIRECTORY, FILE_ALL_TESTS_DUMP_NAME));
+ WordprocessingMLPackage mlPackage = myPackage;
+
+ try {
+ mlPackage.save(file, Docx4J.FLAG_SAVE_ZIP_FILE);
+ ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
+ mlPackage.save(outputStream, Docx4J.FLAG_SAVE_FLAT_XML);
+ final String xml = outputStream.toString("UTF-8");
+ final String s = XmlDocxSorter.sortDocumentParts(xml);
+ FileWriter fileWriter = new FileWriter(file2);
+ fileWriter.append(s);
+ fileWriter.append('\n');
+ fileWriter.close();
+ } catch (Docx4JException e) {
+ e.printStackTrace();
+ } catch (UnsupportedEncodingException e) {
+ e.printStackTrace();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+}
diff --git a/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/DocxConverterTestSuite.java b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/DocxConverterTestSuite.java
index e48bfad03..122157be9 100644
--- a/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/DocxConverterTestSuite.java
+++ b/flexmark-docx-converter/src/test/java/com/vladsch/flexmark/docx/converter/DocxConverterTestSuite.java
@@ -7,6 +7,9 @@
ComboDocxConverterSpecTest.class,
ComboEnDocxConverterSpecTest.class,
ComboDeDocxConverterSpecTest.class,
+ ComboDocxConverterSpec2Test.class,
+ ComboEnDocxConverterSpec2Test.class,
+ ComboDeDocxConverterSpec2Test.class,
ComboDocxConverterIssuesSpecTest.class,
//ComboDocxUserSpecDisabled.class, // added to test suite so it runs locally but not on the travis
})
diff --git a/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec.md b/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec.md
index 47295d843..caa57a8df 100644
--- a/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec.md
+++ b/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec.md
@@ -8465,6283 +8465,3 @@ list with aside block
````````````````````````````````
-## Footnotes
-
-```````````````````````````````` example Footnotes: 1
-Paragraph text[^1]
-
-[^1]: Footnote text
-
-.
-
-
-
-
-
-
- Paragraph text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 2
-Paragraph text[^1]
-
-[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
- to the level of the text after the footnote anchor at the left margin.
-
- * list as part of footnote
- * another item
-
- | table |
- |-------|
- | data |
-
-.
-
-
-
-
-
-
- Paragraph text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text that will be wrapped and should have a hanging indent to align the overflow
-
-
-
-
-
- to the level of the text after the footnote anchor at the left margin.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- list as part of footnote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- another item
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- table
-
-
-
-
-
-
-
-
-
-
-
-
-
- data
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 3
-Paragraph text[^1]
-
-Paragraph text, repeated footnote[^1]
-
-[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
- to the level of the text after the footnote anchor at the left margin.
-
-.
-
-
-
-
-
-
- Paragraph text
-
-
-
-
-
-
-
-
-
-
-
-
-
- Paragraph text, repeated footnote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text that will be wrapped and should have a hanging indent to align the overflow
-
-
-
-
-
- to the level of the text after the footnote anchor at the left margin.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text that will be wrapped and should have a hanging indent to align the overflow
-
-
-
-
-
- to the level of the text after the footnote anchor at the left margin.
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 4
-Paragraph text[^1]
-
-Paragraph text, repeated footnote[^1]
-
-[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
- to the level of the text after the footnote anchor at the left margin. [Test](http://example.com)
-
-.
-
-
-
-
-
-
- Paragraph text
-
-
-
-
-
-
-
-
-
-
-
-
-
- Paragraph text, repeated footnote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text that will be wrapped and should have a hanging indent to align the overflow
-
-
-
-
-
- to the level of the text after the footnote anchor at the left margin.
-
-
-
-
-
-
- Test
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Footnote text that will be wrapped and should have a hanging indent to align the overflow
-
-
-
-
-
- to the level of the text after the footnote anchor at the left margin.
-
-
-
-
-
-
- Test
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 5
-|ID|
-|:--:|
-|Der Hersteller[^C1-04]|
-
-[^C1-04]: Beispiele [DREAD](https://en.wikipedia.org/wiki/DREAD_(risk_assessment_model))
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ID
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Der Hersteller
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Beispiele
-
-
-
-
-
-
- DREAD
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 6
-|ID|
-|:--:|
-|Der Hersteller|
-
-Der Hersteller[^C1-04]
-
-[^C1-04]: Beispiele [DREAD](https://en.wikipedia.org/wiki/DREAD_(risk_assessment_model))
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ID
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Der Hersteller
-
-
-
-
-
-
-
-
-
-
- Der Hersteller
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Beispiele
-
-
-
-
-
-
- DREAD
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Footnotes: 7
-|ID|
-|:--:|
-|Der Hersteller[^C1-04]|
-
-[^C1-04]: Beispiele DREAD
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- ID
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Der Hersteller
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
- Beispiele DREAD
-
-
-
-
-
-````````````````````````````````
-
-
-with same links in different parts
-
-```````````````````````````````` example Footnotes: 8
-Text [^id] with link [link](http://example.com)
-
-[^id]: [link](http://example.com)
-.
-
-
-
-
-
-
- Text
-
-
-
-
-
-
-
-
- with link
-
-
-
-
-
-
- link
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
-
-
-
-
- link
-
-
-
-
-
-
-````````````````````````````````
-
-
-with diff links in different parts
-
-```````````````````````````````` example Footnotes: 9
-Text [^id] with link [link](http://example.com)
-
-[^id]: [link](http://example.com/another)
-.
-
-
-
-
-
-
- Text
-
-
-
-
-
-
-
-
- with link
-
-
-
-
-
-
- link
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- →
-
-
-
-
-
-
- link
-
-
-
-
-
-
-````````````````````````````````
-
-
-## TOC
-
-```````````````````````````````` example(TOC: 1) options(IGNORED)
-[TOC]
-
-# Heading **some bold** 1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-## Heading 1.1 _some italic_
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.2 **_some bold italic_**
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-## Heading 1.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-## Heading 1.3
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-# Heading 2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Contents
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TOC \o "1-3" \h \z \u
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
-
-
-
- some bold
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698210 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698211 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698212 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698213 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698214 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698215 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698216 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698217 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc56698218 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
- some bold
-
-
- 1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
- Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-
-
-
-
-
-
- Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-````````````````````````````````
-
-
-sim toc
-
-```````````````````````````````` example(TOC: 2) options(IGNORED)
-[TOC]: #
-
-
-# Heading **some bold** 1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-## Heading 1.1 _some italic_
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.2 **_some bold italic_**
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-## Heading 1.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-## Heading 1.3
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-# Heading 2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Contents
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TOC \o "1-3" \h \z \u
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
-
-
-
- some bold
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158210 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158211 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158212 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158213 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158214 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158215 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158216 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158217 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73158218 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
- some bold
-
-
- 1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
- Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-
-
-
-
-
-
- Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-````````````````````````````````
-
-
-sim toc
-
-```````````````````````````````` example(TOC: 3) options(IGNORED)
-[TOC]: #
-
-
-# Heading **some bold** 1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-## Heading 1.1 _some italic_
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 1.1.2 **_some bold italic_**
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-## Heading 1.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-## Heading 1.3
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-# Heading 2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.1
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-### Heading 2.0.2
-
-Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Contents
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- TOC \o "1-3" \h \z \u
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
-
-
-
- some bold
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244810 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244811 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244812 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244813 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244814 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244815 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244816 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244817 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- PAGEREF _Toc73244818 \h
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
- some bold
-
-
- 1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
- Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
-
-
-
-
-
-
-
- Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1
-
-
-
-
-
- some italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.1.2
-
-
-
-
-
- some bold italic
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
- Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1.3
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.1
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2.0.2
-
-
-
-
-
-
-
-
- Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
-
-
-
-
-
-
-
- Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
-
-
-
-````````````````````````````````
-
-
-## Enumerated References
-
-```````````````````````````````` example(Enumerated References: 1) options(IGNORED)
-{#fig:test}
-[#fig:test]
-
-{#fig:test2}
-[#fig:test2]
-
-| table |
-|-------|
-| data |
-[[#tbl:test] caption]
-{#tbl:test}
-
-See [@fig:test2]
-
-See [@fig:test]
-
-See [@tbl:test]
-
-
-[@fig]: Figure [#].
-
-[@tbl]: Table [#].
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Figure
-
-
- 1
-
-
- .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Figure
-
-
- 2
-
-
- .
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- table
-
-
-
-
-
-
-
-
-
-
-
-
-
- data
-
-
-
-
-
-
-
-
-
-
- Table
-
-
- 1
-
-
- .
-
-
- caption
-
-
-
-
-
-
-
- See
-
-
-
-
-
-
- HYPERLINK "#fig:test2" \o "Figure 2."
-
-
-
-
-
-
-
-
- Figure
-
-
-
-
-
- 2
-
-
-
-
-
- .
-
-
-
-
-
-
-
-
-
-
-
- See
-
-
-
-
-
-
- HYPERLINK "#fig:test" \o "Figure 1."
-
-
-
-
-
-
-
-
- Figure
-
-
-
-
-
- 1
-
-
-
-
-
- .
-
-
-
-
-
-
-
-
-
-
-
- See
-
-
-
-
-
-
- HYPERLINK "#tbl:test" \o "Table 1."
-
-
-
-
-
-
-
-
- Table
-
-
-
-
-
- 1
-
-
-
-
-
- .
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Enumerated References: 2
-
-{#abc}
-
-[@fig]: Figure [#].
-
-[@tbl]: Table [#].
-.
-
-````````````````````````````````
-
-
-test with suffix
-
-```````````````````````````````` example(Enumerated References: 3) options(hyperlink-suffix)
-
-test{#fig:abc}
-
-See [@fig:abc]
-
-[@fig]: Figure [#].
-
-[@tbl]: Table [#].
-.
-
-
-
-
-
-
-
- test
-
-
-
-
-
-
-
-
- See
-
-
-
-
-
-
- HYPERLINK "#fig:abc_1" \o "Figure 1."
-
-
-
-
-
-
-
-
- Figure
-
-
-
-
-
- 1
-
-
-
-
-
- .
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Enumerated References: 4
-
-| table |
-|-------|
-| data |
-[[#tbl:test] caption]
-{#tbl:test}
-
-[@fig]: Figure [#].
-
-[@tbl]: Table [#].
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- table
-
-
-
-
-
-
-
-
-
-
-
-
-
- data
-
-
-
-
-
-
-
-
-
-
- Table
-
-
- 1
-
-
- .
-
-
- caption
-
-
-
-````````````````````````````````
-
-
-missing definition
-
-```````````````````````````````` example Enumerated References: 5
-abc{#fig:test}
-
-[#fig:test]
-
-[@fig:test]
-
-.
-
-
-
-
-
-
-
- abc
-
-
-
-
-
-
-
-
- 1
-
-
-
-
-
-
-
-
-
-
-
- HYPERLINK "#fig:test" \o "fig 1"
-
-
-
-
-
-
-
-
- fig 1
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-## Heading and Link Ids
-
-Suffix links
-
-```````````````````````````````` example(Heading and Link Ids: 1) options(hyperlink-suffix)
-# Heading 1
-
-## Heading 2
-
-[Top](#heading-1)
-[Heading 2](#heading-2)
-.
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
- Top
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-````````````````````````````````
-
-
-Suffix first heading links
-
-```````````````````````````````` example(Heading and Link Ids: 2) options(IGNORE, heading-id-suffix)
-# Heading 1
-
-## Heading 2
-
-[Top](#heading-1)
-[Heading 2](#heading-2)
-.
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
- Top
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-````````````````````````````````
-
-
-Suffix hyperlinks and first heading links
-
-```````````````````````````````` example(Heading and Link Ids: 3) options(IGNORE, hyperlink-suffix, heading-id-suffix)
-# Heading 1
-
-## Heading 2
-
-[Top](#heading-1)
-[Heading 2](#heading-2)
-.
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 1
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-
-
-
-
-
-
-
- Top
-
-
-
-
-
-
-
-
-
-
- Heading 2
-
-
-
-
-````````````````````````````````
-
-
-## Aside
-
-lazy continuation
-
-```````````````````````````````` example Aside: 1
-* list item
- | aside block
- lazy continuation
-.
-
-
-
-
-
-
-
-
-
-
- list item
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- aside block
-
-
-
-
-
- lazy continuation
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with hyperlink
-
-```````````````````````````````` example Aside: 2
-| [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
-
-
-
-
-
-
-
-
- flexmark-icon-logo
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with hard break
-
-```````````````````````````````` example Aside: 3
-| aside block 1
-| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
-.
-
-
-
-
-
-
-
-
-
-
-
-
- aside block 1
-
-
-
-
-
- with a link
-
-
-
-
-
-
- HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
-
-
-
-
-
-
-
-
- flexmark-icon-logo
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with child paragraphs
-
-```````````````````````````````` example Aside: 4
-| aside block 1
-|
-| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
-.
-
-
-
-
-
-
-
-
-
-
-
-
- aside block 1
-
-
-
-
-
-
-
- with a link
-
-
-
-
-
-
- HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
-
-
-
-
-
-
-
-
- flexmark-icon-logo
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with child aside blocks
-
-```````````````````````````````` example Aside: 5
-| aside block 1
-|
-|| another aside block
-.
-
-
-
-
-
-
-
-
-
-
-
-
- aside block 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- another aside block
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with child block quote
-
-```````````````````````````````` example Aside: 6
-| aside block 1
-|
-|> block quote
-.
-
-
-
-
-
-
-
-
-
-
-
-
- aside block 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- block quote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-as child of block quote
-
-```````````````````````````````` example Aside: 7
-> block quote 1
->
->| aside block
-.
-
-
-
-
-
-
-
-
-
-
-
-
- block quote 1
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- aside block
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-with child paragraphs
-
-```````````````````````````````` example Aside: 8
-| aside block 1
-|
-| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
-|| another aside block
-.
-
-
-
-
-
-
-
-
-
-
-
-
- aside block 1
-
-
-
-
-
-
-
- with a link
-
-
-
-
-
-
- HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
-
-
-
-
-
-
-
-
- flexmark-icon-logo
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- another aside block
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-
-
-## Macros
-
-```````````````````````````````` example Macros: 1
->>>macro
-Simple Text
-<<<
-
-Plain Text <<>>
-.
-
-
-
-
-
-
- Plain Text
-
-
- Simple Text
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Macros: 2
->>>macro
-1. Item 1
-1. Item 2
-<<<
-
-Plain Text <<>>
-.
-
-
-
-
-
-
- Plain Text
-
-
-
-
-
-
-
-
-
-
-
- Item 1
-
-
-
-
-
-
-
-
-
-
-
- Item 2
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Macros: 3
->>>macro
-| Heading |
-|:-------|
-| Data |
-<<<
-
-Plain Text <<>>
-.
-
-
-
-
-
-
- Plain Text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Heading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Data
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Macros: 4
->>>macro
-> Block Quote
-<<<
-
-| outer first | outer heading |
-|:-------------|:--------------|
-| Regular Text | <<>> |
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer first
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer heading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Regular Text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Block Quote
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Macros: 5
->>>macro
-1. Item 1
-1. Item 2
-<<<
-
-| outer first | outer heading |
-|:-------------|:--------------|
-| Regular Text | <<>> |
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer first
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer heading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Regular Text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Item 1
-
-
-
-
-
-
-
-
-
-
-
- Item 2
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-```````````````````````````````` example Macros: 6
->>>macro
-| heading |
-|:------------|
-| column `data` |
-| column **data** 2 |
-<<<
-
-| outer first | outer heading |
-|:-------------|:--------------|
-| Regular Text | <<>> |
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer first
-
-
-
-
-
-
-
-
-
-
-
-
-
- outer heading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Regular Text
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- heading
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- column
-
-
-
-
-
- data
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- column
-
-
-
-
-
- data
-
-
- 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-````````````````````````````````
-
-
-Recursion cut short
-
-```````````````````````````````` example Macros: 7
->>>macro1
-Macro 1
-<<>>
-<<<
-
->>>macro2
-Macro 2
-<<>>
-<<<
-
-Plain text <<>>
-
-Plain text <<>>
-.
-
-
-
-
-
-
- Plain text
-
-
- Macro 1
-
-
-
-
-
- Macro 2
-
-
-
-
-
-
-
-
-
-
- Plain text
-
-
- Macro 2
-
-
-
-
-
- Macro 1
-
-
-
-
-
-
-````````````````````````````````
-
-```````````````````````````````` example Macros: 8
->>>macro
-- item 1
-- item 2
-
-
-| Column |
-|--------|
-| Data |
-<<<
-
-
-| Complex | Simple |
-|-------------|-------------|
-| <<>> | Simple Data |
-
-.
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Complex
-
-
-
-
-
-
-
-
-
-
-
-
- Simple
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- item 1
-
-
-
-
-
-
-
-
-
-
-
- item 2
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Column
-
-
-
-
-
-
-
-
-
-
-
-
-
- Data
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Simple Data
-
-
-
-
-
-
-````````````````````````````````
-
-
diff --git a/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec2.md b/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec2.md
new file mode 100644
index 000000000..5497396bb
--- /dev/null
+++ b/flexmark-docx-converter/src/test/resources/docx_converter_ast_spec2.md
@@ -0,0 +1,6877 @@
+---
+title: DocxConverter Extension Spec
+author: Vladimir Schneider
+version: 1.0
+date: '2017-09-06'
+license: '[CC-BY-SA 4.0](http://creativecommons.org/licenses/by-sa/4.0/)'
+...
+
+---
+
+## DocxConverter
+
+Converts markdown to docx
+
+## Footnotes
+
+```````````````````````````````` example Footnotes: 1
+Paragraph text[^1]
+
+[^1]: Footnote text
+
+.
+
+
+
+
+
+
+ Paragraph text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 2
+Paragraph text[^1]
+
+[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
+ to the level of the text after the footnote anchor at the left margin.
+
+ * list as part of footnote
+ * another item
+
+ | table |
+ |-------|
+ | data |
+
+.
+
+
+
+
+
+
+ Paragraph text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text that will be wrapped and should have a hanging indent to align the overflow
+
+
+
+
+
+ to the level of the text after the footnote anchor at the left margin.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ list as part of footnote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another item
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ table
+
+
+
+
+
+
+
+
+
+
+
+
+
+ data
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 3
+Paragraph text[^1]
+
+Paragraph text, repeated footnote[^1]
+
+[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
+ to the level of the text after the footnote anchor at the left margin.
+
+.
+
+
+
+
+
+
+ Paragraph text
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Paragraph text, repeated footnote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text that will be wrapped and should have a hanging indent to align the overflow
+
+
+
+
+
+ to the level of the text after the footnote anchor at the left margin.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text that will be wrapped and should have a hanging indent to align the overflow
+
+
+
+
+
+ to the level of the text after the footnote anchor at the left margin.
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 4
+Paragraph text[^1]
+
+Paragraph text, repeated footnote[^1]
+
+[^1]: Footnote text that will be wrapped and should have a hanging indent to align the overflow
+ to the level of the text after the footnote anchor at the left margin. [Test](http://example.com)
+
+.
+
+
+
+
+
+
+ Paragraph text
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Paragraph text, repeated footnote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text that will be wrapped and should have a hanging indent to align the overflow
+
+
+
+
+
+ to the level of the text after the footnote anchor at the left margin.
+
+
+
+
+
+
+ Test
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Footnote text that will be wrapped and should have a hanging indent to align the overflow
+
+
+
+
+
+ to the level of the text after the footnote anchor at the left margin.
+
+
+
+
+
+
+ Test
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 5
+|ID|
+|:--:|
+|Der Hersteller[^C1-04]|
+
+[^C1-04]: Beispiele [DREAD](https://en.wikipedia.org/wiki/DREAD_(risk_assessment_model))
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Der Hersteller
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Beispiele
+
+
+
+
+
+
+ DREAD
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 6
+|ID|
+|:--:|
+|Der Hersteller|
+
+Der Hersteller[^C1-04]
+
+[^C1-04]: Beispiele [DREAD](https://en.wikipedia.org/wiki/DREAD_(risk_assessment_model))
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Der Hersteller
+
+
+
+
+
+
+
+
+
+
+ Der Hersteller
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Beispiele
+
+
+
+
+
+
+ DREAD
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Footnotes: 7
+|ID|
+|:--:|
+|Der Hersteller[^C1-04]|
+
+[^C1-04]: Beispiele DREAD
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ ID
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Der Hersteller
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+ Beispiele DREAD
+
+
+
+
+
+````````````````````````````````
+
+
+with same links in different parts
+
+```````````````````````````````` example Footnotes: 8
+Text [^id] with link [link](http://example.com)
+
+[^id]: [link](http://example.com)
+.
+
+
+
+
+
+
+ Text
+
+
+
+
+
+
+
+
+ with link
+
+
+
+
+
+
+ link
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+
+
+
+
+ link
+
+
+
+
+
+
+````````````````````````````````
+
+
+with diff links in different parts
+
+```````````````````````````````` example Footnotes: 9
+Text [^id] with link [link](http://example.com)
+
+[^id]: [link](http://example.com/another)
+.
+
+
+
+
+
+
+ Text
+
+
+
+
+
+
+
+
+ with link
+
+
+
+
+
+
+ link
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ →
+
+
+
+
+
+
+ link
+
+
+
+
+
+
+````````````````````````````````
+
+
+## TOC
+
+```````````````````````````````` example(TOC: 1) options(IGNORED)
+[TOC]
+
+# Heading **some bold** 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+## Heading 1.1 _some italic_
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.2 **_some bold italic_**
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+## Heading 1.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+## Heading 1.3
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+# Heading 2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TOC \o "1-3" \h \z \u
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+
+
+
+ some bold
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102910 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102911 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102912 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102913 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102914 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102915 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102916 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102917 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc62102918 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+ some bold
+
+
+ 1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+ Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+
+
+
+
+
+
+ Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+````````````````````````````````
+
+
+sim toc
+
+```````````````````````````````` example(TOC: 2) options(IGNORED)
+[TOC]: #
+
+
+# Heading **some bold** 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+## Heading 1.1 _some italic_
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.2 **_some bold italic_**
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+## Heading 1.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+## Heading 1.3
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+# Heading 2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TOC \o "1-3" \h \z \u
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+
+
+
+ some bold
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971010 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971011 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971012 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971013 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971014 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971015 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971016 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971017 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc6971018 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+ some bold
+
+
+ 1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+ Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+
+
+
+
+
+
+ Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+````````````````````````````````
+
+
+sim toc
+
+```````````````````````````````` example(TOC: 3) options(IGNORED)
+[TOC]: #
+
+
+# Heading **some bold** 1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+## Heading 1.1 _some italic_
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 1.1.2 **_some bold italic_**
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+## Heading 1.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+## Heading 1.3
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+# Heading 2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.1
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+### Heading 2.0.2
+
+Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Contents
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ TOC \o "1-3" \h \z \u
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+
+
+
+ some bold
+
+
+
+
+
+ 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986410 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986411 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986412 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986413 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986414 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986415 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986416 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986417 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ PAGEREF _Toc18986418 \h
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+ some bold
+
+
+ 1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+ Quisque dapibus sit amet nunc ac pulvinar. Aenean lacus augue, vehicula id tellus sit amet, congue pellentesque felis. Aenean in ipsum ligula. Ut finibus laoreet risus eu egestas. Aenean et diam eget arcu luctus venenatis sed et elit. Sed porta ipsum quis varius facilisis. Sed at neque ex. Duis vel sapien eleifend, volutpat enim sit amet, elementum nulla. Sed fermentum ullamcorper tempor. Pellentesque nec ante aliquet, pulvinar risus non, efficitur magna. Duis ut ornare nisl. In vel blandit eros. Duis eget rhoncus nisi. Etiam nec justo id eros sodales convallis eget sit amet metus.
+
+
+
+
+
+
+
+ Mauris luctus gravida risus, ac iaculis tellus varius at. Nullam vulputate ullamcorper risus vel ultricies. Quisque nec purus sit amet est consectetur suscipit. Pellentesque volutpat orci mauris, vitae pretium mi faucibus in. Proin pretium id est rhoncus congue. In tellus purus, gravida nec egestas non, auctor vitae tortor. Proin dolor nisl, placerat quis egestas in, ornare sit amet lectus. Nullam sem lorem, venenatis sed ipsum vel, egestas convallis ligula. Vestibulum vel finibus leo. Proin ullamcorper vulputate nibh eget pharetra. Etiam enim ipsum, vestibulum at ultrices ac, bibendum eu mauris. Sed eu tellus porta, feugiat elit ac, faucibus nunc. Duis sollicitudin tristique augue eget suscipit. Cras dignissim arcu ac porta ornare. Mauris dignissim nisl eu mattis malesuada. Proin feugiat est non eros hendrerit, sed congue ligula convallis.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1
+
+
+
+
+
+ some italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.1.2
+
+
+
+
+
+ some bold italic
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+ Fusce eget sagittis lorem. Quisque quis blandit ante. Nunc neque erat, mollis ut sem efficitur, luctus tempor turpis. Nunc a nisi cursus, faucibus tortor at, ornare lectus. Nullam nibh magna, rutrum eu tincidunt ut, iaculis at augue. In congue ligula pulvinar purus tincidunt, in placerat magna interdum. Nunc mollis arcu vel metus dapibus lacinia.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1.3
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.1
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2.0.2
+
+
+
+
+
+
+
+
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit. Pellentesque ex nunc, interdum et volutpat hendrerit, consectetur in leo. Vivamus elit urna, interdum id ullamcorper non, pulvinar eget ex. Nunc non sodales ligula. Praesent tincidunt dapibus eleifend. Pellentesque fringilla placerat luctus. Duis dictum ac leo at iaculis. Praesent a cursus dolor, et dapibus tellus. Fusce porttitor tristique gravida.
+
+
+
+
+
+
+
+ Proin maximus ante ac justo rutrum consectetur. Praesent ultrices in lacus id faucibus. Praesent consectetur lorem lorem, ac imperdiet orci pharetra in. Nulla placerat neque a neque ultrices, vitae auctor nisi fermentum. Donec et odio non ipsum ultricies dictum euismod sed urna. Maecenas maximus tellus tempor felis sagittis pulvinar. Maecenas bibendum, purus egestas accumsan porta, ipsum turpis viverra lorem, a gravida nibh ipsum convallis nibh. Aliquam at ante ligula. Quisque et dolor eget magna mollis blandit. Quisque in enim finibus, elementum nunc sit amet, blandit est. Donec consectetur urna in turpis pulvinar efficitur. Vivamus molestie massa id tortor cursus, eu auctor metus tincidunt. Aenean dictum turpis in convallis consectetur. Nam dui nisl, consequat non tincidunt eu, hendrerit at tellus. Pellentesque sit amet diam et leo sollicitudin blandit eu eget metus.
+
+
+
+````````````````````````````````
+
+
+## Enumerated References
+
+```````````````````````````````` example(Enumerated References: 1) options(IGNORED)
+{#fig:test}
+[#fig:test]
+
+{#fig:test2}
+[#fig:test2]
+
+| table |
+|-------|
+| data |
+[[#tbl:test] caption]
+{#tbl:test}
+
+See [@fig:test2]
+
+See [@fig:test]
+
+See [@tbl:test]
+
+
+[@fig]: Figure [#].
+
+[@tbl]: Table [#].
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Figure
+
+
+ 1
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Figure
+
+
+ 2
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ table
+
+
+
+
+
+
+
+
+
+
+
+
+
+ data
+
+
+
+
+
+
+
+
+
+
+ Table
+
+
+ 1
+
+
+ .
+
+
+ caption
+
+
+
+
+
+
+
+ See
+
+
+
+
+
+
+ HYPERLINK "#fig:test2" \o "Figure 2."
+
+
+
+
+
+
+
+
+ Figure
+
+
+
+
+
+ 2
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+
+ See
+
+
+
+
+
+
+ HYPERLINK "#fig:test" \o "Figure 1."
+
+
+
+
+
+
+
+
+ Figure
+
+
+
+
+
+ 1
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+
+
+
+
+ See
+
+
+
+
+
+
+ HYPERLINK "#tbl:test" \o "Table 1."
+
+
+
+
+
+
+
+
+ Table
+
+
+
+
+
+ 1
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Enumerated References: 2
+
+{#abc}
+
+[@fig]: Figure [#].
+
+[@tbl]: Table [#].
+.
+
+````````````````````````````````
+
+
+test with suffix
+
+```````````````````````````````` example(Enumerated References: 3) options(hyperlink-suffix)
+
+test{#fig:abc}
+
+See [@fig:abc]
+
+[@fig]: Figure [#].
+
+[@tbl]: Table [#].
+.
+
+
+
+
+
+
+
+ test
+
+
+
+
+
+
+
+
+ See
+
+
+
+
+
+
+ HYPERLINK "#fig:abc_1" \o "Figure 1."
+
+
+
+
+
+
+
+
+ Figure
+
+
+
+
+
+ 1
+
+
+
+
+
+ .
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Enumerated References: 4
+
+| table |
+|-------|
+| data |
+[[#tbl:test] caption]
+{#tbl:test}
+
+[@fig]: Figure [#].
+
+[@tbl]: Table [#].
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ table
+
+
+
+
+
+
+
+
+
+
+
+
+
+ data
+
+
+
+
+
+
+
+
+
+
+ Table
+
+
+ 1
+
+
+ .
+
+
+ caption
+
+
+
+````````````````````````````````
+
+
+missing definition
+
+```````````````````````````````` example Enumerated References: 5
+abc{#fig:test}
+
+[#fig:test]
+
+[@fig:test]
+
+.
+
+
+
+
+
+
+
+ abc
+
+
+
+
+
+
+
+
+ fig 1
+
+
+
+
+
+
+
+
+
+
+
+ HYPERLINK "#fig:test" \o "fig 1"
+
+
+
+
+
+
+
+
+ fig 1
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+## Heading and Link Ids
+
+Suffix links
+
+```````````````````````````````` example(Heading and Link Ids: 1) options(hyperlink-suffix)
+# Heading 1
+
+## Heading 2
+
+[Top](#heading-1)
+[Heading 2](#heading-2)
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+ Top
+
+
+
+
+
+
+
+
+
+
+ Heading 2
+
+
+
+
+````````````````````````````````
+
+
+## Heading
+
+Allow using empty format ref in heading
+
+```````````````````````````````` example Heading: 1
+# [#hdr] Numbered Heading
+
+[@hdr]: [#].
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ Numbered Heading
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Heading: 2
+# [#hdr] Numbered Heading
+
+# [#hdr] Numbered Heading
+
+[@hdr]: [#].
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ Numbered Heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ Numbered Heading
+
+
+
+````````````````````````````````
+
+
+Compound numbering
+
+```````````````````````````````` example Heading: 3
+# [#hdr1] Numbered Heading 1
+
+## [#hdr1:hdr2:] Numbered Heading 1.1
+
+# [#hdr1] Numbered Heading 2
+
+## [#hdr1:hdr2:] Numbered Heading 2.1
+
+[@hdr1]: [#].
+
+[@hdr2]: [#].
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ Numbered Heading 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Numbered Heading 1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ Numbered Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Numbered Heading 2.1
+
+
+
+````````````````````````````````
+
+
+`.` appended by default if last element for format is empty Enumerated Reference Text or Link
+
+```````````````````````````````` example Heading: 4
+# [#hdr1] Numbered Heading 1
+
+## [#hdr1:hdr2:] Numbered Heading 1.1
+
+# [#hdr1] Numbered Heading 2
+
+## [#hdr1:hdr2:] Numbered Heading 2.1
+
+[@hdr1]: [#]
+
+[@hdr2]: [#]
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ Numbered Heading 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ Numbered Heading 1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ Numbered Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ Numbered Heading 2.1
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Heading: 5
+# [#hd1] Heading 1
+
+# [#hd1] Heading 2
+
+# [#hd1] Heading 3
+
+[@hd1]: [#].
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ Heading 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 3
+
+
+ .
+
+
+ Heading 3
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Heading: 6
+# [#hd1] Heading 1
+
+## [#hd1:hd2:] Heading 1.1
+
+### [#hd1:hd2:hd3:] Heading 1.1.1
+
+### [#hd1:hd2:hd3:] Heading 1.1.2
+
+## [#hd1:hd2:] Heading 1.2
+
+### [#hd1:hd2:hd3:] Heading 1.2.1
+
+### [#hd1:hd2:hd3:] Heading 1.2.2
+
+# [#hd1] Heading 2
+
+## [#hd1:hd2:] Heading 2.1
+
+### [#hd1:hd2:hd3:] Heading 2.1.1
+
+### [#hd1:hd2:hd3:] Heading 2.1.2
+
+[@hd1]: [#].
+[@hd2]: [#].
+[@hd3]: [#].
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ Heading 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Heading 1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Heading 1.1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ Heading 1.1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ Heading 1.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Heading 1.2.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 1
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ Heading 1.2.2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ Heading 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Heading 2.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ Heading 2.1.1
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 2
+
+
+ .
+
+
+ 1
+
+
+ .
+
+
+ 2
+
+
+ .
+
+
+ Heading 2.1.2
+
+
+
+````````````````````````````````
+
+
+## Aside
+
+lazy continuation
+
+```````````````````````````````` example Aside: 1
+* list item
+ | aside block
+ lazy continuation
+.
+
+
+
+
+
+
+
+
+
+
+ list item
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block
+
+
+
+
+
+ lazy continuation
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with hyperlink
+
+```````````````````````````````` example Aside: 2
+| [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
+
+
+
+
+
+
+
+
+ flexmark-icon-logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with hard break
+
+```````````````````````````````` example Aside: 3
+| aside block 1
+| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block 1
+
+
+
+
+
+ with a link
+
+
+
+
+
+
+ HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
+
+
+
+
+
+
+
+
+ flexmark-icon-logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with child paragraphs
+
+```````````````````````````````` example Aside: 4
+| aside block 1
+|
+| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block 1
+
+
+
+
+
+
+
+ with a link
+
+
+
+
+
+
+ HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
+
+
+
+
+
+
+
+
+ flexmark-icon-logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with child aside blocks
+
+```````````````````````````````` example Aside: 5
+| aside block 1
+|
+|| another aside block
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another aside block
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with child block quote
+
+```````````````````````````````` example Aside: 6
+| aside block 1
+|
+|> block quote
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ block quote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+as child of block quote
+
+```````````````````````````````` example Aside: 7
+> block quote 1
+>
+>| aside block
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ block quote 1
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+with child paragraphs
+
+```````````````````````````````` example Aside: 8
+| aside block 1
+|
+| with a link [flexmark-icon-logo](https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png "Title: flexmark-java logo")
+|| another aside block
+.
+
+
+
+
+
+
+
+
+
+
+
+
+ aside block 1
+
+
+
+
+
+
+
+ with a link
+
+
+
+
+
+
+ HYPERLINK "https://raw.githubusercontent.com/vsch/flexmark-java/master/assets/images/flexmark-icon-logo%402x.png" \o "Title: flexmark-java logo"
+
+
+
+
+
+
+
+
+ flexmark-icon-logo
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ another aside block
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+## Macros
+
+```````````````````````````````` example Macros: 1
+>>>macro
+Simple Text
+<<<
+
+Plain Text <<>>
+.
+
+
+
+
+
+
+ Plain Text
+
+
+ Simple Text
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 2
+>>>macro
+1. Item 1
+1. Item 2
+<<<
+
+Plain Text <<>>
+.
+
+
+
+
+
+
+ Plain Text
+
+
+
+
+
+
+
+
+
+
+
+ Item 1
+
+
+
+
+
+
+
+
+
+
+
+ Item 2
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 3
+>>>macro
+| Heading |
+|:-------|
+| Data |
+<<<
+
+Plain Text <<>>
+.
+
+
+
+
+
+
+ Plain Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 4
+>>>macro
+> Block Quote
+<<<
+
+| outer first | outer heading |
+|:-------------|:--------------|
+| Regular Text | <<>> |
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer first
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regular Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Block Quote
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 5
+>>>macro
+1. Item 1
+1. Item 2
+<<<
+
+| outer first | outer heading |
+|:-------------|:--------------|
+| Regular Text | <<>> |
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer first
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regular Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Item 1
+
+
+
+
+
+
+
+
+
+
+
+ Item 2
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 6
+>>>macro
+| heading |
+|:------------|
+| column `data` |
+| column **data** 2 |
+<<<
+
+| outer first | outer heading |
+|:-------------|:--------------|
+| Regular Text | <<>> |
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer first
+
+
+
+
+
+
+
+
+
+
+
+
+
+ outer heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Regular Text
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ heading
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ column
+
+
+
+
+
+ data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ column
+
+
+
+
+
+ data
+
+
+ 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+````````````````````````````````
+
+
+Recursion cut short
+
+```````````````````````````````` example Macros: 7
+>>>macro1
+Macro 1
+<<>>
+<<<
+
+>>>macro2
+Macro 2
+<<>>
+<<<
+
+Plain text <<>>
+
+Plain text <<>>
+.
+
+
+
+
+
+
+ Plain text
+
+
+ Macro 1
+
+
+
+
+
+ Macro 2
+
+
+
+
+
+
+
+
+
+
+ Plain text
+
+
+ Macro 2
+
+
+
+
+
+ Macro 1
+
+
+
+
+
+
+````````````````````````````````
+
+
+```````````````````````````````` example Macros: 8
+>>>macro
+- item 1
+- item 2
+
+
+| Column |
+|--------|
+| Data |
+<<<
+
+
+| Complex | Simple |
+|-------------|-------------|
+| <<>> | Simple Data |
+
+.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Complex
+
+
+
+
+
+
+
+
+
+
+
+
+ Simple
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ item 1
+
+
+
+
+
+
+
+
+
+
+
+ item 2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Column
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Data
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ Simple Data
+
+
+
+
+
+
+````````````````````````````````
+
+
diff --git a/flexmark-docx-converter/src/test/resources/docx_converter_issues_ast_spec.md b/flexmark-docx-converter/src/test/resources/docx_converter_issues_ast_spec.md
index f46677531..e2fb85d03 100644
--- a/flexmark-docx-converter/src/test/resources/docx_converter_issues_ast_spec.md
+++ b/flexmark-docx-converter/src/test/resources/docx_converter_issues_ast_spec.md
@@ -3235,7 +3235,7 @@ TEXT :+1: TEXT
````````````````````````````````
-```````````````````````````````` example(Emoji: 4) options(emoji-github)
+```````````````````````````````` example(Emoji: 4) options(emoji-github, IGNORE)
# Heading 1 :basecamp:
## Heading 2 :basecamp:
diff --git a/flexmark-ext-abbreviation/pom.xml b/flexmark-ext-abbreviation/pom.xml
index 3b854b78c..cbe41c398 100644
--- a/flexmark-ext-abbreviation/pom.xml
+++ b/flexmark-ext-abbreviation/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-abbreviation
@@ -36,18 +36,22 @@
com.vladsch.flexmark
flexmark-ext-typographic
+ test
com.vladsch.flexmark
flexmark-ext-ins
+ test
com.vladsch.flexmark
flexmark-ext-gfm-strikethrough
+ test
com.vladsch.flexmark
flexmark-ext-superscript
+ test
diff --git a/flexmark-ext-admonition/pom.xml b/flexmark-ext-admonition/pom.xml
index e22050089..fa6b7ba01 100644
--- a/flexmark-ext-admonition/pom.xml
+++ b/flexmark-ext-admonition/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-admonition
diff --git a/flexmark-ext-anchorlink/pom.xml b/flexmark-ext-anchorlink/pom.xml
index 2edb4690d..95a352085 100644
--- a/flexmark-ext-anchorlink/pom.xml
+++ b/flexmark-ext-anchorlink/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-anchorlink
@@ -28,7 +28,7 @@
com.vladsch.flexmark
flexmark-jira-converter
- 0.35.6
+ 0.35.10
test
diff --git a/flexmark-ext-aside/pom.xml b/flexmark-ext-aside/pom.xml
index 084b79237..eb3c718bc 100644
--- a/flexmark-ext-aside/pom.xml
+++ b/flexmark-ext-aside/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-aside
diff --git a/flexmark-ext-attributes/flexmark-ext-attributes.iml b/flexmark-ext-attributes/flexmark-ext-attributes.iml
index 64600b4f4..2754ba46a 100644
--- a/flexmark-ext-attributes/flexmark-ext-attributes.iml
+++ b/flexmark-ext-attributes/flexmark-ext-attributes.iml
@@ -36,5 +36,7 @@
+
+
\ No newline at end of file
diff --git a/flexmark-ext-attributes/pom.xml b/flexmark-ext-attributes/pom.xml
index 6e629cdba..5e2aa1081 100644
--- a/flexmark-ext-attributes/pom.xml
+++ b/flexmark-ext-attributes/pom.xml
@@ -1,58 +1,138 @@
- 4.0.0
-
- com.vladsch.flexmark
- flexmark-java
- 0.35.6
-
-
- flexmark-ext-attributes
- flexmark-java extension for attributes
- flexmark-java extension for attributes
-
-
-
- com.vladsch.flexmark
- flexmark-util
-
-
- com.vladsch.flexmark
- flexmark
-
-
- com.vladsch.flexmark
- flexmark-test-util
- test
-
-
- com.vladsch.flexmark
- flexmark-ext-anchorlink
- test
-
-
- com.vladsch.flexmark
- flexmark-ext-toc
- test
-
-
- com.vladsch.flexmark
- flexmark-ext-definition
- test
-
-
- com.vladsch.flexmark
- flexmark-ext-tables
- test
-
-
- com.vladsch.flexmark
- flexmark-ext-emoji
- test
-
-
- com.vladsch.flexmark
- flexmark-formatter
-
-
+
+ 4.0.0
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-java
+
+ 0.35.10
+
+
+ flexmark-ext-attributes
+
+
+ flexmark-java extension for attributes
+
+
+ flexmark-java extension for attributes
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-util
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-test-util
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-anchorlink
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-toc
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-definition
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-escaped-character
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-tables
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-typographic
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-ext-emoji
+
+
+ test
+
+
+
+
+ com.vladsch.flexmark
+
+
+ flexmark-formatter
+
+
+
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributeNode.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributeNode.java
index cd2591bd2..db7dee5a7 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributeNode.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributeNode.java
@@ -1,6 +1,6 @@
package com.vladsch.flexmark.ext.attributes;
-import com.vladsch.flexmark.ast.CustomNode;
+import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ast.DoNotDecorate;
import com.vladsch.flexmark.util.html.Attribute;
import com.vladsch.flexmark.util.sequence.BasedSequence;
@@ -8,7 +8,7 @@
/**
* An Attribute node representing a single attribute name and value in attributes node
*/
-public class AttributeNode extends CustomNode implements DoNotDecorate {
+public class AttributeNode extends Node implements DoNotDecorate {
protected BasedSequence name = BasedSequence.NULL;
protected BasedSequence attributeSeparator = BasedSequence.NULL;
protected BasedSequence openingMarker = BasedSequence.NULL;
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesDelimiter.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesDelimiter.java
new file mode 100644
index 000000000..2bbd1c0a4
--- /dev/null
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesDelimiter.java
@@ -0,0 +1,27 @@
+package com.vladsch.flexmark.ext.attributes;
+
+import com.vladsch.flexmark.ast.DelimitedNode;
+import com.vladsch.flexmark.ast.Node;
+import com.vladsch.flexmark.ast.DoNotDecorate;
+import com.vladsch.flexmark.ast.NonRenderingInline;
+import com.vladsch.flexmark.util.sequence.BasedSequence;
+
+/**
+ * A empty implicit AttributesNode used to mark attribute span start
+ */
+public class AttributesDelimiter extends AttributesNode {
+ public AttributesDelimiter() {
+ }
+
+ public AttributesDelimiter(final BasedSequence chars) {
+ super(chars);
+ }
+
+ public AttributesDelimiter(final BasedSequence openingMarker, final BasedSequence text, final BasedSequence closingMarker) {
+ super(openingMarker, text, closingMarker);
+ }
+
+ public AttributesDelimiter(final BasedSequence chars, final String attributesBlockText) {
+ super(chars, attributesBlockText);
+ }
+}
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesExtension.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesExtension.java
index 75c7d2704..a55a5abd5 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesExtension.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesExtension.java
@@ -36,6 +36,8 @@ public class AttributesExtension implements Parser.ParserExtension
});
public static final DataKey ATTRIBUTES_KEEP = new DataKey<>("ATTRIBUTES_KEEP", KeepType.FIRST); // standard option to allow control over how to handle duplicates
public static final DataKey ASSIGN_TEXT_ATTRIBUTES = new DataKey<>("ASSIGN_TEXT_ATTRIBUTES", true); // assign attributes to text if previous is not a space
+ public static final DataKey WRAP_NON_ATTRIBUTE_TEXT = new DataKey<>("WRAP_NON_ATTRIBUTE_TEXT", true);
+ public static final DataKey USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER = new DataKey<>("USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER", false);
private AttributesExtension() {
}
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesNode.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesNode.java
index c486c4fe8..d341c47d0 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesNode.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/AttributesNode.java
@@ -1,6 +1,6 @@
package com.vladsch.flexmark.ext.attributes;
-import com.vladsch.flexmark.ast.CustomNode;
+import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ast.DelimitedNode;
import com.vladsch.flexmark.ast.DoNotDecorate;
import com.vladsch.flexmark.ast.NonRenderingInline;
@@ -9,7 +9,7 @@
/**
* A AttributesNode node
*/
-public class AttributesNode extends CustomNode implements DelimitedNode, DoNotDecorate, NonRenderingInline {
+public class AttributesNode extends Node implements DelimitedNode, DoNotDecorate, NonRenderingInline {
protected BasedSequence openingMarker = BasedSequence.NULL;
protected BasedSequence text = BasedSequence.NULL;
protected BasedSequence closingMarker = BasedSequence.NULL;
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributeParsing.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributeParsing.java
index a0ddba1f0..50fa2f91b 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributeParsing.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributeParsing.java
@@ -4,6 +4,8 @@
import java.util.regex.Pattern;
+import static com.vladsch.flexmark.ext.attributes.AttributesExtension.USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER;
+
class AttributeParsing {
final Parsing myParsing;
final Pattern ATTRIBUTES_TAG;
@@ -13,7 +15,17 @@ public AttributeParsing(Parsing parsing) {
this.myParsing = parsing;
String unquotedValue = myParsing.UNQUOTEDVALUE;//.replace("]+","}{"); // exclude braces
this.ATTRIBUTE = Pattern.compile("\\s*([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?");
- this.ATTRIBUTES_TAG = Pattern.compile("\\{((?:" + "\\s*([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")" +
- "(?:" + "\\s+([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")*" + ")\\s*\\}");
+
+ if (USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER.getFrom(parsing.options)) {
+ this.ATTRIBUTES_TAG = Pattern.compile(
+ "^\\{((?:[#.])|(?:" + "\\s*([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")" +
+ "(?:" + "\\s+([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")*" + "\\s*)\\}"
+ );
+ } else {
+ this.ATTRIBUTES_TAG = Pattern.compile(
+ "^\\{((?:" + "\\s*([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")" +
+ "(?:" + "\\s+([#.]" + unquotedValue + "|" + myParsing.ATTRIBUTENAME + ")\\s*(?:=\\s*(" + myParsing.ATTRIBUTEVALUE + ")?" + ")?" + ")*" + "\\s*)\\}"
+ );
+ }
}
}
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesInlineParserExtension.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesInlineParserExtension.java
index 56d5d5ef4..ac544f0cc 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesInlineParserExtension.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesInlineParserExtension.java
@@ -1,6 +1,7 @@
package com.vladsch.flexmark.ext.attributes.internal;
import com.vladsch.flexmark.ext.attributes.AttributeNode;
+import com.vladsch.flexmark.ext.attributes.AttributesDelimiter;
import com.vladsch.flexmark.ext.attributes.AttributesNode;
import com.vladsch.flexmark.parser.InlineParser;
import com.vladsch.flexmark.parser.InlineParserExtension;
@@ -38,13 +39,15 @@ public boolean parse(final InlineParser inlineParser) {
// see what we have
// open, see if open/close
BasedSequence attributesText = input.subSequence(matcher.start(1), matcher.end(1));
- AttributesNode attributes = new AttributesNode(attributesOpen.subSequence(0, 1), attributesText, attributesOpen.endSequence(1));
+ AttributesNode attributes = attributesText.equals("#") || attributesText.equals(".") ? new AttributesDelimiter(attributesOpen.subSequence(0, 1), attributesText, attributesOpen.endSequence(1))
+ : new AttributesNode(attributesOpen.subSequence(0, 1), attributesText, attributesOpen.endSequence(1));
+
attributes.setCharsFromContent();
int leadingSpaces = attributesText.countLeading(" \t");
// give it to the text node
if (leadingSpaces > 0) {
- inlineParser.appendText(attributesText,0,leadingSpaces);
+ inlineParser.appendText(attributesText, 0, leadingSpaces);
attributesText = attributesText.subSequence(leadingSpaces);
}
@@ -52,7 +55,7 @@ public boolean parse(final InlineParser inlineParser) {
inlineParser.getBlock().appendChild(attributes);
BasedSequence attributeText = attributesText.trim();
- if (!attributeText.isEmpty()) {
+ if (!attributeText.isEmpty() && attributes instanceof AttributesNode) {
// have some attribute text
// parse attributes
Matcher attributeMatcher = parsing.ATTRIBUTE.matcher(attributeText);
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodeFormatter.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodeFormatter.java
index 8aa0f9622..43eb856a6 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodeFormatter.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodeFormatter.java
@@ -1,5 +1,6 @@
package com.vladsch.flexmark.ext.attributes.internal;
+import com.vladsch.flexmark.ext.attributes.AttributesDelimiter;
import com.vladsch.flexmark.ast.Document;
import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ext.attributes.AttributeNode;
@@ -67,6 +68,12 @@ public void render(AttributesNode node, NodeFormatterContext context, MarkdownWr
AttributesNodeFormatter.this.render(node, context, markdown);
}
}));
+ set.add(new NodeFormattingHandler(AttributesDelimiter.class, new CustomNodeFormatter() {
+ @Override
+ public void render(AttributesDelimiter node, NodeFormatterContext context, MarkdownWriter markdown) {
+ AttributesNodeFormatter.this.render(node, context, markdown);
+ }
+ }));
return set;
}
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodePostProcessor.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodePostProcessor.java
index bac671627..e00623c6f 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodePostProcessor.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesNodePostProcessor.java
@@ -2,12 +2,15 @@
import com.vladsch.flexmark.ast.*;
import com.vladsch.flexmark.ext.attributes.AttributeNode;
+import com.vladsch.flexmark.ext.attributes.AttributesDelimiter;
import com.vladsch.flexmark.ext.attributes.AttributesExtension;
import com.vladsch.flexmark.ext.attributes.AttributesNode;
import com.vladsch.flexmark.parser.block.NodePostProcessor;
import com.vladsch.flexmark.parser.block.NodePostProcessorFactory;
import com.vladsch.flexmark.util.NodeTracker;
+import java.util.ArrayList;
+
public class AttributesNodePostProcessor extends NodePostProcessor {
private final NodeAttributeRepository nodeAttributeRepository;
private final AttributesOptions myOptions;
@@ -18,7 +21,7 @@ public AttributesNodePostProcessor(Document document) {
}
public Node getAttributeOwner(NodeTracker state, AttributesNode attributesNode) {
- Node previous = attributesNode.getPreviousAnyNot(BlankLine.class);
+ Node previous = attributesNode.getPreviousAnyNot(BlankLine.class, DoNotAttributeDecorate.class);
Node next = attributesNode.getNext();
Node attributeOwner;
Node parent = attributesNode.getParent();
@@ -81,14 +84,50 @@ public Node getAttributeOwner(NodeTracker state, AttributesNode attributesNode)
} else {
if ((!myOptions.assignTextAttributes && (previous instanceof Text || previous instanceof TextBase)) || previous.getChars().getEndOffset() < attributesNode.getStartOffset()) {
// either previous is text and no text attributes or not attached to the previous node
- // then attributes go to parent
- if (parent instanceof Paragraph && parent.getParent() instanceof ParagraphItemContainer) {
+ // then attributes go to parent unless overridden by delimited attribute spans
+
+ if (myOptions.useEmptyImplicitAsSpanDelimiter) {
+ // find first previous not delimited by unmatched attribute
+ previous = matchDelimitedSpans(state, attributesNode, previous);
+ }
+
+ if (previous instanceof TextBase) {
+ // use delimited span
+ attributeOwner = previous;
+ } else if (parent instanceof Paragraph && parent.getParent() instanceof ParagraphItemContainer) {
attributeOwner = parent.getParent();
} else {
attributeOwner = parent;
}
} else {
- // attached, attributes go to previous node
+ // attached, attributes go to previous node, but may need to wrap spans containing DoNotAttributeDecorate in TextBase
+ if (myOptions.wrapNonAttributeText) {
+ // find first previous not delimited by attribute
+ Node first = attributesNode.getPrevious();
+ Node lastNonAttributesNode = null;
+ boolean hadDoNotDecorate = false;
+
+ while (first != null && (first instanceof Text || first instanceof DoNotAttributeDecorate)) {
+ if (first instanceof DoNotAttributeDecorate) {
+ hadDoNotDecorate = true;
+ }
+ lastNonAttributesNode = first;
+ first = first.getPrevious();
+ }
+
+ if (hadDoNotDecorate) {
+ // need to wrap in text base from first to attribute node
+ TextBase textBase = new TextBase();
+ textBaseWrap(state, lastNonAttributesNode, attributesNode, textBase);
+ previous = textBase;
+ }
+ }
+
+ if (myOptions.useEmptyImplicitAsSpanDelimiter) {
+ // find first previous not delimited by unmatched attribute
+ previous = matchDelimitedSpans(state, attributesNode, previous);
+ }
+
if (previous instanceof Text) {
// insert text base where text was
TextBase textBase = new TextBase(previous.getChars());
@@ -99,6 +138,9 @@ public Node getAttributeOwner(NodeTracker state, AttributesNode attributesNode)
textBase.appendChild(previous);
state.nodeAddedWithChildren(textBase);
attributeOwner = textBase;
+ } else if (previous instanceof AttributesDelimiter) {
+ // no owner, attributes go into aether
+ attributeOwner = null;
} else {
if (previous instanceof AttributesNode) {
// we are spliced right up against previous attributes, give our attributes to the owner of previous attributes
@@ -112,6 +154,72 @@ public Node getAttributeOwner(NodeTracker state, AttributesNode attributesNode)
return attributeOwner;
}
+ static Node matchDelimitedSpans(NodeTracker state, AttributesNode attributesNode, Node previous) {
+ Node first = attributesNode.getPrevious();
+ Node lastNonAttributesNode = null;
+ ArrayList unmatchedAttributes = new ArrayList<>();
+
+ while (first != null) {
+ if (first instanceof AttributesDelimiter) {
+ if (!unmatchedAttributes.isEmpty()) {
+ // match it and wrap in text
+ Node lastNode = unmatchedAttributes.remove(unmatchedAttributes.size() - 1);
+ lastNonAttributesNode = first.getNext();
+ if (lastNode != lastNonAttributesNode) {
+ TextBase textBase = new TextBase();
+
+ textBaseWrap(state, lastNonAttributesNode, lastNode, textBase);
+ lastNonAttributesNode = textBase;
+ } else {
+ previous = first;
+ }
+ } else {
+ // unmatched delimiter is our start span
+ TextBase textBase = new TextBase();
+ lastNonAttributesNode = first.getNext();
+
+ if (lastNonAttributesNode != attributesNode) {
+ textBaseWrap(state, lastNonAttributesNode, attributesNode, textBase);
+ previous = textBase;
+ } else {
+ previous = first;
+ }
+ break;
+ }
+ } else if (first instanceof AttributesNode) {
+ unmatchedAttributes.add(first);
+ } else {
+ lastNonAttributesNode = first;
+ }
+
+ first = first.getPrevious();
+ }
+
+ if (!unmatchedAttributes.isEmpty()) {
+ // use the first unmatched as our end of attribute span
+ previous = unmatchedAttributes.get(0);
+ Node previousNext = previous.getNext();
+ if (previousNext != null && previousNext != attributesNode) {
+ previous = previousNext;
+ }
+ }
+
+ return previous;
+ }
+
+ static void textBaseWrap(final NodeTracker state, Node lastNonAttributesNode, final Node lastNode, final TextBase textBase) {
+ while (lastNonAttributesNode != lastNode) {
+ Node nextNode = lastNonAttributesNode.getNext();
+ lastNonAttributesNode.unlink();
+ state.nodeRemoved(lastNonAttributesNode);
+ textBase.appendChild(lastNonAttributesNode);
+ lastNonAttributesNode = nextNode;
+ }
+ textBase.setCharsFromContent();
+ lastNode.insertBefore(textBase);
+ state.nodeAddedWithDescendants(textBase);
+ }
+
@Override
public void process(NodeTracker state, Node node) {
if (node instanceof AttributesNode) {
@@ -154,15 +262,17 @@ public void process(NodeTracker state, Node node) {
}
Node attributeOwner = getAttributeOwner(state, attributesNode);
- nodeAttributeRepository.put(attributeOwner, attributesNode);
-
- // set the heading id for this node so the correct id will be used
- if (attributeOwner instanceof AnchorRefTarget) {
- for (Node attributeNode : attributesNode.getReversedChildren()) {
- if (attributeNode instanceof AttributeNode) {
- if (((AttributeNode) attributeNode).isId()) {
- ((AnchorRefTarget) attributeOwner).setAnchorRefId(((AttributeNode) attributeNode).getValue().toString());
- break;
+ if (attributeOwner != null) {
+ nodeAttributeRepository.put(attributeOwner, attributesNode);
+
+ // set the heading id for this node so the correct id will be used
+ if (attributeOwner instanceof AnchorRefTarget) {
+ for (Node attributeNode : attributesNode.getReversedChildren()) {
+ if (attributeNode instanceof AttributeNode) {
+ if (((AttributeNode) attributeNode).isId()) {
+ ((AnchorRefTarget) attributeOwner).setAnchorRefId(((AttributeNode) attributeNode).getValue().toString());
+ break;
+ }
}
}
}
diff --git a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesOptions.java b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesOptions.java
index ff85020e6..154ba965c 100644
--- a/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesOptions.java
+++ b/flexmark-ext-attributes/src/main/java/com/vladsch/flexmark/ext/attributes/internal/AttributesOptions.java
@@ -7,14 +7,20 @@
class AttributesOptions implements MutableDataSetter {
public final boolean assignTextAttributes;
+ public final boolean wrapNonAttributeText;
+ public final boolean useEmptyImplicitAsSpanDelimiter;
public AttributesOptions(DataHolder options) {
assignTextAttributes = AttributesExtension.ASSIGN_TEXT_ATTRIBUTES.getFrom(options);
+ wrapNonAttributeText = AttributesExtension.WRAP_NON_ATTRIBUTE_TEXT.getFrom(options);
+ useEmptyImplicitAsSpanDelimiter = AttributesExtension.USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER.getFrom(options);
}
@Override
public MutableDataHolder setIn(final MutableDataHolder dataHolder) {
dataHolder.set(AttributesExtension.ASSIGN_TEXT_ATTRIBUTES, assignTextAttributes);
+ dataHolder.set(AttributesExtension.WRAP_NON_ATTRIBUTE_TEXT, wrapNonAttributeText);
+ dataHolder.set(AttributesExtension.USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER, useEmptyImplicitAsSpanDelimiter);
return dataHolder;
}
}
diff --git a/flexmark-ext-attributes/src/main/javadoc/overview.md b/flexmark-ext-attributes/src/main/javadoc/overview.md
index bb6518a29..527be484e 100644
--- a/flexmark-ext-attributes/src/main/javadoc/overview.md
+++ b/flexmark-ext-attributes/src/main/javadoc/overview.md
@@ -41,3 +41,6 @@ Attribute which starts with `#` such as `#id-string` is equivalent to `id="id-st
* `style` values are accumulated as a semicolon (`;`) separated list.
* all others override any previous values of the same name.
+Setting `USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER` to `true`, will treat `{.}` or `{#}` as markers
+for start of closest matching attributes node to give greater control of where attributes are
+attached in text.
diff --git a/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/ComboExtAttributesSpecTest.java b/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/ComboExtAttributesSpecTest.java
index 1b7ec9f8b..6eb1e1d76 100644
--- a/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/ComboExtAttributesSpecTest.java
+++ b/flexmark-ext-attributes/src/test/java/com/vladsch/flexmark/ext/attributes/ComboExtAttributesSpecTest.java
@@ -3,8 +3,10 @@
import com.vladsch.flexmark.ext.anchorlink.AnchorLinkExtension;
import com.vladsch.flexmark.ext.definition.DefinitionExtension;
import com.vladsch.flexmark.ext.emoji.EmojiExtension;
+import com.vladsch.flexmark.ext.escaped.character.EscapedCharacterExtension;
import com.vladsch.flexmark.ext.tables.TablesExtension;
import com.vladsch.flexmark.ext.toc.TocExtension;
+import com.vladsch.flexmark.ext.typographic.TypographicExtension;
import com.vladsch.flexmark.html.HtmlRenderer;
import com.vladsch.flexmark.parser.Parser;
import com.vladsch.flexmark.spec.SpecExample;
@@ -28,6 +30,8 @@ public class ComboExtAttributesSpecTest extends ComboSpecTestCase {
TocExtension.create(),
EmojiExtension.create(),
DefinitionExtension.create(),
+ EscapedCharacterExtension.create(),
+ TypographicExtension.create(),
TablesExtension.create()
));
@@ -40,6 +44,8 @@ public class ComboExtAttributesSpecTest extends ComboSpecTestCase {
);
optionsMap.put("text-attributes", new MutableDataSet().set(AttributesExtension.ASSIGN_TEXT_ATTRIBUTES, true));
optionsMap.put("no-text-attributes", new MutableDataSet().set(AttributesExtension.ASSIGN_TEXT_ATTRIBUTES, false));
+ optionsMap.put("dont-wrap-non-attributes", new MutableDataSet().set(AttributesExtension.WRAP_NON_ATTRIBUTE_TEXT, false));
+ optionsMap.put("empty-implicit-delimiters", new MutableDataSet().set(AttributesExtension.USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER, true));
optionsMap.put("src-pos", new MutableDataSet().set(HtmlRenderer.SOURCE_POSITION_ATTRIBUTE, "md-pos"));
}
diff --git a/flexmark-ext-attributes/src/test/resources/ext_attributes_ast_spec.md b/flexmark-ext-attributes/src/test/resources/ext_attributes_ast_spec.md
index 250910f69..ecbac9483 100644
--- a/flexmark-ext-attributes/src/test/resources/ext_attributes_ast_spec.md
+++ b/flexmark-ext-attributes/src/test/resources/ext_attributes_ast_spec.md
@@ -95,6 +95,14 @@ For the rest of the specification the `options` following the example will conta
* else
* Cond 1.3 attributes are assigned to the text element
+To allow greater control of attribute assignment it is possible to set
+`USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER` to `true`, will treat `{.}` or `{#}` as markers for start
+of closest matching attributes node to give greater control of where attributes are attached in
+text.
+
+**NOTE**: If `ASSIGN_TEXT_ATTRIBUTES` is set to `false` then
+`USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER` option is ignored.
+
attributes assigned to paragraph
```````````````````````````````` example(Text Node Previous Sibling: 1) options(no-text-attributes)
@@ -1774,9 +1782,595 @@ Document[0, 162]
````````````````````````````````
-## Trailing Spaces
+## Non-Attributes
+
+wrap non-attributes by default
+
+```````````````````````````````` example Non-Attributes: 1
+This is a test. It works fine until a word like don't appears.{.style} Another style might follow.{.style2}
+.
+This is a test. It works fine until a word like don’t appears. Another style might follow.
+.
+Document[0, 108]
+ Paragraph[0, 108]
+ Text[0, 51] chars:[0, 51, "This … e don"]
+ TypographicSmarts[51, 52] typographic: ’
+ TextBase[52, 62] chars:[52, 62, "t appears."]
+ Text[52, 62] chars:[52, 62, "t appears."]
+ AttributesNode[62, 70] textOpen:[62, 63, "{"] text:[63, 69, ".style"] textClose:[69, 70, "}"]
+ AttributeNode[63, 69] name:[63, 64, "."] value:[64, 69, "style"] isImplicit isClass
+ TextBase[70, 98] chars:[70, 98, " Anot … llow."]
+ Text[70, 98] chars:[70, 98, " Anot … llow."]
+ AttributesNode[98, 107] textOpen:[98, 99, "{"] text:[99, 106, ".style2"] textClose:[106, 107, "}"]
+ AttributeNode[99, 106] name:[99, 100, "."] value:[100, 106, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example Non-Attributes: 2
+This is a test. It works fine until a word like 'don't' appears.{.style} Another style might
+follow.{.style2}
+.
+This is a test. It works fine until a word like ‘don’t’ appears. Another style might
+follow.
+.
+Document[0, 110]
+ Paragraph[0, 110]
+ Text[0, 48] chars:[0, 48, "This … like "]
+ TypographicQuotes[48, 55] typographicOpening: ‘ typographicClosing: ’ textOpen:[48, 49, "'"] text:[49, 54, "don't"] textClose:[54, 55, "'"]
+ Text[49, 52] chars:[49, 52, "don"]
+ TypographicSmarts[52, 53] typographic: ’
+ Text[53, 54] chars:[53, 54, "t"]
+ TextBase[55, 64] chars:[55, 64, " appears."]
+ Text[55, 64] chars:[55, 64, " appears."]
+ AttributesNode[64, 72] textOpen:[64, 65, "{"] text:[65, 71, ".style"] textClose:[71, 72, "}"]
+ AttributeNode[65, 71] name:[65, 66, "."] value:[66, 71, "style"] isImplicit isClass
+ Text[72, 92] chars:[72, 92, " Anot … might"]
+ SoftLineBreak[92, 93]
+ TextBase[93, 100] chars:[93, 100, "follow."]
+ Text[93, 100] chars:[93, 100, "follow."]
+ AttributesNode[100, 109] textOpen:[100, 101, "{"] text:[101, 108, ".style2"] textClose:[108, 109, "}"]
+ AttributeNode[101, 108] name:[101, 102, "."] value:[102, 108, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example Non-Attributes: 3
+This is a test. It works fine until a word like don\'t appears.{.style} Another style might
+follow.{.style2}
+.
+This is a test. It works fine until a word like don't appears. Another style might
+follow.
+.
+Document[0, 109]
+ Paragraph[0, 109]
+ TextBase[0, 63] chars:[0, 63, "This … ears."]
+ Text[0, 51] chars:[0, 51, "This … e don"]
+ EscapedCharacter[51, 53] textOpen:[51, 52, "\"] text:[52, 53, "'"]
+ Text[53, 63] chars:[53, 63, "t appears."]
+ AttributesNode[63, 71] textOpen:[63, 64, "{"] text:[64, 70, ".style"] textClose:[70, 71, "}"]
+ AttributeNode[64, 70] name:[64, 65, "."] value:[65, 70, "style"] isImplicit isClass
+ Text[71, 91] chars:[71, 91, " Anot … might"]
+ SoftLineBreak[91, 92]
+ TextBase[92, 99] chars:[92, 99, "follow."]
+ Text[92, 99] chars:[92, 99, "follow."]
+ AttributesNode[99, 108] textOpen:[99, 100, "{"] text:[100, 107, ".style2"] textClose:[107, 108, "}"]
+ AttributeNode[100, 107] name:[100, 101, "."] value:[101, 107, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Non-Attributes: 4) options(dont-wrap-non-attributes)
+This is a test. It works fine until a word like don't appears.{.style} Another style might follow.{.style2}
+.
+This is a test. It works fine until a word like don’t appears. Another style might follow.
+.
+Document[0, 107]
+ Paragraph[0, 107]
+ Text[0, 51] chars:[0, 51, "This … e don"]
+ TypographicSmarts[51, 52] typographic: ’
+ TextBase[52, 62] chars:[52, 62, "t appears."]
+ Text[52, 62] chars:[52, 62, "t appears."]
+ AttributesNode[62, 70] textOpen:[62, 63, "{"] text:[63, 69, ".style"] textClose:[69, 70, "}"]
+ AttributeNode[63, 69] name:[63, 64, "."] value:[64, 69, "style"] isImplicit isClass
+ TextBase[70, 98] chars:[70, 98, " Anot … llow."]
+ Text[70, 98] chars:[70, 98, " Anot … llow."]
+ AttributesNode[98, 107] textOpen:[98, 99, "{"] text:[99, 106, ".style2"] textClose:[106, 107, "}"]
+ AttributeNode[99, 106] name:[99, 100, "."] value:[100, 106, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Non-Attributes: 5) options(dont-wrap-non-attributes)
+This is a test. It works fine until a word like 'don't' appears.{.style} Another style might follow.{.style2}
+.
+This is a test. It works fine until a word like ‘don’t’ appears. Another style might follow.
+.
+Document[0, 109]
+ Paragraph[0, 109]
+ Text[0, 48] chars:[0, 48, "This … like "]
+ TypographicQuotes[48, 55] typographicOpening: ‘ typographicClosing: ’ textOpen:[48, 49, "'"] text:[49, 54, "don't"] textClose:[54, 55, "'"]
+ Text[49, 52] chars:[49, 52, "don"]
+ TypographicSmarts[52, 53] typographic: ’
+ Text[53, 54] chars:[53, 54, "t"]
+ TextBase[55, 64] chars:[55, 64, " appears."]
+ Text[55, 64] chars:[55, 64, " appears."]
+ AttributesNode[64, 72] textOpen:[64, 65, "{"] text:[65, 71, ".style"] textClose:[71, 72, "}"]
+ AttributeNode[65, 71] name:[65, 66, "."] value:[66, 71, "style"] isImplicit isClass
+ TextBase[72, 100] chars:[72, 100, " Anot … llow."]
+ Text[72, 100] chars:[72, 100, " Anot … llow."]
+ AttributesNode[100, 109] textOpen:[100, 101, "{"] text:[101, 108, ".style2"] textClose:[108, 109, "}"]
+ AttributeNode[101, 108] name:[101, 102, "."] value:[102, 108, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Non-Attributes: 6) options(dont-wrap-non-attributes)
+This is a test. It works fine until a word like don\'t appears.{.style} Another style might
+follow.{.style2}
+.
+This is a test. It works fine until a word like don't appears. Another style might
+follow.
+.
+Document[0, 108]
+ Paragraph[0, 108]
+ TextBase[0, 63] chars:[0, 63, "This … ears."]
+ Text[0, 51] chars:[0, 51, "This … e don"]
+ EscapedCharacter[51, 53] textOpen:[51, 52, "\"] text:[52, 53, "'"]
+ Text[53, 63] chars:[53, 63, "t appears."]
+ AttributesNode[63, 71] textOpen:[63, 64, "{"] text:[64, 70, ".style"] textClose:[70, 71, "}"]
+ AttributeNode[64, 70] name:[64, 65, "."] value:[65, 70, "style"] isImplicit isClass
+ Text[71, 91] chars:[71, 91, " Anot … might"]
+ SoftLineBreak[91, 92]
+ TextBase[92, 99] chars:[92, 99, "follow."]
+ Text[92, 99] chars:[92, 99, "follow."]
+ AttributesNode[99, 108] textOpen:[99, 100, "{"] text:[100, 107, ".style2"] textClose:[107, 108, "}"]
+ AttributeNode[100, 107] name:[100, 101, "."] value:[101, 107, "style2"] isImplicit isClass
+````````````````````````````````
+
+
+## Attribute Span
+
+```````````````````````````````` example Attribute Span: 1
+Cond 1.2 text node{.red}
+.
+Cond 1.2 text node
+.
+Document[0, 25]
+ Paragraph[0, 25]
+ TextBase[0, 18] chars:[0, 18, "Cond … node"]
+ Text[0, 18] chars:[0, 18, "Cond … node"]
+ AttributesNode[18, 24] textOpen:[18, 19, "{"] text:[19, 23, ".red"] textClose:[23, 24, "}"]
+ AttributeNode[19, 23] name:[19, 20, "."] value:[20, 23, "red"] isImplicit isClass
+````````````````````````````````
+
+
+can use empty for braces
+
+```````````````````````````````` example Attribute Span: 2
+Cond 1.2 text {}node
+.
+Cond 1.2 text {}node
+.
+Document[0, 21]
+ Paragraph[0, 21]
+ Text[0, 20] chars:[0, 20, "Cond … }node"]
+````````````````````````````````
+
+
+empty attributes are just text
+
+```````````````````````````````` example Attribute Span: 3
+Cond 1.2 text {}node{.red}
+.
+Cond 1.2 text {}node
+.
+Document[0, 27]
+ Paragraph[0, 27]
+ TextBase[0, 20] chars:[0, 20, "Cond … }node"]
+ Text[0, 20] chars:[0, 20, "Cond … }node"]
+ AttributesNode[20, 26] textOpen:[20, 21, "{"] text:[21, 25, ".red"] textClose:[25, 26, "}"]
+ AttributeNode[21, 25] name:[21, 22, "."] value:[22, 25, "red"] isImplicit isClass
+````````````````````````````````
+
+
+empty attributes are just text
+
+```````````````````````````````` example Attribute Span: 4
+Cond 1.2 text { }node{.red}
+.
+Cond 1.2 text { }node
+.
+Document[0, 28]
+ Paragraph[0, 28]
+ TextBase[0, 21] chars:[0, 21, "Cond … }node"]
+ Text[0, 21] chars:[0, 21, "Cond … }node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+can use empty class is just text
+
+```````````````````````````````` example Attribute Span: 5
+Cond 1.2 text {.}node{.red}
+.
+Cond 1.2 text {.}node
+.
+Document[0, 28]
+ Paragraph[0, 28]
+ TextBase[0, 21] chars:[0, 21, "Cond … }node"]
+ Text[0, 21] chars:[0, 21, "Cond … }node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+spaces in empty id is just text
+
+```````````````````````````````` example Attribute Span: 6
+Cond 1.2 text { #}node{.red}
+.
+Cond 1.2 text { #}node
+.
+Document[0, 29]
+ Paragraph[0, 29]
+ TextBase[0, 22] chars:[0, 22, "Cond … }node"]
+ Text[0, 22] chars:[0, 22, "Cond … }node"]
+ AttributesNode[22, 28] textOpen:[22, 23, "{"] text:[23, 27, ".red"] textClose:[27, 28, "}"]
+ AttributeNode[23, 27] name:[23, 24, "."] value:[24, 27, "red"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example Attribute Span: 7
+Cond 1.2 text {# }node{.red}
+.
+Cond 1.2 text {# }node
+.
+Document[0, 29]
+ Paragraph[0, 29]
+ TextBase[0, 22] chars:[0, 22, "Cond … }node"]
+ Text[0, 22] chars:[0, 22, "Cond … }node"]
+ AttributesNode[22, 28] textOpen:[22, 23, "{"] text:[23, 27, ".red"] textClose:[27, 28, "}"]
+ AttributeNode[23, 27] name:[23, 24, "."] value:[24, 27, "red"] isImplicit isClass
+````````````````````````````````
+
+
+spaces in empty class is just text
+
+```````````````````````````````` example(Attribute Span: 8) options(empty-implicit-delimiters)
+Cond 1.2 text { .}node{.red}
+.
+Cond 1.2 text { .}node
+.
+Document[0, 28]
+ Paragraph[0, 28]
+ TextBase[0, 22] chars:[0, 22, "Cond … }node"]
+ Text[0, 22] chars:[0, 22, "Cond … }node"]
+ AttributesNode[22, 28] textOpen:[22, 23, "{"] text:[23, 27, ".red"] textClose:[27, 28, "}"]
+ AttributeNode[23, 27] name:[23, 24, "."] value:[24, 27, "red"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 9) options(empty-implicit-delimiters)
+Cond 1.2 text {. }node{.red}
+.
+Cond 1.2 text {. }node
+.
+Document[0, 28]
+ Paragraph[0, 28]
+ TextBase[0, 22] chars:[0, 22, "Cond … }node"]
+ Text[0, 22] chars:[0, 22, "Cond … }node"]
+ AttributesNode[22, 28] textOpen:[22, 23, "{"] text:[23, 27, ".red"] textClose:[27, 28, "}"]
+ AttributeNode[23, 27] name:[23, 24, "."] value:[24, 27, "red"] isImplicit isClass
+````````````````````````````````
+
+
+can use empty id is just text
+
+```````````````````````````````` example Attribute Span: 10
+Cond 1.2 text {#}node{.red}
+.
+Cond 1.2 text {#}node
+.
+Document[0, 28]
+ Paragraph[0, 28]
+ TextBase[0, 21] chars:[0, 21, "Cond … }node"]
+ Text[0, 21] chars:[0, 21, "Cond … }node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+can use empty class as delimiter
+
+```````````````````````````````` example(Attribute Span: 11) options(empty-implicit-delimiters)
+Cond 1.2 text {.}node{.red}
+.
+Cond 1.2 text node
+.
+Document[0, 27]
+ Paragraph[0, 27]
+ Text[0, 14] chars:[0, 14, "Cond … text "]
+ AttributesDelimiter[14, 17] textOpen:[14, 15, "{"] text:[15, 16, "."] textClose:[16, 17, "}"]
+ TextBase[17, 21] chars:[17, 21, "node"]
+ Text[17, 21] chars:[17, 21, "node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 12) options(empty-implicit-delimiters)
+Cond 1.2 {.}text node{.red}
+.
+Cond 1.2 text node
+.
+Document[0, 27]
+ Paragraph[0, 27]
+ Text[0, 9] chars:[0, 9, "Cond 1.2 "]
+ AttributesDelimiter[9, 12] textOpen:[9, 10, "{"] text:[10, 11, "."] textClose:[11, 12, "}"]
+ TextBase[12, 21] chars:[12, 21, "text node"]
+ Text[12, 21] chars:[12, 21, "text node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+can use empty id as delimiter
+
+```````````````````````````````` example(Attribute Span: 13) options(empty-implicit-delimiters)
+Cond 1.2 {#}text node{.red}
+.
+Cond 1.2 text node
+.
+Document[0, 27]
+ Paragraph[0, 27]
+ Text[0, 9] chars:[0, 9, "Cond 1.2 "]
+ AttributesDelimiter[9, 12] textOpen:[9, 10, "{"] text:[10, 11, "#"] textClose:[11, 12, "}"]
+ TextBase[12, 21] chars:[12, 21, "text node"]
+ Text[12, 21] chars:[12, 21, "text node"]
+ AttributesNode[21, 27] textOpen:[21, 22, "{"] text:[22, 26, ".red"] textClose:[26, 27, "}"]
+ AttributeNode[22, 26] name:[22, 23, "."] value:[23, 26, "red"] isImplicit isClass
+````````````````````````````````
+
+
+nesting is allowed
+
+```````````````````````````````` example(Attribute Span: 14) options(empty-implicit-delimiters)
+Cond {.}1.2 {#}text node{.red}{.green}
+.
+Cond 1.2 text node
+.
+Document[0, 38]
+ Paragraph[0, 38]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 30] chars:[8, 30, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "#"] textClose:[14, 15, "}"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ Text[15, 24] chars:[15, 24, "text node"]
+ AttributesNode[24, 30] textOpen:[24, 25, "{"] text:[25, 29, ".red"] textClose:[29, 30, "}"]
+ AttributeNode[25, 29] name:[25, 26, "."] value:[26, 29, "red"] isImplicit isClass
+ AttributesNode[30, 38] textOpen:[30, 31, "{"] text:[31, 37, ".green"] textClose:[37, 38, "}"]
+ AttributeNode[31, 37] name:[31, 32, "."] value:[32, 37, "green"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 15) options(empty-implicit-delimiters)
+Cond {#}1.2 {.}text node{.red}{.green}
+.
+Cond 1.2 text node
+.
+Document[0, 38]
+ Paragraph[0, 38]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "#"] textClose:[7, 8, "}"]
+ TextBase[8, 30] chars:[8, 30, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "."] textClose:[14, 15, "}"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ Text[15, 24] chars:[15, 24, "text node"]
+ AttributesNode[24, 30] textOpen:[24, 25, "{"] text:[25, 29, ".red"] textClose:[29, 30, "}"]
+ AttributeNode[25, 29] name:[25, 26, "."] value:[26, 29, "red"] isImplicit isClass
+ AttributesNode[30, 38] textOpen:[30, 31, "{"] text:[31, 37, ".green"] textClose:[37, 38, "}"]
+ AttributeNode[31, 37] name:[31, 32, "."] value:[32, 37, "green"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 16) options(empty-implicit-delimiters)
+Cond {#}1.2 {#}text node{.red}{.green}
+.
+Cond 1.2 text node
+.
+Document[0, 38]
+ Paragraph[0, 38]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "#"] textClose:[7, 8, "}"]
+ TextBase[8, 30] chars:[8, 30, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "#"] textClose:[14, 15, "}"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ Text[15, 24] chars:[15, 24, "text node"]
+ AttributesNode[24, 30] textOpen:[24, 25, "{"] text:[25, 29, ".red"] textClose:[29, 30, "}"]
+ AttributeNode[25, 29] name:[25, 26, "."] value:[26, 29, "red"] isImplicit isClass
+ AttributesNode[30, 38] textOpen:[30, 31, "{"] text:[31, 37, ".green"] textClose:[37, 38, "}"]
+ AttributeNode[31, 37] name:[31, 32, "."] value:[32, 37, "green"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 17) options(empty-implicit-delimiters)
+Cond {.}1.2 {.}text node{.red}{.green}
+.
+Cond 1.2 text node
+.
+Document[0, 38]
+ Paragraph[0, 38]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 30] chars:[8, 30, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "."] textClose:[14, 15, "}"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ Text[15, 24] chars:[15, 24, "text node"]
+ AttributesNode[24, 30] textOpen:[24, 25, "{"] text:[25, 29, ".red"] textClose:[29, 30, "}"]
+ AttributeNode[25, 29] name:[25, 26, "."] value:[26, 29, "red"] isImplicit isClass
+ AttributesNode[30, 38] textOpen:[30, 31, "{"] text:[31, 37, ".green"] textClose:[37, 38, "}"]
+ AttributeNode[31, 37] name:[31, 32, "."] value:[32, 37, "green"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 18) options(empty-implicit-delimiters)
+Cond {.}1.2 {.}text node{.red}{.green}
+.
+Cond 1.2 text node
+.
+Document[0, 38]
+ Paragraph[0, 38]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 30] chars:[8, 30, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "."] textClose:[14, 15, "}"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ TextBase[15, 24] chars:[15, 24, "text node"]
+ Text[15, 24] chars:[15, 24, "text node"]
+ AttributesNode[24, 30] textOpen:[24, 25, "{"] text:[25, 29, ".red"] textClose:[29, 30, "}"]
+ AttributeNode[25, 29] name:[25, 26, "."] value:[26, 29, "red"] isImplicit isClass
+ AttributesNode[30, 38] textOpen:[30, 31, "{"] text:[31, 37, ".green"] textClose:[37, 38, "}"]
+ AttributeNode[31, 37] name:[31, 32, "."] value:[32, 37, "green"] isImplicit isClass
+````````````````````````````````
+
+
+delimiters override assignment to parent
+
+```````````````````````````````` example(Attribute Span: 19) options(empty-implicit-delimiters)
+Cond {.}1.2 {.}decorated text {.red} {.green}
+.
+Cond 1.2 decorated text
+.
+Document[0, 45]
+ Paragraph[0, 45]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 36] chars:[8, 36, "1.2 { … .red}"]
+ Text[8, 12] chars:[8, 12, "1.2 "]
+ AttributesDelimiter[12, 15] textOpen:[12, 13, "{"] text:[13, 14, "."] textClose:[14, 15, "}"]
+ TextBase[15, 30] chars:[15, 30, "decor … text "]
+ TextBase[15, 30] chars:[15, 30, "decor … text "]
+ Text[15, 30] chars:[15, 30, "decor … text "]
+ AttributesNode[30, 36] textOpen:[30, 31, "{"] text:[31, 35, ".red"] textClose:[35, 36, "}"]
+ AttributeNode[31, 35] name:[31, 32, "."] value:[32, 35, "red"] isImplicit isClass
+ AttributesNode[37, 45] textOpen:[37, 38, "{"] text:[38, 44, ".green"] textClose:[44, 45, "}"]
+ AttributeNode[38, 44] name:[38, 39, "."] value:[39, 44, "green"] isImplicit isClass
+````````````````````````````````
-```````````````````````````````` example Trailing Spaces: 1
+
+unmatched goes to parent
+
+```````````````````````````````` example(Attribute Span: 20) options(empty-implicit-delimiters)
+Cond 1.2 {.}decorated text {.red} {.green}
+.
+Cond 1.2 decorated text
+.
+Document[0, 42]
+ Paragraph[0, 42]
+ Text[0, 9] chars:[0, 9, "Cond 1.2 "]
+ AttributesDelimiter[9, 12] textOpen:[9, 10, "{"] text:[10, 11, "."] textClose:[11, 12, "}"]
+ TextBase[12, 27] chars:[12, 27, "decor … text "]
+ TextBase[12, 27] chars:[12, 27, "decor … text "]
+ Text[12, 27] chars:[12, 27, "decor … text "]
+ AttributesNode[27, 33] textOpen:[27, 28, "{"] text:[28, 32, ".red"] textClose:[32, 33, "}"]
+ AttributeNode[28, 32] name:[28, 29, "."] value:[29, 32, "red"] isImplicit isClass
+ AttributesNode[34, 42] textOpen:[34, 35, "{"] text:[35, 41, ".green"] textClose:[41, 42, "}"]
+ AttributeNode[35, 41] name:[35, 36, "."] value:[36, 41, "green"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 21) options(empty-implicit-delimiters)
+Cond {.}blue {.}green {.}red{.red}{.green}{.blue}{.rgb}
+.
+Cond blue green red
+.
+Document[0, 55]
+ Paragraph[0, 55]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 42] chars:[8, 42, "blue … reen}"]
+ TextBase[8, 42] chars:[8, 42, "blue … reen}"]
+ TextBase[8, 42] chars:[8, 42, "blue … reen}"]
+ Text[8, 13] chars:[8, 13, "blue "]
+ AttributesDelimiter[13, 16] textOpen:[13, 14, "{"] text:[14, 15, "."] textClose:[15, 16, "}"]
+ TextBase[16, 34] chars:[16, 34, "green … .red}"]
+ TextBase[16, 34] chars:[16, 34, "green … .red}"]
+ Text[16, 22] chars:[16, 22, "green "]
+ AttributesDelimiter[22, 25] textOpen:[22, 23, "{"] text:[23, 24, "."] textClose:[24, 25, "}"]
+ TextBase[25, 28] chars:[25, 28, "red"]
+ TextBase[25, 28] chars:[25, 28, "red"]
+ Text[25, 28] chars:[25, 28, "red"]
+ AttributesNode[28, 34] textOpen:[28, 29, "{"] text:[29, 33, ".red"] textClose:[33, 34, "}"]
+ AttributeNode[29, 33] name:[29, 30, "."] value:[30, 33, "red"] isImplicit isClass
+ AttributesNode[34, 42] textOpen:[34, 35, "{"] text:[35, 41, ".green"] textClose:[41, 42, "}"]
+ AttributeNode[35, 41] name:[35, 36, "."] value:[36, 41, "green"] isImplicit isClass
+ AttributesNode[42, 49] textOpen:[42, 43, "{"] text:[43, 48, ".blue"] textClose:[48, 49, "}"]
+ AttributeNode[43, 48] name:[43, 44, "."] value:[44, 48, "blue"] isImplicit isClass
+ AttributesNode[49, 55] textOpen:[49, 50, "{"] text:[50, 54, ".rgb"] textClose:[54, 55, "}"]
+ AttributeNode[50, 54] name:[50, 51, "."] value:[51, 54, "rgb"] isImplicit isClass
+````````````````````````````````
+
+
+```````````````````````````````` example(Attribute Span: 22) options(empty-implicit-delimiters)
+Cond {.}blue {.}green {.}red{.red}{.green}{.blue} rgb{.rgb}
+.
+Cond blue green red rgb
+.
+Document[0, 59]
+ Paragraph[0, 59]
+ Text[0, 5] chars:[0, 5, "Cond "]
+ AttributesDelimiter[5, 8] textOpen:[5, 6, "{"] text:[6, 7, "."] textClose:[7, 8, "}"]
+ TextBase[8, 42] chars:[8, 42, "blue … reen}"]
+ TextBase[8, 42] chars:[8, 42, "blue … reen}"]
+ Text[8, 13] chars:[8, 13, "blue "]
+ AttributesDelimiter[13, 16] textOpen:[13, 14, "{"] text:[14, 15, "."] textClose:[15, 16, "}"]
+ TextBase[16, 34] chars:[16, 34, "green … .red}"]
+ TextBase[16, 34] chars:[16, 34, "green … .red}"]
+ Text[16, 22] chars:[16, 22, "green "]
+ AttributesDelimiter[22, 25] textOpen:[22, 23, "{"] text:[23, 24, "."] textClose:[24, 25, "}"]
+ TextBase[25, 28] chars:[25, 28, "red"]
+ TextBase[25, 28] chars:[25, 28, "red"]
+ Text[25, 28] chars:[25, 28, "red"]
+ AttributesNode[28, 34] textOpen:[28, 29, "{"] text:[29, 33, ".red"] textClose:[33, 34, "}"]
+ AttributeNode[29, 33] name:[29, 30, "."] value:[30, 33, "red"] isImplicit isClass
+ AttributesNode[34, 42] textOpen:[34, 35, "{"] text:[35, 41, ".green"] textClose:[41, 42, "}"]
+ AttributeNode[35, 41] name:[35, 36, "."] value:[36, 41, "green"] isImplicit isClass
+ AttributesNode[42, 49] textOpen:[42, 43, "{"] text:[43, 48, ".blue"] textClose:[48, 49, "}"]
+ AttributeNode[43, 48] name:[43, 44, "."] value:[44, 48, "blue"] isImplicit isClass
+ TextBase[49, 53] chars:[49, 53, " rgb"]
+ Text[49, 53] chars:[49, 53, " rgb"]
+ AttributesNode[53, 59] textOpen:[53, 54, "{"] text:[54, 58, ".rgb"] textClose:[58, 59, "}"]
+ AttributeNode[54, 58] name:[54, 55, "."] value:[55, 58, "rgb"] isImplicit isClass
+````````````````````````````````
+
+
+## Embedded Spaces
+
+leading spaces
+
+```````````````````````````````` example Embedded Spaces: 1
+text { attribute=value}
+.
+text
+.
+Document[0, 26]
+ Paragraph[0, 26]
+ Text[0, 4] chars:[0, 4, "text"]
+ AttributesNode[5, 25] textOpen:[5, 6, "{"] text:[6, 24, " attribute=value"] textClose:[24, 25, "}"]
+ AttributeNode[9, 24] name:[9, 18, "attribute"] sep:[18, 19, "="] value:[19, 24, "value"]
+````````````````````````````````
+
+
+trailing spaces
+
+```````````````````````````````` example Embedded Spaces: 2
text {attribute=value }
.
text
@@ -1784,11 +2378,95 @@ text {attribute=value }
Document[0, 26]
Paragraph[0, 26]
Text[0, 4] chars:[0, 4, "text"]
- AttributesNode[5, 25] textOpen:[5, 6, "{"] text:[6, 21, "attribute=value"] textClose:[24, 25, "}"]
+ AttributesNode[5, 25] textOpen:[5, 6, "{"] text:[6, 24, "attribute=value "] textClose:[24, 25, "}"]
AttributeNode[6, 21] name:[6, 15, "attribute"] sep:[15, 16, "="] value:[16, 21, "value"]
````````````````````````````````
+Attributes go to link or element
+
+```````````````````````````````` example Embedded Spaces: 3
+Work with
+[Markdown]{style="color:[[LINK]]"} files like you do with other languages in the IDE:
+
+[Markdown]: https://example.com
+.
+Work with
+Markdown files like you do with other languages in the IDE:
+.
+Document[0, 129]
+ Paragraph[0, 96] isTrailingBlankLine
+ Text[0, 9] chars:[0, 9, "Work with"]
+ SoftLineBreak[9, 10]
+ LinkRef[10, 20] referenceOpen:[10, 11, "["] reference:[11, 19, "Markdown"] referenceClose:[19, 20, "]"]
+ Text[11, 19] chars:[11, 19, "Markdown"]
+ AttributesNode[20, 44] textOpen:[20, 21, "{"] text:[21, 43, "style=\"color:[[LINK]]\""] textClose:[43, 44, "}"]
+ AttributeNode[21, 43] name:[21, 26, "style"] sep:[26, 27, "="] valueOpen:[27, 28, "\""] value:[28, 42, "color:[[LINK]]"] valueClose:[42, 43, "\""]
+ Text[44, 95] chars:[44, 95, " file … IDE:"]
+ Reference[97, 128] refOpen:[97, 98, "["] ref:[98, 106, "Markdown"] refClose:[106, 108, "]:"] url:[109, 128, "https://example.com"]
+````````````````````````````````
+
+
+```````````````````````````````` example Embedded Spaces: 4
+Work with
+![Markdown]{style="color:[[LINK]]"} files like you do with other languages in the IDE:
+
+[Markdown]: https://example.com/image.png
+.
+Work with
+ files like you do with other languages in the IDE:
+.
+Document[0, 140]
+ Paragraph[0, 97] isTrailingBlankLine
+ Text[0, 9] chars:[0, 9, "Work with"]
+ SoftLineBreak[9, 10]
+ ImageRef[10, 21] referenceOpen:[10, 12, "!["] reference:[12, 20, "Markdown"] referenceClose:[20, 21, "]"]
+ Text[12, 20] chars:[12, 20, "Markdown"]
+ AttributesNode[21, 45] textOpen:[21, 22, "{"] text:[22, 44, "style=\"color:[[LINK]]\""] textClose:[44, 45, "}"]
+ AttributeNode[22, 44] name:[22, 27, "style"] sep:[27, 28, "="] valueOpen:[28, 29, "\""] value:[29, 43, "color:[[LINK]]"] valueClose:[43, 44, "\""]
+ Text[45, 96] chars:[45, 96, " file … IDE:"]
+ Reference[98, 139] refOpen:[98, 99, "["] ref:[99, 107, "Markdown"] refClose:[107, 109, "]:"] url:[110, 139, "https://example.com/image.png"]
+````````````````````````````````
+
+
+```````````````````````````````` example Embedded Spaces: 5
+Work with
+[Markdown](https://example.com){style="color:[[LINK]]"} files like you do with other languages in the IDE:
+.
+Work with
+Markdown files like you do with other languages in the IDE:
+.
+Document[0, 117]
+ Paragraph[0, 117]
+ Text[0, 9] chars:[0, 9, "Work with"]
+ SoftLineBreak[9, 10]
+ Link[10, 41] textOpen:[10, 11, "["] text:[11, 19, "Markdown"] textClose:[19, 20, "]"] linkOpen:[20, 21, "("] url:[21, 40, "https://example.com"] pageRef:[21, 40, "https://example.com"] linkClose:[40, 41, ")"]
+ Text[11, 19] chars:[11, 19, "Markdown"]
+ AttributesNode[41, 65] textOpen:[41, 42, "{"] text:[42, 64, "style=\"color:[[LINK]]\""] textClose:[64, 65, "}"]
+ AttributeNode[42, 64] name:[42, 47, "style"] sep:[47, 48, "="] valueOpen:[48, 49, "\""] value:[49, 63, "color:[[LINK]]"] valueClose:[63, 64, "\""]
+ Text[65, 116] chars:[65, 116, " file … IDE:"]
+````````````````````````````````
+
+
+```````````````````````````````` example Embedded Spaces: 6
+Work with
+{style="color:[[LINK]]"} files like you do with other languages in the IDE:
+.
+Work with
+ files like you do with other languages in the IDE:
+.
+Document[0, 128]
+ Paragraph[0, 128]
+ Text[0, 9] chars:[0, 9, "Work with"]
+ SoftLineBreak[9, 10]
+ Image[10, 52] textOpen:[10, 12, "!["] text:[12, 20, "Markdown"] textClose:[20, 21, "]"] linkOpen:[21, 22, "("] url:[22, 51, "https://example.com/image.png"] pageRef:[22, 51, "https://example.com/image.png"] linkClose:[51, 52, ")"]
+ Text[12, 20] chars:[12, 20, "Markdown"]
+ AttributesNode[52, 76] textOpen:[52, 53, "{"] text:[53, 75, "style=\"color:[[LINK]]\""] textClose:[75, 76, "}"]
+ AttributeNode[53, 75] name:[53, 58, "style"] sep:[58, 59, "="] valueOpen:[59, 60, "\""] value:[60, 74, "color:[[LINK]]"] valueClose:[74, 75, "\""]
+ Text[76, 127] chars:[76, 127, " file … IDE:"]
+````````````````````````````````
+
+
## Translator Encoding
```````````````````````````````` example Translator Encoding: 1
@@ -1836,3 +2514,5 @@ Document[0, 28]
````````````````````````````````
+[Markdown]: https://daringfireball.net/projects/markdown
+
diff --git a/flexmark-ext-autolink/pom.xml b/flexmark-ext-autolink/pom.xml
index 575cdc97e..07e9b4e0b 100644
--- a/flexmark-ext-autolink/pom.xml
+++ b/flexmark-ext-autolink/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-autolink
diff --git a/flexmark-ext-definition/pom.xml b/flexmark-ext-definition/pom.xml
index 07b473de4..6385963fa 100644
--- a/flexmark-ext-definition/pom.xml
+++ b/flexmark-ext-definition/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-definition
diff --git a/flexmark-ext-emoji/pom.xml b/flexmark-ext-emoji/pom.xml
index 71baad924..7512b406b 100644
--- a/flexmark-ext-emoji/pom.xml
+++ b/flexmark-ext-emoji/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-emoji
diff --git a/flexmark-ext-enumerated-reference/pom.xml b/flexmark-ext-enumerated-reference/pom.xml
index c81eb7db6..f150dc14e 100644
--- a/flexmark-ext-enumerated-reference/pom.xml
+++ b/flexmark-ext-enumerated-reference/pom.xml
@@ -4,7 +4,7 @@
com.vladsch.flexmark
flexmark-java
- 0.35.6
+ 0.35.10
flexmark-ext-enumerated-reference
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedOrdinalRenderer.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedOrdinalRenderer.java
new file mode 100644
index 000000000..995b8e35b
--- /dev/null
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedOrdinalRenderer.java
@@ -0,0 +1,25 @@
+package com.vladsch.flexmark.ext.enumerated.reference;
+
+public interface EnumeratedOrdinalRenderer {
+ /**
+ * Start of rendering for all renderings
+ *
+ * @param renderings renderings which will be rendered
+ */
+ void startRendering(EnumeratedReferenceRendering[] renderings);
+
+ /**
+ * Render final reference format
+ *
+ * @param referenceOrdinal ordinal for the reference
+ * @param referenceFormat reference format or null
+ * @param defaultText default text to use if referenceFormat is null or not being used
+ * @param needSeparator true if need to add separator character before adding text or rendering reference format
+ */
+ void render(final int referenceOrdinal, EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator);
+
+ /**
+ * After Rendering is complete
+ */
+ void endRendering();
+}
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBase.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBase.java
index f5c110e32..961d1aeb8 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBase.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBase.java
@@ -7,7 +7,7 @@
/**
* A EnumeratedReference node
*/
-public class EnumeratedReferenceBase extends CustomNode implements DelimitedNode, DoNotDecorate, ReferencingNode {
+public class EnumeratedReferenceBase extends Node implements DelimitedNode, DoNotDecorate, ReferencingNode {
protected BasedSequence openingMarker = BasedSequence.NULL;
protected BasedSequence text = BasedSequence.NULL;
protected BasedSequence closingMarker = BasedSequence.NULL;
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBlock.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBlock.java
index 7bfffe71c..d728fe930 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBlock.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceBlock.java
@@ -9,7 +9,7 @@
/**
* A EnumeratedReference block node
*/
-public class EnumeratedReferenceBlock extends CustomBlock implements ReferenceNode, ParagraphItemContainer {
+public class EnumeratedReferenceBlock extends Block implements ReferenceNode, ParagraphItemContainer {
protected BasedSequence openingMarker = BasedSequence.NULL;
protected BasedSequence text = BasedSequence.NULL;
protected BasedSequence closingMarker = BasedSequence.NULL;
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceRendering.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceRendering.java
new file mode 100644
index 000000000..67e7bbda6
--- /dev/null
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/EnumeratedReferenceRendering.java
@@ -0,0 +1,13 @@
+package com.vladsch.flexmark.ext.enumerated.reference;
+
+public class EnumeratedReferenceRendering {
+ public final EnumeratedReferenceBlock referenceFormat;
+ public final String referenceType;
+ public final int referenceOrdinal;
+
+ public EnumeratedReferenceRendering(final EnumeratedReferenceBlock referenceFormat, final String referenceType, final int referenceOrdinal) {
+ this.referenceFormat = referenceFormat;
+ this.referenceType = referenceType;
+ this.referenceOrdinal = referenceOrdinal;
+ }
+}
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumRefTextCollectingVisitor.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumRefTextCollectingVisitor.java
index 6f498cf95..a77705259 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumRefTextCollectingVisitor.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumRefTextCollectingVisitor.java
@@ -1,8 +1,7 @@
package com.vladsch.flexmark.ext.enumerated.reference.internal;
import com.vladsch.flexmark.ast.*;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceLink;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceText;
+import com.vladsch.flexmark.ext.enumerated.reference.*;
import com.vladsch.flexmark.util.sequence.BasedSequence;
import com.vladsch.flexmark.util.sequence.SegmentedSequenceBuilder;
@@ -10,9 +9,15 @@
public class EnumRefTextCollectingVisitor {
private SegmentedSequenceBuilder out;
private final NodeVisitor myVisitor;
- private final int ordinal;
+ private int myOrdinal;
+
+ public EnumRefTextCollectingVisitor() {
+ this(0);
+ }
public EnumRefTextCollectingVisitor(int ordinal) {
+ myOrdinal = ordinal;
+
myVisitor = new NodeVisitor(
new VisitHandler(Text.class, new Visitor() {
@Override
@@ -57,39 +62,102 @@ public void visit(EnumeratedReferenceLink node) {
}
})
);
- this.ordinal = ordinal;
}
public String getText() {
return out.toString();
}
+ /**
+ * @param node format node
+ * @deprecated use {@link #collect(BasedSequence, EnumeratedReferenceRendering[], String)}
+ */
+ @Deprecated
public void collect(Node node) {
out = new SegmentedSequenceBuilder(node.getChars());
myVisitor.visit(node);
}
+ /**
+ * @param node format node
+ * @deprecated use {@link #collectAndGetText(BasedSequence, EnumeratedReferenceRendering[], String)}
+ */
+ @Deprecated
public String collectAndGetText(Node node) {
collect(node);
return out.toString();
}
+ /**
+ * @param node format node
+ * @deprecated use {@link #collectAndGetSegments(BasedSequence, EnumeratedReferenceRendering[], String)}
+ */
+ @Deprecated
public BasedSequence[] collectAndGetSegments(Node node) {
collect(node);
return out.toSegments();
}
+ /**
+ * @param node format node
+ * @deprecated use {@link #collectAndGetSequence(BasedSequence, EnumeratedReferenceRendering[], String)}
+ */
+ @Deprecated
public BasedSequence collectAndGetSequence(Node node) {
collect(node);
return out.toBasedSequence();
}
+ public void collect(BasedSequence basedSequence, final EnumeratedReferenceRendering[] renderings, final String defaultFormat) {
+ out = new SegmentedSequenceBuilder(basedSequence);
+
+ EnumeratedReferences.renderReferenceOrdinals(renderings, defaultFormat, new EnumeratedOrdinalRenderer() {
+ @Override
+ public void startRendering(final EnumeratedReferenceRendering[] renderings) {
+
+ }
+
+ @Override
+ public void render(final int referenceOrdinal, final EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator) {
+ if (needSeparator) out.append(".");
+
+ if (referenceFormat != null) {
+ myOrdinal = referenceOrdinal;
+ collect(referenceFormat);
+ } else {
+ // use default text
+ out.append(defaultText);
+ }
+ }
+
+ @Override
+ public void endRendering() {
+
+ }
+ });
+ }
+
+ public String collectAndGetText(BasedSequence basedSequence, EnumeratedReferenceRendering[] renderings, final String defaultFormat) {
+ collect(basedSequence, renderings, defaultFormat);
+ return out.toString();
+ }
+
+ public BasedSequence[] collectAndGetSegments(BasedSequence basedSequence, EnumeratedReferenceRendering[] renderings, final String defaultFormat) {
+ collect(basedSequence, renderings, defaultFormat);
+ return out.toSegments();
+ }
+
+ public BasedSequence collectAndGetSequence(BasedSequence basedSequence, EnumeratedReferenceRendering[] renderings, final String defaultFormat) {
+ collect(basedSequence, renderings, defaultFormat);
+ return out.toBasedSequence();
+ }
+
private void visit(EnumeratedReferenceText node) {
final String text = node.getText().toString();
if (text.isEmpty()) {
// placeholder for ordinal
- out.append(String.valueOf(ordinal));
+ out.append(String.valueOf(myOrdinal));
}
}
@@ -98,7 +166,7 @@ private void visit(EnumeratedReferenceLink node) {
if (text.isEmpty()) {
// placeholder for ordinal
- out.append(String.valueOf(ordinal));
+ out.append(String.valueOf(myOrdinal));
}
}
@@ -108,7 +176,7 @@ private void visit(SoftLineBreak node) {
private void visit(HardLineBreak node) {
final BasedSequence chars = node.getChars();
- out.append(chars.subSequence(chars.length()-1, chars.length()));
+ out.append(chars.subSequence(chars.length() - 1, chars.length()));
}
private void visit(HtmlEntity node) {
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceBlockParser.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceBlockParser.java
index 7a53378ec..26f81007a 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceBlockParser.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceBlockParser.java
@@ -13,7 +13,7 @@
import java.util.regex.Pattern;
public class EnumeratedReferenceBlockParser extends AbstractBlockParser {
- static String ENUM_REF_ID = ".*";
+ static String ENUM_REF_ID = "(?:[^0-9].*)?";
static Pattern ENUM_REF_ID_PATTERN = Pattern.compile("\\[[\\@|#]\\s*(" + ENUM_REF_ID + ")\\s*\\]");
static Pattern ENUM_REF_DEF_PATTERN = Pattern.compile("^\\[[\\@]\\s*(" + ENUM_REF_ID + ")\\s*\\]:");
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceLinkRefProcessor.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceLinkRefProcessor.java
index 1f9813e89..6077f7607 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceLinkRefProcessor.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceLinkRefProcessor.java
@@ -30,7 +30,7 @@ public int getBracketNestingLevel() {
@Override
public boolean isMatch(BasedSequence nodeChars) {
- return nodeChars.length() >= 3 && nodeChars.charAt(0) == '[' && (nodeChars.charAt(1) == '@' || nodeChars.charAt(1) == '#') && nodeChars.endCharAt(1) == ']';
+ return nodeChars.length() >= 3 && nodeChars.charAt(0) == '[' && (nodeChars.charAt(1) == '@' || nodeChars.charAt(1) == '#') && nodeChars.endCharAt(1) == ']' && (nodeChars.length() == 3 || !Character.isDigit(nodeChars.charAt(2)));
}
@Override
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodePostProcessor.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodePostProcessor.java
index c8f6f1ddc..ab6880821 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodePostProcessor.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodePostProcessor.java
@@ -1,19 +1,27 @@
package com.vladsch.flexmark.ext.enumerated.reference.internal;
import com.vladsch.flexmark.ast.Document;
+import com.vladsch.flexmark.ast.Heading;
import com.vladsch.flexmark.ast.Node;
import com.vladsch.flexmark.ext.attributes.AttributeNode;
import com.vladsch.flexmark.ext.attributes.AttributesNode;
import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceText;
+import com.vladsch.flexmark.html.renderer.HeaderIdGenerator;
+import com.vladsch.flexmark.html.renderer.HtmlIdGenerator;
import com.vladsch.flexmark.parser.block.NodePostProcessor;
import com.vladsch.flexmark.parser.block.NodePostProcessorFactory;
import com.vladsch.flexmark.util.NodeTracker;
+import com.vladsch.flexmark.util.sequence.BasedSequence;
public class EnumeratedReferenceNodePostProcessor extends NodePostProcessor {
private final EnumeratedReferences enumeratedReferences;
+ private final HtmlIdGenerator headerIdGenerator;
public EnumeratedReferenceNodePostProcessor(Document document) {
enumeratedReferences = EnumeratedReferenceExtension.ENUMERATED_REFERENCE_ORDINALS.getFrom(document);
+ headerIdGenerator = new HeaderIdGenerator.Factory().create();
+ headerIdGenerator.generateIds(document);
}
@Override
@@ -26,6 +34,19 @@ public void process(NodeTracker state, Node node) {
if (((AttributeNode) attributeNode).isId()) {
final String text = ((AttributeNode) attributeNode).getValue().toString();
enumeratedReferences.add(text);
+ break;
+ }
+ }
+ }
+ } else if (node instanceof Heading) {
+ // see if it has bare enum reference text
+ for (Node child : node.getChildren()) {
+ if (child instanceof EnumeratedReferenceText) {
+ BasedSequence text = ((EnumeratedReferenceText) child).getText();
+ String type = EnumeratedReferenceRepository.getType(text.toString());
+ if (type.isEmpty() || text.equals(type + ":")) {
+ String id = (type.isEmpty() ? text : type) + ":" + headerIdGenerator.getId(node);
+ enumeratedReferences.add(id);
}
}
}
@@ -35,7 +56,7 @@ public void process(NodeTracker state, Node node) {
public static class Factory extends NodePostProcessorFactory {
public Factory() {
super(false);
- addNodes(AttributesNode.class);
+ addNodes(AttributesNode.class, Heading.class);
}
@Override
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodeRenderer.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodeRenderer.java
index c8091bc47..e2824b49d 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodeRenderer.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceNodeRenderer.java
@@ -1,11 +1,9 @@
package com.vladsch.flexmark.ext.enumerated.reference.internal;
import com.vladsch.flexmark.ast.Document;
+import com.vladsch.flexmark.ast.Heading;
import com.vladsch.flexmark.ast.Node;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceBlock;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceLink;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceText;
+import com.vladsch.flexmark.ext.enumerated.reference.*;
import com.vladsch.flexmark.html.CustomNodeRenderer;
import com.vladsch.flexmark.html.HtmlWriter;
import com.vladsch.flexmark.html.renderer.*;
@@ -15,30 +13,33 @@
import java.util.LinkedHashSet;
import java.util.Set;
-import static com.vladsch.flexmark.html.renderer.RenderingPhase.BODY_TOP;
-
public class EnumeratedReferenceNodeRenderer implements PhasedNodeRenderer
// , PhasedNodeRenderer
{
private final EnumeratedReferenceOptions options;
private EnumeratedReferences enumeratedOrdinals;
private int ordinal;
+ private final HtmlIdGenerator headerIdGenerator; // used for enumerated text reference
public EnumeratedReferenceNodeRenderer(DataHolder options) {
this.options = new EnumeratedReferenceOptions(options);
ordinal = 0;
+ headerIdGenerator = new HeaderIdGenerator.Factory().create();
}
@Override
public Set getRenderingPhases() {
LinkedHashSet phaseSet = new LinkedHashSet<>();
- phaseSet.add(BODY_TOP);
+ phaseSet.add(RenderingPhase.HEAD_TOP);
+ phaseSet.add(RenderingPhase.BODY_TOP);
return phaseSet;
}
@Override
public void renderDocument(final NodeRendererContext context, final HtmlWriter html, final Document document, final RenderingPhase phase) {
- if (phase == BODY_TOP) {
+ if (phase == RenderingPhase.HEAD_TOP) {
+ headerIdGenerator.generateIds(document);
+ } else if (phase == RenderingPhase.BODY_TOP) {
enumeratedOrdinals = EnumeratedReferenceExtension.ENUMERATED_REFERENCE_ORDINALS.getFrom(document);
}
}
@@ -54,52 +55,82 @@ public Set> getNodeRenderingHandlers() {
return set;
}
- private void render(EnumeratedReferenceLink node, NodeRendererContext context, HtmlWriter html) {
+ private void render(final EnumeratedReferenceLink node, final NodeRendererContext context, final HtmlWriter html) {
final String text = node.getText().toString();
if (text.isEmpty()) {
// placeholder for ordinal
html.text(String.valueOf(ordinal));
} else {
- Node referenceFormat = enumeratedOrdinals.getFormatNode(text);
- int wasOrdinal = ordinal;
- ordinal = enumeratedOrdinals.getOrdinal(text);
- if (referenceFormat != null) {
- String title = new EnumRefTextCollectingVisitor(ordinal).collectAndGetText(referenceFormat);
- html.withAttr().attr("href", "#" + text).attr("title", title).tag("a");
- context.renderChildren(referenceFormat);
- html.tag("/a");
- } else {
- // no format, just output type space ordinal
- final String defaultText = String.format("%s %d", EnumeratedReferenceRepository.getType(text), ordinal);
- html.withAttr().attr("href", "#" + text).attr("title", defaultText).tag("a");
- html.text(defaultText);
- html.tag("/a");
- }
- ordinal = wasOrdinal;
+ enumeratedOrdinals.renderReferenceOrdinals(text, null, new EnumeratedOrdinalRenderer() {
+ @Override
+ public void startRendering(final EnumeratedReferenceRendering[] renderings) {
+ String title = new EnumRefTextCollectingVisitor().collectAndGetText(node.getChars().getBaseSequence(), renderings, null);
+ html.withAttr().attr("href", "#" + text).attr("title", title).tag("a");
+ }
+
+ @Override
+ public void render(final int referenceOrdinal, final EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator) {
+ EnumeratedReferenceNodeRenderer.this.ordinal = referenceOrdinal;
+ if (needSeparator) {
+ html.text(".");
+ }
+
+ if (referenceFormat != null) {
+ context.renderChildren(referenceFormat);
+ } else {
+ html.text(defaultText);
+ }
+ }
+
+ @Override
+ public void endRendering() {
+ html.tag("/a");
+ }
+ });
}
}
- private void render(EnumeratedReferenceText node, NodeRendererContext context, HtmlWriter html) {
- final String text = node.getText().toString();
+ private void render(EnumeratedReferenceText node, final NodeRendererContext context, final HtmlWriter html) {
+ String text = node.getText().toString();
if (text.isEmpty()) {
// placeholder for ordinal
html.text(String.valueOf(ordinal));
} else {
- Node referenceFormat = enumeratedOrdinals.getFormatNode(text);
- int wasOrdinal = ordinal;
- ordinal = enumeratedOrdinals.getOrdinal(text);
-
- final String defaultText = String.format("%s %d", EnumeratedReferenceRepository.getType(text), ordinal);
-
- if (referenceFormat != null) {
- context.renderChildren(referenceFormat);
- } else {
- // no format, just output ordinal
- html.text(defaultText);
+ String type = EnumeratedReferenceRepository.getType(text.toString());
+
+ if (type.isEmpty() || text.equals(type + ":")) {
+ Node parent = node.getAncestorOfType(Heading.class);
+
+ if (parent instanceof Heading) {
+ text = (type.isEmpty() ? text : type) + ":" + headerIdGenerator.getId(parent);
+ }
}
- ordinal = wasOrdinal;
+
+ enumeratedOrdinals.renderReferenceOrdinals(text, null, new EnumeratedOrdinalRenderer() {
+ @Override
+ public void startRendering(final EnumeratedReferenceRendering[] renderings) {
+
+ }
+
+ @Override
+ public void render(final int referenceOrdinal, final EnumeratedReferenceBlock referenceFormat, final String defaultText, final boolean needSeparator) {
+ if (needSeparator) html.text(".");
+
+ if (referenceFormat != null) {
+ EnumeratedReferenceNodeRenderer.this.ordinal = referenceOrdinal;
+ context.renderChildren(referenceFormat);
+ } else {
+ html.text(defaultText);
+ }
+ }
+
+ @Override
+ public void endRendering() {
+
+ }
+ });
}
}
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceRepository.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceRepository.java
index e781cce84..3130915fe 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceRepository.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferenceRepository.java
@@ -18,7 +18,7 @@ public class EnumeratedReferenceRepository extends NodeRepository referencedEnumeratedReferenceBlocks = new ArrayList();
public static String getType(final String text) {
- int pos = text.indexOf(':');
+ int pos = text.lastIndexOf(':');
if (pos > 0) {
return text.subSequence(0, pos).toString();
} else {
diff --git a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferences.java b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferences.java
index 18535a5e3..9992a3067 100644
--- a/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferences.java
+++ b/flexmark-ext-enumerated-reference/src/main/java/com/vladsch/flexmark/ext/enumerated/reference/internal/EnumeratedReferences.java
@@ -1,16 +1,18 @@
package com.vladsch.flexmark.ext.enumerated.reference.internal;
import com.vladsch.flexmark.ast.Node;
-import com.vladsch.flexmark.ext.enumerated.reference.EnumeratedReferenceExtension;
+import com.vladsch.flexmark.ext.enumerated.reference.*;
import com.vladsch.flexmark.util.options.DataHolder;
import java.util.HashMap;
public class EnumeratedReferences {
public static final String EMPTY_TYPE = "";
+ public static final int[] EMPTY_ORDINALS = new int[0];
+
private final EnumeratedReferenceRepository referenceRepository;
private final HashMap enumerationCounters;
- private final HashMap enumeratedReferenceOrdinals;
+ private final HashMap enumeratedReferenceOrdinals;
public EnumeratedReferences(DataHolder options) {
referenceRepository = EnumeratedReferenceExtension.ENUMERATED_REFERENCES.getFrom(options);
@@ -20,22 +22,56 @@ public EnumeratedReferences(DataHolder options) {
public void add(final String text) {
String type = EnumeratedReferenceRepository.getType(text);
- int ordinal;
- if (!enumerationCounters.containsKey(type)) {
- enumerationCounters.put(type, 2);
- ordinal = 1;
- } else {
- ordinal = enumerationCounters.get(type);
- enumerationCounters.put(type, ordinal + 1);
+
+ String[] types = type.split(":");
+ int[] ordinals = new int[types.length];
+
+ // replace all types but the last with ordinal of that type
+ StringBuilder nestedType = new StringBuilder();
+
+ int iMax = types.length;
+ for (int i = 0; i < iMax; i++) {
+ String typeText = types[i];
+ nestedType.append(typeText);
+
+ String nestedTypeKey = nestedType.toString();
+
+ if (i < iMax - 1) {
+ Integer ordinalInt = enumerationCounters.get(nestedTypeKey);
+ int typeOrdinal = ordinalInt == null ? 0 : ordinalInt;
+
+ nestedType.append(':').append(typeOrdinal).append(':');
+ ordinals[i] = typeOrdinal;
+ } else {
+ // last type gets defined if it does not exist
+ int ordinal;
+
+ if (!enumerationCounters.containsKey(nestedTypeKey)) {
+ enumerationCounters.put(nestedTypeKey, 1);
+ ordinal = 1;
+ } else {
+ ordinal = enumerationCounters.get(nestedTypeKey) + 1;
+ enumerationCounters.put(nestedTypeKey, ordinal);
+ }
+
+ ordinals[i] = ordinal;
+ }
}
// save the ordinal for this reference and type
- enumeratedReferenceOrdinals.put(text, ordinal);
+ enumeratedReferenceOrdinals.put(text, ordinals);
}
+ /**
+ * @param text anchor id with type reference
+ * @return ordinal or 0 for anchor id
+ * @deprecated only returns the last ordinal for the text, does not support compound ordinal numbering
+ * use {@link #getEnumeratedReferenceOrdinals(String)} to get compound ordinals
+ */
+ @Deprecated
public int getOrdinal(final String text) {
- final Integer ordinal = enumeratedReferenceOrdinals.get(text);
- return ordinal == null ? 0 : ordinal;
+ final int[] ordinals = enumeratedReferenceOrdinals.get(text);
+ return ordinals == null ? 0 : ordinals[ordinals.length - 1];
}
/**
@@ -43,9 +79,69 @@ public int getOrdinal(final String text) {
*
* @param text reference text
* @return enumerated reference block or null if not defined
+ * @deprecated use {@link #getEnumeratedReferenceOrdinals(String)} instead which supports compound enumerated ordinals
*/
+ @Deprecated
public Node getFormatNode(final String text) {
String type = EnumeratedReferenceRepository.getType(text);
return referenceRepository.get(type);
}
+
+ public EnumeratedReferenceRendering[] getEnumeratedReferenceOrdinals(final String text) {
+ String type = EnumeratedReferenceRepository.getType(text);
+
+ String[] types = type.split(":");
+ EnumeratedReferenceRendering[] renderings = new EnumeratedReferenceRendering[types.length];
+
+ int[] ordinals = enumeratedReferenceOrdinals.get(text);
+
+ if (ordinals == null) {
+ ordinals = EMPTY_ORDINALS;
+ }
+
+ int iMax = types.length;
+ for (int i = 0; i < iMax; i++) {
+ String typeText = types[i];
+ EnumeratedReferenceBlock referenceFormat = referenceRepository.get(typeText);
+ int ordinal = i < ordinals.length ? ordinals[i] : 0;
+ renderings[i] = new EnumeratedReferenceRendering(referenceFormat, typeText, ordinal);
+ }
+
+ return renderings;
+ }
+
+ public void renderReferenceOrdinals(final String text, final String defaultFormat, EnumeratedOrdinalRenderer renderer) {
+ EnumeratedReferenceRendering[] renderings = getEnumeratedReferenceOrdinals(text);
+ renderReferenceOrdinals(renderings, defaultFormat, renderer);
+ }
+
+ public static void renderReferenceOrdinals(EnumeratedReferenceRendering[] renderings, final String defaultFormat, EnumeratedOrdinalRenderer renderer) {
+ boolean needSeparator = false;
+
+ String useDefaultFormat = defaultFormat == null ? "%s %d" : defaultFormat;
+
+ renderer.startRendering(renderings);
+
+ for (EnumeratedReferenceRendering rendering : renderings) {
+ int ordinal = rendering.referenceOrdinal;
+
+ String defaultText = String.format(useDefaultFormat, rendering.referenceType, rendering.referenceOrdinal);
+
+ renderer.render(ordinal, rendering.referenceFormat, defaultText, needSeparator);
+
+ if (rendering.referenceFormat != null) {
+ Node lastChild = rendering.referenceFormat.getLastChild();
+ while (lastChild != null && !(lastChild instanceof EnumeratedReferenceBase)) {
+ lastChild = lastChild.getLastChild();
+ }
+
+ needSeparator = lastChild instanceof EnumeratedReferenceBase && ((EnumeratedReferenceBase) lastChild).getText().isEmpty();
+ } else {
+ char c = defaultText.charAt(defaultText.length() - 1);
+ needSeparator = Character.isUnicodeIdentifierPart(c);
+ }
+ }
+
+ renderer.endRendering();
+ }
}
diff --git a/flexmark-ext-enumerated-reference/src/main/javadoc/information_source.png b/flexmark-ext-enumerated-reference/src/main/javadoc/information_source.png
new file mode 100644
index 000000000..e1e8ede6e
Binary files /dev/null and b/flexmark-ext-enumerated-reference/src/main/javadoc/information_source.png differ
diff --git a/flexmark-ext-enumerated-reference/src/main/javadoc/overview.html b/flexmark-ext-enumerated-reference/src/main/javadoc/overview.html
index 70898e6e2..c45d9712a 100644
--- a/flexmark-ext-enumerated-reference/src/main/javadoc/overview.html
+++ b/flexmark-ext-enumerated-reference/src/main/javadoc/overview.html
@@ -9,6 +9,7 @@
the category and reference is used to uniquely identify an element in the category. The anchor
id of the element will be type:reference and this must be used by the enumerated reference
label or link.
+ type must not start with a digit.
To refer to the element in the document use the enumerated reference elements:
@@ -34,10 +35,10 @@
For example:
-{#fig:test}
+{#fig:test}
[#fig:test]
-{#fig:test2}
+{#fig:test2}
[#fig:test2]
| heading | heading | heading |
@@ -58,10 +59,10 @@
is equivalent to the following without having to manually keep track of numbering of individual
elements:
-{#fig:test}
+{#fig:test}
Figure 1.
-{#fig:test2}
+{#fig:test2}
Figure 2.
| table |
@@ -96,5 +97,71 @@
<p>See <a href="#fig:test"><span>Figure 1.</span></a></p>
<p>See <a href="#tbl:test"><span>Table 1.</span></a></p>
+Enumerated Reference Text in Headings
+Because headings contain their own anchor id an enumerated reference with only a type is
+allowed in headings and has the effect of adding an incremented counter to heading text.
+# [#hd1] Heading 1
+
+# [#hd1] Heading 2
+
+# [#hd1] Heading 3
+
+[@hd1]: [#].
+
+Will render as:
+<h1>1. Heading 1</h1>
+<h1>2. Heading 2</h1>
+<h1>3. Heading 3</h1>
+
+Compound Types
+Compound enumerated reference types are created by including more than one type reference with
+: separating each type.
+The effect of compound reference is that all child reference counters are reset to 1 for change
+in parent type’s ordinal allowing creation of legal numbering using enumerated references.
+ When combining enumerated type ordinal strings for compound enumerated
+reference if the last element of the enumerated format definition is an empty enumerated
+reference text [#] or empty enumerated reference link [@] then a . will be added after the
+parent enumerated ordinal text.
+ For compound type for headings without an element id, a trailing : is
+needed to prevent the last type from being interpreted as the element id.
+# [#hd1] Heading 1
+
+## [#hd1:hd2:] Heading 1.1
+
+### [#hd1:hd2:hd3:] Heading 1.1.1
+
+### [#hd1:hd2:hd3:] Heading 1.1.2
+
+## [#hd1:hd2:] Heading 1.2
+
+### [#hd1:hd2:hd3:] Heading 1.2.1
+
+### [#hd1:hd2:hd3:] Heading 1.2.2
+
+# [#hd1] Heading 2
+
+## [#hd1:hd2:] Heading 2.1
+
+### [#hd1:hd2:hd3:] Heading 2.1.1
+
+### [#hd1:hd2:hd3:] Heading 2.1.2
+
+[@hd1]: [#].
+[@hd2]: [#].
+[@hd2]: [#].
+
+Will render as:
+<h1>1. Heading 1</h1>
+<h2>1.1. Heading 1.1</h2>
+<h3>1.1.1. Heading 1.1.1</h3>
+<h3>1.1.2. Heading 1.1.2</h3>
+<h2>1.2. Heading 1.2</h2>
+<h3>1.2.1. Heading 1.2.1</h3>
+<h3>1.2.2. Heading 1.2.2</h3>
+<h1>2. Heading 2</h1>
+<h2>2.1. Heading 2.1</h2>
+<h3>2.1.1. Heading 2.1.1</h3>
+<h3>2.1.2. Heading 2.1.2</h3>
+