Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 16 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,22 @@ follow semantic versioning; release dates are ISO 8601.

### Public API

- **Restyling Normal reaches a DOCX's body text when the body is in runs or tables.** Normal is
elected from the style the most characters are set in, and the count left two kinds of text
out. A paragraph made of runs counted in its paragraph's style, which its runs set aside, and
table cells did not count at all. Where most of the text sits in runs or cells — invoices,
proposals, a rota — Normal came from the few paragraphs left, and the body carried a direct
size that restyling Normal did not reach: Normal 14pt over 10pt text in `ProposalEditorial`,
12pt over 10.5pt in `CobaltRota`. Each piece of text now counts in the style it is written
in, a table cell's in the style its cascade resolves to; an empty cell counts for nothing.
The face and size with the most text are chosen before the colour, so body text set in two
colours is not outvoted: `ProposalNorthline`'s 9pt text, in its body colour and a muted one,
lost to its 10pt. A header's or footer's paragraph mark is now in its text's style too. Word's
editing protocol finds the body following Normal in all 62 corpus documents, against 54.
LibreOffice sets `VioletGrid` on one page, as the PDF, instead of two, its 37 lines past 2pt
down to none; 65 lines move in all, 50 nearer, and the 15 further are `CobaltRota`'s by
0.05–0.4pt across. In Word one line moves: the right-hand slot of `CobaltRota`'s footer,
"quayside bar | 31 aug – 6 sep 2026", 0.36pt further across.
- **A reader can type below a DOCX's closing table.** A document that ends with a table ends
with the paragraph Word requires after it. That paragraph was always a point tall with its
mark hidden, so that it could not open a blank page, and no one could type below the table.
Expand Down
4 changes: 3 additions & 1 deletion docs/recipes/docx-export.md
Original file line number Diff line number Diff line change
Expand Up @@ -349,7 +349,9 @@ and a header's or footer's line keep the page's measure too.
## Named styles, so the document can be restyled

