ScroogeXHTML for Object Pascal 11.0-MS2, the second milestone release of 11.0, was released on 22 October 2026. MS1 brought table conversion. MS2 switches to the Java product’s defaults, as announced in our first look at 11.0.
This milestone contains the breaking changes, more table and list fixes, and a set of conversion details aligned with the Java ScroogeXHTML RTF Converter. It also comes with a migration guide that shows how to keep your 10.x output where you need it.
Tables: closer to the original layout
MS1 did a bit more than our first look promised. Besides rows, header rows, column widths, borders, shading and alignment, it converts horizontally merged cells to colspan. A cell can hold several paragraphs and lists, and each paragraph keeps its own formatting. In plain-text output, each table row becomes one line with tab-separated cells.
MS2 fixes two layout issues found in real-world documents:
- Top-aligned cells stay at the top. RTF aligns cell content to the top by default, but HTML centres it vertically. Cells now get an explicit
vertical-align:top. - Google Docs tables keep their bottom borders. Diagonal cell borders, which Google Docs writes, were applied to the bottom border by mistake. Diagonal borders are still not converted.
Vertically merged cells (rowspan) and nested tables are not converted yet. A nested table is written as tab-separated text inside its outer cell.
Lists, font sizes and more
Lists. MS1 turned multi-level RTF lists into nested HTML lists. MS2 fixes the cases that broke on output from Word, TRichView and WPTools:
- A list that skips levels, for example one that starts at level 2, no longer produces invalid
<ol><ol><ol><li>markup. Each jump opens one nested list, and a list that starts at a deeper level is a top-level list, as in the Java product. - List items now get the number format of their own level. Before, an item on a level with Arabic numerals could get
type="I"when the RTF named the list before its level.
Font sizes. Font sizes are now written in em by default, and px is a new unit (1pt = 4/3px). Sizes in em, px and percent keep half-point precision and round the same way as in the Java product, so 10.5pt becomes 0.88em instead of 0.92em. The rarely used ex unit is gone.
More details aligned with the Java product:
- Language conversion knows 60 Windows language codes instead of 13, including Hebrew, Polish and Dutch. Swedish is now
lang="sv". - Emoji and other characters outside the Basic Multilingual Plane are no longer lost with Free Pascal.
- Font names with a leading @ (the Windows vertical-writing variants) lose the @, so the CSS font-family matches an installed font.
- The Symbol font character 0x40 becomes U+2245 (≅).
- A new
ESxUnexpectedErrortells a converter bug apart from bad input.
Breaking changes
MS2 changes the defaults announced in our first look. Most changes alter the HTML that an unchanged program produces, and most can be reverted with a line of code:
| Change | 10.x | 11.0-MS2 | To keep the 10.x output |
|---|---|---|---|
| Empty paragraphs | <p></p> | <br> | ConvertEmptyParagraphs := False |
| Font size unit | pt | em | FontSizeScale := fsPoint |
| Inline pictures (data URI adapter) | up to 1 KiB | up to 256 KiB | TMemoryPictureAdapterDataURI.Create(1) |
| Automatic text colour | black | inherited | no switch; set a colour in your style sheet |
Non-UTF-8 charset in MetaContentType | ignored or mislabelled | raises ESxConfigurationError | no switch; remove the charset |
| Tabs in plain-text output | eight | tab character | no switch |
| Link with a disallowed target | href="" | no href | no switch |
fsEX font size scale | available | removed | use fsEM |
To get the 10.x output with 11.0, in one go:
Scrooge.ConvertEmptyParagraphs := False; // 11.0 default: True
Scrooge.FontSizeScale := fsPoint; // 11.0 default: fsEM
Scrooge.ConvertTables := False; // 11.0 default: True
// if you use the data URI picture adapter without an explicit limit:
Scrooge.PictureAdapter := TMemoryPictureAdapterDataURI.Create(1);
The new migration guide, MIGRATING.md, describes every change in detail. It ships with the documentation and grows with each milestone. It also holds the 10.0 and 9.0 breaking changes, which used to be in the Getting Started document.
What’s next
Work on the next milestone has started with the document model that post-processors work with. Its node members now follow the W3C DOM (ParentNode, ChildNodes, AppendChild, RemoveChild), and the old names stay available as deprecated aliases. Vertically merged cells and nested tables remain on the list for tables.
Please note
This is a milestone release for evaluation, not a final release. Final specifications and features may differ from what is described here. A release candidate is likely to be available later this year.