Changed
Faster source tokenization
Source tokenization is now implemented via scanner rather than regex, making the first stage of compilation up to 5x faster.
Fixed
.tablebyrows accepts dynamically typed rows
Rows generated dynamically, such as the output of .repeat stored in a variable, can now be used as table rows. Previously, this failed with a type cast error.
.var {rows}
.repeat {3}
index:
- - Cell .index:A
- Cell .index:B
.tablebyrows rows:{.rows}
CommonMark emphasis correctness
***bold italic** still italic* now renders correctly.
Numbered lists past nine items
A line such as 10. item now correctly starts a new item.
A decorative heading interrupts paragraphs
#! Heading now closes the preceding paragraph, like regular headings do.
A bare ### line under a heading is its own heading
A line of hashes with nothing after them used to be absorbed by the heading above it, so it disappeared.
A line of tabs separates paragraphs
A line containing only tabs now separates paragraphs, as a line containing only spaces always did.
Deeply nested link destinations
Parentheses in a link destination now balance correctly at any depth.
Multi-line setext headings keep all their lines
A heading underlined by === or --- that spans several lines used to keep only the last line. The whole text now becomes the heading.
Flat stack usage for block tokenization
Tokenization of Markdown paragraphs, lists, list items, blockquotes, tables, code, footnotes, and setext headings no longer grows the recursion stack linearly, optimizing resource usage and preventing crashes on small stacks.
REPL prints to console
Fixed a regression that caused quarkdown repl to write to file rather than to stdout.
Preview runs no longer re-scan libraries
Preview sessions no longer look for available libraries on each run, slightly improving performance.
PDF export no longer fails when its port is busy
Fixed a regression that caused PDF export to fail instead of moving on to the next free port, if the current one was busy.
Sponsors
Thanks to our sponsors! 🎉
