-
Notifications
You must be signed in to change notification settings - Fork 296
Markdown Merge API
Formatter doubles as a merge renderer to combine multiple markdown documents into a single document while trying to preserve reference resolution within each document.
ℹ️ in versions prior to 0.60.0 formatter functionality was implemented in
flexmark-formatter module and required an additional dependency.
This is done by adding a numeric sequence to any references which create a conflict definition between documents.
ℹ️ By default flexmark-ext-abbreviation extension elements do not change
abbreviation and abbreviation definitions to make them unique since abbreviations are expected
to be defined to the same values across documents and adding a numeric suffix would change the
displayed text. However, this behavior can be changed by setting
AbbreviationExtension.MAKE_MERGED_ABBREVIATIONS_UNIQUE to true in the formatter options used
to merge the documents.
If Formatter.DEFAULT_LINK_RESOLVER property is set to true then doc relative and doc root
relative (ones starting with /) will be changed in each document to a link prefixed with
Formatter.DOC_RELATIVE_URL or Formatter.DOC_ROOT_URL property set on each merged document.
This allows all links and image references to be mapped a link which will resolve to the correct
target in the merged document. These properties should be set to either the full path prefix for
the document or some prefix which will result in merged document links to resolve properly. The
details of what this value should be does not depend on this library but on the link resolution
used for rendering the merged document and its doc relative and doc root URL properties.
-
Formatter.mergeRender(Document[] documents, Appendable out, int maxBlankLines, HtmlIdGeneratorFactory idGeneratorFactory)- is the most general api, with:-
documentsis the list of documents to be merged. -
outthe appendable for merged document output -
maxBlankLinesthe maximum number of blank lines to allow after each document in the merged result -
idGeneratorFactoryis the HTML id generator factory to use for generating heading ids. Ifnullthen default HTML renderer header id generator will be used.
-
-
void Formatter.mergeRender(Document[], Appendable, HtmlIdGeneratorFactory), will usevoid Formatter.MAX_TRAILING_BLANK_LINESproperty formaxBlankLines, the rest as above -
String Formatter.mergeRender(Document[], int, HtmlIdGeneratorFactory), will return the string value of the resulting merged document.
Sample code: FormatterMergeSample.java
Conflicting headings in merged document will result in unique heading id added as an explicit
attribute if the flexmark-ext-attributes extension is used. This will map local heading
references to the unique id resulting in correct header reference within a file. If the
attributes extension is not used then no unique id will be generated and all local heading links
will refer to the first matching heading.
Merging the following documents:
# Heading
[](#heading) # Heading
[](#heading) Will result in the merged markdown file:
# Heading
[](#heading)
# Heading {#heading1}
[](#heading1) Merge functionality is implemented using the formatter translation API without actually changing
any text, only references. This means that any custom reference elements which implement
translation rendering using the NodeRepositoryFormatter<> base class will be merge capable.
For examples of how references are handled it is best to reference implementation of core elements in CoreNodeFormatter.java or extensions: