NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
crates.io · #1047 most downloaded on crates.io
Convert pulldown-cmark Events back to the string they were parsed from
Last release 8 days ago
29 Sep 2026
Release timing varies
gaps range from 2 weeks to 9 months
Nearly every release is documented
notes for 54 of 55 stable releases
1 version withdrawn
withdrawn after publishing
9 years old
56 releases · first in 2018
Beware that this is basically an SI rewrite, which I reviewed from an API perspective. It should be way more correct than the previous version, at lea
Beware that this is basically an SI rewrite, which I reviewed from an API perspective.
It should be way more correct than the previous version, at least tests would
say so.
Reason: I wanted to prevent piece-meal SI-PRs to fix individual aspects of the prior
version, which was pretty sub-par in the correctness department.
require parser options and validate round-trip configurations
Checked public API, rest is mostly rubber-stamped
Make the originating parser flags mandatory in State::new and every cmark
helper so escaping and source validation agree with the parser. Remove
State::default(), default to symbolic superscripts/subscripts, and add
optional, recommended Options::validate. Support all subsets of twelve modern
extensions with standard markers: 491,520 finite configurations are accepted
and 5,799,936 are explicitly rejected.
Preserve mandatory list and definition boundaries, nested delimiter runs,
math/table interactions, and raw blocks ending at EOF or by dedentation.
Validate delimiter choices before emitting them and report unrepresentable
blocks instead of silently changing events. Preserve list structure that
relied on invisible definitions by reserving a collision-free label; these
exceptional lists buffer the remaining input until finish.
Keep accumulated reference occurrences and labels out of block-rendering
snapshots. Criterion benchmarks cover shared, distinct, edited, and nested
references at 1,000–8,000 paragraphs and show proportional scaling.
Add permanent differential tests with exact merged-event comparisons across
both rendering paths, 860 retained regressions, 91,446 generated inputs,
symbolic extension combinations, numeric preferences, and every accepted
configuration. Run the exhaustive release suite in CI. Document migration,
validation, coverage counts, and commands that print the results.
round-trip the full CommonMark 0.31.2 spec
Rubber-stamp mostly, and nearly 1000 SLOC less seem to speak a clear language.
I at least validated the public API which seemed sensible.
The new API is definitely nicer, the tests are cleaned up.
All 652 CommonMark 0.31.2 examples now round-trip with their parsed
structure intact under default formatting. This includes paragraph
boundaries, tight and loose lists, link types, and indented versus fenced
code blocks. Strict event comparisons cover ordinary and source-range
serialization, every event boundary, and event-by-event input.
Markdown decisions often need context that arrives later: a later list
item can make the entire list loose, and the following block affects how
the list must end. The serializer now retains one top-level block until
that context is available. It can therefore keep adjacent lists distinct,
keep following code outside a list, and choose valid heading, emphasis,
fence, and reference syntax. Consistent newline and container handling
also preserves tight HTML lists and loose definitions without introducing
extra block quotes.
The new opaque State owns its options and retained input, so borrowed
event chunks and source strings need not outlive a processing call.
process and process_with_source_range accept all supplied events on
success and report consumed events and written UTF-8 bytes through
Progress. Output uses fmt::Write and may be buffered. finish flushes
the last block and reference definitions; repeated successful calls write
nothing. Invalid ranges and unbalanced events are reported as errors,
and a failed state cannot be reused.
Source ranges preserve original spelling only when it reparses to the
supplied events. Edited text uses safe escaping, and edited shortcut
labels can become explicit references to retain their original targets.
print CommonMark conformance totals
Print passed example totals for ordinary/source-range and incremental
serialization so cargo test --test integrate spec:: -- --nocapture shows
the number of CommonMark examples covered. Check the expected fixture
count when running the incremental test on its own as well.
update CommonMark fixtures to 0.31.2
Vendor the latest published specification and record its source and
checksum. Decode the spec's tab markers and retain final newlines when
extracting examples, matching the official JSON inputs and HTML.
The corrected 652-example corpus currently passes 622 round trips.
Add a focused regression for fixture extraction.
State::new and allcmark* helpers. Remove State::default() and default to symbolic superscriptOptions::validate and SUPPORTED_PARSER_OPTIONS.cmark_resume* and the public State fields with anState::new, process, process_with_source_range, and finish API.One column per quarter.
The last bugfix release before the rewrite that will bring full conformance.
The last bugfix release before the rewrite that will bring full conformance.
discard quote terminators when definitions end
Ending a definition emits a newline outside its block quote. Discard
the pending quote-ending line there so the next tight-list child cannot
start an extra empty quote. Keep pending lines across item and list ends,
which do not themselves write outside the quote.
Cover direct and nested definitions, enclosing block quotes, and resumed
serialization.
preserve paragraph spacing in loose definitions
Once inline events consume the title's pending newline, a code term no
longer leaves a blank line before its definition. Defer the definition
marker until its first child so a paragraph can request the required
blank line before the marker. Flush a pending marker when finalizing.
Cover tight and loose terms, multiple definitions, nested containers,
empty definitions, and serialization resumed at every event boundary.
Update the definition-list snapshot for the added paragraph spacing.
account for HTML newlines in tight list items
HTML events already emit their trailing newline. Count that line break
when limiting separators in tight items so following inline content does
not make the list loose. Keep normal paragraph spacing and remember the
newline across resumed serialization.
write pending newlines before every inline event
For Text and InlineHtml events, we'd write out pending newlines, but for
Code, InlineMath, DisplayMath, FootnoteReference, and TaskListMarker,
we did not. In a tight list item, inline content can directly follow the
end of a block, so the input:
* # heading
`code`
would roundtrip as:
* # heading`code`
avoid instances of tight lists roundtripping to loose
This is a somewhat subtle commit because we have to handle tight list block
quotes carefully, such as:
* item
* a
> q
>
textMost of the commit is about dealing with this case.
in tight list items, start thematic breaks on their own line
In a tight list item, a thematic break can directly follow the item's text.
Nothing before the break asks for a newline in that case, so the input:
* item
***
would roundtrip as:
* item---
which parses as a single line of text.
Start the break on a new line. A --- line directly under a line of text is a
setext heading underline, which would turn item into a heading, so write the
break as *** in this case. Thematic breaks everywhere else are still written
as ---.
in tight list items, start blocks on a new line after inline content
ensure blank lines are emitted after nested lists if necessary Previously, the input:
ensure blank lines are emitted after nested lists if necessary
Previously, the input:
1. item
* a
* b
para
would roundtrip as:
1. item
* a
* b
para
This is incorrect, because the CommonMark spec would treat para as part of
the b item.
Fix this by tracking the last event, and using that to emit a blank line if
necessary. This isn't perfect but it should handle the vast majority of cases.
<csr-id-b4c3dacd7808a47aa44ff1d0df3fd64cd0426588/> ensure blank lines are emitted after nested lists if necessary Previously, the input:
1. item
* a
* b
para
would roundtrip as:
1. item
* a
* b
para
This is incorrect, because the CommonMark spec would treat para as part of
the b item.
Fix this by tracking the last event, and using that to emit a blank line if necessary. This isn't perfect but it should handle the vast majority of cases.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
escape brackets in generated link labels
escape brackets in generated link labels
Shortcut and collapsed link labels are reconstructed from decoded text, so
bracket escapes were lost when their reference definitions were emitted. This
made the generated Markdown invalid for labels containing brackets.
Escape backslashes and square brackets while capturing generated link and image
labels, while leaving parser-provided explicit reference IDs unchanged to avoid
double escaping. Add regression coverage for shortcut, explicit, and image
references and update the CommonMark conformance count from 585 to 586.
<csr-id-e4467422fbb68aff72a96808c3ab62b503897adc/> escape brackets in generated link labels <!-- agent --> Shortcut and collapsed link labels are reconstructed from decoded text, so bracket escapes were lost when their reference definitions were emitted. This made the generated Markdown invalid for labels containing brackets.
Escape backslashes and square brackets while capturing generated link and image labels, while leaving parser-provided explicit reference IDs unchanged to avoid double escaping. Add regression coverage for shortcut, explicit, and image references and update the CommonMark conformance count from 585 to 586.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Add #![deny(missing_docs)] attribute to enable missing documentation checks and add comprehensive documentation for all public items
Add support for super/subscript without html
Superscript and subscript can be presented in markdown as:
^superscript^ and subscript respectively. This is not always turned on,
and many people prefer the HTML tag form, however in order to round-trip
markdown which uses the symbolic form we need an option to enable that.
This feature is enabled via a new field in the Options struct.
<csr-id-ffa22b3e25ef79aad66774f1c08b1a4a1b1bc4f4/> Add support for super/subscript without html Superscript and subscript can be presented in markdown as: ^superscript^ and ~subscript~ respectively. This is not always turned on, and many people prefer the HTML tag form, however in order to round-trip markdown which uses the symbolic form we need an option to enable that.
This feature is enabled via a new field in the Options struct.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d04ad95)15e7a74)aba929c)463b65a)ffa22b3)077d5d0)6d09f44)9b55c82)
</details>Improve CommonMark conformance testing output This is a major improvement to the rendering of the failing CommonMark conformance test output, that sho
Improve CommonMark conformance testing output
This is a major improvement to the rendering of the failing
CommonMark conformance test output, that should make it easier
to read and understand when pulldown-cmark-to-cmark is producing
erroneous output.
Additionally, this introduces a way to force the printing of the
CommonMark failure report from the command line:
$ FULL_CMARK_RESULTS=true cargo test
and documents in CONTRIBUTING.md that new contributors may want
to start with trying to improve conformance.
This removes #[should_panic] from the main CommonMark test. Instead,
we now hard-code in how many of the CommonMark tests are known to pass.
If the number that actually passes increases or decreases, this test
will fail, informing the user either that they have introduced a bug
(decrease), or that they've successfully improved conformance (increase).
Previously, if a change accidentally reduce the conformance, there was
no easy way to know, since that information was not stored/tracked
in any way.
Add Repeated utility to simplify writing repeated content
Move and group related code
My impression reading through the code in this project is that
top-level statements have gotten a bit intertangled over time;
this tries to reorder things to have a clearer flow and
structure, grouping related things together.
For example, this moves the recently added Error enum up above
all of the API functions, instead of leaving it somewhat
arbitrarily nestled between cmark_resume_with_options() and
cmark_resume_one_event().
No code changes were made to the body of functions or types.
This also does not change any of the public APIs, only where
code is located.
Group padded newline logic at top of text_modifications.rs
Rename padding_of() to list_item_padding_of()
Add 'Public API Functions' header in lib.rs
Consolidate public enum and struct types at the
top of lib.rs, instead of leaving them scattered
amongst the cmark*() public functions.
Consolidate the two impl State<'_> statements
Move cmark_resume(), cmark() and cmark_with_options()
from the bottom of lib.rs up to the top, before the ~600
implementation of cmark_resume_one_event() that makes up
the bulk of lib.rs
Add State::set_minimum_newlines_before_start()
This should help with readability. As an example, I didn't realize
initially that all of the if statements updated in this PR
were actually modifying the same field.
But once I started doing the more generic refactoring of adding
a set_option_minimum() method, I looked at every line and
realized they were all the same.
Factoring this to a method should clarify to future readers that
updating newlines_before_start specifically is a recurring operation.
Use write_padded_string() in a couple additional places
Additionally, while in the neighhborhood, add pub(crate) to the other
text_modifications.rs private helpers
These being marked as pub is misleading since the text_modifications
module is not actually externally public, and these functions
are never re-exported publicly.
write_padded_string() in a couple additional places (3ab278b)The breaking release is to avoid side-effects with different pulldown-cmark versions. This crate now comes with version 13.
The breaking release is to avoid side-effects with different pulldown-cmark versions.
This crate now comes with version 13.
Add helper to factor out newline + padding pattern
When writing a newline into the generated Markdown content
to start a new line of output, it is (almost) always necessary
to output the "padding" characters used to indent the content
at the current location in the document, based on the hierarchy
of block-level elements the output cursor is "inside" of.
Since writing a newline and writing the current padding are
always paired, factoring them out into a function should help
with readability and consistency in performing this minor
two-step dance correctly.
State::padding is shown conventionally (e10010f)<csr-id-05e247e5c7a74ac7bf9a906417724b8a275cabcc/> <csr-id-2252ba1d9cf93256a8bcdd721813ed2397e32464/> <csr-id-942c42ba6fc517b595130603e9fd4aa1309ee755/> <csr-id-30b706b719fd2554b664bc7d2c40bcb7e7095a8c/> <csr-id-31a49d0d45c1c32bfcf1c653121ee3ca0a1d4fe8/> <csr-id-3ab278b9db5546f405bcd13bdf5c3f0d59d2fb8a/> <csr-id-5b93e7e7b51000632bfecf6d7a49e48d9fb3bc19/>
The breaking release is to avoid side-effects with different pulldown-cmark versions.
This crate now comes with version 13.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
c1347d1)475478a)ed16be5)fb9bbd6)b47d6c9)State::padding is shown conventionally (e10010f)efbdd3a)05e247e)2252ba1)
</details>definition list block indentation now works correctly.
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
27cbc16)80f82f4)435307d)abb85a6)261c23b)1ffd7c8)60e1854)32628b3)
</details>Add structured error handling for cmark(), cmark_resume() etc When cmark_resume_with_options() , which serves as basis for the other cmark* functions,
Add structured error handling for cmark(), cmark_resume() etc
When cmark_resume_with_options(), which serves as basis for the other
cmark* functions, finds an inconsistent event stream (for example, two
consecutive heading start tags), it panics.
Introduce a custom error type Error in the crate and change the return
type of all public functions from fmt::Result<_> to Result<_, Error>.
The next commit adds an integration test.
<csr-id-fdc5859ff9823189c6966d5448468bff1d82d899/> Add structured error handling for cmark(), cmark_resume() etc
When cmark_resume_with_options(), which serves as basis for the other
cmark* functions, finds an inconsistent event stream (for example, two
consecutive heading start tags), it panics.
Introduce a custom error type Error in the crate and change the return
type of all public functions from fmt::Result<_> to Result<_, Error>.
The next commit adds an integration test.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
harden again manufactured input which could previously trigger assertion failures.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Make State struct non-exhaustive That way, future additions to the rather internal state won't be a reason for breaking changes anymore.
State struct non-exhaustivedrasticly improve escaping !, #, and |
Raises spec tests from 578 to 580. It handles cases that look like these
Link, not image: \
This header ends with hashes, not an ATX trailer ###
====================================================
| a \| b | a \| c |
|--------|--------|
Cow<'a, str> to minimize allocations for pipe escaping (022fa11)State struct non-exhaustive (13785fe)!, #, and | (76c24a1)State struct non-exhaustive
That way, future additions to the rather internal state won't be a reason for breaking changes anymore.<csr-id-76c24a16cf34d1675bef52aa8b4c58edebefbfa8/> drasticly improve escaping !, #, and |
Raises spec tests from 578 to 580. It handles cases that look like these
Link, not image: !a
| a | b | a | c |
|---|
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ccc8a52)daef56b)a85fe39)Cow<'a, str> to minimize allocations for pipe escaping (022fa11)c9ecdd2)State struct non-exhaustive (13785fe)e7f0784)37e8dcb)edcac27)f6fba5f)4690885)!, #, and | (76c24a1)
</details>use TextMergeStream for round-trip tests This increases the amount of passing tests to 578. It doesn't strictly improve the quality of implementation,
TextMergeStream for round-trip testsTextMergeStream for round-trip tests (b3d7df2)<csr-id-b3d7df263409e2f9ebdaae843e087c714b994367/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6c8bc4d)81ac29b)TextMergeStream for round-trip tests (b3d7df2)d8f22c1)d5323a8)33ce10d)2f75de2)848abc3)3fdf308)db76794)8a9573d)
</details>retain more details on reference links This raises the number of passing spec tests from 436 to 459.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
16 commits contributed to the release.
<csr-id-21a7f26a611e7a5b99ab33e9386acd30f0188960/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
ab22a57)85ca9d4)pulldown-cmark's MSRV. (7269c4f)21a7f26)c6899bc)1a3029f)5745ce5)820b661)43c6e8a)d636dc6)a8c7fa5)d97f8f5)6e2ae15)8f9d4bf)08ffcb8)66b9ed2)
</details>Add support for pulldown-cmark v0.12, and an understanding of markdown Definition Lists.
Add support for pulldown-cmark v0.12, and an understanding of markdown Definition Lists.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4dd27c5)pulldown-cmark crate at v0.12 (17b5308)7b74f1b)f1f18d4)173ae85)7674b54)e686a8f)f1a8a3e)
</details>3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
> This release adds support for Math expressions, and notification boxes like the one this text is written in.
[!NOTE] This release adds support for Math expressions, and notification boxes like the one this text is written in.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
e6c8c3e)d72bfd3)d8cbd37)bff28af)6d05a28)89d5dd5)d55ac5d)c8632c4)f961f76)74a5b59)e94e9e4)8e09ddb)153ff68)42049d9)ea04970)1d047be)dcf769c)8723b1f)c81d969)173b8a4)
</details>This release contains a fix to avoid escaping characters within codeblocks. See https://github.com/Byron/pulldown-cmark-to-cmark/issues/73 for details
This release contains a fix to avoid escaping characters within codeblocks. See https://github.com/Byron/pulldown-cmark-to-cmark/issues/73 for details.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Please also note that for most this won't be a breaking change as only a field was added to State, which isn't used unless you do incremental event se…
This release adds support for keeping escapes in the original source for the input events,
assuming the new cmark_resume_with_source_range_and_options() function is used.
Please also note that for most this won't be a breaking change as only a field was added
to State, which isn't used unless you do incremental event serialization.
last_event_end_index indices into and how it's used
This is marked as breaking change as the field itself is new in State
and could be breaking for some.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
1978c0c)cfcabc4)8c6bee4)d9d81c0)c332f98)386e663)last_event_end_index indices into and how it's used (6c8297c)f66724b)bebff1e)< escape handling (542bc1f)State derives (ea17e27)78965c4)cmark_resume_with_source_range_and_options is different (49f60d5)source_range persist special character escape by peeking source (92ad2c8)a234ed5)93cbb33)8c6ccdb)
</details>add newlines_after_metadata option
<csr-id-5d940367d7d720a176c361b99ab8699897a53313/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
upgrade to pulldown-cmark v0.10 This comes with a variety of changes to the State type, which is the reason this is a breaking release.
<csr-id-b90defbf6ade8b3c1c0585f7933421f086eeb123/>
<csr-id-640148b354eb7325e1fbeec2acbd4867d3c536fc/> upgrade to pulldown-cmark v0.10
This comes with a variety of changes to the State type, which is the reason
this is a breaking release.
The overall correctness is improved though, bringing the amount of successful tests of the spec to 435/649 (up by 4).
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
002be03)640148b)366f304)b3bfd40)42739b5)8152f81)1c21b70)b09ce73)6afb4cd)4a66292)38bb5dd)82110a4)fc30c6d)ea2608e)ebf9b69)3090b8a)a26731c)b90defb)
</details>introduce calculate_code_block_token_count(), along with DEFAULT_CODE_BLOCK_TOKEN_COUNT. That way it's possible to correctly determine the amount of f
calculate_code_block_token_count(), along with DEFAULT_CODE_BLOCK_TOKEN_COUNT.
That way it's possible to correctly determine the amount of fenced code-block tokens
needed to render all given events such that code-blocks are retained.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add count_code_block_tokens() function. It allows to calculate the amount of backticks around a code block for given events to assure code-blocks are
count_code_block_tokens() function.
It allows to calculate the amount of backticks around a code block for given events
to assure code-blocks are reproduced correctly when rendering the same events.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
d236e29)count_code_block_tokens() function. (10b855f)c0f631d)f119d77)b926264)31e8bb5)
</details>Escape double quotes in link titles.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
properly format multi-line footnotes. Merge branch 'multiline-footnotes' (`f6b5348`)
f6b5348)<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add apache-2 license text to crate as well
. or )
as the ordered list marker. Now users can configure the marker they want
to use with the ordered_list_token option.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 2 times to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6f23621)b889953)d9eb454)9ea32f4)c2a0113)1cd68a4)8f81a30)3437734)1e76c95)2263c2f)6bde374)ce1fb72)f2fae4b)981c86a)
</details>add newlines where needed to produce valid codeblocks
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
duplicated shortcut link definitions are only printed once.
<csr-id-e214cc1be5305f9b43738affff4d1ca22242af37/>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
support for backticks within inline-backticks, see this this comment for details.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
add cmark_resume(), completing the API transition started with the major version change.
cmark_resume(), completing the API transition started with the major version change.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Note that the breaking change is fixable by removing the last parameter from the cmark() function if it was None, or using cmark_resume instead.
Note that the breaking change is fixable by removing the last parameter from the cmark() function if it was None,
or using cmark_resume instead.
<csr-id-7166abeb0f89ee1dfb7790923d0d5fc6edc394c5/> Simplify cmark(…) by removing State parameter, introduce cmark_resume(…).
The reason for doing it this way around causing a breaking change is
the change of behaviour for cmark_resume, which now returns a state
instance that needs a finalize() call to flush certain caches.
Currently this is only used to write link blocks, after which the state is still usable for future invocations if necessary.
That way the caller has control over where to put link blocks, or other items that should be placed at the end of a logical section.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
44c5286)e9f809f)7ee11da)cmark(…) by removing State parameter, introduce cmark_resume(…). (7166abe)6a42312)84acaf3)
</details>Shortcut handling is now using the State.
<csr-id-93f2d11e467221418748c672a3c493dcfbf9d6e7/>
<csr-id-0a6f80d67eed9234170c95d8282cbc76ae66d47c/> Shortcut handling is now using the State.
This makes resumable event processing work as expected, even though the output won't be similar as it will print shortcuts right after all events have been processed and it's impossible to know how often it will be called.
Simplify State.
Use an Option to get rid ofa boolean and make isuse impossible.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
This release adds support for pulldown-cmark v0.9, see the tracking issue for more information.
This release adds support for pulldown-cmark v0.9, see the tracking issue for more information.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Multiple shortcut links are now separated by newline.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Shortcut links are now printed at the end of the stream like one would expect
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
68a9b6a)bbc22fe)2d5d4e1)81b1eb4)e25f14d)25cc3d1)
</details>The Options type was updated in a breaking fashion to allow configuring certain tokens, e.g. the * list token can now be configured as - if desired.
The Options type was updated in a breaking fashion to allow configuring certain tokens, e.g. the * list token can now be configured as - if desired.
Thanks to the author of this PR.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
cc82b0f)0b795a7)06fe6cb)fa14750)9aef43f)db6e12c)9313bac)
</details>Improves newline handling when line ends with inline HTML
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
4 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
handline html in tables correctly.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
Clippy helped 1 time to make code idiomatic.
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7782189)f733496)874edba)7fdf0da)934cfab)65f5949)c2a2de3)f27acce)59db24f)make in CI (4b53d20)cac031a)16e66da)9d2dc90)45bfb5e)
</details>2 commits contributed to the release over the course of 42 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Allow configuring the amount of backticks used in code blocks. May break code relying on the amount of fields in the configuration struct.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Fixed table header handling (see PR for details)
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
BREAKING: Move all types from pulldown_cmark_to_cmark::* into pulldown_cmark_to_cmark::* for simplicity. For most common use-cases, this means that us
pulldown_cmark_to_cmark::fmt::* into pulldown_cmark_to_cmark::* for simplicity.
For most common use-cases, this means that users of pulldown_cmark_to_cmark::fmt::cmark now use pulldown_cmark_to_cmark::cmark instead.<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
7070f33)
</details>support for markdown embedded in HTML tags, like
support for markdown embedded in HTML tags, like
<article>
* list
* list
**bold**
</article>
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
b53fbe5)0b414d0)59c5a3b)fcd32d0)2ea28f7)6b3f51c)3e856c9)5b1c7c6)0174671)5786f7e)
</details>Nothing published for this version
2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
8 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
3 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
2 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
27909e0)a92f729)90f134e)148c789)c6490bc)9a87b4e)
</details>4 commits contributed to the release over the course of 299 calendar days.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
5 commits contributed to the release over the course of 1 calendar day.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
6 commits contributed to the release.
<csr-read-only-do-not-edit/>
<csr-read-only-do-not-edit/>
<details><summary>view details</summary>
Your coding agent can read these notes before it upgrades. Set up the MCP server →