Skip to content

v4.10.0

Choose a tag to compare

@jonmichaels jonmichaels released this 17 Sep 16:48
· 7 commits to main since this release

Added

  • A page can declare its own sheet. .pr or= (landscape/portrait)
    measured against real WordStar 7: set at the top of a page it applies to
    that page immediately; set in the middle of a page it waits for the next
    page boundary, exactly as WS7 does. The Printed PDF now draws each page on
    its own sheet size instead of one page size for the whole document, and
    the running head/foot and automatic page number follow that page's own
    height (a landscape page's number no longer resolves off the top of a
    portrait document). layout JSON version 13 publishes a page's own size
    (width/height/orientation) only where it differs from the document's — the
    same "omit unless it differs" rule every other per-page field here already
    follows; a page that never changes size emits nothing new. Modern is
    unchanged by design — it composes on one reflowed sheet regardless of what
    the source document's pages asked for.

  • The layout JSON says when a running head, foot or page number is off the
    paper
    (version 12). WordStar commands such a row anyway and lets the printer
    clip it — real WordStar 7 prints put the automatic number 14.4pt below the
    bottom edge of a Letter sheet when .mb is smaller than .fm — so the PDF is
    unchanged and still draws it there, with the page as its clip. A program
    drawing pages from this JSON has no paper to clip with, so such a row now
    carries off_sheet: true and must not be drawn. The key is absent, not false,
    on every row that is on the sheet.

Fixed

  • Page furniture is set in the document's own face, not in Times. Running
    heads, running feet, the automatic page number and footnote/endnote text were
    written in a hardcoded face and size in the RTF exports and in the Modern PDF
    — Times New Roman 11 on a Printed page whose body is Courier 12, on every page
    of a running-head document. They resolve through the same font chain body text
    does now: a .h#/.f# that opens a font block prints in THAT face and size
    (22 documents in the public test corpus, which the Printed PDF has always
    honoured and the other three surfaces threw away); a head that declares
    nothing takes the mode's body face — Courier in Printed, the reading face in
    Modern, Courier in a document that declares itself non-proportional. Sizes
    follow the same rule: Printed furniture is the body's size, Modern furniture
    is the body size less 2pt (12pt against Modern's 14pt body, where the RTF and
    the Modern PDF both used 11). Printed PDF is unchanged — it was already right.

  • Modern: a list bullet and its text no longer read as one crowded word.
    The square bullet was drawn on the same fixed-pitch cell Printed uses, but
    the space after it was measured in the reading face — 3.5pt against the
    cell's 7.2 — so the item's first word sat about half as far from the bullet
    as it does in the Printed and Native views. It is now one cell, as it is
    there: the first word starts two cells past the bullet in all three views.
    Also fixed in the Modern RTF's hanging indent, which had computed a third
    number again. Only bullets whose marker is a cp437 block glyph are
    affected; a * or - marker is a real letter in the reading face and
    keeps the spacing it had.

  • Markdown: text that used to vanish now survives. A document that
    literally says <SP>, <Enter> or <B> had that read as an HTML tag by
    every Markdown renderer, which showed NOTHING — the word disappeared.
    (<B> was worse: a real tag, switching bold on with nothing to switch it
    off.) < and & are escaped now. Affects Sawyer's macro and patch
    documentation heavily; none of the shipped samples.

  • Markdown: strikeout no longer breaks where a bold or italic word sits
    inside it.
    The emitter closed the strikeout and reopened it with nothing
    in between (~~alpha~~~~**beta**~~~~gamma~~); four tildes are not
    strikethrough in any flavour, so the strike was lost AND the tildes showed
    up as text. The run is merged now.

  • Markdown: a verse or stanza containing a blank line no longer emits a
    line of invisible whitespace.
    The two-trailing-spaces hard break turned
    such a blank into a line holding just two spaces, which CommonMark reads as
    a blank line — so the paragraph split anyway, into pieces whose raw text
    claimed otherwise. A blank line ends the unit now, which is what it always
    rendered as. The dangling trailing spaces at a unit's end go too.

    All three are Modern-mode Markdown only. A Printed-mode body, and any
    print-stream or ruler-driven document in either mode, is a fenced code
    block whose content is literal and is untouched.

  • ctrl-kd --version no longer prints a Python SyntaxWarning ahead of its
    own output. A docstring cited RTF's \margr control word inside a plain
    (non-raw) string, so Python read \m as an escape sequence it did not
    recognise and warned about it. Nothing was broken, but the warning named a
    file inside the package and was the first thing a new Homebrew or PyPI user
    saw, which reads like a crash. It appeared only on a COLD bytecode cache —
    the first run after an install — which is why no development machine ever
    showed it. Every module is now compiled with warnings as errors by both the
    test suite and tools/run-full-suite.sh, so it cannot come back.

  • Printed RTF's text column is the document's own ruler width, not a
    fixed arithmetic off the page margins.
    The column had been computed as
    paper width minus twice the left margin, which has nothing to do with what
    the author actually typed the page to hold; at the ordinary default it came
    out one character narrower than a common 69-character line, so thousands of
    facsimile lines across the public corpus arrived re-wrapped by the reader —
    the one thing Printed mode exists to prevent. The column now follows the
    widest ruler in the document (or the longest printed line itself, when box
    art or a print stream runs past its own ruler), and the page grows to fit
    it, up to Word's own maximum page size. A document whose lines are wider
    than even that still re-wraps in the reader — there is no page any reader
    accepts that would hold them, and that group shrank from 132 documents to
    32 in a full sweep.

  • A reverse-video banner ("white on black") is visible in RTF and HTML,
    not white text on a white page.
    Both exporters kept WordStar's white
    colour but never painted the black ground behind it, so the words were
    simply not there — three documents in the public corpus lost a banner this
    way, one of which says outright in its own text that it should read white
    on black. The ground is drawn now; turning off inline styling removes it
    along with the colour, same as it always has for every other colour.

  • A Printed HTML page is no longer twice as tall as the document. The
    facsimile block already breaks a line on its own newline; the emitter was
    also writing a <br> at the end of every line, so each line was followed
    by a blank one. A 57-page document rendered at double height with its line
    grid gone. The extra break is removed.

  • Newspaper-style columns (.co) render as one column block per section,
    in both Printed and Modern HTML
    , not one box per paragraph. Modern had
    been opening a fresh pair of columns for every paragraph in a columnar
    region, which balances each paragraph on its own and leaves ragged,
    half-empty columns underneath; Printed dropped the columns entirely. Both
    now open a single container for the whole section, closing it only where
    the document itself ends the columns.

  • A Modern HTML page no longer scrolls sideways on a phone. The Modern
    stylesheet had no line-length limit at all — a wide window gave a line
    roughly twice a comfortable reading length, and at phone width a long path,
    a run of control words, or a wide row of block graphics pushed the whole
    page off the edge of the screen. Modern HTML now keeps a reading-width
    column and lets only the one unbreakable row (an embedded picture) scroll
    inside itself, the way the Printed facsimile already does. Printed HTML is
    untouched — it was already narrow enough.

