theseus/extensions/docx-editor/README.md
Local Dev 4af11d28fb chore(docx-editor): first-party update channel, not the community catalogue
This is our own extension, so it belongs on the channel the operator key
signs — theseus.x/extensions/docx-editor/ — alongside screenshot, aegis and
pdf-editor. The community catalogue is for extensions published by whoever
owns a BNS name, and routing ours through it would have meant asking a name
owner to vouch for code we wrote.

Drops the community packing script: with one channel there is one publish
path, and it is the one already written down in docs/ADDON-UPDATES.md.

Worth stating plainly, because it is currently true and awkward: Settings
can only *install* from the community catalogue. An extension that is
neither bundled nor catalogued has a working update channel and no way for
anyone to get the first copy. Either it goes back into the build or it needs
a first-party entry point.
2026-09-21 22:28:30 +02:00

86 lines
4.2 KiB
Markdown

# Word editor — a Theseus extension
Opens, edits and saves Word documents (`.docx`) in a full Theseus tab, and
exports them as PDF.
Saving comes in three shapes. **Save** drops a copy in your downloads until the
document has a home; **Save as…** opens a real file dialog where the extension
you type — `.docx` or `.pdf` — decides the format, and from then on Save writes
straight to that file; **PDF** is the one-click export. PDFs are rendered by
Chromium's own print pipeline from `lib/doc-css.js`, the same stylesheet the
editor displays, on the paper size the document itself specifies — so the
export matches the preview rather than being a second opinion about it.
It is a first-party extension: written here, signed with the Silent Mode
operator key, and updated over the channel at
`theseus.x/extensions/docx-editor/` like every other add-on Theseus ships.
It does not go through the community catalogue, which is for extensions
published by whoever owns a BNS name.
It currently lives outside `bundled-addons/`, so it is not compiled into the
browser and a fresh profile doesn't have it. That keeps a megabyte of
vendored library off everyone who only wanted a browser — but note that
Settings can only *install* from the community catalogue, so until it is
either bundled or listed there, the update channel keeps an existing copy
current without giving anyone a way to get the first one.
## The icon
`icon.svg` is the one drawing. `npm run icons` rasterises it to
`icon-16/32/48/128/256.png` and writes a minified copy into `addon.json`'s
`icon` field, which is what the dock button and the catalogue card read — so
there is never a second version to keep in step.
It is deliberately not Microsoft's Word icon. That mark, and the blue sheet
with a white W it belongs to, are Microsoft's trademarks; dressing our
extension up as theirs would be both a legal problem and a dishonest one. The
mark here says "text document" in its own words: a page with a turned corner,
a heading rule, body lines, and a pilcrow badge in Silent Mode green.
## Building
The vendored libraries (mammoth, ProseMirror, docx, JSZip) are bundled by a
build step that lives outside this folder, because mammoth needs local patches
before it can carry everything the editor edits:
cd ../../addon-build/docx-editor
npm install
npm run build # writes vendor/docx-vendor.js here
npm run icons # re-rasterises icon.svg after editing it
`vendor/docx-vendor.js` is committed, so the extension is installable straight
from a checkout; re-run `npm run build` after touching anything under
`addon-build/`.
## Publishing
The full recipe is in [docs/ADDON-UPDATES.md](../../docs/ADDON-UPDATES.md);
the short version, signed with the operator key and always from a clean copy
of the commit rather than the working tree:
git archive HEAD TheseusNavigator/extensions/docx-editor | tar -x -C <clean>
node scripts/sign-addon-update.mjs <clean>/TheseusNavigator/extensions/docx-editor https://navigate.st/bns/theseus.x/extensions/docx-editor "$USERPROFILE/.silentmode/ops/addon-update-key.pem" --out out/
node ../Argus/src/lib/sia-upload.js out/docx-editor-<version>.tar.gz bns/theseus/extensions/docx-editor
node ../Argus/src/lib/sia-upload.js out/updates.json bns/theseus/extensions/docx-editor
The channel lives on Sia only — nothing goes to the VPS filesystem — and is
served through the gateway at `https://navigate.st/bns/theseus.x/extensions/`.
A first release has no `updates.json` to prepend to, so it ships one holding
just its own entry. Versions must increase.
## Testing
Three levels, all re-runnable, all from `../../addon-build/docx-editor`:
node test/roundtrip.mjs # the built-in fixture
node test/corpus.mjs <folder of .docx> # real documents
node ../../../scratchpad/verify-docx-editor/drive.mjs # a real Theseus, over CDP
The last one installs this folder into a throwaway profile the way the
community channel would, and is the only one that catches browser-only
breakage.
What survives a round trip, and what doesn't, is written up in
[ROUND-TRIP.md](ROUND-TRIP.md). Read that before promising anyone a Word
feature.