The export writes a styles part whose `Normal` carries the document's own body text —
the style the most characters are set in, not the one the most nodes use. Runs that only
the style the most characters are set in, not the one the most nodes use. Each piece of text
counts in the style it is written in: a run in its own, a table cell's in the style its
cascade resolves to. Runs that only
restate it stay silent, so changing `Normal` in Word changes the body the way a reader
expects. A run whose font, size or colour differs keeps saying so, so headings, chips and
accents are unaffected.
Expand Down
133 changes: 67 additions & 66 deletions qa/src/test/resources/docx-fidelity/libreoffice-linux-lines.tsv
Original file line number Diff line number Diff line change
Expand Up @@ -1764,45 +1764,46 @@ cv-violet_grid 0:53e5e7c5a884 -0.20 0.10 experience
cv-violet_grid 0:5a0774260e0c -0.08 0.10 2022-present
cv-violet_grid 0:204f460767ff -0.12 0.02 seniorux/uidesigner|novafin(fint
cv-violet_grid 0:318bba211bdc -0.07 -0.28 sanfrancisco,ca
cv-violet_grid 0:318bba211bdc#1 8.85 -0.28 sanfrancisco,ca
cv-violet_grid 0:318bba211bdc#1 -0.15 -0.28 sanfrancisco,ca
cv-violet_grid 0:3883e88c63c3 -0.08 0.05 ledend-to-enddesignforapersonalf
cv-violet_grid 0:ccc00663f089 1.70 0.05 conducteduserresearch,builtperso
cv-violet_grid 0:7d0f908c7e5f 3.48 0.05 designedwireframes,prototypes,an
cv-violet_grid 0:9b57c4a85aad 5.27 0.05 establishedandmaintainedascalabl
cv-violet_grid 0:6894eafb99c2 7.05 0.05 collaboratedwithproductmanagers,
cv-violet_grid 0:01e4455cec51 8.84 0.10 2020-2022
cv-violet_grid 0:24d722f0cfbe 8.80 0.02 uxdesigner|brighthealth(healthte
cv-violet_grid 0:530707fb0897 8.84 0.05 redesignedpatientportalexperienc
cv-violet_grid 0:b2e27a1d9270 10.62 0.05 plannedandfacilitatedusabilityte
cv-violet_grid 0:ab80a52d70fe 12.40 0.05 partneredwithengineerstoensurefe
cv-violet_grid 0:11cbf615189b 14.19 0.05 createdreusablecomponentsandstyl
cv-violet_grid 0:7e5081a3ed48 15.98 0.10 2018-2020
cv-violet_grid 0:73f7bbf7cd60 15.94 0.02 juniorux/uidesigner|lumendigital
cv-violet_grid 0:c6b06045332f 15.99 -0.17 austin,tx
cv-violet_grid 0:5ea8234925c5 15.98 0.05 supporteddiscoveryworkshops,user
cv-violet_grid 0:46f00c76528c 17.76 0.05 designedresponsivewebsitesandlan
cv-violet_grid 0:f3cea36a9d83 19.54 0.05 collaboratedwithcopywritersandde
cv-violet_grid 0:d94eccbb1fbe 21.31 0.10 selectedprojects
cv-violet_grid 0:45dc8bf81211 21.26 0.08 novafinmobileapp|personalfinance
cv-violet_grid 0:d398b29d3dbb 21.31 0.61 2023
cv-violet_grid 0:e66c1ce573d3 21.17 0.08 ledux/uidesignforbudgeting,goalt
cv-violet_grid 0:0ed8829e68d0 21.17 0.08 thatinformedasimplifiednavigatio
cv-violet_grid 0:ee9bd17ebccf 21.17 0.08 22%increaseinweeklyactiveusers.
cv-violet_grid 0:28b4603d784a 21.25 0.08 brighthealthpatientportal|health
cv-violet_grid 0:1bea20e1df19 21.30 0.61 2021
cv-violet_grid 0:999ddb26bed6 21.16 0.08 redesignedkeypatientflowsincludi
cv-violet_grid 0:073d15633c0b 21.16 0.08 systemandcomponentlibraryusedacr
cv-violet_grid 0:68bf0109c6f8 21.41 0.10 education
cv-violet_grid 0:6cb574fa10b6 21.41 0.07 languages
cv-violet_grid 0:0cf7506cf94a 21.48 0.10 bacheloroffineartsingraphicdesig
cv-violet_grid 0:00ab7a6aa5f1 21.49 0.10 californiacollegeofthearts
cv-violet_grid 0:7e2c21bb41db 21.48 0.10 sanfrancisco,ca|2014-2018
cv-violet_grid 0:b6234d2ea0d6 20.73 0.02 english
cv-violet_grid 0:bef32d2c315a 37.47 -0.03 native
cv-violet_grid 0:bef32d2c315a#1 5.21 -0.03 native
cv-violet_grid 0:9c9b13446cd9 21.96 0.02 spanish
cv-violet_grid 0:e35242c809c8 23.19 0.02 portuguese
cv-violet_grid 0:c5d1de4964d6 23.19 -0.03 conversational
cv-violet_grid 0:ccc00663f089 -0.10 0.05 conducteduserresearch,builtperso
cv-violet_grid 0:7d0f908c7e5f -0.12 0.05 designedwireframes,prototypes,an
cv-violet_grid 0:9b57c4a85aad -0.13 0.05 establishedandmaintainedascalabl
cv-violet_grid 0:6894eafb99c2 -0.15 0.05 collaboratedwithproductmanagers,
cv-violet_grid 0:01e4455cec51 -0.16 0.10 2020-2022
cv-violet_grid 0:24d722f0cfbe -0.20 0.02 uxdesigner|brighthealth(healthte
cv-violet_grid 0:530707fb0897 -0.16 0.05 redesignedpatientportalexperienc
cv-violet_grid 0:b2e27a1d9270 -0.18 0.05 plannedandfacilitatedusabilityte
cv-violet_grid 0:ab80a52d70fe -0.20 0.05 partneredwithengineerstoensurefe
cv-violet_grid 0:11cbf615189b -0.21 0.05 createdreusablecomponentsandstyl
cv-violet_grid 0:7e5081a3ed48 -0.22 0.10 2018-2020
cv-violet_grid 0:73f7bbf7cd60 -0.26 0.02 juniorux/uidesigner|lumendigital
cv-violet_grid 0:c6b06045332f -0.21 -0.17 austin,tx
cv-violet_grid 0:5ea8234925c5 -0.22 0.05 supporteddiscoveryworkshops,user
cv-violet_grid 0:46f00c76528c -0.24 0.05 designedresponsivewebsitesandlan
cv-violet_grid 0:f3cea36a9d83 -0.26 0.05 collaboratedwithcopywritersandde
cv-violet_grid 0:d94eccbb1fbe -0.29 0.10 selectedprojects
cv-violet_grid 0:45dc8bf81211 -0.34 0.08 novafinmobileapp|personalfinance
cv-violet_grid 0:d398b29d3dbb -0.29 0.61 2023
cv-violet_grid 0:e66c1ce573d3 -0.43 0.08 ledux/uidesignforbudgeting,goalt
cv-violet_grid 0:0ed8829e68d0 -0.43 0.08 thatinformedasimplifiednavigatio
cv-violet_grid 0:ee9bd17ebccf -0.43 0.08 22%increaseinweeklyactiveusers.
cv-violet_grid 0:28b4603d784a -0.35 0.08 brighthealthpatientportal|health
cv-violet_grid 0:1bea20e1df19 -0.30 0.61 2021
cv-violet_grid 0:999ddb26bed6 -0.44 0.08 redesignedkeypatientflowsincludi
cv-violet_grid 0:073d15633c0b -0.44 0.08 systemandcomponentlibraryusedacr
cv-violet_grid 0:68bf0109c6f8 -0.19 0.10 education
cv-violet_grid 0:6cb574fa10b6 -0.19 0.07 languages
cv-violet_grid 0:0cf7506cf94a -0.12 0.10 bacheloroffineartsingraphicdesig
cv-violet_grid 0:00ab7a6aa5f1 -0.11 0.10 californiacollegeofthearts
cv-violet_grid 0:7e2c21bb41db -0.12 0.10 sanfrancisco,ca|2014-2018
cv-violet_grid 0:b6234d2ea0d6 -1.47 0.02 english
cv-violet_grid 0:bef32d2c315a -1.48 -0.03 native
cv-violet_grid 0:bef32d2c315a#1 -1.44 -0.03 native
cv-violet_grid 0:9c9b13446cd9 -1.44 0.02 spanish
cv-violet_grid 0:e35242c809c8 -1.41 0.02 portuguese
cv-violet_grid 0:c5d1de4964d6 -1.41 -0.03 conversational
cv-violet_grid 0:1de4fede4f63 -1.16 22.41 idesignwithempathy,iteratewithpu
invoice-classic 0:c26c22b94338 0.49 0.10 graphcomposestudio
invoice-classic 0:c26c22b94338#1 0.25 0.06 graphcomposestudio
invoice-classic 0:2a08ce5567fb 0.35 0.10 18layoutstreet
Expand Down Expand Up @@ -4129,25 +4130,25 @@ receipt-modern 0:403a860bfc00 0.03 0.05 invented.
receipt-modern 0:7b14b8d2c5c4 -0.04 0.14 page1of1
rota-cobalt 0:33888e306262 0.18 0.52 quay
rota-cobalt 0:f5f481423c57 -0.32 0.52 quaysidebar
rota-cobalt 0:d457d4238a16 0.08 1.23 monday31st
rota-cobalt 0:916a90a10237 0.08 1.29 tuesday1st
rota-cobalt 0:c602d130bfde 0.08 1.27 wednesday2nd
rota-cobalt 0:74cf6babb6f6 0.08 1.23 thursday3rd
rota-cobalt 0:ae6aa379ad0c 0.08 1.18 friday4th
rota-cobalt 0:a6643f169bfd 0.08 1.62 saturday5th
rota-cobalt 0:58752a3c0543 0.08 1.18 sunday6th
rota-cobalt 0:d457d4238a16 0.08 0.73 monday31st
rota-cobalt 0:916a90a10237 0.08 0.74 tuesday1st
rota-cobalt 0:c602d130bfde 0.08 0.77 wednesday2nd
rota-cobalt 0:74cf6babb6f6 0.08 0.73 thursday3rd
rota-cobalt 0:ae6aa379ad0c 0.08 0.68 friday4th
rota-cobalt 0:a6643f169bfd 0.08 0.72 saturday5th
rota-cobalt 0:58752a3c0543 0.08 0.73 sunday6th
rota-cobalt 0:c4aee96677b0 -0.23 0.66 /cleancrushedice
rota-cobalt 0:2895e01ceae0 -0.24 0.68 machine&area
rota-cobalt 0:f4e7df025c89 -0.23 0.75 pianist18:30/clean
rota-cobalt 0:2895e01ceae0 -0.24 0.63 machine&area
rota-cobalt 0:f4e7df025c89 -0.23 0.70 pianist18:30/clean
rota-cobalt 0:d3acaa767810 -0.24 0.70 crushedicemachine&
rota-cobalt 0:4a91ee5f0106 -0.25 0.61 area
rota-cobalt 0:b913ee5e077a -0.23 0.83 privatedinner44pax/
rota-cobalt 0:d89987d22df9 -0.24 0.74 soulgf/pianist18:30
rota-cobalt 0:fb980282ae0a -0.23 0.78 pianist18:30/partner
rota-cobalt 0:4a91ee5f0106 -0.25 0.56 area
rota-cobalt 0:b913ee5e077a -0.23 0.68 privatedinner44pax/
rota-cobalt 0:d89987d22df9 -0.24 0.69 soulgf/pianist18:30
rota-cobalt 0:fb980282ae0a -0.23 0.63 pianist18:30/partner
rota-cobalt 0:3c1fc038017e -0.24 0.64 meeting3:30pm
rota-cobalt 0:cc96b22615e5 0.07 0.65 pianist19:00
rota-cobalt 0:bc14a4ce6407 -0.13 2.01 statuslegend
rota-cobalt 0:1f58b9145b24 -0.07 1.03 request
rota-cobalt 0:cc96b22615e5 0.07 0.60 pianist19:00
rota-cobalt 0:bc14a4ce6407 -0.13 1.26 statuslegend
rota-cobalt 0:1f58b9145b24 -0.07 0.88 request
rota-cobalt 0:b4dc66dde806 -0.07 0.73 off
rota-cobalt 0:b4dc66dde806#1 -0.06 0.45 off
rota-cobalt 0:b4dc66dde806#2 -0.06 0.36 off
Expand Down Expand Up @@ -4185,11 +4186,11 @@ rota-cobalt 0:cdc2def9aec4#12 0.79 0.40 hol
rota-cobalt 0:cdc2def9aec4#13 0.80 0.37 hol
rota-cobalt 0:cdc2def9aec4#14 0.80 0.42 hol
rota-cobalt 0:cdc2def9aec4#15 0.80 0.37 hol
rota-cobalt 0:08c4242b5f58 -0.07 0.93 stock
rota-cobalt 0:f8f8922da592 -0.07 0.86 standby
rota-cobalt 0:c2fb788c7dee -0.07 1.10 training
rota-cobalt 0:a18603086e5b -0.07 0.86 support
rota-cobalt 0:17ae69cc7e46 -0.09 0.67 covers
rota-cobalt 0:08c4242b5f58 -0.07 0.78 stock
rota-cobalt 0:f8f8922da592 -0.07 0.81 standby
rota-cobalt 0:c2fb788c7dee -0.07 0.85 training
rota-cobalt 0:a18603086e5b -0.07 0.81 support
rota-cobalt 0:17ae69cc7e46 -0.09 0.52 covers
rota-cobalt 0:412a5c513322 -0.08 0.64 l104/d50
rota-cobalt 0:304560bf3205 -0.08 0.65 l33/d57
rota-cobalt 0:ca6ce47ada53 -0.08 0.66 l32/d76
Expand All @@ -4198,7 +4199,7 @@ rota-cobalt 0:7062fafe1dab -0.08 0.60 l65/d112
rota-cobalt 0:778cb57b62fa -0.08 0.60 l73/d112
rota-cobalt 0:1b4471920f01 -0.08 0.62 l72/d83
rota-cobalt 0:288965a1f2c8 -0.18 0.53 management
rota-cobalt 0:6a61eb7383e8 -0.07 0.91 rosa
rota-cobalt 0:6a61eb7383e8 -0.07 0.76 rosa
rota-cobalt 0:3bb0f0bb5552 -0.06 0.26 09:00-18:00
rota-cobalt 0:3bb0f0bb5552#1 0.10 0.22 09:00-18:00
rota-cobalt 0:3bb0f0bb5552#2 0.10 0.23 09:00-18:00
Expand Down Expand Up @@ -4226,7 +4227,7 @@ rota-cobalt 0:e669544e9895 -0.85 0.91 08:00-16:00
rota-cobalt 0:e669544e9895#1 -0.07 0.96 08:00-16:00
rota-cobalt 0:19c30663e8ef -0.79 1.71 16:00-21:00
rota-cobalt 0:19c30663e8ef#1 0.00 1.76 16:00-21:00
rota-cobalt 0:c9affe7f7587 0.04 1.03 tomas
rota-cobalt 0:c9affe7f7587 0.04 0.88 tomas
rota-cobalt 0:6d43df86fe4b 0.05 0.26 16:00-00:00
rota-cobalt 0:6d43df86fe4b#1 0.05 0.31 16:00-00:00
rota-cobalt 0:6d43df86fe4b#2 0.10 0.27 16:00-00:00
Expand Down Expand Up @@ -4269,12 +4270,12 @@ rota-cobalt 0:953cb9ba8128 0.50 0.90 mirela
rota-cobalt 0:c1298a6e85c2 0.51 0.27 12:00-18:00
rota-cobalt 0:c1298a6e85c2#1 0.62 0.27 12:00-18:00
rota-cobalt 0:86846e84f9bf 0.61 0.78 sofia
rota-cobalt 0:effcc54ba75f 0.61 0.87 karol
rota-cobalt 0:effcc54ba75f 0.61 0.82 karol
rota-cobalt 0:5c1e134d2d34 0.72 0.89 henrik
rota-cobalt 0:6326e0e8cfda 0.83 0.92 lucia
rota-cobalt 0:6326e0e8cfda 0.83 0.82 lucia
rota-cobalt 0:c235e502637c 0.76 0.53 barbacks
rota-cobalt 0:bd558de5f794 0.78 0.84 oskar
rota-cobalt 0:4941d6993ee9 0.78 0.99 teodor
rota-cobalt 0:1d3d3d6a07bd 0.79 0.88 vesna
rota-cobalt 0:4941d6993ee9 0.78 0.89 teodor
rota-cobalt 0:1d3d3d6a07bd 0.79 0.83 vesna
rota-cobalt 0:59f2ff7c7c70 0.03 0.08 timesshownin24-hourformat.shiftc
rota-cobalt 0:594c41ec0506 0.03 -3.15 quaysidebar|31aug-6sep2026
rota-cobalt 0:594c41ec0506 0.03 -3.60 quaysidebar|31aug-6sep2026
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ cv-slate_orange 1 1 87 86 0.42 1.02 0
cv-teal_pulse 1 1 57 57 0.22 0.64 0
cv-terracotta_rail 1 1 102 102 0.44 0.94 0
cv-timeline_minimal 2 2 89 86 0.45 0.50 0
cv-violet_grid 1 2 80 77 0.36 21.41 37
cv-violet_grid 1 1 80 78 0.22 0.44 0
invoice-classic 1 1 56 56 0.12 0.30 0
invoice-classic_long 2 2 166 166 0.20 0.27 0
invoice-consulting 1 1 92 92 0.67 0.96 0
Expand Down
Loading
Loading