Changed

  • Every quirk was renamed, and the names that shipped in 4.9.0 still work.
    A quirk's name is text a reader reads and types — --list-quirks prints it,
    --quirk/--no-quirk take it, the layout format publishes it — so the six
    now say what they do in plain words instead of naming the printer driver or
    the code behind them:

    4.9.0 now
    driver-euro-sign euro-swap
    lj6dtp-typography smart-punctuation
    lj6dtp-box-corners box-corners
    lj6dtp-colour-as-gray colors-as-gray
    lj6dtp-fill-patterns fill-patterns
    stray-style-strikeout sawyer-strikeout

    The old names are still ACCEPTED wherever one can be typed or stored, so
    nothing anyone has scripted or saved stops working. They are never PRINTED:
    --list-quirks, quirks_applicable/quirks_applied and every report say the
    new name only, so one output can never show both spellings for one quirk.

  • Descriptions and the quirk window's own row titles use US spelling: "Screen
    colors as gray", "Colors 9–14 as hatch patterns".

  • --headers and --page-numbers now say outright, in their own --help
    text, that they apply to PDF and RTF only. Text, Markdown and HTML are
    unpaged by design and never carried running heads, feet or page numbers;
    the flags are still accepted (and ignored, with no error) on those three
    formats — nothing about how they convert has changed.

3,325 answer-key cells were re-recorded across this release's commits (a cell
can move more than once as later commits build on earlier ones): 796 for the
per-page-sheet schema bump (792 layout cells at the version number alone,
one document's pdf.printed/rtf.printed pair for its actual landscape
page, and that same document's layout cells re-recorded a second time for
a follow-up fix to the running-head model), 540 for the Printed RTF column
width (385 documents' rtf.printed, 148 rtf.modern), 508 for the doubled
HTML line height (352 html.printed,
149 html.modern), 246 for the Modern HTML reading measure (all html.modern),
154 for the quirk renames (72 documents' layout cells, where the applied-quirk
list is spelled out), 897 for page-furniture fonts (354 rtf.printed, 353
rtf.modern, 178 pdf.modern, plus the picture-bearing twin of each), 115 for
the three Markdown fixes (markdown.modern), 28 for the newspaper-column fix
(14 documents, both HTML cells), 19 for the Modern bullet gap (pdf.modern +
rtf.modern), 14 for off-sheet furniture (7 documents' layout cells), and 8
for the reverse-video ground (2 documents, all four RTF/HTML cells). The
--headers/--page-numbers help wording and the compile-warnings fix moved
no cells at all.