Version History
- Release 0.60.0
- Next 0.61.xx
- 0.62.2
- 0.62.0
- 0.61.34
- 0.61.32
- 0.61.30
- 0.61.28
- 0.61.26
- 0.61.24
- 0.61.22
- 0.61.20
- 0.61.18
- 0.61.16
- 0.61.14
- 0.61.12
- 0.61.10
- 0.61.8
- 0.61.6
- 0.61.4
- 0.61.2
- 0.61.0
- 0.60.2
- 0.60.0
- 0.59.124
- 0.59.122
- 0.59.120
- 0.59.118
- 0.59.116
- 0.59.114
- 0.59.112
- 0.59.110
- 0.59.108
- 0.59.106
- 0.59.104
- 0.59.102
- 0.59.100
- 0.59.98
- 0.59.96
- 0.59.94
- 0.59.92
- 0.59.90
- 0.59.88
- 0.59.86
- 0.59.84
- 0.59.82
- 0.59.80
- 0.59.78
- 0.59.76
- 0.59.74
- 0.59.72
- 0.59.70
- 0.59.68
- 0.59.66
- 0.59.64
- 0.59.62
- 0.59.60
- 0.59.58
- 0.59.56
- 0.59.54
- 0.59.52
- 0.59.50
- 0.59.48
- 0.59.46
- 0.59.44
- 0.59.42
- 0.59.40
- 0.59.38
- 0.59.36
- 0.59.34
- 0.59.32
- 0.59.30
- 0.59.28
- 0.59.27
- 0.59.25
- 0.59.23
- 0.59.21
- 0.59.19
- 0.59.17
- 0.59.15
- 0.59.13
- 0.59.11
- 0.59.9
- 0.59.7
- 0.59.5
- 0.59.1
- 0.50.48
- 0.50.46
- 0.50.44
- 0.50.42
- 0.50.40
- 0.50.38
- 0.50.36
- 0.50.34
- 0.50.32
- 0.50.30
- 0.50.28
- 0.50.26
- 0.50.24
- 0.50.22
- 0.50.20
- 0.50.18
- 0.50.16
- 0.42.14
- 0.42.12
- 0.42.10
- 0.42.8
- 0.42.6
- 0.42.4
- 0.42.2
- 0.42.0
- 0.40.34
- 0.40.32
- 0.40.30
- 0.40.28
- 0.40.26
- 0.40.24
- 0.40.22
- 0.40.20
- 0.40.18
- 0.40.16
- 0.40.14
- 0.40.12
- 0.40.10
- 0.40.8
- 0.40.6
- 0.40.4
- 0.40.2
- 0.40.0
Please give feedback on the upcoming changes if you have concerns about breaking your code:
-
Break: split out generic AST utilities from
flexmark-util
module into separate smaller modules. IntelliJ IDEA migration to help with migration from 0.50.40 will be provided where needed if the package or class is changed.com.vladsch.flexmark.util
will no longer contain any files but will contain the separate utilities modules withflexmark-utils
module being an aggregate of all utilities modules, similar toflexmark-all
ast/
classes toflexmark-util-ast
builder/
classes toflexmark-util-builder
collection/
classes toflexmark-util-collection
data/
classes toflexmark-util-data
dependency/
classes toflexmark-util-dependency
format/
classes toflexmark-util-format
html/
classes toflexmark-util-html
mappers/
classes toflexmark-util-sequence
options/
classes toflexmark-util-options
sequence/
classes toflexmark-util-sequence
visitor/
classes toflexmark-util-visitor
-
Convert anonymous classes to lambda where possible.
-
refactor
flexmark-util
to eliminate dependency cycles between classes in different subdirectories. -
Break: delete deprecated properties, methods and classes
-
Add:
org.jetbrains:annotations:15.0
dependency to have@Nullable
/@NotNull
annotations added for all parameters. I use IntelliJ IDEA for development and it helps to have these annotations for analysis of potential problems and use with Kotlin. -
Break: refactor and cleanup tests to eliminate duplicated code and allow easier reuse of test cases with spec example data.
-
Break: move formatter tests to
flexmark-core-test
module to allow sharing of formatter base classes in extensions without causing dependency cycles in formatter module. -
Break: move formatter module into
flexmark
core. this module is almost always included anyway because most extension have a dependency on formatter for their custom formatting implementations. Having it as part of the core allows relying on its functionality in all modules. -
Break: move
com.vladsch.flexmark.spec
andcom.vladsch.flexmark.util
inflexmark-test-util
tocom.vladsch.flexmark.test.spec
andcom.vladsch.flexmark.test.util
respectively to respect the naming convention between modules and their packages. -
Break:
NodeVisitor
implementation details have changed. If you were overridingNodeVisitor.visit(Node)
in the previous version it is nowfinal
to ensure compile time error is generated. You will need to change your implementation. See comment in the class for instructions.ℹ️
com.vladsch.flexmark.util.ast.Visitor
is only needed for implementation ofNodeVisitor
andVisitHandler
. If you convert all anonymous implementations ofVisitHandler
to lambdas you can remove all imports forVisitor
.- Fix: remove old visitor like adapters and implement ones based on generic classes not linked to flexmark AST node.
- Deprecate old base classes:
com.vladsch.flexmark.util.ast.NodeAdaptedVisitor
see javadoc for classcom.vladsch.flexmark.util.ast.NodeAdaptingVisitHandler
com.vladsch.flexmark.util.ast.NodeAdaptingVisitor
- Fix: replace
PrefixedSubSequence
andSegmentedSequence.create()
with non builder arguments to useSequenceBuilder
throughout library code, except wherePrefixedSubSequence
is used as is without immediately wrapping inSegmentedSequence
. This happens anyway inSegmentedSequence.create
for non-builder arg, should make it explicit. - Fix: rewrite
LineAppendableImpl
to be compatible withSequenceBuilder
- optimize by not processing one char at a time. Split the sequence into regions of
interest and process the regions as one piece which the
SequenceBuilder
can optimize to base sequence quicker. - do not construct temporary
StringBuilder
but only keep the last line under construction temporary, with all previously constructed lines used for prior content. - use separate instance of sequence builder for the line under construction.
SegmentedSequence
construction is fast enough to not need a parallel string builder for context tests.
- optimize by not processing one char at a time. Split the sequence into regions of
interest and process the regions as one piece which the
- Add: dependency resolution for Node Renderer Factories to make them independent of extension add order
- Fix: Change spec example to variable number of sections
- Add: yaml front matter configurator for modules. See: Yaml Front Matter Configuration
- Fix: table formatting caret position tracking affects alignment even when not inserting,
just formatting. Need to keep track of whether format after typing or just format. Then
caret position should only track but not force spaces behind it to be preserved. See
failed tests in
com.vladsch.flexmark.ext.tables.MarkdownTableTest
- Add: spec example language per section options and rendering in HTML.
- Add: Tests for section name options
- Fix: Document docx form controls in wiki.
- Add: table recovery utility to restore table after it was wrapped as plain text paragraph.
Needed when formatting is applied without a table extension. If not noticed will result in
a table which is tedious to recover manually. Handle only tables with leading and trailing
|
for each line that was wrapped. Otherwise, it is impossible to tell where each line ends and another begins. - Fix: Html converter to not add spaces between end of inline marker and next punctuation:
.,:;
- Fix: merge
Parsing
optimization by using static patterns - Fix: add a few more
Parsing
optimization by using static patterns for flag based dynamic values. - Fix: add cache for dynamic
Parsing
patterns based on dependent options.
- Fix: HTML to Md converter to convert empty a tags to empty link text links. ie.
<a href="#abc"></a>
to[](#abc)
, except when contained in heading elements. - Break: rename
Attributes
toMutableAttributes
and create new immutableAttributes
class. - Fix: do not remove
title
attribute provided byLinkResolver
when link has no title. Allow link resolver titles to be used.
- Fix: add
DocxRenderer.PAGE_SIZE
andDocxRenderer.PAGE_LANDSCAPE
properties to allow simple changes to page setup for rendered document which is different from one in the template.
- Fix: optimized TOC levels from erroneous
#,#
to#-#
for single level TOC.
-
Fix: Toc and SimToc
levels
parsing to properly handle levels as per documentation.- single numeric >2 is 2-level, ie.
levels=4
should be interpreted aslevels=2-4
but waslevels=4,4
. levels=x-
to be same aslevels=x-6
, was handled aslevels=x,x
levels=levelList
where level list is a comma separated list of levels or ranges. Default is to include heading levels 2 and 3. If a range is specified using-
as separator between numeric values then the included range is from first numeric to last numeric inclusive. If first numeric is missing then 1 will be used in its place. If last numeric is missing then 6 will be used in its place.Examples:
levels=1
include level 1 only, same aslevels=1,1
levels=2
include level 2 only, same aslevels=2,2
levels=3
include levels 2 and 3levels=4
include levels 2,3 and 4levels=2-4
include levels 2,3 and 4. same aslevels=4
levels=2-4,5
include levels 2,3,4 and 5levels=1,3
include levels 1 and 3levels=-3
include levels 1 to 3levels=3-
include levels 3 to 6
- single numeric >2 is 2-level, ie.
-
Fix:
SequenceBuilder.toString()
not to add space between sequence parts. -
Break:
TextCollectingVisitor
needsTextContainer.F_ADD_SPACES_BETWEEN_NODES
to ensure there is at least one space between texts of different nodes in collected text. Previously this was added automatically by sequence builder. Use one of thegetAndCollect
functions taking options flags and passTextContainer.F_ADD_SPACES_BETWEEN_NODES
. -
Fix:
MarkdownParagraph
wrapping with preserving tracked offsets with spaces to preserve spaces right before last non-blank character. -
Fix: unify handling of link generating inline element handling in link text elements.
- Add:
LinkRendered
interface to identify link rendering elements derived from link/image ref syntax identified by implementation ofLinkRefDerived
interface - Fix:
WikiNode
to implementLinkRefDerived
- Fix:
WikiLink
to implementLinkRendered
- Fix:
Footnote
to implementLinkRendered
ℹ️ nested link ref derived elements in link ref text have priority and cannot be used to embed into link ref text using
[link ref text][ref id]
syntax. - Add:
- Fix: link refs in link text should be collapsed.
-
Add:
Parser.LINK_TEXT_PRIORITY_OVER_LINK_REF
, defaultfalse
, commonmark spec does not specify how to parse:[[moon]](/uri) [moon]: moon.jpg
with default implementation priority given to contained ref, renders as:
<p>[<a href="moon.jpg">moon</a>](/uri)</p>
when set to
true
, priority given to outer link and will render as:<p><a href="/uri">[][moon]</a></p>
ℹ️ Undefined reference links are always treated as text when in a link text element.
-
- Fix: #407, Link text inline content fails to parse image references, link and image refs in link text would be collapsed even when they are not tentative but defined.
-
Fix:
JekyllTagExtension
handling of inline include tag. If included file contains a single paragraph then the paragraph is unwrapped so only the text is included. Otherwise, the included file AST is included as is, which may result in invalid HTML if included file has block elements since these will be included in thep
tag of including element.Break: ℹ️ when include tag embedding is enabled, the included file elements will be added as child nodes of the
JekyllTag
node, notJekyllTagBlock
node as was done in previous versions.
- Break: remove from
TocOptions
confusing and error pronerawTitle
andrawTitleLevel
. Now mutable toc options have to settitle
andtitleLevel
then callTocOptions.AsMutable.normalizeTitle()
- Fix: add more debug trace information to markdown wrap tracked offset mismatch.
- Add:
UriContentResolver
extension for unified content handling in parser and renderers by extensions.- Add:
JekyllTagExtension.CONTENT_RESOLVER_FACTORIES
, defaultCollections.emptyList()
. If this option is an empty list then a singleton list ofFileUriContentResolver.Factory
instance will be used. - Fix:
IncludeNodePostProcessor
to use content resolvers for getting file content instead of getting file directly. - Add:
DocxRenderer.DEFAULT_CONTENT_RESOLVER
, defaulttrue
, set tofalse
not to addFileUriContentResolver
to content resolvers factories. - Add:
DocxRendererContext.resolvedContent(ResolvedLink)
to allow generic URI to content resolution. - Fix:
CoreNodeDocxRenderer
to use content resolvers for resolving image links, only resolvinghttp://
andhttps://
links if content is not resolved.
- Add:
- Fix: add range limit to
Escaping.replaceAll(Pattern, BasedSequence, List<Range>, Replacer, ReplacedTextMapper)
when setting matcher range. - Add:
DocxRenderer.CUSTOM_PROPERTIES
, defaultCollections.emptyMap()
, if present then custom properties of the document will be set.
- Fix: #398, Autolinks get cut off if they contain `&` (escaped query params) for multiple html entities per link.
- Fix: update docx4j to 8.1.6
- Fix: docx rendering tests for full spec example
- Add:
JekyllTagExtension.EMBED_INCLUDED_CONTENT
, defaultfalse
. Set totrue
to embed included markdown content. - Fix: tracked paragraph wrapping when inserting space before EOL on a line when the word before caret will be wrapped to the next line. ie. the EOL will be removed.
- Deprecate:
JekyllTagExtension.ENABLE_RENDERING
, not used nor needed. - Fix: #398, Autolinks get cut off if they contain `&` (escaped query params)
- Add:
HtmlRenderer.FENCED_CODE_LANGUAGE_DELIMITERS
, default" \t"
, to configure which chars terminate the language part of info string - Add:
HtmlRenderer.FENCED_CODE_LANGUAGE_CLASS_MAP
, defaultnew HashMap()
, to provide individual language to class mapping string. If language string is not in the map thenHtmlRenderer.FENCED_CODE_LANGUAGE_CLASS_PREFIX
+ language will be used. Intended to allow creating alias mapping and per-language class configuration.
- Fix: wrong assert conditions in
LineAppendableImpl.setPrefixLength(int, int)
- Fix: assert condition for
MarkdownParagraph.resolveTrackedOffsetsEdit
, space and non-break space should be considered a match. - Fix:
MarkdownParagraph.resolveTrackedOffsetsEdit
, space and non-break space should be considered a match. - Add: details to assert for
SegmentTree.findSegmentPos(int, int[], int, int)
to allow diagnostics in reports
- Add:
HtmlRenderer.HEADER_ID_REF_TEXT_TRIM_LEADING_SPACES
defaulttrue
andHtmlRenderer.HEADER_ID_REF_TEXT_TRIM_TRAILING_SPACES
defaulttrue
. Whenfalse
then corresponding reference link text in heading text used for generating heading id is not trimmed. - Add:
HtmlRenderer.HEADER_ID_ADD_EMOJI_SHORTCUT
defaultfalse
Whentrue
then emjoi nodes add emoji shortcut to collected text for heading id. - Fix:
ParserEmulationProfile.GITHUB
- Set
HtmlRenderer.HEADER_ID_REF_TEXT_TRIM_TRAILING_SPACES
tofalse
because GitHub does not trim trailing spaces for generating heading ids. Emoji
node to generate text for heading id consisting of the emoji shortcut, for GitHub compatibility.- Fix:
ImageRef
not to add text to heading text for heading id generation
- Set
- Fix: add more information to
MarkdownParagraph.resolveTrackedOffsetsEdit
assert failures to allow better diagnostics in reported stack traces. - Fix: disable wrapping of multiline URL image links
- Fix:
Paragraph
content node to preserve leading spaces on lines. Otherwise, multiline URL image content would loose indents since these were stripped from paragraph content during parsing.-
Fix:
TablesExtension
to accept non-indenting leading spaces on all table rows. This results in previously non-table text as valid table texts:Abc|Def |---|---
-
- Fix:
LinkRef
andImageRef
changing spaces to
for wrap formatting when not part of aParagraph
, ie. in heading text.
- Fix: merge #397, PR: Add base64 image support with docx rendering thanks to @Xaelis
- Add: test for base64 encoded docx conversion
- Break:
WikiLinkLinkResolver
to takeWikiLinkExtension.ALLOW_ANCHORS
andWikiLinkExtension.ALLOW_ANCHOR_ESCAPE
into account when extracting page ref from link.- Fix:
#
or\
included in the URL of the resolved link are now URL encoded. - Fix: default
WikiLinkLinkResolver
handles its own text unescaping. When resolving wiki
link with default resolver do not unescape. If replacing default resolver ensure you unescape the text. This is needed to properly handle anchor escaping. - Fix:
PegdownOptionsAdapter
to setWikiLinkExtension.ALLOW_ANCHORS
totrue
for pegdown compatibility
- Fix:
- Fix: deprecate
CoreNodeFormatter.ATTRIBUTE_UNIQUIFICATION_ID_MAP
and move declaration toFormatter.ATTRIBUTE_UNIQUIFICATION_ID_MAP
- Fix: deprecate
CoreNodeFormatter.UNIQUIFICATION_ID_MAP
and move declaration toFormatter.UNIQUIFICATION_ID_MAP
- Fix: wiki links should not be wrapped during formatting.
- Add: WikiLink formatter extension and tests
- Add: WikiLink translating formatter functionality and tests
- Fix:
ScopedDataSet.getAll()
andScopedDataSet.getKeys()
would not return keys from parent scope. - Fix: #396, DocumentParser stops reading too early resulting in the document being cut off
-
Fix: enable original spec tests
-
Fix: merge #391, PR: Fix: CRLF line separator in fenced code blocks produce redundant CR.
-
Fix: merge #387, JUnit is in the compile scope
-
Add: ability to insert anchor ref targets to
HtmlIdGenerator
when scanning a document. -
Add: add
LinkResolverBasicContext
as base interface ofLinkResolverContext
to allow simple context to pass toLinkResolver
when resolving links without needing to implement all unused methods ofLinkResolverContext
. -
Break: change argument to
LinkResolver
andLinkResolverFactory
toLinkResolverBasicContext
. Except forJekyllTagExtension
, the argument is stillLinkResolverContext
and passed value can be cast to this if required. -
Add: support for
JekyllTagBlock
withinclude
directive toDocxRenderer
Use
{% include includeFile %}
to include the file into the source document.includeFile
is resolved relative toDocxRenderer.DOC_RELATIVE_URL
orDocxRenderer.DOC_ROOT_URL
. The latter is used ifincludeFile
starts with/
Will only include files if
JekyllTagExtension.LINK_RESOLVER_FACTORIES
is not empty, in which case the link resolvers will be used to resolveincludeFile
to full file path. Use singleton list ofDocxLinkResolver.Factory
instance to resolve using doc relative and root url paths. -
Fix:
MergeLinkResolver
andDocxLinkResolver
- Fix: change formatter sub-context rendering node to nullable
- Fix: rename
BaseSequence.extendToAny
toBaseSequence.extendByAnyNot
which better reflects the operation of the method. - Deprecate:
BaseSequence.extendToAny
- Add:
FlexmarkHtmlConverter
div
to table options to allow convertingdiv
based table code to markdown tables. - Fix: move
BaseSequenceManager
and related toflexmark-util-experimental
since these are not used.
- Add:
migrate flexmark-java 0_50_x to 0_60_0.xml
IntelliJ Migration - Fix: rename abbreviation
FormatOptions
AbbreviationFormatOptions
- Fix: rename definition
FormatOptions
DefinitionFormatOptions
- Fix: rename task list
FormatOptions
TaskListFormatOptions
- Fix: formatter core test for invalid indentation
- Fix: formatter
EqualizeTrailingMarker.EQUALIZE
adding marker when there is none. - Fix: missing
TextContainer
implementation byTypographicSmarts
- Fix: restore
IRenderBase.NullRenderer
andIRenderBase.TextRenderer
static classes
- Fix: cleanup and simplify dependency handler use. Too convoluted in the current implementation.
- Fix:
Formatter
not inserting blank line after paragraph when followed by list sub-item in tighten mode.
- Fix: split
flexmark-util
module sub-directories into separate modulesast/
classes toflexmark-util-ast
builder/
classes toflexmark-util-builder
collection/
classes toflexmark-util-collection
data/
classes toflexmark-util-data
dependency/
classes toflexmark-util-dependency
format/
classes toflexmark-util-format
html/
classes toflexmark-util-html
mappers/
classes toflexmark-util-sequence
options/
classes toflexmark-util-options
sequence/
classes toflexmark-util-sequence
visitor/
classes toflexmark-util-visitor
- Fix: add missing semi in convert to visual test functions HTML entities.
- Fix: remove static char predicate fields from
SequenceUtils
- Deprecate: static char predicate fields in
SequenceUtils
- Fix: change docx converter to not include
<>
around auto and mail links in generated code. - Fix: #384, Markdown parser produces invalid HTML
- Fix: render ref link and image as text if link resolved to empty URL
- Fix: formatter to not output tail blank line after fenced code if it is last child of list item and current list spacing is not LOOSE.
- Fix: data key
toString()
to useClass.getSimpleName()
- Fix:
MarkdownTable
not prefixing caption line with requested line prefix.
- Add:
IRichSequence.padding
to return the required padding sequence. - Fix:
IRichSequence.padStart
was not padding the sequence but only returned the required padding.
- Fix: Change the meaning of
ListSpacing.LOOSEN
andListSpacing.TIGHTEN
for formatter withParser.BLANK_LINES_IN_AST
set to true:-
ListSpacing.LOOSEN
adds blank lines only if list is loose because it has items in the list followed by blank lines.⚠️ This will work as expected only ifParser.LISTS_AUTO_LOOSE
istrue
. Otherwise, a blank line will only be inserted if there is already a blank line after the item, same as selectingListSpacing.AS_IS
. -
ListSpacing.TIGHTEN
removes blank lines which are not significant in determining whether the list is loose so as to make the list as tight as possible.
-
- Add:
ParagraphItemContainer.isParagraphInTightListItem(Paragraph)
to allow testing for paragraph items not wrapped without having list options. - Fix: remove debug exception in
MarkdownTable
when an offset is not found in tracked offsets. - Fix: clean up output to stdout in tests for
MarkdownParagraph
- Fix:
LineAppendableImpl.getLines()
when requested withmaxTrailingBlankLines
of -1 then last line should not have and EOL. - Fix:
SimToc
formatting:- allow empty title string in parser
- blank title should not add TOC heading
- empty title string should be converted to empty string and not removed
- change no title
TocOptions
to be empty title and if an empty title string is specified then title string will be blank (" "
).
- Break:
TocUtils.renderMarkdownToc(MarkdownWriter, List<Integer>, List<String>, TocOptions)
andTocUtils.renderTocContent(MarkdownWriter, TocOptions, TocOptions, List<Heading>, List<String>)
to not haveHeading
arguments but only relevant heading information to allow reuse.
- Fix: #382, Is there an option for number of whitespaces needed to create sub-lists?
FIXED_INDENT
list parser did not convert list item looking text with >= 4 spaces to lazy continuation.
- Break: Add validation to parser that passed
BasedSequence
is contiguous with no out of base parts and throw descriptiveIllegalArgumentException
if it is not. Otherwise, it is possible to provide sequences which will cause exceptions during parser. - Fix: re-implement markdown paragraph tracked offset resolution by scanning the unwrapped and
wrapped text segments and mapping them to original sequence offsets while analyzing text
context and keeping track of: start of line, first non-blank, last non-blank, end of line.
- Fix: implement generic code for resolving index in wrapped sequence based on tracking offset in base sequence without inexplicable fudge factor adjustments.
- Fix: validate that
MarkdownParagraph
can properly compute spaces before/after at offset fromaltSeq.getBaseSequence()
and remove these fields fromTrackedOffset.create
. - Fix:
LineAppendableImpl.appendTo
would trim spaces on blank lines. Lines should be appended as is since formatting is done during accumulation not when output to sequence or appendable. - Break: invert
LineAppendable.F_ALLOW_LEADING_EOL
toLineAppendable.F_TRIM_LEADING_EOL
to ensure that flags of 0 do no trimming.- Fix:
Formatter.FORMAT_FLAGS
to addLineAppendable.F_TRIM_LEADING_EOL
to defaults used for formatting if none specified.
- Fix:
- Fix:
LineAppendableImpl
empty forward iterator had next instead of none. - Add:
TrackedOffset
spaces before/after the offset. This is impossible to determine from segmented sequence in edge cases. Best to have it provided from original sequence where it is easy to determine and combined with what is in the final sequence since some spaces could have been removed when parent prefixes are removed. - Fix: removal of all prefixes messes up format tracked offset resolution
- Fix:
SegmentTree.getSegmentRange(int, int, int, int, BasedSequence, Segment)
was not computing startOffset correctly if first segment was text and had no previousANCHOR
segment.- Fix:
SegmentedSequenceTree.subSequence()
was not computing correct start offset due toSegmentTree
bug.
- Fix:
- Add:
Formatter.DOCUMENT_FIRST_PREFIX
andFormatter.DOCUMENT_PREFIX
to allow setting prefixes for the whole document. - Add:
SequenceBuilder
treating of any based sequence whose base is equal in characters to its own as equivalent since offsets will match. - Fix:
LineAppendable.isEmpty()
return true only if no lines or pending lines - Fix:
SubSequence
constructor to only use the baseCharSequence
hash code if it isString
- Add:
Formatter.TRACKED_SEQUENCE
option to allow formatting of document based onSegmentedSequence
which cannot be used for parsing without converting to contiguous sequence. Used to construct offset tracker for tracked offset resolution.- Fix:
Formatter
paragraph wrapping to use trackedSequence. - Fix: tracked offset resolution to use trackedSequence.
- Fix:
- Fix: make all reference nodes
compareTo()
not case sensitive - Fix: change back to
jetbrains.annotations:15.0
- Fix: formatter to not change HTML block indentations by
- Break: rename
HtmlFormattingAppendable
toHtmlAppendable
- Break: rename
HtmlFormattingAppendableBase
toHtmlAppendableBase
- Add:
LineInfo
to have the lineCharSequence
- Add: to
LineAppendable
- extend
Iterable<LineInfo>
- Add:
LineAppendable.append(LineAppendable, int, int, boolean)
to append another line appendable without prefixes - Add:
LineAppendable.copyAppendable(LineAppendable, int, int, boolean)
to make a copy and append selected content with or without prefixes - Add:
LineAppendable.insertLine(int, CharSequence, CharSequence)
to insert lines
- extend
- Fix: create
TestSuite
for each util module subdirectory - Fix: change
UtilTestSuite
to run other module test suites. - Fix: refactor
flexmark-util
to allow separate modules:visitor
has no dependenciesmisc
: classes contained inutil
directory tomisc
, has no dependenciescollection
depends onmisc
onlydependency
depends onmisc
,collection
data
depends onmisc
onlybuilder
depends onmisc
,data
sequence
depends onmisc
,collection
,data
options
depends onmisc
,sequence
html
depends onmisc
,sequence
ast
depends onmisc
,collection
,data
,sequence
format
depends onmisc
,collection
,data
,sequence
,html
,ast
- Fix: refactor
flexmark-util
to eliminate cyclic dependencies between future util modules- Break: delete deprecated classes contained in
mappers
LowerCaseMapper
UpperCaseMapper
- Break: move classes contained in
mappers
directory tosequence/mappers
subdirectory - Break: move classes contained in
util
directory:SharedDataKeys
todata
- the rest to
misc
- Break: move from
html
tosequence
to eliminate dependency cycleEscaping
Html5Entities
LineAppendable
LineAppendableImpl
- Break: move from
builder
tomisc
to eliminate dependency cycleExtension
- Break: move
from
sequenceto
misc` to eliminate dependency cycleCharPredicate
- Break: move from
Utils
toBasedUtils
to eliminate dependency cycleasBased
- Break: move from
Utils
toSharedDataKeys
to eliminate dependency cyclerunningTests
- Break: move from
Utils
toSequenceUtils
to eliminate dependency cycleparseUnsignedIntOrNull
parseUnsignedIntOrNull
parseIntOrNull
parseIntOrNull
parseLongOrNull
parseLongOrNull
parseUnsignedIntOrDefault
parseUnsignedIntOrDefault
parseIntOrDefault
parseIntOrDefault
parseNumberOrNull
parseNumberPrefixOrNull
- Break: delete deprecated classes contained in
- Fix:
MarkdownParagraph
tracked offset correction when deleting first non-blank char surrounded by spaces, index would be 0 instead of at first non-blank of wrapped with space inserted after index.
- Fix: disable wrapping of link and image text if wrapping enabled.
- Break: remove unused
ContinuationIndent
- Break: remove
Formatter.BLOCK_QUOTE_CONTINUATION_MARKERS
and related. It was never properly implemented and even if it would be it can mess up the document for compound prefixes depending on selected settings. - Fix:
AttributesNodeFormatter
adding quotes around implicit attribute values:#
and.
prefixed ones. - Fix:
FormatterUtils
usingnode.getDocument()
instead ofcontext.getDocument()
- Add:
TrackedOffsetUtils
for common tracked offset resolving code - Add: tracked offset option to
HtmlRenderer
, NOT TESTED, Experimental - Break: remove kludged
Formatter.render
builder arguments and only useAppendable
, pass builder since builder interface is extending appendable. - Fix:
LineAppendable
- Break: replace
ISequenceBuilder
arguments withAppendable
, ifLineAppendable
orISequenceBuilder
then will use its builder, otherwise will useStringSequenceBuilder
- Add:
LineAppendable.setPrefixLength(int, int)
to change prefix/line content split for lines - Add:
LineAppendable.setLine(int, CharSequence, CharSequence)
to change prefix/line content split for lines - Add: appendTo without prefixes to allow extracting content only.
- Add:
LineAppendable.setLine(int, CharSequence, CharSequence)
to set prefix and text of line. - Add:
LineAppendable.setPrefixLength(int, int)
to change the prefix/text index for the line without changing actual line content. - Break:
LineAppendable.append(LineAppendable, int, int)
does not add aline()
call before appending, which means if there is an unterminated line, the first line of appended appendable will be added to it. This allows adding text before the first line of appendable. - Break:
LineAppendable.line()
and variants no longer allow adding a blank line at the top of the text if allow leading EOL is enabled. UseblankLine()
for this. - Break:
LineAppendable.blankLine()
and variants no longer allow adding a blank line at the top of the text if allow leading EOL is not enabled.
- Break: replace
- Break: clean up
BitFieldSet
:- method names, ones adding/removing enum fields are now
add
/remove
, ones taking bit mask areorMask
/andNotMask
. - add
getUnsigned()
versions for int, short, bytegetUInt()
,getUShort()
andgetUByte()
to get unsigned values of fields when they are shorter than the storage type.setUnsignedField()
versions for all field types, signed ones are a PITA to deal with when encoding bit mask values. For signed values use thesetBitField
andgetLong()
,getInt()
,getShort()
,getByte()
.
- method names, ones adding/removing enum fields are now
- Fix: task bullet marker would not be changed if complete task changed to non-task during formatting.
- Fix: Spec test file formatting
- not incrementing example count
- Fix:
TestUtils.addSpecExample()
to add EOL after ast if not already terminated. This was causing spec example formatting to mess up. - Fix: add extra blank line after spec example
- Fix: parser to not remove trailing EOLs in spec example sections
- Fix: formatter to preserve all whitespace in spec examples
- Fix: format options by spacing commas and removing any repeated commas
- Fix:
Formatter
tracked offset at EOL resolving for any offsets not handled by elements.
- Break: rename
SpecReader.TYPE_TEST_BREAK
andSpecReader.TYPE_BREAK
toSpecReader.SECTION_TEST_BREAK
andSpecReader.SECTION_BREAK
respectively. - Fix:
LineAppendableImpl.appendTo
and all context rendering methodsflushTo()
now take a separate arguments formaxBlankLines
which applies to body of text.maxTrailingBlankLines
which applies to trailing blank lines in appendable. - Fix:
LineAppendableImpl
re-implement and clean up using a more consistent model for accumulating and manipulating lines of output.- Add: separate arguments for
maxBlankLines
which applies to body of text andmaxTrailingBlankLines
which applies to trailing blank lines in appendable. - Change: accumulation now done as full lines with information on prefix, and eol
- Add: separate arguments for
- Add:
TrackedOffsetList
for efficient tracked offset location - Fix: add formatter tracking when formatting first block element child of an empty list item to allow having block element on same line as list item prefix.
- Add:
AsideExtension
custom formatter - Fix: formatter tracking offset adjustment when tracking offset is not in table or paragraph, ie. not resolved after formatting then resolve in Formatter.render when using builder.
- Add:
SpecExampleExtension
formatting for spec test files. - Add:
NodeFormatterContext.delegateRender()
method to delegate to format handler registered after the current one. If none then will delegate toNode
renderer, withCoreNodeFormatter.render(Node)
being the last in line. - Add: separate
TextContainer.F_LINK_NODE_TEXT
collection type to allow link element text to be collected separate fromTextContainer.F_NODE_TEXT
flag. - Add:
SpaceInsertingSequenceBuilder
to track intervening spaces between nodes and insert on non-space. - Fix:
TextCollectingVisitor
to add intervening spaces to match old implementation. - Add:
Formatter.TRACKED_OFFSETS
default empty list, to provide which offsets into the base sequence being formatted should be tracked so their index can be resolved in the formatted result.- Add: tracked offset use to
Paragraph
formatting wrapping code - Add: tracked offset use to
TableBlock
formatting code
- Add: tracked offset use to
- Add:
MarkdownTable.sorted(ColumnSort[], int, Predicate<String>)
suffix testing predicate to allow sorting of columns with numeric prefix by numeric then by suffix if numeric part is equal. - Add:
MarkdownTable
constructor param for character sequence of the table. Can be any sequence. For use by applications if they need access to original table character sequence.
- Fix: change
RefNode
text collection to resolve reference if link url collection is requested.
- Fix: replace old
TextCollectingVisitor
implementation with new one independent of specific nodes. - Add:
TextContainer
interface to allow text collection without knowing implementation node class. - Add:
TextCollectingVisitor
to utils which does not require specific node classes. Takes option flags:F_LINK_TEXT
- link text or image alt for link/image nodesF_LINK_PAGE_REF
- link page ref for link/image nodesF_LINK_ANCHOR
- link anchor for link/image nodesF_LINK_URL
- link url for link/image nodesF_NODE_TEXT
- collect node text without unescaping or percent url decoding
- Add:
MarkdownTable.transposed(int)
to get a transposed version of the table - Add:
MarkdownTable.sorted(ColumnSort[], int flags))
to get a sorted version of a table by given columns/sort type. Columns sorted by text extracted byTextCollectingVisitor
using given collectionflags
- Add:
TableFormatOptions.FORMAT_TABLE_FILL_MISSING_MIN_COLUMN
, defaultnull
, to control min column where filling of missing columns begins when formatting table.
- Fix: convert
MarkdownTable
to use commonTrackedOffset
for offset tracking API - Fix: convert
MarkdownParagraph
to use commonTrackedOffset
for offset tracking API - Fix: deprecate old
addTrackedOffset
methods. - Fix: rename formatter
HEADER
options toHEADING
- Fix: deprecate old header named options
- Fix: delete unused formatter option
KEEP_TRAILING_SPACES
- Fix: delete unused formatter option
CODE_KEEP_TRAILING_SPACES
- Add: missing formatter options:
HeadingStyle
BLOCK_QUOTE_CONTINUATION_MARKERS
LIST_RESET_FIRST_ITEM_NUMBER
applies if renumbering itemsLIST_ALIGN_NUMERIC
flexmark-ext-attributes
formatting of individual attributes instead of dumping the attributes node text.FORMAT_ATTRIBUTES_COMBINE_CONSECUTIVE
FORMAT_SORT_ATTRIBUTES
FORMAT_ID_ATTRIBUTE
,AttributeImplicitName
enum, as is, implicit preferred, explicit preferredFORMAT_CLASS_ATTRIBUTE
,AttributeImplicitName
enum, as is, implicit preferred, explicit preferredFORMAT_ATTRIBUTES_SPACES
FORMAT_ATTRIBUTE_EQUAL_SPACE
FORMAT_ATTRIBUTE_VALUE_QUOTES
- prioritized task items:
flexmark-ext-gfm-tasklist
FORMAT_ORDERED_TASK_ITEM_PRIORITY
:Integer
, priority to use for parent item. Ordered task items do not not sort on priority since they are already ordered by number.FORMAT_ORDERED_TASK_ITEM_PRIORITY
:Integer
, priority to use for parent item. Ordered task items do not not sort on priority since they are already ordered by number.FORMAT_TASK_ITEM_PRIORITIES
:int[]
, specifies integer priority for item marker characters corresponding toLISTS_ITEM_PREFIX_CHARS
used for list items. Higher number is higher priority. A parent item's priority is the max priority of itself and any of its descendant task items. Non-task items do not have their own priority, only priority derived from their descendant items.
ElementPlacementSort
SORT_DELETE_UNUSED
DELETE_UNUSED
LINK_MARKER_COMMENT_PATTERN
CONTINUATION_ALIGNMENT
- Add: Formatter control for controlling non-formatting regions.
<!-- @formatter:on -->
and<!-- @formatter:off -->
tagsFORMAT_CONTROL_ON
:String
FORMAT_CONTROL_OFF
:String
FORMAT_CONTROL_REGEX
:Boolean
to treat control on/off strings as regex pattern.
- implement
SimTocExtension.FORMAT_UPDATE_ON_FORMAT
option
- Break: rename
CharWidthProvider
methods and changezeroWidth
argument toCharPredicate
- Fix:
TestUtils.getOptions(SpecExample, String, Function<String, DataHolder>)
to return immutable data holder to prevent leak of options between spec examples - Fix: escape of plain
.
at start of continuation. - Fix:
ListBlockParser
escape/unEscape handler not checking if returned index == -1 and not handling empty char sequence. - Fix:
MarkdownParagraph
- not checking if passed sequence is empty before invoking special lead-in escape/unEscape handlers, which is not part of the API contract.
- backspace after typing a char should not remove spaces which surrounded the char
- Fix: make
Paired
extendMap.Entry
- Fix:
#381, StackOverflowError with long base64 image and LINKS_ALLOW_MATCHED_PARENTHESES disabled,
USE_HARDCODED_LINK_ADDRESS_PARSER
was not used if matched parentheses were disabled causing stack overflow in regex evaluation. szxvalsdfj lasdf jffdddd
- Fix: erroneous not-null annotation on nullable return in
InlineParser.parseCustom(BasedSequence, Node, BitSet, Map<Character, CharacterNodeFactory>)
- Fix:
MarkdownParagraph
wrap tracked offset adjustment:- on typing space in middle of word with second word becoming first non blank on a continuation line.
- on typing space at start of continuation line with
LS
ahead of position. - on typing space after non-space at start of continuation line with
LS
ahead of position. - on typing space after end of paragraph after the right margin.
- Fix:
MarkdownParagraph
- Add: tracked offsets handling to prepare and resolve tracked offsets in wrapped text
- handle inserting a space when tracked offset is followed by a space to allow two spaces at tracked offset
- handle tracked offset followed by
LS
to resolve offset to end of previous line - handle backspace on first character of continuation line to splice word to last word of previous line.
- Fix: To take
CharSequence
for indent properties instead ofint
for number of spaces to allow arbitrary indentation characters.
- Add: tracked offsets handling to prepare and resolve tracked offsets in wrapped text
- Fix:
SegmentOffsetTree
aggregated length replacement to containstartOffset
of next segment instead ofendOffset
of segment at position, to mimic equivalent aggregated length ofSegmentTree
. - Fix:
BasedOffsetTracker
to handle 0 span and 1 span offset ranges and return info for the requested offset.
- Fix:
MarkdownParagraph
line break getter/setter names. - Fix:
BasedOffsetTracker
- if segment end offset equals offset and no segment containing offset is found, then use segment for index calculation.
- assertion conditions when search returns null, offset can be >= end offset
- Add:
Formatter
Paragraph wrapping options and code.- Add:
Formatter.RIGHT_MARGIN
, default0
, if >0 then text will be wrapped to given margin - Add:
Formatter.APPLY_SPECIAL_LEAD_IN_HANDLERS
, defaulttrue
, when true will escape special lead-in characters which wrap to beginning of line and un-escape any which wrap from beginning of line. Used to prevent special characters inside paragraph body from starting a new element when wrapped to beginning of line.
- Add:
- Add:
CustomBlockParserFactory.getLeadInHandler(DataHolder)
and handle escaping/unescaping special lead in characters for the block elements. Add escape/unescape to:BlockQuoteParser
ListBlockParser
HeadingParser
AdmonitionBlockParser
AsideBlockParser
DefinitionItemBlockParser
- Add:
Parser.Builder.specialLeadInHandler(SpecialLeadInHandler)
to allow parser extensions to register special lead in escaper/unescaper handlers for parser extension block elements if they do not have any custom block parser factories but do create extensions. - Add: special lead-in escape/unescape handlers during text wrapping
- Add:
SegmentOffsetTree
for binary search on offset in base sequence for conversion to index in result sequence. - Fix:
BitFieldSet.toString()
to output field values when fields are more than one bit long. - Add:
BasedOffsetTracker
to takeBasedSequence
result (could be segmented, offset in based sequence,PositionAnchor
and return index of this offset in the resulting based sequence.
- Fix: convert
BitEnumSet
toBitFieldSet
to allow bit fields of more than 1 bit.- Add: Optional
BitField
interface, if implemented by Enum for use byBitFieldSet
then bit fields can be 1 to 64 bits in size, with manipulation of bit packed values and iteration over non-zero valued elements.
- Add: Optional
- Fix: rename
LineFormattingAppendable
toLineAppendable
- Fix: remove unused overloads and methods from
LineFormattingAppendable
- Add: new methods to
LineFormattingAppendable
for prefix changes and combined prefix/line manipulation. - Break: rename
LineAppendable.SUPPRESS_TRAILING_WHITESPACE
toLineAppendable.F_TRIM_TRAILING_WHITESPACE
- Break: rename and invert
LineAppendable.ALLOW_LEADING_WHITESPACE
toLineAppendable.F_TRIM_LEADING_WHITESPACE
- Deprecate: convenience copies of
LineAppendable
flags inFormatter
andHtmlRenderer
. UseLineAppendable
directly. - Break:
Formatter.FORMAT_FLAGS
default changed from0
toLineAppendable.F_TRIM_LEADING_WHITESPACE
to reflect inversion of option flag and preserve behavior - Break:
HtmlRenderer.FORMAT_FLAGS
default changed from0
toLineAppendable.F_TRIM_LEADING_WHITESPACE
to reflect inversion of option flag and preserve behavior - Fix: remove
my
prefix from fields inflexmark-utils
to keep consistent naming convention in module. - Add:
BitEnumSet
to expose the bit mask of elements to use as efficient and convenient bit masked options - Add:
ArrayUtils.toArray(BitSet)
to return anint[]
of all bit numbers that are set. - Break: make constructor
Range(int, int)
protected. UseRange.of
to create instances.
- Fix: move experimental concept classes out of the library. Too much clutter of unused old
experimental stuff.
- Fix: move
PositionList
related classes toflexmark-util-experimental
- Fix: move unused classes from utils to experimental
- Fix: move
- Fix: rename
BasedSequenceBuilder
toSequenceBuilder
- Fix:
MarkdownParagraph
- use
SegmentBuilder
for accumulating wrapped text. - Fix: remove any position tracking code from paragraph formatter
- use
- Fix:
SoftBreakNode
in link ref would be trimmed and loose contained EOL as a result. - Fix:
SegmentedSequence
to takeSegmentBuilder
parts for sequence generation instead of list of based sequences. The parts are already resolved by builder, based sequences duplicates useless work on both ends.- Fix: optimize storage by implementing binary search with segments serialized to byte array.
- Add: build
SegmentBuilder
fromSegmentTree
- Add: code to extract
startOffset
/endOffset
andtreeData
range forsubSequence
ofSegmentedSequenceTree
- Add:
SegmentTree
binary search tree for segmented sequence segments
- Add: build
- Add:
SegmentedSequenceTree
binary tree based segmented sequences with option to use oldSegmentedSequenceFull
if desired. - Add: build
SegmentTree
fromSegmentBuilder
segments
- Fix: optimize storage by implementing binary search with segments serialized to byte array.
- Add: segment builder text part stats for first256 and repeatedText, former if all chars in part < 256, latter if all chars are the same. In preparation for storage optimized segmented sequence impl.
- Fix: optimized
SegmentBuilder
- Change
TEXT
segments fromString
content to start/end being the -ve of start+1/end+1 of the subsequence for thisTEXT
inStringBuilder
- Change
Seg
to removemyText
field and requireCharSequence
argument for to be passed to all methods which returnedmyText
in previous implementation. Returned value should beCharSequence
which is thesubSequence
representing theTEXT
content. TEXT
segments no longer have a start/end offset of prev/nextBASE
since their start/end offsets represent offset inStringBuilder
for their character sequence. Their base start offset isendOffset
of previousBASE
orstartOffset
ofSegmentBuilder
if first segment. TheirendOffset
isstartOffset
of nextBASE
orendOffset
ofSegmentBuilder
if it is a danglingTEXT
segment.TEXT
segments to be accumulated inStringBuilder
so a single char sequence for out of base characters is available.SegmentBuilder
tracks lastimmutableOffset
in itsStringBuilder
to reflect the accumulated, immutable out of baseTEXT
segments in the segment builder.immutableOffset
andStringBuilder.length()
represents the start/end offsets of danglingTEXT
segment.- dangling
TEXT
segment is mutable until aBASE
segment is added after it which results inSegmentBuilder
endOffset
change and afteroptimizeText
method has been invoked. IfTEXT
segment becomes immutable thenimmutableOffset
is changed to theendOffset
of theTEXT
segment's subSequence end. - adding an
ANCHOR
after danglingTEXT
with anoffset
equal toStringBuilder
endOffset
will invokeoptimizeText
to allow extending previousBASE
range and reducing danglingTEXT
content. It will not change the danglingTEXT
to immutableTEXT
to allow appending more text after the call. - appending
TEXT
toSegmentBuilder
appends the text toStringBuilder
and updates out of base stats for appendedTEXT
content. Out of base stats always reflect the current content ofSegmentBuilder
- methods:
handleOverlap
is invoked when an overlapping,BASE
segment is added. It may result in callingoptimizeText
if the resolution of overlap causes aBASE
segment to be appended after a danglingTEXT
segment.- An exception is thrown if:
- an overlap is found in returned segments
- text length of returned segments does not equal the text length of original sequence.
- Arguments are
Object[3]
: lastBASE
range, optional danglingTEXT
and newBASE
range passed asObject[]
withRange
andCharSequence
representingBASE
andTEXT
segments. StringBuilder
content is truncated toimmutableOffset
and out of base statistics are updated to remove theTEXT
content character information before method invocation because they will be updated for changed segments returned by the method.- It must return an
Object[]
of segments that resolve the overlap. No optimization needs to be done at this point becauseoptimizeText
will be called if needed as the resulting segments are appended to theSegmentBuilder
SegmentBuilder
will replace last range and append the rest of the returned segments and update all internal structures, eliminating the concern for these inhandleOverlap
.
- An exception is thrown if:
optimizeText
called when aBASE
orANCHOR
segment is added after danglingTEXT
segment.- An exception is thrown if:
- an overlap is found in returned segments
- text length of returned segments does not equal the text length of original arguments.
- Arguments are
Object[3]
: lastBASE
range orRange.NULL
, danglingTEXT
and newBASE
/ANCHOR
range orRange.NULL
are passed asObject[]
withRange
andString
representingBASE
/ANCHOR
andTEXT
segments respectively. StringBuilder
content is truncated toimmutableOffset
and out of base statistics are updated to remove theTEXT
content character information before method invocation because they will be updated for changed segments returned by the method.- Method to return an
Object[]
of optimized segments, withRange
representingBASE
/ANCHOR
segments andCharSequence
representingTEXT
segments. SegmentBuilder
will replace last range and append the rest of the returned segments and update all internal structures, eliminating the concern for these inoptimizeText
.
- An exception is thrown if:
- Change
- Fix: remove space to
conversion of spec example first line. Was done to allow GitHub to display spec examples as fenced code. No longer needed since GitHub switched to CommonMark parser. - Fix: update all spec files to have no non-break spaces in example opener.
- Add:
TestUtils.customIntOption(String, String, Function<Integer, DataHolder>)
andTestUtils.customStringOption(String, String, Function<String, DataHolder>)
to ease creatingCUSTOM_OPTION
option types.
- Add:
SettableInstance
andSettableExtractedInstance
classes to facilitate implementation of settings which can be changed through spec example options. - Break: move
SpecReader.getSpecInputStream(ResourceLocation)
andSpecReader.getReadSpec(ResourceLocation)
toResourceLocation.getResourceInputStream(ResourceLocation)
andResourceLocation.getResourceText(ResourceLocation)
- Add:
ResourceLocation.getResourceInputStream()
andResourceLocation.getResourceText()
- Add: static
BuilderBase.removeExtensions(DataHolder, Collection<Class<? extends Extension>>)
for removing extension classes fromSharedDataKeys.EXTENSIONS
.
- Add:
SequenceUtils.equals(CharSequence, Object)
to consolidate char sequence equals - Fix:
SegmentedBuilder
if anchor position is less than currentendOffset
then ignore anchor. - Deprecate:
TestUtils.showTabs(String)
andTestUtils.unShowTabs(String)
in favour ofTestUtils.toVisibleSpecText(String)
andTestUtils.fromVisibleSpecText(String)
because these convert more than tabs.
-
Fix: bug causing duplicated text in segmented sequences
-
Fix: optimize
SegmentedSequence
, non base characters are now stored in base offsets as-(char+1)
, this eliminatesnonBasedChars
completely. -
Add: segmented sequence stats collection
-
Add: options to based sequences which are not used unless a sequence passed to
BasedSequence.of
is first wrapped inBasedOptionsSequence
. Then all sequences created from this base will have int bit options testable withBasedSequence.isOption(int)
and get arbitrary options withBasedSequence.getOption(DataKeyBase<T>)
or just get the wholeDataHolder
options viaBasedSequence.getOptions()
for more sophisticated needs. If theDataHolder
passed toBasedOptionsSequence
is mutable thenMakes adding customized behavior and features easy and transparent to implementation with no overhead since
SubSequence
delegates to itsbaseSeq
if it is aBasedOptionsHolder
for these methods but otherwise does no checking. The overhead is one level of delegation ofCharSequence
methods for sequences with options with no impact on the rest.
- Fix: rework
PositionList
andPosition
-
Add: concept of scope framing to invalidate all position created in the frame and not taken out via
Position.unframed()
, will also take out listeners and preview listeners added in the frame. This optimizes removal of positions from notifications. Otherwise the update list grows fast and with every iteration, until gc is run, which may be a while. Problem becomes worse if the position list is long lived and accumulates positions which were not detached over its lifetime, between gc runs. Every iteration should be scoped. Iterating 10x over a 10 item list without scoping has max 110 listener updates, scoping inner loop only 10 max listeners, scoping inner loop 1.Usage is:
Object frame = openFrame(); try { ... } finally { closeFrame(frame); }
with all positions created between open/close frame being detached. Frames can be nested and are validated for double closing, unclosed nested, and other common errors. Positions will throw an exception if used after frame is closed. -
Add:
IPreviewPositionListener
toPositionList
so changes can be previewed and changed. Useful forSegmentBuilder
to keep invariants and tracked counts updated when these are changed by optimizers so optimizers do not need to concern themselves about these.
-
- Add:
SegmentBuilder
option flags for tracking unique non-based characters and including anchors (0 span ranges) in the segment list.
- Add:
BasedSequence.addSegments(BasedSegmentBuilder)
so each sequence adds its own optimized segment list without requiring by character scanning ofg ofBasedSequence.getIndexOffset(int)
and building the segments the hard way.- Fix:
BasedSequenceBuilder
to useBasedSequence.addSegments
ReplacedBasedSequence
it has no use other than to test if sequence replaces base
- Fix: Change segment parts to
EditOp
which extends range and holds an nullable string. This will allow keeping track of replaced parts of base sequence.- if string is null then it is a range from base
- range is empty then string is not null and is an insert at position in base
- range not empty and string not empty then it is a replacement of base segment.
- Fix:
- Fix: rename
BasedCharsRecoverySegmentOptimizer
toCharRecoveryOptimizer
- Fix:
SegmentBuilder
changeappend...()
to plainappend()
- Fix:
SegmentBuilder
to keep track of start and end range in the list based on first/last range added.- Test: need to test this more thoroughly
- Fix: simplify overlap by passing index to last range in list and the range overlapping it. No position.
- Fix: simplify optimization by passing the full list to optimizer. No position list.
- Fix: eliminate multiple methods for the same functionality, append:
EditOp
, start/end offsets orString
. The rest are history. - Test: cached start/end/length/last range index.
- Add:
BasedSegmentBuilder
to convert overlap in added ranges to out of base text - Fix: change
BasedSequenceBuilder
to useBasedSegmentBuilder
for segment accumulation instead of its own implementation.- Add: construction with optional
BasedSegmentOptimizer
list and apply optimizers to segment list before generating sequence or string. - Fix: if there is an overlap in appended sequence with previous segments, add the overlap as out of base text instead of throwing an exception.
- Fix: optimize and simplify for speed, too many methods. Keep only add/append of
CharSequence
and add/append for start/end offsets. The rest are gone.
- Add: construction with optional
- Add: Common char sets:
DECIMAL_DIGITS
HEXADECIMAL_DIGITS
OCTAL_DIGITS
- Fix: infinite recursion in deprecated
SubSequence.of
- Break: delete
BasedSequence.getIndexRange(int, int)
does not do the intended job and is complicated and useless at the same time for its purpose. - Deprecate: to be delete
BasedSequence.getIndexOffset(int)
as soon asSegmentedSequence
is migrated to segment builder sequence part list.
- Fix: move spec resource files to
flexmark-test-specs
resources. Any modules needing the spec have to add a test dependency on this module. - Break: try to reduce footprint of
IRichSequence
andIRichSequenceBase
by making getting rid off some overloads with default params.- Add: factor out bulk of
IRichSequenceBase
toSequenceUtils
so functionality could be used on anyCharSequence
. - Fix: change all character inclusion based functions to use
CharPredicate
- Add: factor out bulk of
- Add:
CharPredicate
to consolidate all character inclusion testing via predicates. - Fix: make
BaseSequence.of
use plain based sequences and not managed for now. Issues when mutable sequences are passed as parameters make it unstable. Have to use or immutable char sequence or char backed sequence for managed and that will create too much overhead if used for all cases. - Add:
PositionList
andPosition
classes to represent list and position in that list which allow modification, deletion, insertions while iterating over the list. Multiple position instances to different indexed elements can be created and all will be updated to reflect changes in their element's position.- Fix: cleanup naming conventions in new classes.
- Fix: rewrite implementation and optimizer using
PositionList
andPosition
instead of hand rolled code. - Fix: make
Position
handle insert/delete index change invalidation instead ofPositionList
- Add: add anchor for position to allow next/prev anchoring
- Add: positions are now have iterable from position to end/start of list, or from next to end/previous to start.
- Fix: replace flags and position anchor field with byte flags.
-
Fix:
SegmentBuilder
to not add empty text. -
Add:
SegmentOptimizer
forSegmentBuilder
segment optimization -
Add:
CharMatchingSegmentOptimizer
to change replaced text to range in sequence when the replacement text matches sequence characters. Eliminates out of base unnecessary characters. -
Fix: add quick fail/success test for equality of base object. base strings through delete range/insert string operations.
-
Fix: make all based sequence test for same base use
getBase()
instead ofgetBaseSequence()
. It is the underlying base object that is important not the based sequence used to wrap it. -
Add:
BasedSequenceManager
to allow re-use of equivalent base sequences to eliminate the problem of having different base sequences for the same text content. Only implemented forSubSequence
notCharSubSequence
Uses weak refs and weak hash map so as long as there is a reference to previously created sequence base, requests to
BaseSequenceManager.INSTANCE.getBaseSequence(T, Function<T, BasedSequence>)
will return an existing based sequence for the passed object.Uses fast fail on
length()
andhashCode()
differences with fallback on weak hash map for getting previously computed equality comparisons to minimize expensive duplicate content comparisons for previously determined equal/unequal sequence bases.Weak refs and maps ensure cache is cleared when last used reference to base or its subsequence is released and gc() has run.
-
Fix: change
SubSequence
to create aString
if passed sequence implementsAppendable
to eliminate use of mutable sequences as bases the same wayCharSubSequence
did forStringBuilder
. It is important not to use mutableCharSequences
forBasedSequence.of()
argument. If not suretoString()
on the argument is the best option. -
Fix: change all possible uses of
CharSubSequence
toSubSequence
-
Add:
SegmentBuilder
to track offset ranges in original or base sequence and inserted out of -
Fix:
BasedSequenceBuilder.add(CharSequence)
now does not complain when adding aBasedSequence
which is from a different base than the builder. It simply treats it as it does any other non-based sequence and adds it as out of base chars. -
Fix:
SequenceBuilder.addAll(Collection<? extends CharSequence>)
now takes list of anything extendingCharSequence
-
Add: javadoc to
BasedSequence.baseSubSequence(int, int)
that it should return sequence equal to base sequence without any modifications or additions. This should really be implemented only in real base sequences likeCharSubSequence
andSubSequence
the rest should rely onBasedSequenceImpl
.
- Fix: merge formatter always adding
<>
around autolinks even when original did not have them. - Fix: docx conversion renders mail link text with
mailto:
prefix - Fix: add
'\0'
to'\uFFFD'
conversion inRichSequence
- Fix: #376, convert markdown to html, delimiters are not allowed to span table cells.
- Add:
Text addText(String value, boolean noProofRPr, boolean createR)
- Add:
Text addTextCreateR(String value, boolean noProofRPr)
- Add:
Text addTextCreateR(String value)
- Add:
Text addText(String value, boolean noProofRPr)
- Add:
Text addText(String value)
- Add:
Text addInstrText(String value, boolean noProofRPr, boolean createR)
- Add:
Text addInstrTextCreateR(String value, boolean noProofRPr)
- Add:
Text addInstrTextCreateR(String value)
- Add:
Text addInstrText(String value, boolean noProofRPr)
- Add:
Text addInstrText(String value)
- Add:
FldChar addFldChar(STFldCharType charType, boolean createR)
- Add:
FldChar addFldCharCreateR(STFldCharType charType)
- Add:
FldChar addFldChar(STFldCharType charType)
- Deprecate:
DocxContext.addWrappedText()
useDocxContext.addText(String)
- Deprecate:
DocxContext.text(String)
useDocxContext.addTextCreateR(String)
- Fix:
IRichSequenceBase.split
andIRichSequenceBase.splitList
some combinations would pass parameters out of place causing wrong operation. - Fix:
MarkdownParagraph
wrapping to use simplified left aligned wrapping with no trailing spaces
- Add: docx renderer form fields via
[name]{.class attributes}
where name is given byDocxRenderer.FORM_CONTROLS
and if not empty or blank then an unresolved reference link with that name will be converted to a word form input field with type and options given in teh attributes.- drop down list, class name
.dropdown
attributes:name
- name for the form fielddefault
- default selection first item if no default provided. Can be option text (case sensitive tried first, if no match then case insensitive is tried), if text match fails then attempted to parse as an integer index 1..number of optionshelp
- text to show in status bar and on hitting F1options
- list of options separated by|
, individual options will be trimmed but otherwise left as is
- checkbox, class name
.checkbox
attributes:name
- name for the form fieldchecked
- default will be checked, otherwise uncheckedhelp
- text to show in status bar and on hitting F1
- text, class name
.text
attributes:name
- name for the form fielddefault
- default valuehelp
- text to show in status bar and on hitting F1max-length
- number or leave out for unlimitedtype
- gives the type of text fieldregular
- default if type not provided, regular textformat
-UPPERCASE
,LOWERCASE
,FIRST CAPITAL
,TITLE CASE
, not case sensitive, space between words can be eliminated or replaced by-
date
- dateformat
- word date format
number
- numberformat
- word number format
current-date
- current dateformat
- word date format
current-time
- current timeformat
- word time format
- drop down list, class name
- Break:
BasedSequence.append(CharSequence[])
now constructs as segmented sequence so proper ordering of segments is enforced. This meansIllegalArgumentException
will be thrown when this condition is not met. To get old functionality you need to create an appended string of all sequences andBasedSequence.of()
on that string. - Break: rename
MappedSequence
toMappedBasedSequence
to allow forMappedRichSequence
- Break: rename
RichCharSequence
toIRichSequence
to separate base interfaces for rich and based sequences and allow forRichSequence
to be the base interface for rich sequences similar toBasedSequence
for based sequences - Break: rename
RichCharSequenceBase
toIRichSequenceBase
- Break: rename
RichCharSequenceImpl
toRichSequenceImpl
- Break: rename
RepeatedCharSequence
toRepeatedSequence
- Add:
RichSequence.of
for creatingRichSequence
instances - Add:
BasedSequence.of
for creatingBasedSequence
instances - Deprecate:
RichSequenceImpl.of
, useRichSequence.of
instead - Deprecate:
BasedSequenceImpl.of
, useBasedSequence.of
instead - Deprecate:
SubSequence.of
, useBasedSequence.of
instead - Deprecate:
UpperCaseMapper
andLowerCaseMapper
useChangeCase.toUpperCase
andChangeCase.toLowerCase
- Deprecate: all static factory method named
of
to more specific so that errors are less likely.repeatOf
,prefixOf
otherwise it is possible to have the wrong factory method called and not see it. - Break: move
com.vladsch.flexmark.tree.iteration.ArrayIterable
tocom.vladsch.flexmark.util.collection.iteration.ArrayIterable
com.vladsch.flexmark.util.html.CellAlignment
tocom.vladsch.flexmark.util.collection.iteration.ArrayIterable
com.vladsch.flexmark.ast.DelimitedNode
tocom.vladsch.flexmark.util.ast.DelimitedNode
- Fix:
IRichSequence
and by extensionRichSequence
andBasedSequence
- Add:
IRichSequence.trimToEndOfLine(CharSequence eolChars, boolean includeEol, int index)
- trim end to end of line at index - Add:
IRichSequence.trimToStartOfLine(CharSequence, boolean, int)
- trimmed end after next EOL - Add:
IRichSequence.leadingBlankLinesRange(CharSequence eolChars, int fromIndex, int endIndex)
- find next range of blank lines - Add:
IRichSequence.trailingBlankLinesRange(CharSequence eolChars, int startIndex, int fromIndex)
- find previous range of blank lines - Add:
IRichSequence.blankLinesRemovedRanges(CharSequence eolChars, int fromIndex, int endIndex)
- list of ranges in sequence betweenfromIndex
andendIndex
excluding all blank lines - Add: range based methods:
IRichSequence.subSequence(Range)
IRichSequence.subSequenceAfter(Range)
IRichSequence.subSequenceBefore(Range)
- Add: editing methods:
IRichSequence.insert(CharSequence, int)
insert another char sequence at indexIRichSequence.delete(int, int)
delete range in this sequenceIRichSequence.replace(CharSequence, CharSequence)
one char sequence in this sequence with anotherIRichSequence.replace(int, int, CharSequence)
range in this sequence with char sequence
- Add:
- Add: to
BasedSequence
- Add:
BasedSequence.extendToEndOfLine(CharSequence eolChars, boolean includeEol)
- extend end to end of line in basedSequence - Add:
BasedSequence.extendToStartOfLine(CharSequence eolChars, boolean includeEol)
- extend start to start of line in basedSequence
- Convenience methods returning coordinates from the base sequence
@NotNull Pair<Integer, Integer> baseLineColumnAtIndex(int index);
@NotNull Range baseLineRangeAtIndex(int index);
int baseEndOfLine(int index);
int baseEndOfLineAnyEOL(int index);
int baseStartOfLine(int index);
int baseStartOfLineAnyEOL(int index);
int baseColumnAtIndex(int index);
@NotNull Pair<Integer, Integer> baseLineColumnAtStart();
@NotNull Pair<Integer, Integer> baseLineColumnAtEnd();
int baseEndOfLine();
int baseEndOfLineAnyEOL();
int baseStartOfLine();
int baseStartOfLineAnyEOL();
@NotNull Range baseLineRangeAtStart();
@NotNull Range baseLineRangeAtEnd();
int baseColumnAtEnd();
int baseColumnAtStart();
- Add:
- Add: to
Node
convenience methods delegated togetChars()
int getStartOffset()
togetStartOffset()
int getEndOffset()
togetEndOffset()
int getTextLength()
tolength()
BasedSequence getBaseSequence()
togetBaseSequence()
Range getSourceRange()
toetSourceRange()
BasedSequence baseSubSequence(int startIndex, int endIndex)
tobaseSubSequence(startIndex, endIndex)
BasedSequence baseSubSequence(int startIndex)
tobaseSubSequence(startIndex)
BasedSequence getEmptyPrefix()
togetEmptyPrefix()
BasedSequence getEmptySuffix()
togetEmptySuffix()
int getStartOfLine()
tobaseStartOfLine()
int getEndOfLine()
tobaseEndOfLine()
int startOfLine(int index)
tobaseStartOfLine(index)
int endOfLine(int index)
tobaseEndOfLine(index)
Pair<Integer, Integer> lineColumnAtIndex(int index)
tobaseLineColumnAtIndex(index)
Pair<Integer, Integer> lineColumnAtStart()
tobaseLineColumnAtStart()
Pair<Integer, Integer> getLineColumnAtEnd()
tobaseLineColumnAtEnd()
- Add:
ArrayUtils
for searching arrays of<T>
on value or predicateindexOf()
variations for forward searchlastIndexOf()
variations for backward searchfirstOf()
variations for forward search returning matched element ornull
lastOf()
variations for backward search returning matched element ornull
- Break:
RichCharSequence
alltrim
,trimStart
,trimEnd
keepLength
argument is nowkeep
with different meaning. Instead of min length of string to keep, it is min number of trimmable characters to keep, which is more useful but does break compatibility. Now it can be used to leave whitespace padding up to a maximum ofkeep
characters. - Fix: reformat tests for compound sections
- Deprecate:
Range.subSequence(CharSequence)
useRange.basedSubSequence(CharSequence)
,Range.richSubSequence(CharSequence)
or for plain sequencesRange.charSubSequence(CharSequence)
- Fix: rename
Range.subSequence()
toRange.basedSubSequence()
- Fix: rename
Range.safeSubSequence()
toRange.safeBasedSubSequence()
which limit the subsequence within 0 to length - Add:
Range.richSubSequence()
- Add:
Range.safeRichBasedSubSequence()
which limit the subsequence within 0 to length - Add:
Range.charSubSequence()
- Add:
Range.safeCharBasedSubSequence()
which limit the subsequence within 0 to length
- Break: remove example option parsing related
TestUtils
methods. - Add: spec example language per section options and rendering in HTML.
- Add:
ExampleOption
to parse and provide information about - Add: compound spec-example sections, to combine previous lower level headings via
splice(" - ")
for better organization of tests and to allow hierarchical structure view for spec files in Markdown Navigator - Fix: remove all file url prefix for tests. Either provide the file url for the spec or default resolution will be used.
- Fix: remove unnecessary type param from
MutableDataHolder.remove(DataKeyBase<?>)
- Fix:
Parser.HEADING_NO_EMPTY_HEADING_WITHOUT_SPACE
had wrong regex. Did not allow non-empty headings without space either.
- Fix: remove synchronization. The issue was with using
HashMap.computeIfAbsent()
and passing the factory, which could and would access and create other keys. This caused concurrent modification, not threading. Now computing value with factory then adding it to the dataSet.
- Add: synchronized around
HashMap
modification to ensure thread safety. Elimination of nullable keys would allow usingConcurrentHashMap
inDataSet
but access and modification to options is done at start of parse as extensions and core load their options, afterwards the data set is mostly not modified or accessed.
- Fix: add nullable annotations to
DataSet
andDataKey
classes - Break:
DataKey
now represents not null data values, useNullableDataKey
if using nullable values, for processing of either type of data key, useDataKeyBase
super class which does not specify nullability for the data value. - Break:
DataValueFactory
now has non-nullable dataHolder argument and nullable result. Use:DataNotNullValueFactory
for nullable result and non nullable dataHolderDataValueNullableFactory
for nullable result and nullable dataHolderDataNotNullValueNullableFactory
for non-nullable result and non-nullable dataHolder
- Add:
DataKey
3 argument constructor with pre-computed non null default value to be used for null dataHolder defaults. This way the factory isDataNotNullValueFactory
which takes a non-null data holder and returns a computed value. - Add:
NullableDataKey
3 argument constructor with pre-computed nullable default value to be used for null dataHolder defaults. This way the factory isDataValueFactory
which takes a non-null data holder and returns a computed value. - Fix: add
DataKey.get(DataHolder)
to replaceDataKey.getFrom(DataHolder)
, shorter and compatible with Kotlin array access syntax, also handles nullability of data. - Fix: deprecate
DataKey.getFrom()
- Fix: replace all
DataHolder.get()
byDataKey.get()
- Fix: add nullability annotations to a boat load of classes.
- Add:
MutableDataHolder.set(@NotNull DataKey<T>, @NotNull T)
andMutableDataHolder.set(@NotNull NullableDataKey<T>, @Nullable T)
to respect nullability of key's data value. - Add:
DataKey.set(@NotNull MutableDataHolder, @NotNull T)
andNullableDataKey.set(@NotNull MutableDataHolder, @Nullable T)
to allow setting data values via keys, if needed.
- Fix: change all test case construction param from
Map<String, DataHolder>
toMap<String, ? extends DataHolder>
to allow for any type implementing the right map.
- Fix: pass through opening line of spec example to
DumpSpecReader
so it can construct an accurate full spec version of expected text. - Fix: add
ResourceResolverManager
to handleResourceUrlResolver
registration.
-
Add: parameterized test case options, ones that have option name followed by
[
and terminated by]
. Used for custom handling variations of option. These should setTestUtils.CUSTOM_OPTION
to aBiFunction<String option, String text, DataHolder>
whereoption
is the option name (type
in example),text
is the text between[]
.optionsMap.put("type", new MutableDataSet().set(CUSTOM_OPTION, ActionSpecTestCase::typeOption));
public static DataHolder typeOption(String option, String params) { // allow escape String text = params .replace("\\\\", "\\") .replace("\\]", "]") .replace("\\t", "\t") .replace("\\n", "\n") .replace("\\r", "\r") .replace("\\b", "\b"); return new MutableDataSet().set(ACTION_NAME, TYPE_ACTION).set(TYPE_ACTION_TEXT, text); }
-
Add: now if test option
DataHolder
withTestUtils.CUSTOM_OPTION
set then it will be invoked even when no[]
present to allow handling of empty params, which will benull
in this case. -
Add: before checking for parameterized option the full option with params and
[]
is tried. If present then its results are used, but also checked ifTestUtils.CUSTOM_OPTION
is present. -
Add:
ResourceUrlResolver
, registered viaResourceLocation.registerUrlResolver(Function<String, String>)
to allow resource URL conversion to URL used in example messages to be adjusted by project. Must register resolvers before trying to get an instance ofResourceLocation
since resolution of file url is done in constructor. -
Add: example's URL in exceptions when processing undefined example option.
-
Add: HTML comment handling to
SpecReader
, start/end comment tags must be the first non-blank on the line and outside of spec example.
- Fix: remove moved test class from core to utils module.
- Fix: change all tests to use static const
ResourceLocation
instead of creating a new instance. - Fix: make
ComboSpecTestCase.getSpecResourceLocation()
final and remove it from all subclasses.
- Fix: move flexmark modules test classes out of
test.util
package which is forflexmark-test-util
module's test classes - Add:
DataSet.registerDataKeyAggregator(DataKeyAggregator)
to allow for aggregation action keys and aggregation for combining keys which require this. Only applied inDataSet.aggregate()
DataSet.aggregate(DataHolder, DataHolder)
DataSet.aggregateActions(DataHolder, DataHolder)
- Fix: convert all resource info to
ResourceLocation
- Add: class location resolution via file under test
resources
named for the root package of the module and containing directory path(s) from parent ofresources
directory to get source root for test files. for maven builds it isjava/
. This allows resolving absolute file path for class files in tests for generating the locationfile:///
- Fix: package for some modules did not follow module/package naming convention
- Fix: move
flexmark-ext-superscript
to proper package by naming conventioncom.vladsch.flexmark.ext.superscript
- Fix: move
flexmark-profile-pegdown
to proper package by naming conventioncom.vladsch.flexmark.profile.pegdown
- Fix: move
flexmark-test-util
spec
package undercom.vladsch.flexmark.test.util
package
- Fix: move
- Add: test class location helpers to all modules:
flexmark-core-test/src/test/resources/com.vladsch.flexmark.core.test.txt
flexmark-docx-converter/src/test/resources/com.vladsch.flexmark.docx.converter.txt
flexmark-ext-abbreviation/src/test/resources/com.vladsch.flexmark.ext.abbreviation.txt
flexmark-ext-admonition/src/test/resources/com.vladsch.flexmark.ext.admonition.txt
flexmark-ext-anchorlink/src/test/resources/com.vladsch.flexmark.ext.anchorlink.txt
flexmark-ext-aside/src/test/resources/com.vladsch.flexmark.ext.aside.txt
flexmark-ext-attributes/src/test/resources/com.vladsch.flexmark.ext.attributes.txt
flexmark-ext-autolink/src/test/resources/com.vladsch.flexmark.ext.autolink.txt
flexmark-ext-definition/src/test/resources/com.vladsch.flexmark.ext.definition.txt
flexmark-ext-emoji/src/test/resources/com.vladsch.flexmark.ext.emoji.txt
flexmark-ext-enumerated-reference/src/test/resources/com.vladsch.flexmark.ext.enumerated.reference.txt
flexmark-ext-escaped-character/src/test/resources/com.vladsch.flexmark.ext.escaped.character.txt
flexmark-ext-footnotes/src/test/resources/com.vladsch.flexmark.ext.footnotes.txt
flexmark-ext-gfm-issues/src/test/resources/com.vladsch.flexmark.ext.gfm.issues.txt
flexmark-ext-gfm-strikethrough/src/test/resources/com.vladsch.flexmark.ext.gfm.strikethrough.txt
flexmark-ext-gfm-tasklist/src/test/resources/com.vladsch.flexmark.ext.gfm.tasklist.txt
flexmark-ext-gfm-users/src/test/resources/com.vladsch.flexmark.ext.gfm.users.txt
flexmark-ext-gitlab/src/test/resources/com.vladsch.flexmark.ext.gitlab.txt
flexmark-ext-ins/src/test/resources/com.vladsch.flexmark.ext.ins.txt
flexmark-ext-jekyll-front-matter/src/test/resources/com.vladsch.flexmark.ext.jekyll.front.matter.txt
flexmark-ext-jekyll-tag/src/test/resources/com.vladsch.flexmark.ext.jekyll.tag.txt
flexmark-ext-macros/src/test/resources/com.vladsch.flexmark.ext.macros.txt
flexmark-ext-media-tags/src/test/resources/com.vladsch.flexmark.ext.media.tags.txt
flexmark-ext-resizable-image/src/test/resources/com.vladsch.flexmark.ext.resizable.image.txt
flexmark-ext-spec-example/src/test/resources/com.vladsch.flexmark.ext.spec.example.txt
flexmark-ext-superscript/src/test/resources/com.vladsch.flexmark.ext.superscript.txt
flexmark-ext-tables/src/test/resources/com.vladsch.flexmark.ext.tables.txt
flexmark-ext-toc/src/test/resources/com.vladsch.flexmark.ext.toc.txt
flexmark-ext-typographic/src/test/resources/com.vladsch.flexmark.ext.typographic.txt
flexmark-ext-wikilink/src/test/resources/com.vladsch.flexmark.ext.wikilink.txt
flexmark-ext-xwiki-macros/src/test/resources/com.vladsch.flexmark.ext.xwiki.macros.txt
flexmark-ext-yaml-front-matter/src/test/resources/com.vladsch.flexmark.ext.yaml.front.matter.txt
flexmark-ext-youtube-embedded/src/test/resources/com.vladsch.flexmark.ext.youtube.embedded.txt
flexmark-ext-zzzzzz/src/test/resources/com.vladsch.flexmark.ext.zzzzzz.txt
flexmark-formatter-test-suite/src/test/resources/com.vladsch.flexmark.formatter.test.suite.txt
flexmark-html2md-converter/src/test/resources/com.vladsch.flexmark.html2md.converter.txt
flexmark-integration-test/src/test/resources/com.vladsch.flexmark.integration.test.txt
flexmark-java.wiki/src/test/resources/com.vladsch.flexmark-java.wiki.txt
flexmark-jira-converter/src/test/resources/com.vladsch.flexmark.jira.converter.txt
flexmark-pdf-converter/src/test/resources/com.vladsch.flexmark.pdf.converter.txt
flexmark-profile-pegdown/src/test/resources/com.vladsch.flexmark.profile.pegdown.txt
flexmark-tree-iteration/src/test/resources/com.vladsch.flexmark.tree.iteration.txt
flexmark-util/src/test/resources/com.vladsch.flexmark.util.txt
flexmark-youtrack-converter/src/test/resources/com.vladsch.flexmark.youtrack.converter.txt
flexmark/src/test/resources/com.vladsch.flexmark.txt
- Fix: package for some modules did not follow module/package naming convention
- Add: creation of
SpecExample
instance based on caller information with correct file/line of the source callingRenderingTestCase.assertRendering(String, String, String)
or its variants. - Fix: convert typographic smarts inline parser to match strings instead of using regex which sometimes takes long to execute for no apparent reason.
- Fix: make
SpecExampleRendererBase
reusable by moving any references to flexmark parsing rendering specifics toFlexmarkSpecExampleRenderer
and moving up not related to flexmark parsing, like caching of generated HTML and AST. - Fix: consolidate full spec and individual example test case in to one method.
- Fix: delete deprecated methods, classes, fields.
- Fix: delete deprecated flexmark-ext-gfm-tables
- Fix: format code
-
Break: move formatter tests and html renderer to
flexmark-core-test
module to allow sharing of test base classes in extensions without causing dependency cycles in formatter module. -
Break: move formatter module into
flexmark
core. this module is almost always included anyway because most extension have a dependency on formatter for their custom formatting implementations. Having it as part of the core allows relying on its functionality in all modules. -
Break: move
com.vladsch.flexmark.spec
andcom.vladsch.flexmark.util
inflexmark-test-util
tocom.vladsch.flexmark.test.spec
andcom.vladsch.flexmark.test.util
respectively to respect the naming convention between modules and their packages. -
Break: remove
flexmark-html-parser
,flexmark-html2md-converter
is a replacement -
Fix: revert back to
MutableDataSet.set(DataKey<T>, T)
to enforce compile time type checking for typed class values -
Fix: clean up all tests to eliminate duplication and unnecessary interface methods.
Metric Before After Files 1264 1297 Lines 124,192 118,755 Source Lines 96,669 92,145 Comment Lines 9,878 9,597 Blank Lines 17,646 17,013
- Fix: remove need to load/unload extensions. Properly handle removal from
EXTENSIONS
property for those tests that need it by implementingLOAD_EXTENSIONS
property andUNLOAD_EXTENSIONS
property handling inRenderingTestCase.combineOptions(DataHolder, DataHolder)
. - Fix: remove loading/unloading and other test support code from builder, no longer needed,
including
withOptions()
and builder construction from another builder. - Fix: change
EXTENSIONS
fromIterable
toCollection
, which should not affect most code and easier to work with. - Fix: translation mode formatting would loose indented code blocks in items if these blocks were indented more than the minimum indent for the item.
- Fix: paragraphs in containers that have non-blank termination marker would be erroneously marked as isTrailingBlankLine when they were terminated because the container was closed not because of a blank line.
- Fix: First paragraph of
AdmonitionBlock
would always format with leading blank line. Now it formats as it was in original markdown to allow preserving format as is when it is not significant or confusing.
- Fix:
NO_EOL
option for tests was applied inconsistently. - Fix: add
SpecExample
argument togetSpecExampleRenderer
- Fix: add
SpecExampleParse
argument toaddSpecExample
- Fix: regression bug #372
#372, [Regression?] Attributes extension not applied to `code` tag of code blocks
- Add:
AttributesExtension.FENCED_CODE_ADD_ATTRIBUTES
, defaultFencedCodeAddType.ADD_TO_PRE_CODE
for backward compatibility with 0.42, but if this is option is not set andAttributesExtension.FENCED_CODE_INFO_ATTRIBUTES
is set totrue
, default will change toFencedCodeAddType.ADD_TO_PRE
since attributes after info are used to add to thecode
tag.
- Add:
- Add:
SpecExampleRenderer.finalizeRender()
to allow tests and others to clean up after each rendering - Add: ability to combine data sets with
DataKey<Consumer<?>>
keys in a custom way. Needed if some option values do not contain a single value but multiple values that are set with a consumer changing some values in a structure. In such cases overwriting of these values may not be correct and the consumers need to invoked so the results of second consumer get to apply changes to options. - Fix: add dual argument constructor to
MutableDataSet
- Fix: change
AttributesExtension.FENCED_CODE_INFO_ATTRIBUTES
to defaultfalse
to match previous versions.
- Fix: MarkdownTable index out of bounds in some functions when table has no rows
- Fix:
DataSet
copy constructors to acceptnull
- Fix: change
DataSet.keySet()
toDataSet.getKeys()
- Deprecate:
DataSet.keySet()
- Deprecate:
- Add:
BasedSequence.extendByAny(CharSequence charSet, int maxCount)
to extend the based sequence to include any following contiguous characters from the underlying based sequence that are incharSet
. Variations includeBasedSequence.extendByAny(CharSequence)
for unlimited count andBasedSequence.extendByOneOfAny(CharSequence)
for max count of 1. - Add:
BasedSequence.extendToAny(CharSequence charSet, int maxCount)
to extend the based sequence to include first of any following characters from the underlying based sequence that are incharSet
. Variations includeBasedSequence.extendToAny(CharSequence)
for unlimited count. - Add:
BasedSequence.prefixWithIndent(int maxColumns)
to extend the based sequence to include leading indent from the underlying based sequence up to a maximum of given columns. Tabs are taken into account as set to 4 space columns. Variations includeBasedSequence.prefixWithIndent()
for unlimited indent. - Break: make
NodeAdaptedVisitor.myCustomHandlersMap
private. UseNodeAdaptedVisitor.getHandler(Node)
,NodeAdaptedVisitor.getHandler(Class<?>)
, andNodeAdaptedVisitor.getNodeClasses()
to get access to contained data.
- Fix: #382, Is there an option for number of whitespaces needed to create sub-lists?
FIXED_INDENT
list parser did not convert list item looking text with >= 4 spaces to lazy continuation.
- Fix:
#381, StackOverflowError with long base64 image and LINKS_ALLOW_MATCHED_PARENTHESES disabled,
USE_HARDCODED_LINK_ADDRESS_PARSER
was not used if matched parentheses were disabled causing stack overflow in regex evaluation. - Fix: docx conversion renders mail link text with
mailto:
prefix
- Fix: #376, convert markdown to html, delimiters are not allowed to span table cells.
- Fix: regression bug
#372, [Regression?] Attributes extension not applied to `code` tag of code blocks
- Add:
AttributesExtension.FENCED_CODE_ADD_ATTRIBUTES
, defaultFencedCodeAddType.ADD_TO_PRE_CODE
for backward compatibility with 0.42, but if this is option is not set andAttributesExtension.FENCED_CODE_INFO_ATTRIBUTES
is set totrue
, default will change toFencedCodeAddType.ADD_TO_PRE
since attributes after info are used to add to thecode
tag.
- Add:
- Fix: data set copy constructors to accept
null
- Fix: change
DataSet.keySet()
toDataSet.getKeys()
- Deprecate:
DataSet.keySet()
- Deprecate:
- Add:
BasedSequence.extendByAny(CharSequence charSet, int maxCount)
to extend the based sequence to include any following contiguous characters from the underlying based sequence that are incharSet
. Variations includeBasedSequence.extendByAny(CharSequence)
for unlimited count andBasedSequence.extendByOneOfAny(CharSequence)
for max count of 1. - Add:
BasedSequence.extendToAny(CharSequence charSet, int maxCount)
to extend the based sequence to include first of any following characters from the underlying based sequence that are incharSet
. Variations includeBasedSequence.extendToAny(CharSequence)
for unlimited count. - Add:
BasedSequence.prefixWithIndent(int maxColumns)
to extend the based sequence to include leading indent from the underlying based sequence up to a maximum of given columns. Tabs are taken into account as set to 4 space columns. Variations includeBasedSequence.prefixWithIndent()
for unlimited indent. - Break: make
NodeAdaptedVisitor.myCustomHandlersMap
private. UseNodeAdaptedVisitor.getHandler(Node)
,NodeAdaptedVisitor.getHandler(Class<?>)
, andNodeAdaptedVisitor.getNodeClasses()
to get access to contained data.
- Add:
BasedSequence.emptyPrefix()
andBasedSequence.emptySuffix()
to return empty sequence at start or end of the current sequence. Useful forPrefixedSubSequence.of(String, BasedSequence, int, int)
variants without needing to extract the subsequence manually. - Fix: factor out link URL parser to separate class with own tests
- Fix: link URL parser not handling char escaping, nested parenthesis tracking and other edge cases in jekyll URL macro parsing.
- Fix: real fix for Stack Overflow when parsing long URLs, by hand rolling parsing of link
destination.
- Add:
Parser.USE_HARDCODED_LINK_ADDRESS_PARSER
, defaulttrue
, setting tofalse
will use regex parsing for link destination address. May causeStackOverflowError
exception on long input but does allow customizing the regex if needed.
- Add:
- Add:
BasedSequence.safeCharAt(int)
will return\0
if index out of range for the sequence. - Add:
BasedSequence.safeBaseCharAt(int)
will return character from the base sequence if index out of range for sequence or\0
if out of base sequence range.
- Fix:
SegmentedSequence
would return sequence with start > end if ending withPrefixedSubSequence
whose position was > end of real sequences before. - Add:
BitIntegerSet.toArray(int[], int)
for easyint[]
creation from bit set. - Add:
BitIntegerSet.addAll(int[], int, int)
for setting fromint[]
- Add: source
Node
tocom.vladsch.flexmark.util.format.TableCell
- Fix: Stack overflow when parsing large embedded images with space in URL enabled. Now link
urls starting with
data:image/png;base64,
do not allow spaces in the link.
- Add:
DocxRenderer
image max-width tests - Add:
DocxRenderer
image max-height attribute processing and tests - Fix: refactor
DocxRenderer
tests to extract common code to base class - Fix: heading rendering to work with styles using numbering
- Fix:
DocxRenderer
- Add: page break via empty paragraph with only
{.pagebreak}
attributes - Add: tab via
{.tab}
attributes - Add: inline image alignment with
{align=}
:left
- left align, wrap text to rightright
- right align, wrap text to leftcenter
- center align, wrap text to left and right- else no wrapping around image
- Add: handling of
font-size
attribute, expects float of font size in pt, rounds to nearest 1/2 pt - Add: image size attribute handling for
in
andcm
for inch and cm dimensions. Can be given in:%
for percent of page widthpt
pointscm
cmin
inches- if no units given then pixels are assumed.
- Fix: if image size only given for one dimension, compute the other preserving aspect ratio
- Fix: change default emoji size to 0.9 of line height
- Fix: remove
<>
wrapper from URL target - Fix: lists to set style id to
DocxRenderer.PARAGRAPH_BULLET_LIST_STYLE
for unordered lists andDocxRenderer.PARAGRAPH_NUMBERED_LIST_STYLE
for ordered lists, while still usingDocxRenderer.BULLET_LIST_STYLE
andDocxRenderer.NUMBERED_LIST_STYLE
for the numbering style. Tight/loose is now uses paragraph settings fromDocxRenderer.TIGHT_PARAGRAPH_STYLE
andDocxRenderer.LOOSE_PARAGRAPH_STYLE
respectively as mods on list style. - Fix: start image ids at 100000 to avoid id conflicts with images already in the document being added. For example in footers/headers.
- Fix: for R tags, only add space="preserve" if contained text starts or ends with a space. Does not affect result but reduces xml noise.
- Add: page break via empty paragraph with only
- Fix:
Formatter
translation and merge rendering
- Fix: #362, ArrayIndexOutOfBoundsException in BasedSequence.indexOfAll
- Add:
DocxRenderer.BULLET_LIST_STYLE
default"BulletList"
, numbering style to use for bullet list item paragraph. - Add:
DocxRenderer.NUMBERED_LIST_STYLE
default"NumberedList"
, numbering style to use for numbered list item paragraph. - Add: Simple
Attributes
processing to docx conversion:.className
on paragraph elements will set the docx styleId toclassName
if the style id is found.- Use
{style=""}
to set attributes on text or block elements. Only the following are processed:color
- text colorbackground-color
- shade fill color, pattern always solid.font-family
- not implementedfont-size
- not implementedfont-weight
- set/clear bold (if using numeric weights then >= 550 sets bold, less clears it)font-style
- set/clear italic
- Add: merge multiple markdown documents into single document functionality. Includes making
conflicting references between documents unique by adding an integer numeric suffix.
- Conflicting headings will get a unique explicit id attribute by the
flexmark-ext-attributes
extension. - Added to
Formatter
module using modified translation API functionality.Formatter.mergeRender(Document[], Appendable, HtmlIdGeneratorFactory)
Formatter.mergeRender(Document[], Appendable, int, HtmlIdGeneratorFactory)
Formatter.mergeRender(Document[], int, HtmlIdGeneratorFactory)
- Add: merge tests and functionality to:
flexmark-formatter
core rendering of anchors and headings.flexmark-ext-abbreviation
, by default making references unique is disabled. Enable by settingAbbreviationExtension.MAKE_MERGED_ABBREVIATIONS_UNIQUE
totrue
for the formatter options used to merge documents.flexmark-ext-attributes
flexmark-ext-enumerated-reference
flexmark-ext-footnotes
flexmark-ext-macros
- Add: link mapping based on document's
Formatter.DOC_RELATIVE_URL
andFormatter.DOC_ROOT_URL
properties.
- Conflicting headings will get a unique explicit id attribute by the
- Fix:
Formatter
attributes would eliminate separator space before or after following text possibly changing the applicable node for the attribute.
- Fix: docx converter to use
BulletList
andNumberedList
numbering list styles for list conversions to allow easy list item styling for multi-level lists- Add:
DocxConverterEmpty
to samples for generatingflexmark-empty-template.docx
fromempty.md
andempty.xml
- Add:
- Fix: update docx4j to version 8.1.2
- Fix: update jsoup to version 1.11.3
- Fix: Attributes with spaces after
{
generated wrong previous text offsets
- Fix: #357, HTML to markdown and removed nested list
- Remove:
FlexmarkHtmlConverter.EXT_TABLES
unused conversion option. - Add: allow attributes after fenced code info string as last non-blank text after the info
string.
- Add:
AttributesExtension.FENCED_CODE_INFO_ATTRIBUTES
defaulttrue
, if false will not parse attributes after the fenced code info string
- Add:
- Add:
flexmark-html2md-converter
module which implements HTML to Markdown conversion with an extension API to allow customizing the conversion process. Sample: HtmlToMarkdownCustomizedSample.java - Fix: deprecate the old
flexmark-html-parser
classes
- Fix: GitLab block quotes should have
>>>
as termination, not<<<
, macros are still terminated by>>>
to allow nested block quotes in macros. Affects:- HTML converter
- Formatter
- Fix: #351, Is there any special format requirement for processing html data to markdown
- Fix: #349, Translation Helper bugs, mix-up between anchors and other non-translating elements after translation.
- Fix: #349, Translation Helper bugs
- Fix: #348, WRAP_AUTO_LINKS defaults to false, Markdown loses a potential useful link
- Break: change
FlexmarkHtmlParser.WRAP_AUTO_LINKS
default to true - Fix: add
SpecReader.readExamples(String, String)
which takes resource name and file URL to allow for non-standard resource file locations. - Fix: html to markdown string not add EOL by default.
- Break: make Java 8 minimum version and use JDK 8 for compilation
- Fix: IntelliJ Migration contained in migrate flexmark-java 0_42_x to 0_50_0.xml, to use:
- copy to IntelliJ application settings to
migration
subdirectory - if you have the project which you want to migrate open, then close it
- open the project in IntelliJ Ultimate or Community
- update the flexmark-java dependency version to 0.42.0 (or later) and make sure the new library is downloaded/updated in the project.
- use menu
Refactor
>Migrate...
or search everywhere (double shift activation) and search for migrate action. - select
migrate flexmark-java 0.42.x to 0.50.0
- press
Run
- in the refactoring preview tool window that opens hit
Do Refactor
- copy to IntelliJ application settings to
- Remove classes from utils which are implemented in Java 8
- replace
RunnableValue
withSupplier
, requires changingrun()
withget()
- replace
ValueRunnable
withConsumer
, requires changingrun()
withaccept()
- replace
Factory
withSupplier
, requires changingcreate()
withget()
- replace
Computable
withFunction
, requires changingcompute()
withapply()
and reversing template parameters. - replace
ComputableFactory
withFunction
, requires changingcreate()
withapply()
and reversing template parameters. - replace
ComputeFactory
withFunction
, requires changingcreate()
withapply()
and reversing template parameters. - replace all factory interfaces to be compatible with
Function
interface and changecreate()
withapply()
- replace
com.vladsch.flexmark.util.collection.Consumer
withjava.util.function.Consumer
- clean up
DataKey
andDataHolder
related classes- move
com.vladsch.flexmark.util.collection.DataValueFactory
tocom.vladsch.flexmark.util.DataValueFactory
- replace
com.vladsch.flexmark.util.collection.DynamicDefaultKey
withcom.vladsch.flexmark.util.options.DataKey
- change
MutableDataHolder.getOrCompute(DataKey<T>, DataValueFactory<T>)
toMutableDataHolder.getOrCompute(DataKey<T>)
with the data value factory taken from they key.
- move
- remove unused
ItemIndexSetMap
, useIndexedItemSetMap
instead - move
flexmark-util
Node related classes and interfaces tocom.vladsch.flexmark.util.ast
- move
com.vladsch.flexmark.util.NodeTracker
tocom.vladsch.flexmark.util.ast.NodeTracker
- move
com.vladsch.flexmark.util.BlockTracker
tocom.vladsch.flexmark.util.ast.BlockTracker
- move
com.vladsch.flexmark.util.KeepType
tocom.vladsch.flexmark.util.ast.KeepType
- move
com.vladsch.flexmark.util.IParse
tocom.vladsch.flexmark.util.ast.IParse
- move
com.vladsch.flexmark.util.IRender
tocom.vladsch.flexmark.util.ast.IRender
- move
com.vladsch.flexmark.util.collection.NodeClassifierVisitor
tocom.vladsch.flexmark.util.ast.NodeClassifierVisitor
- move
com.vladsch.flexmark.util.collection.NodeCollectingVisitor
tocom.vladsch.flexmark.util.ast.NodeCollectingVisitor
- move
com.vladsch.flexmark.util.collection.ClassifyingNodeTracker
tocom.vladsch.flexmark.util.ast.ClassifyingNodeTracker
- move
com.vladsch.flexmark.util.mappers.NodeClassifier
tocom.vladsch.flexmark.util.ast.NodeClassifier
- move
- move data key/set/holder classes to
flexmark.util.data
package fromflexmark.util.options
package- move
com.vladsch.flexmark.util.options.DataHolder
tocom.vladsch.flexmark.util.data.DataHolder
- move
com.vladsch.flexmark.util.options.MutableDataSet
tocom.vladsch.flexmark.util.data.MutableDataSet
- move
com.vladsch.flexmark.util.options.MutableScopedDataSet
tocom.vladsch.flexmark.util.data.MutableScopedDataSet
- move
com.vladsch.flexmark.util.options.ScopedDataSet
tocom.vladsch.flexmark.util.data.ScopedDataSet
- move
com.vladsch.flexmark.util.options.DataValueFactory
tocom.vladsch.flexmark.util.data.DataValueFactory
- move
com.vladsch.flexmark.util.options.MutableDataHolder
tocom.vladsch.flexmark.util.data.MutableDataHolder
- move
com.vladsch.flexmark.util.options.DataSet
tocom.vladsch.flexmark.util.data.DataSet
- move
com.vladsch.flexmark.util.options.MutableDataSetter
tocom.vladsch.flexmark.util.data.MutableDataSetter
- move
com.vladsch.flexmark.util.options.DataKey
tocom.vladsch.flexmark.util.data.DataKey
- move
- Fix: IntelliJ Migration contained in migrate flexmark-java 0_42_x to 0_50_0.xml, to use:
- Add:
LineFormattingAppendable
andLineFormattingAppendableImpl
- Fix: deprecate
FormattingAppendable
to be replaced byLineFormattingAppendable
- Fix: deprecate
FormattingAppendableImpl
to be replaced byLineFormattingAppendableImpl
- Fix: replace all uses of
FormattingAppendable
byLineFormattingAppendable
- Fix: replace all uses of
FormattingAppendableImpl
byLineFormattingAppendableImpl
- Delete:
FormattingAppendable
andFormattingAppendableImpl
- Fix: deprecate
- Fix: Factor out BasedSequenceImpl functionality that does not depend on
BasedSequence
and can be applied to any CharSequence into its ownRichCharSequence
interface with default abstract implementation inRichCharSequenceBase
and implementation inRichCharSequenceImpl
.
- Fix: #351, Is there any special format requirement for processing html data to markdown
- Fix: HTML parser converts
a
tags in preformatted text to links, should convert to URL only
- Fix: #349, Translation Helper bugs, mix-up between anchors and other non-translating elements after translation.
- Fix: #349, Translation Helper bugs
- Fix: #348, WRAP_AUTO_LINKS defaults to false, Markdown loses a potential useful link
- Add: PDF converter landscape sample PdfLandscapeConverter.java
- Fix: revert to OpenHtmlToPDF version 0.0.1-RC15 which is the last Java 7 byte code version
- Fix: fill missing columns StringIndexOutOfBoundsException when prev cell consists of consecutive pipes without text
- Fix: add explicit
Locale.US
toString.format()
when using%d
for integers to prevent conversion to arabic on Java 11.
- Fix: #338, getLineNumber incorrect with Windows end of line separators
- merge: #339, PR: Fix to line number when using Windows EOL characters. thanks to
- Fix: Trailing URI prefix only auto-links do not get parsed
- Fix: #334, CR line separators don't produce line break nodes,
- merge: #335, PR: Fix CR-only line separator handling thanks to Kijimuna
- Fix: #332, withOptions forgets about old link resolvers
- Break: move
com.vladsch.flexmark.Extension
tocom.vladsch.flexmark.util.builder.Extension
- Fix: IntelliJ Migration contained in migrate flexmark-java 0_40_x to 0_42_0, to use:
- copy to IntelliJ application settings to
migration
subdirectory - if you have the project which you want to migrate open, then close it
- open the project in IntelliJ Ultimate or Community
- update the flexmark-java dependency version to 0.42.0 (or later) and make sure the new library is downloaded/updated in the project.
- use menu
Refactor
>Migrate...
- select
migrate flexmark-java 0.42.x to 0.50.0
- press
Run
- in the refactoring preview tool window that opens hit
Do Refactor
- copy to IntelliJ application settings to
- Add: common builder base to handle unloading extensions
- Add:
BuilderBase.RELOAD_EXTENSIONS
defaulttrue
, iftrue
then will unload loaded extension from the builder whenwithOptions()
is used on:Parser
,HtmlRenderer
,Formatter
orDocxRenderer
. Iffalse
then will not reload extensions which are already loaded. The latter is slightly faster because loaded extensions are not re-loaded but will not change extension configuration for loaded extensions based on new options. - Fix:
HtmlParser.Builder
constructor with options does not preserve all already loaded extensions and custom api factories - Fix:
Parser.Builder
constructor with options does not preserve all already loaded extensions and custom api factories - Fix:
Formatter.Builder
constructor with options does not preserve all already loaded extensions and custom api factories - Fix:
DocxRenderer.Builder
constructor with options does not preserve all already loaded extensions and custom api factories - Add:
BuilderBase.UNLOAD_EXTENSIONS
, defaultExtension.EMPTY_LIST
, all extensions in the list will be removed. Used only when usingwithOptions()
and providing new options with this key set. Used during testing to remove default extensions.
- Break: move
- Fix: #328, Html2mark - missing newline when paragraph followed by div
- Fix: #331, Ability to replace empty <p> with <br> during html2mark conversion
- Fix: NPE in
TableParagraphPreProcessor
- Fix:
AutolinkNodePostProcessor
processing links out of order causing sequence end/start reversal.
- Fix: compound enumerated references in attributes ids and outside of headings to output with last enumerated reference ordinal.
- Fix: limit
EnumeratedReferenceBlock
to single line of text without processing other block elements. - Fix: change
Abbreviations
to custom block parser from paragraph pre-processor. Allows abbreviation definitions without preceding blank line.
- Add: enumerated reference text in heading to be used with only a format reference, the id is taken from the heading attributes.
- Add: compound enumerated references for creating legal numbering for enumerated references.
- Fix: upgrade dependencies
- OpenHtmlToPdf -> 0.0.1-RC19
- docx4j -> 6.1.2
- Add: parse int or default to
Utils.java
-
Break: test case related classes changed to allow providing URL string for the file resource used in the text instead of relying on heuristic conversion of resource URL to file path.
-
Fix: #326, flexmark-html-parser - multiple <code> inside <pre> bug
-
Fix:
EscapedCharacterExtension
disabled forDoNotLinkDecorate
nodes if another extension specified itsNodePostProcessorFactory
as dependent onText
withDoNotDecorate
andDoNotLinkDecorate
and the extension was added afterEscapedCharacterExtension
-
Add:
Parser.WWW_AUTO_LINK_ELEMENT
, defaultfalse
. Iftrue
then strings of the form<www.someurl>
will be parsed as auto-links -
Fix: copy
Extensions
fromflexmark-profile-pegdown
module toPegdownExtensions
in core parser. Old class still available and extends the new named class. -
Add:
ParserEmulationProfile.getOptions(DataHolder)
toParserEmulationProfile
to allow using current option values in deciding what the settings should be for the profile. Used byParserEmulationProfile.PEGDOWN
-
Fix: #323, TOC generation improvement, profile setting HeaderId generation to
false
even thoughPegdownExtensions.ANCHORLINKS
is not used -
Add: css option to PDF export and use as default css from #323, TOC generation improvement, thanks to @jvdvegt
- Add:
PdfConverterExtension.DEFAULT_CSS
data key with default value of embedded CSS. - Add:
PdfConverterExtension.embedCss(String html, String css)
will embed the css in html by inserting it between<head>
and</head>
wrapped in<style>
and</style>
. Does its best to generate valid HTML, use it if your don't want to bother creating your own HTML document with embedded CSS.
ℹ️ Default CSS is only added if
PdfConverterExtension.exportToPdf(OutputStream, String, String, DataHolder)
is used to provide options. For all other calls you need to embed the default css into your HTML string before exporting to PDF. - Add:
-
Fix: HTML parser link/image conversion to ref link and reference when cannot create a valid reference fallback to generating explicit link instead.
-
Fix: HTML parser ignoring
NONE
forFlexmarkHtmlParser.EXT_INLINE_LINK
andFlexmarkHtmlParser.EXT_INLINE_IMAGE
options -
Fix: HTML parser to add blank line before block quote and aside if they are not the first child of their parent.
-
Fix: HTML parser, divs always generated line before and after, instead of before if not first child element and after if not last child element.
-
Add:
IParse.transferReferences(Document, Document, Boolean)
, to allow overriding repositoryKeepType
selected copying behaviour for references already defined in the destination document. -
Deprecate:
IParse.transferReferences(Document, Document)
, in favour ofIParse.transferReferences(Document, Document, Boolean)
- Fix: merge util tests from @James-Adam and fix bugs
- Fix: change to
MutableDataSet.set(DataKey<? extends T>, T)
- Fix: #316, Github user extension incorrectly formats some text
- Add: test to make sure previous character to
@
is notisUnicodeIdentifierPart()
,-
nor.
- Add: test to make sure previous character to
- Add:
FlexmarkHtmlParser
options:- Fix: #318, Ability to disable table caption in FlexmarkHtmlParser,
- Add:
TABLE_CAPTION
option as a convenience alias forFormatter.FORMAT_TABLE_CAPTION
. Add documentation to Extensions: Html To Markdown
- Add:
- Fix: #314, Ability to override character replacements map in FlexmarkHtmlParser,
- Add:
TYPOGRAPHIC_REPLACEMENT_MAP
option key taking aMap<String,String>
, if not empty will be used instead of the bundled map. Any typographic characters or HTML entities missing from the map will be output without conversion. If you want to suppress a typographic so it is not output add""
to its mapped value.
- Add:
- Fix: #317, FlexmarkHtmlParser outputs extra newline when converting nested <ol>, <ul> lists
- Fix: when rendering raw HTML for inline elements, have to escape contained special markdown characters.
- Add:
FOR_DOCUMENT
option to use as document into which the generated Markdown will be inserted. This is to allow re-use matching references generated from HTML instead of new ones. EXT_INLINE_LINK
andEXT_INLINE_IMAGE
option defaultLinkConversion.MARKDOWN_EXPLICIT
, specifies type of link and image conversion to apply:NONE
,MARKDOWN_EXPLICIT
,MARKDOWN_REFERENCE
,TEXT
,HTML
- Fix: #318, Ability to disable table caption in FlexmarkHtmlParser,
- Add: Remove reliance on YouTrack: IDEA-207453 and instead change resource file URL to path
in
SpecReader
and add a message to all example tests with the file URL with:xxx
wherexxx
is the line number of the spec example in the file. - This will print the source location of the test in the console. Clicking the link goes right to the spec source file and line of the failed test if Awesome Console plugin is installed.
-
Add:
EmbeddedAttributeProvider
documentation and add it to the provider's list by default unlessHtmlRenderer.EMBEDDED_NODE_PROVIDER
is set to false. Add attributes to nodes in the AST by inserting aEmbeddedAttributeProvider.EmbeddedNodeAttributes
node with the desired attributes. See: NodeInsertingPostProcessorSample.java for example. -
Add: document that
DocxRenderer
emoji with GitHub preferred is not able to download images, compilingImageUtils
library with Java 8 eliminates the problem. -
Add: resource file URL to
SpecReader
and add a message to all example tests with the file URL with:xxx
wherexxx
is the line number of the spec example in the file. -
This will print the source location of the test in the console. Clicking the link goes right to the spec source file and line of the failed test. Unfortunately this URL will only work in IntelliJ when JetBrains add this to console to handle such
file://
URLs: YouTrack: IDEA-207453 -
Fix: #310, PR: Change URL of GitHub CDN thanks to @benelog
-
Fix:
AsideExtension
option keys to be dynamic data keys dependent on corresponding Parser block quote options for their defaults. -
⚠️ This can potentially break code relying on versions of the extension before0.40.18
because parsing rules can change depending on which block quote options are changed from their default values. -
To ensure independent options for aside blocks and block quotes, set aside options explicitly. The following will set all aside options to default values, independent from block quote options:
.set(EXTEND_TO_BLANK_LINE, false) .set(IGNORE_BLANK_LINE, false) .set(ALLOW_LEADING_SPACE, true) .set(INTERRUPTS_PARAGRAPH, true) .set(INTERRUPTS_ITEM_PARAGRAPH, true) .set(WITH_LEAD_SPACES_INTERRUPTS_ITEM_PARAGRAPH, true)
-
Deprecate:
Parser.BLOCK_QUOTE_TO_BLANK_LINE
, use more mnemonicParser.BLOCK_QUOTE_EXTEND_TO_BLANK_LINE
-
Deprecate:
CustomNode
andCustomBlock
.Block
andNode
should be used directly. The library aims to make no distinction between core and extension implementations, these classes add no useful information. -
Deprecate: BaseSequence had old named functions which were misleading and duplicated under proper names:
countChars()
->countLeading()
countCharsNot()
->countLeadingNot()
countCharsReversed()
->countTrailing()
countNotCharsReversed()
->countTrailingNot()
-
First of all they only counted leading characters which the name did not imply. Second they were duplicated.
-
Add character counting functions:
countOfAny()
countOfAnyNot()
-
Fix:
DefinitionExtension
does not correctly set the child parse column, causing list items to be expecting 1 extra space for child item recognition. -
Add:
ExtensionConversion.NONE
to suppress any output from corresponding element -
Add:
FlexmarkHtmlParser.EXT_MATH
, defaultExtensionConversion.HTML
, for selecting<math>
tag processing. For now onlyMARKDOWN
does nothing useful. Later it will be used to convert math ml to GitLab math inline element.
- Fix:
EnumeratedReferenceExtension
would process GitHub issue link text as enumerated reference. Now enumeratedreference
must start with a non-digit character to be interpreted as enumerated reference. - Fix: Reference Text, Reference Id, Link Text and Image Alt Text child text was not trimmed in the AST causing the parent text range to be smaller than the contained children's text range.
- Add:
PdfConverterExtension.PROTECTION_POLICY
, defaultnull
. Set the protection policy for the generated PDF document.- Merge: #306, PR: Add password protection support, send appreciations to niksw7
- Add:
youtu.be
link handling toYouTubeLinkExtension
- Merge: #305, PR: add new youtube link style support to flexmark-ext-youtube-embedded for youtu.be/xyz(?t=123), send appreciations to jjYBdx4IL
- Fix:
AutolinkExtension
removing leadingTypographic
nodes when the first link occurs in text following the typographic node. - Add: PDF converter sample with non-latin character set rendering information.
- Fix: missing
simple_smile
emoji cheat sheet shortcut
- Fix: #300, Typography extension breaks some auto links
- Add:
TypographicText
interface to mark nodes which hold text which is replaced with typographic for rendering but treated as text for decoration processing. For nowAutolinkExtension
is the only one making use of it to prevent typographic smarts from breaking up a link and causing part of it to be left out of the URL.
- Fix: GitLab inline math parser to allow multi-line inline math elements
- Fix: #295, CoreNodeFormatter does not descend into children on Link nodes , more like
kludge,
Formatter.OPTIMIZED_INLINE_RENDERING
whenfalse
and not translating to always render children of link text.
- Fix: change
AttributeProviderFactory
extensions to eliminate duplicate registrations of factories. - Fix:
AttributesExtension
to assign attributes to explicit/refs links/images - Fix: #299, FlexmarkHtmlParser produces extra empty list item for eclosing </p> element
- Fix:
MarkdownTable.appendTable(FormattingAppendable)
to setFormattingAppendable.ALLOW_LEADING_WHITESPACE
so indentation prefix is not eliminated. - Fix:
FormattingAppendableImpl
to not skip pending spaces ifFormattingAppendable.ALLOW_LEADING_WHITESPACE
is selected, these will be prefixed before indent. - Add:
FlexmarkHtmlParser.SKIP_LINKS
, defaultfalse
. When true links are converted to text part of the link. - Add:
DoNotAttributeDecorate
interface to be implemented by all text nodes which do not result in span-like rendering of their text, such asTypographicSmarts
,TypographicQuotes
andSoftLineBreak
but will erroneously create a break in the text and mess up attribute assignment to text spans. - Add:
AttributesExtension.WRAP_NON_ATTRIBUTE_TEXT
, defaulttrue
. Whenfalse
does not wrap nodes marked asDoNotAttributeDecorate
inTextBase
. Whentrue
, will allow intuitive attribute processing for text containingDoNotAttributeDecorate
as single text span instead of one interrupted by the typographic smarts nodes. - Fix:
AttributesExtension
incorrectly parsed invalid empty sequences and absorbed the text instead of skipping it. ie.{}
,{ }
,{#}
and{.}
- Add:
AttributesExtension.USE_EMPTY_IMPLICIT_AS_SPAN_DELIMITER
, defaultfalse
. When set totrue
will treat{#}
or{.}
, without embedded spaced, as start attribute span delimiter to mark start of attribute assignment to text between{.}
or{#}
and the matching attributes element.
- Fix: #295, CoreNodeFormatter does not descend into children on Link nodes
Link
,LinkRef
,Image
andImageRef
node formatter renderer now descends into child nodes during all formatting, not just translation formatting.
- Add:
Formatter.OPTIMIZED_INLINE_RENDERING
defaultfalse
. When set totrue
will use previous rendering for links and images which appends the node characters without descending into child nodes.
- Fix: #294, BlankLine nodes within BlockQuote change in behaviour
- remove blank lines from AST for
BlockQuote
andAsideBlock
nodes ifParser.BLANK_LINES_IN_AST
is not set.
- remove blank lines from AST for
- Fix: #292, 0.40.0: JUnit is in the compile scope
- remove unnecessary ast collecting visitor in
DocumentParser
- add test scope to flexmark pom
- remove unnecessary ast collecting visitor in
- Fix: #293, YamlFrontMatterBlock rendered as markdown does not preserve nested lists
- Add:
YamlFrontMatterValue
node containing yaml value(s) inserted as children ofYamlFrontMatterNode
- Fix: change stored key as
BasedSequence
instead of string, can be retrieved asYamlFrontMatterNode.getKeySequence()
- Add: code to return
List<String>
from child nodes ofYamlFrontMatterNode
- Fix: resolve offsets in
YamlFrontMatterNode
andYamlFrontMatterValue
nodes.
- Add:
- Fix: Java9+ Compatibility, IntelliJ Migration contained in migrate 0_35_x to 0_40_0.xml, to
use:
- copy to IntelliJ application settings to
migrations
subdirectory - if you have the project which you want to migrate open, then close it
- open the project in IntelliJ Ultimate or Community
- update the flexmark-java dependency version to 0.40.0 (or later) and make sure the new library is downloaded/updated in the project.
- use menu
Refactor
>Migrate...
- select
migrate flexmark-java 0.35.x to 0.40.0
- press
Run
- in the refactoring preview tool window that opens hit
Do Refactor
- copy to IntelliJ application settings to
⚠️ In my projects, the IDE can miss some class migrations, especially on files which are not open. Re-running the migration tends to apply the migration. In cases where migration is not applied manual editing will be needed. In my projectsDocument
,Node
andFormatter
were the problem classes:com.vladsch.flexmark.ast.Document
tocom.vladsch.flexmark.util.ast.Document
com.vladsch.flexmark.ast.Node
tocom.vladsch.flexmark.util.ast.Node
com.vladsch.flexmark.formatter.internal.Formatter
tocom.vladsch.flexmark.formatter.Formatter
⚠️ flexmark-docx-converter
andflexmark-pdf-converter
cannot be used with Java 9+ modules because the underlying libraries used have package load conflicts that will be resolved in a later release.
-
Fix: overlapping packages in different modules, change:
-
com.vladsch.flexmark.ast.AllNodesVisitor
tocom.vladsch.flexmark.util.ast.AllNodesVisitor
-
com.vladsch.flexmark.ast.BlankLine
tocom.vladsch.flexmark.util.ast.BlankLine
-
com.vladsch.flexmark.ast.BlankLineContainer
tocom.vladsch.flexmark.util.ast.BlankLineContainer
-
com.vladsch.flexmark.ast.Block
tocom.vladsch.flexmark.util.ast.Block
-
com.vladsch.flexmark.ast.BlockContent
tocom.vladsch.flexmark.util.ast.BlockContent
-
com.vladsch.flexmark.ast.BlockNodeVisitor
tocom.vladsch.flexmark.util.ast.BlockNodeVisitor
-
com.vladsch.flexmark.ast.Content
tocom.vladsch.flexmark.util.ast.Content
-
com.vladsch.flexmark.ast.ContentNode
tocom.vladsch.flexmark.util.ast.ContentNode
-
com.vladsch.flexmark.ast.CustomBlock
tocom.vladsch.flexmark.util.ast.CustomBlock
-
com.vladsch.flexmark.ast.CustomNode
tocom.vladsch.flexmark.util.ast.CustomNode
-
com.vladsch.flexmark.ast.DescendantNodeIterable
tocom.vladsch.flexmark.util.ast.DescendantNodeIterable
-
com.vladsch.flexmark.ast.DescendantNodeIterator
tocom.vladsch.flexmark.util.ast.DescendantNodeIterator
-
com.vladsch.flexmark.ast.Node
tocom.vladsch.flexmark.util.ast.Node
-
com.vladsch.flexmark.ast.Document
tocom.vladsch.flexmark.util.ast.Document
-
com.vladsch.flexmark.ast.DoNotCollectText
tocom.vladsch.flexmark.util.ast.DoNotCollectText
-
com.vladsch.flexmark.ast.DoNotDecorate
tocom.vladsch.flexmark.util.ast.DoNotDecorate
-
com.vladsch.flexmark.ast.DoNotLinkDecorate
tocom.vladsch.flexmark.util.ast.DoNotLinkDecorate
-
com.vladsch.flexmark.ast.KeepTrailingBlankLineContainer
tocom.vladsch.flexmark.util.ast.KeepTrailingBlankLineContainer
-
com.vladsch.flexmark.ast.NodeAdaptedVisitor
tocom.vladsch.flexmark.util.ast.NodeAdaptedVisitor
-
com.vladsch.flexmark.ast.NodeAdaptingVisitHandler
tocom.vladsch.flexmark.util.ast.NodeAdaptingVisitHandler
-
com.vladsch.flexmark.ast.NodeAdaptingVisitor
tocom.vladsch.flexmark.util.ast.NodeAdaptingVisitor
-
com.vladsch.flexmark.ast.NodeIterable
tocom.vladsch.flexmark.util.ast.NodeIterable
-
com.vladsch.flexmark.ast.NodeIterator
tocom.vladsch.flexmark.util.ast.NodeIterator
-
com.vladsch.flexmark.ast.NodeRepository
tocom.vladsch.flexmark.util.ast.NodeRepository
-
com.vladsch.flexmark.ast.NodeVisitor
tocom.vladsch.flexmark.util.ast.NodeVisitor
-
com.vladsch.flexmark.ast.NodeVisitorBase
tocom.vladsch.flexmark.util.ast.NodeVisitorBase
-
com.vladsch.flexmark.ast.NonRenderingInline
tocom.vladsch.flexmark.util.ast.NonRenderingInline
-
com.vladsch.flexmark.ast.Package
tocom.vladsch.flexmark.util.ast.Package
-
com.vladsch.flexmark.ast.ReferenceNode
tocom.vladsch.flexmark.util.ast.ReferenceNode
-
com.vladsch.flexmark.ast.ReferencingNode
tocom.vladsch.flexmark.util.ast.ReferencingNode
-
com.vladsch.flexmark.ast.VisitHandler
tocom.vladsch.flexmark.util.ast.VisitHandler
-
com.vladsch.flexmark.ast.Visitor
tocom.vladsch.flexmark.util.ast.Visitor
-
com.vladsch.flexmark.IParse
tocom.vladsch.flexmark.util.IParse
-
com.vladsch.flexmark.IRender
tocom.vladsch.flexmark.util.IRender
-
Fix: API classes under
internal
package: -
flexmark
: -
com.vladsch.flexmark.internal.inline.AsteriskDelimiterProcessor
tocom.vladsch.flexmark.parser.core.delimiter.AsteriskDelimiterProcessor
-
com.vladsch.flexmark.internal.inline.EmphasisDelimiterProcessor
tocom.vladsch.flexmark.parser.core.delimiter.EmphasisDelimiterProcessor
-
com.vladsch.flexmark.internal.Bracket
tocom.vladsch.flexmark.parser.core.delimiter.Bracket
-
com.vladsch.flexmark.internal.Delimiter
tocom.vladsch.flexmark.parser.core.delimiter.Delimiter
-
com.vladsch.flexmark.internal.ThematicBreakOptions
tocom.vladsch.flexmark.internal.ThematicBreakParser.ThematicBreakOptions
-
com.vladsch.flexmark.internal.HeadingOptions
tocom.vladsch.flexmark.internal.HeadingParser.HeadingOptions
-
com.vladsch.flexmark.internal.BlockParserTracker
tocom.vladsch.flexmark.parser.block.BlockParserTracker
-
com.vladsch.flexmark.internal.BlockQuoteParser
tocom.vladsch.flexmark.parser.core.BlockQuoteParser
-
com.vladsch.flexmark.internal.DocumentBlockParser
tocom.vladsch.flexmark.parser.core.DocumentBlockParser
-
com.vladsch.flexmark.internal.FencedCodeBlockParser
tocom.vladsch.flexmark.parser.core.FencedCodeBlockParser
-
com.vladsch.flexmark.internal.HeadingParser
tocom.vladsch.flexmark.parser.core.HeadingParser
-
com.vladsch.flexmark.internal.IndentedCodeBlockParser
tocom.vladsch.flexmark.parser.core.IndentedCodeBlockParser
-
com.vladsch.flexmark.internal.ListBlockParser
tocom.vladsch.flexmark.parser.core.ListBlockParser
-
com.vladsch.flexmark.internal.ListItemParser
tocom.vladsch.flexmark.parser.core.ListItemParser
-
com.vladsch.flexmark.internal.ParagraphParser
tocom.vladsch.flexmark.parser.core.ParagraphParser
-
com.vladsch.flexmark.internal.ThematicBreakParser
tocom.vladsch.flexmark.parser.core.ThematicBreakParser
-
com.vladsch.flexmark.internal.HtmlBlockParser
tocom.vladsch.flexmark.parser.core.HtmlBlockParser
-
com.vladsch.flexmark.internal.ReferencePreProcessorFactory
tocom.vladsch.flexmark.parser.core.ReferencePreProcessorFactory
-
com.vladsch.flexmark.internal.InlineParserImpl
tocom.vladsch.flexmark.parser.internal.InlineParserImpl
-
com.vladsch.flexmark.internal.BlockStartImpl
tocom.vladsch.flexmark.parser.internal.BlockStartImpl
-
com.vladsch.flexmark.internal.BlockContinueImpl
tocom.vladsch.flexmark.parser.internal.BlockContinueImpl
-
com.vladsch.flexmark.internal.LinkRefProcessorData
tocom.vladsch.flexmark.parser.internal.LinkRefProcessorData
-
com.vladsch.flexmark.internal.CommonmarkInlineParser
tocom.vladsch.flexmark.parser.internal.CommonmarkInlineParser
-
com.vladsch.flexmark.internal.MatchedBlockParserImpl
tocom.vladsch.flexmark.parser.internal.MatchedBlockParserImpl
-
com.vladsch.flexmark.internal.PostProcessorManager
tocom.vladsch.flexmark.parser.internal.PostProcessorManager
-
com.vladsch.flexmark.internal.DocumentParser
tocom.vladsch.flexmark.parser.internal.DocumentParser
-
com.vladsch.flexmark.internal.HtmlDeepParser
tocom.vladsch.flexmark.parser.internal.HtmlDeepParser
-
resource
/com/vladsch/flexmark/internal/util/entities.properties
to/com/vladsch/flexmark/util/html/entities.properties
inflexmark-util
module -
flexmark-docx-converter
-
com.vladsch.flexmark.docx.converter.internal.DocxRenderer
tocom.vladsch.flexmark.docx.converter.DocxRenderer
-
com.vladsch.flexmark.docx.converter.internal.DocxRendererPhase
tocom.vladsch.flexmark.docx.converter.DocxRendererPhase
-
com.vladsch.flexmark.docx.converter.internal.NodeDocxRendererHandler
tocom.vladsch.flexmark.docx.converter.NodeDocxRendererHandler
-
com.vladsch.flexmark.docx.converter.internal.DocxRendererOptions
tocom.vladsch.flexmark.docx.converter.DocxRendererOptions
-
flexmark-formatter
-
com.vladsch.flexmark.formatter.internal.Formatter
tocom.vladsch.flexmark.formatter.Formatter
-
com.vladsch.flexmark.formatter.internal.FormattingPhase
tocom.vladsch.flexmark.formatter.FormattingPhase
-
com.vladsch.flexmark.formatter.internal.MarkdownWriter
tocom.vladsch.flexmark.formatter.MarkdownWriter
-
com.vladsch.flexmark.formatter.internal.NodeFormatter
tocom.vladsch.flexmark.formatter.NodeFormatter
-
com.vladsch.flexmark.formatter.internal.NodeFormatterContext
tocom.vladsch.flexmark.formatter.NodeFormatterContext
-
com.vladsch.flexmark.formatter.internal.NodeFormatterFactory
tocom.vladsch.flexmark.formatter.NodeFormatterFactory
-
com.vladsch.flexmark.formatter.internal.NodeFormattingHandler
tocom.vladsch.flexmark.formatter.NodeFormattingHandler
-
com.vladsch.flexmark.formatter.internal.NodeRepositoryFormatter
tocom.vladsch.flexmark.formatter.NodeRepositoryFormatter
-
com.vladsch.flexmark.formatter.internal.PhasedNodeFormatter
tocom.vladsch.flexmark.formatter.PhasedNodeFormatter
-
com.vladsch.flexmark.formatter.internal.NodeFormatterSubContext
tocom.vladsch.flexmark.formatter.NodeFormatterSubContext