Open Word documents with WordCraft by default (file associations + Options button) (#304)

* Open Word documents with WordCraft from the system (#295)

Register WordCraft for Word, RTF and ODT files on Windows and Linux without
taking over anyone's defaults, and add File > Options > General > "Make
WordCraft the default for Word documents..." where the system allows it.

- Windows MSI: a ProgId per type (.docx .docm .dotx .dotm .doc .dot .rtf
  .odt, plus .md and .txt as Open With candidates only) with the app icon
  and `"wordcraft.exe" "%1"`, OpenWithProgids, Applications\wordcraft.exe
  SupportedTypes, and Capabilities + RegisteredApplications so WordCraft
  shows in Settings > Default apps. New component with its own GUID.
- Linux: the desktop entry declares the macro-enabled, template and legacy
  Word types and text/rtf; AppStream lists the media types. deb, rpm,
  AppImage and both Flatpak manifests use this same file.
- macOS: Info.plist also lists legacy .doc.
- The Options button runs `ui.makeDefaultApp` through a new
  Services::make_default_app hook: Windows opens
  ms-settings:defaultapps on WordCraft's page; Linux and BSD run
  `xdg-mime default ai.storyteller.wordcraft.desktop <types>` (refused
  inside Flatpak or without an installed desktop entry); macOS shows the
  Finder Get Info hint; the web shows nothing. The status bar reports the
  outcome. Strings translated in every catalog.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Review fixes for #304: keep Make default out of programmatic dispatch

ui.makeDefaultApp is refused when run programmatically (control channel, MCP, macros,
scripts); only a click on File > Options > General > Make WordCraft the default… reaches
the host's hook, so no agent can change the user's system default apps or open system
settings. Test: programmatic_calls_cannot_change_the_default_apps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>

* Default-app strings in the newer catalogs; the button's test looks for a General-pane label

---------

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
Co-authored-by: Brandon Thomas <echelon@gmail.com>
This commit is contained in:
authored and GitHub committed 2026-10-12 04:30:57 -04:00
1 parent f4dfc8eb85
commit ba9bbb48dd
25 files changed
+546 -12

No files matched your search

+1 -1
View File
@@ -201,7 +201,7 @@ Ranked, to beta (detail and remaining milestones in [docs/roadmap.md](docs/roadm
| 2026-10-10 | Draw tab: pen, pencil and highlighter ink, stroke eraser, Select, Review › Hide Ink; ink saved to DOCX as DrawingML freeforms (#307); catalog 399/431 (92.6%) |
| 2026-10-10 | Draw Table and Eraser (#303): a pen draws one-cell tables and splits cells along drawn lines; the eraser merges the cells beside a border. Catalog 393/431 (91.2%) |
| 2026-10-10 | DOCX charts, SmartArt and OLE objects survive open and save with their parts (#319) |
| 2026-10-10 | Full re-measure against Word for Mac 16.113.4 and progress docs to the craftrules standard (this page, `docs/target-app-parity.md`, `gaps.md`, `roadmap.md`, `architecture.md`, format/layout/UI/hardware/localization parity; `docs/parity.md` → `docs/parity-checklist.md`). Landed the same day (~80 PRs): equations with OMML and an Equation tab (#191); Word 97-2003 `.doc` import (#145); right-to-left and Persian text (#207); Zotero integration (#189); Read Aloud player (#190); text boxes and floating objects editable (#46) and placed like Word (#136); floating tables (#137); track-changes fixes (#125, #244); typing parity with Word (#204); hidden text (#173); save prompts and AutoSave rules (#151); LaTeX import/export (#11); keytips and mini-toolbar (#43); Spanish, Ukrainian and Brazilian Portuguese interfaces; system theme (#249); Linux file dialogs no longer freeze (#246); Chinese UI font on Windows (#248); every installed font weight (#239); cell text direction (#245); Paste Special (#235), Advanced Find (#234), Column Selection (#237), Style Inspector (#236), custom table styles (#256), View gridlines (#243), zoom buttons (#232), inertial touchpad scrolling (#252), File Info fields kept (#268), ¶ in mixed-direction paragraphs (#278), Serbian interface (#250), table Height/Width boxes, AutoFit Contents and Table Properties (#44), AutoSave switch greyed out with the reason where it can't save (.md/.txt/.html, unsaved, browser) (#196, #176), OpenGL fallback on Windows PCs without a DirectX 12 driver (#316), Columns, Symbol and Field dialogs (#321), Tabs and Borders and Shading dialogs (#320); free rotation and flips for pictures, shapes and text boxes with a rotation handle (#332); v0.4.0 released |
| 2026-10-10 | Full re-measure against Word for Mac 16.113.4 and progress docs to the craftrules standard (this page, `docs/target-app-parity.md`, `gaps.md`, `roadmap.md`, `architecture.md`, format/layout/UI/hardware/localization parity; `docs/parity.md` → `docs/parity-checklist.md`). Landed the same day (~80 PRs): equations with OMML and an Equation tab (#191); Word 97-2003 `.doc` import (#145); right-to-left and Persian text (#207); Zotero integration (#189); Read Aloud player (#190); text boxes and floating objects editable (#46) and placed like Word (#136); floating tables (#137); track-changes fixes (#125, #244); typing parity with Word (#204); hidden text (#173); save prompts and AutoSave rules (#151); LaTeX import/export (#11); keytips and mini-toolbar (#43); Spanish, Ukrainian and Brazilian Portuguese interfaces; system theme (#249); Linux file dialogs no longer freeze (#246); Chinese UI font on Windows (#248); every installed font weight (#239); cell text direction (#245); Paste Special (#235), Advanced Find (#234), Column Selection (#237), Style Inspector (#236), custom table styles (#256), View gridlines (#243), zoom buttons (#232), inertial touchpad scrolling (#252), File Info fields kept (#268), ¶ in mixed-direction paragraphs (#278), Serbian interface (#250), table Height/Width boxes, AutoFit Contents and Table Properties (#44), AutoSave switch greyed out with the reason where it can't save (.md/.txt/.html, unsaved, browser) (#196, #176), OpenGL fallback on Windows PCs without a DirectX 12 driver (#316), Columns, Symbol and Field dialogs (#321), Tabs and Borders and Shading dialogs (#320); free rotation and flips for pictures, shapes and text boxes with a rotation handle (#332); v0.4.0 released; file associations on Windows and Linux with a Make-default button in Options (#295) |
| 2026-10-09 | Interface languages follow the system or Options (#12; zh-hans, zh-hant, ja); TOC page numbers as an updatable field (#52); rotating log file (#17); window geometry remembered (#38) |
| 2026-10-08 | v0.2.0 and v0.3.0 released; Flatpak and AppImage auto-update (#22) |
| 2026-10-07 | v0.1.0 released; contributor credits in About (#6) |
+181
View File
@@ -0,0 +1,181 @@
//! File › Options › General › Make WordCraft the default for Word documents (#295).
//!
//! The installers register WordCraft for Word, RTF and ODT files without taking over the
//! defaults (`packaging/windows/wordcraft.wxs`, the `.desktop` file's `MimeType=`, `Info.plist`).
//! This is the button that makes it the default when the user asks:
//! - **Windows** doesn't let apps set defaults: it opens Settings › Default apps on WordCraft's
//! page (`ms-settings:defaultapps?registeredAppMachine=WordCraft`; Windows 10 ignores the query
//! and shows the Default apps list), where the user picks WordCraft per type.
//! - **Linux and BSD**: `xdg-mime default ai.storyteller.wordcraft.desktop <types>` for
//! [`WORD_MIME_TYPES`], which writes the user's `mimeapps.list`. Only when the desktop entry is
//! installed (deb, rpm, Flatpak; a bare AppImage has none), and not from inside the Flatpak
//! sandbox, which can't change the host's defaults.
//! - **macOS** has no API for it here: the Options page explains Finder's Get Info › Change All.
//!
//! [`WORD_MIME_TYPES`]: self::WORD_MIME_TYPES
use wordcraft_ui_egui::DefaultApp;
/// The `Services::make_default_app` hook.
pub type Hook = Box<dyn Fn() -> Result<DefaultApp, String>>;
/// The hook for this platform; `None` where there is no button (macOS).
pub fn hook() -> Option<Hook> {
#[cfg(target_os = "windows")]
let hook: Option<Hook> = Some(Box::new(windows::open_default_apps));
#[cfg(all(unix, not(target_os = "macos")))]
let hook: Option<Hook> = Some(Box::new(xdg::make_default));
#[cfg(not(any(target_os = "windows", all(unix, not(target_os = "macos")))))]
let hook: Option<Hook> = None;
hook
}
/// The desktop entry the Linux packages install, and the Flatpak's app id.
#[cfg(any(all(unix, not(target_os = "macos")), test))]
const DESKTOP_ID: &str = "ai.storyteller.wordcraft.desktop";
/// The types the button makes WordCraft the default for on Linux and BSD: Word documents and
/// templates (also macro-enabled and legacy), RTF and ODT. The same set the Windows installer
/// lists under WordCraft's Capabilities; Markdown and plain text are only offered under Open With.
/// Every one is in the `.desktop` file's `MimeType=` (a test checks).
#[cfg(any(all(unix, not(target_os = "macos")), test))]
const WORD_MIME_TYPES: &[&str] = &[
"application/vnd.openxmlformats-officedocument.wordprocessingml.document", // .docx
"application/vnd.ms-word.document.macroEnabled.12", // .docm
"application/vnd.openxmlformats-officedocument.wordprocessingml.template", // .dotx
"application/vnd.ms-word.template.macroEnabled.12", // .dotm
"application/msword", // .doc
"application/msword-template", // .dot
"application/rtf", // .rtf
"text/rtf", // .rtf (older name)
"application/vnd.oasis.opendocument.text", // .odt
];
/// The arguments for `xdg-mime` that make `desktop_id` the default for [`WORD_MIME_TYPES`]: one
/// call sets them all.
#[cfg(any(all(unix, not(target_os = "macos")), test))]
fn xdg_mime_args(desktop_id: &str) -> Vec<String> {
["default", desktop_id].into_iter().chain(WORD_MIME_TYPES.iter().copied()).map(str::to_string).collect()
}
/// The `applications` folders the desktop looks for entries in, from `XDG_DATA_HOME` (default
/// `~/.local/share`) and `XDG_DATA_DIRS` (default `/usr/local/share:/usr/share`). Relative paths
/// are ignored, as the XDG Base Directory spec says.
#[cfg(any(all(unix, not(target_os = "macos")), test))]
fn application_dirs(data_home: Option<&str>, data_dirs: Option<&str>, home: Option<&str>) -> Vec<std::path::PathBuf> {
use std::path::{Path, PathBuf};
let absolute = |s: &&str| Path::new(s).is_absolute();
let home_dir = data_home
.filter(|s| !s.is_empty())
.filter(absolute)
.map(PathBuf::from)
.or_else(|| home.filter(|s| !s.is_empty()).filter(absolute).map(|h| Path::new(h).join(".local/share")));
let system = data_dirs.filter(|s| !s.is_empty()).unwrap_or("/usr/local/share:/usr/share");
home_dir
.into_iter()
.chain(system.split(':').filter(|s| !s.is_empty()).filter(absolute).map(PathBuf::from))
.map(|d| d.join("applications"))
.collect()
}
#[cfg(target_os = "windows")]
mod windows {
use wordcraft_ui_egui::DefaultApp;
/// Settings › Default apps, on the page of the app registered as `WordCraft` under
/// `HKLM\Software\RegisteredApplications` (the MSI writes it).
const SETTINGS_URI: &str = "ms-settings:defaultapps?registeredAppMachine=WordCraft";
pub(super) fn open_default_apps() -> Result<DefaultApp, String> {
open::that_detached(SETTINGS_URI).map_err(|e| format!("couldn't open Settings: {e}"))?;
Ok(DefaultApp::SettingsOpened)
}
}
#[cfg(all(unix, not(target_os = "macos")))]
mod xdg {
use std::process::Command;
use wordcraft_ui_egui::DefaultApp;
use super::{DESKTOP_ID, application_dirs, xdg_mime_args};
/// The longest error text from `xdg-mime` shown in the status bar.
const MAX_ERROR: usize = 200;
pub(super) fn make_default() -> Result<DefaultApp, String> {
if std::env::var_os("FLATPAK_ID").is_some() || std::path::Path::new("/.flatpak-info").exists() {
return Err(
"the Flatpak sandbox can't change default apps; choose WordCraft under Open With in your file manager or system settings".into()
);
}
let var = |k: &str| std::env::var(k).ok();
let dirs = application_dirs(var("XDG_DATA_HOME").as_deref(), var("XDG_DATA_DIRS").as_deref(), var("HOME").as_deref());
if !dirs.iter().any(|d| d.join(DESKTOP_ID).is_file()) {
return Err(format!("{DESKTOP_ID} isn't installed (an AppImage needs desktop integration first)"));
}
let out = Command::new("xdg-mime").args(xdg_mime_args(DESKTOP_ID)).output().map_err(|e| match e.kind() {
std::io::ErrorKind::NotFound => "xdg-mime isn't installed (it comes with xdg-utils)".to_string(),
_ => format!("couldn't run xdg-mime: {e}"),
})?;
if out.status.success() {
return Ok(DefaultApp::MadeDefault);
}
let stderr = String::from_utf8_lossy(&out.stderr);
let first = stderr.lines().map(str::trim).find(|l| !l.is_empty()).unwrap_or("");
let message: String = first.chars().take(MAX_ERROR).collect();
Err(if message.is_empty() { format!("xdg-mime failed ({})", out.status) } else { format!("xdg-mime failed: {message}") })
}
}
#[cfg(test)]
mod tests {
use std::path::PathBuf;
use super::*;
#[test]
fn xdg_mime_sets_every_word_type_in_one_call() {
let args = xdg_mime_args(DESKTOP_ID);
assert_eq!(args.first().map(String::as_str), Some("default"));
assert_eq!(args.get(1).map(String::as_str), Some("ai.storyteller.wordcraft.desktop"));
assert_eq!(&args[2..], WORD_MIME_TYPES);
for t in [
"application/vnd.openxmlformats-officedocument.wordprocessingml.document",
"application/msword",
"application/rtf",
"application/vnd.oasis.opendocument.text",
] {
assert!(args.iter().any(|a| a == t), "{t}");
}
assert!(!args.iter().any(|a| a == "text/plain" || a == "text/markdown"), "plain text and Markdown are never claimed");
}
/// Every type the button claims is one the desktop entry declares, or desktops ignore it.
#[test]
fn the_desktop_entry_declares_every_claimed_type() {
let entry = include_str!("../../../packaging/linux/ai.storyteller.wordcraft.desktop");
let declared: Vec<&str> =
entry.lines().find_map(|l| l.strip_prefix("MimeType=")).map(|v| v.split(';').filter(|s| !s.is_empty()).collect()).unwrap_or_default();
for t in WORD_MIME_TYPES {
assert!(declared.contains(t), "{t} missing from MimeType=");
}
assert!(entry.lines().any(|l| l == "Exec=wordcraft %F"), "files are passed on the command line");
}
#[test]
fn application_dirs_follow_the_xdg_spec() {
let p = |s: &str| PathBuf::from(s);
assert_eq!(
application_dirs(None, None, Some("/home/a")),
[p("/home/a/.local/share/applications"), p("/usr/local/share/applications"), p("/usr/share/applications")]
);
assert_eq!(
application_dirs(Some("/data"), Some("/opt/share::relative:/usr/share"), Some("/home/a")),
[p("/data/applications"), p("/opt/share/applications"), p("/usr/share/applications")]
);
// Empty or relative values fall back to the defaults; no home at all is fine.
assert_eq!(application_dirs(Some(""), Some(""), None), [p("/usr/local/share/applications"), p("/usr/share/applications")]);
assert_eq!(application_dirs(Some("rel"), None, Some("also-rel")), [p("/usr/local/share/applications"), p("/usr/share/applications")]);
}
}
+5 -2
View File
@@ -13,6 +13,7 @@ mod animations;
#[cfg(target_os = "macos")]
mod apple_events;
mod control_server;
mod default_apps;
mod file_dialogs;
#[cfg(any(target_os = "windows", test))]
mod graphics;
@@ -176,13 +177,15 @@ fn save_prefs(app: &WordApp) {
}
/// Native file dialogs, shown without blocking the window (`file_dialogs`, #94), File › Print
/// through the system's PDF viewer (`print`, #15), pictures on the system clipboard (#45), and
/// the system's animation setting (`animations`).
/// through the system's PDF viewer (`print`, #15), pictures on the system clipboard (#45), the
/// system's animation setting (`animations`), and making WordCraft the default app for Word
/// documents (`default_apps`, #295).
fn services(file_dialog: file_dialogs::Hook, ctx: &egui::Context) -> Services {
Services {
file_dialog: Some(file_dialog),
print: Some(print::hook()),
clipboard_picture: Some(Box::new(clipboard_picture)),
make_default_app: default_apps::hook(),
animations_enabled: Some(animations::hook(ctx)),
clipboard_text: Some(Box::new(|| arboard::Clipboard::new().ok()?.get_text().ok())),
..Default::default()
+7
View File
@@ -2041,3 +2041,10 @@
Your system has animation effects turned off. Efekty animace jsou v systému vypnuté.
Your system doesn't report an animation setting, so animation effects stay on. Systém neuvádí žádné nastavení animací, proto efekty animace zůstávají zapnuté.
Do Not Check Spelling or Grammar Nekontrolovat pravopis ani gramatiku
Couldn't make WordCraft the default: {error} WordCraft se nepodařilo nastavit jako výchozí: {error}
In Default apps, choose WordCraft for the document types you want it to open. Ve Výchozích aplikacích vyberte WordCraft pro typy dokumentů, které má otevírat.
Make WordCraft the default for Word documents… Nastavit WordCraft jako výchozí pro dokumenty Word…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Soubory .docx, .doc, .rtf a .odt a šablony Wordu se od teď otevírají ve WordCraftu.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Otevře Nastavení › Výchozí aplikace, kde zvolíte WordCraft pro .docx a další typy dokumentů.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Chcete-li dokumenty Word otevírat ve WordCraftu jako výchozí: vyberte jeden ve Finderu, zvolte Soubor › Informace, v části „Otevřít v aplikaci“ vyberte WordCraft a klikněte na „Změnit vše“.
WordCraft is now the default app for Word documents. WordCraft je nyní výchozí aplikací pro dokumenty Word.
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -2035,3 +2035,10 @@
Your system has animation effects turned off. Auf Ihrem System sind Animationseffekte deaktiviert.
Your system doesn't report an animation setting, so animation effects stay on. Ihr System meldet keine Animationseinstellung, daher bleiben Animationseffekte aktiviert.
Do Not Check Spelling or Grammar Rechtschreibung und Grammatik nicht prüfen
Couldn't make WordCraft the default: {error} WordCraft konnte nicht als Standard festgelegt werden: {error}
In Default apps, choose WordCraft for the document types you want it to open. Wählen Sie unter „Standard-Apps“ WordCraft für die Dokumenttypen, die es öffnen soll.
Make WordCraft the default for Word documents… WordCraft als Standard für Word-Dokumente festlegen…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Öffnet .docx-, .doc-, .rtf- und .odt-Dateien sowie Word-Vorlagen ab jetzt mit WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Öffnet Einstellungen › Standard-Apps, wo Sie WordCraft für .docx und die anderen Dokumenttypen wählen.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Um Word-Dokumente standardmäßig mit WordCraft zu öffnen: Wählen Sie eines im Finder aus, wählen Sie Ablage › Informationen, wählen Sie WordCraft unter „Öffnen mit“ und klicken Sie auf „Alle ändern“.
WordCraft is now the default app for Word documents. WordCraft ist jetzt die Standard-App für Word-Dokumente.
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -280,6 +280,7 @@
Copy Copiar
Copy Formatting Copiar formato
Corrections Correcciones
Couldn't make WordCraft the default: {error} No se pudo hacer de WordCraft la aplicación predeterminada: {error}
Count words in text boxes and notes Contar las palabras de los cuadros de texto y las notas
Cover Page Portada
Create Crear
@@ -449,6 +450,7 @@
Immersive Inmersivo
Immersive Reader Lector inmersivo
Immersive\nReader Lector\ninmersivo
In Default apps, choose WordCraft for the document types you want it to open. En Aplicaciones predeterminadas, elige WordCraft para los tipos de documento que quieras que abra.
Increase Font Size Aumentar tamaño de fuente
Increase Indent Aumentar sangría
Indent Sangría
@@ -531,6 +533,7 @@
MIT OR Apache-2.0. Copyright (c) 2026 ArtCraft Team and the WordCraft contributors. MIT o Apache-2.0. Copyright (c) 2026 ArtCraft Team y los colaboradores de WordCraft.
Macros Macros
Mailings Correspondencia
Make WordCraft the default for Word documents… Hacer de WordCraft la aplicación predeterminada para documentos de Word…
Manage Sources Administrar fuentes
Many pages Varias páginas
Margins Márgenes
@@ -602,6 +605,8 @@
One Page Una página
Open Abrir
OpenDocument Text (*.odt) Texto de OpenDocument (*.odt)
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. A partir de ahora, los archivos .docx, .doc, .rtf y .odt y las plantillas de Word se abren con WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Abre Configuración › Aplicaciones predeterminadas, donde eliges WordCraft para .docx y los demás tipos de documento.
Optional Hyphen Guion opcional
Copyright Sign Signo de copyright
Ellipsis Puntos suspensivos
@@ -903,6 +908,7 @@
Thick Gruesa
Three Tres
Tight Ajustado
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Para abrir los documentos de Word con WordCraft de forma predeterminada: selecciona uno en el Finder, elige Archivo › Obtener información, selecciona WordCraft en «Abrir con» y haz clic en «Cambiar todo».
Top Border Borde superior
Top Margin Margen superior
Top of Page Parte superior de la página
@@ -963,6 +969,7 @@
Word XML Document (*.xml) Documento XML de Word (*.xml)
WordArt WordArt
WordCraft WordCraft
WordCraft is now the default app for Word documents. WordCraft es ahora la aplicación predeterminada para los documentos de Word.
Words Palabras
Words only Solo palabras
Wrap Text Ajustar texto
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -1579,6 +1579,13 @@
Right (vertical) Paremal (vertikaalne)
Ruby text: Ruby-tekst:
Size (pt): Suurus (pt):
Couldn't make WordCraft the default: {error} WordCrafti ei õnnestunud vaikerakenduseks määrata: {error}
In Default apps, choose WordCraft for the document types you want it to open. Vali jaotises „Vaikerakendused“ WordCraft nende dokumenditüüpide jaoks, mida see peaks avama.
Make WordCraft the default for Word documents… Määra WordCraft Wordi dokumentide vaikerakenduseks…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Edaspidi avatakse .docx-, .doc-, .rtf- ja .odt-failid ning Wordi mallid WordCraftiga.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Avab Sätted › Vaikerakendused, kus saad valida WordCrafti .docx-i ja teiste dokumenditüüpide jaoks.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Wordi dokumentide vaikimisi avamiseks WordCraftiga vali Finderis üks dokument, vali Fail › Hangi teave, vali jaotises „Ava rakendusega“ WordCraft ja klõpsa „Muuda kõiki“.
WordCraft is now the default app for Word documents. WordCraft on nüüd Wordi dokumentide vaikerakendus.
Templates Mallid
Templates and Add-ins Mallid ja lisandmoodulid
Attach Template Manusta mall
Can't render this file because it contains an unexpected character in line 445 and column 13.
+7
View File
@@ -2420,3 +2420,10 @@
✓ None ✓ Nessuno
preview Title Esempio
Do Not Check Spelling or Grammar Non controllare ortografia e grammatica
Couldn't make WordCraft the default: {error} Impossibile rendere WordCraft l'app predefinita: {error}
In Default apps, choose WordCraft for the document types you want it to open. In App predefinite, scegli WordCraft per i tipi di documento che deve aprire.
Make WordCraft the default for Word documents… Rendi WordCraft l'app predefinita per i documenti Word…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. D'ora in poi i file .docx, .doc, .rtf e .odt e i modelli di Word si aprono con WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Apre Impostazioni › App predefinite, dove scegli WordCraft per .docx e gli altri tipi di documento.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Per aprire i documenti Word con WordCraft per impostazione predefinita: selezionane uno nel Finder, scegli Archivio › Ottieni informazioni, scegli WordCraft in «Apri con», quindi fai clic su «Modifica tutto».
WordCraft is now the default app for Word documents. WordCraft è ora l'app predefinita per i documenti Word.
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -77,6 +77,7 @@
Click to switch back to inserting クリックすると挿入モードに戻ります
Color only 色のみ
Compress punctuation at the start of a line 行頭の約物を詰める
Couldn't make WordCraft the default: {error} WordCraft を既定のアプリにできませんでした: {error}
Custom dictionary ユーザー辞書
Dark page (white text on black) ダーク ページ (黒地に白い文字)
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. 四角形をドラッグして表を描くか、セルを横切る線を引いて分割します。Esc で終了します。
@@ -105,6 +106,7 @@
Inside: 内側:
Latin text font: ラテン文字のフォント:
Left border 左罫線
In Default apps, choose WordCraft for the document types you want it to open. 既定のアプリで、WordCraft で開きたい文書の種類ごとに WordCraft を選んでください。
Left Margin 左余白
Indents and Spacing インデントと間隔
Legal style numbering 正規形式で番号付け
@@ -125,6 +127,9 @@
Number format 番号書式
Number style for this level: このレベルの番号の種類:
Outside border 外側の罫線
Make WordCraft the default for Word documents… WordCraft を Word 文書の既定のアプリにする…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. 今後、.docx、.doc、.rtf、.odt ファイルと Word テンプレートを WordCraft で開きます。
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. 設定 › 既定のアプリ を開きます。そこで .docx などの文書の種類ごとに WordCraft を選びます。
Overtype 上書き
Overtype (typing replaces the characters after the caret) 上書き (入力した文字がカーソルの後ろの文字を置き換えます)
Page display ページの表示
@@ -319,6 +324,8 @@
Delete Style スタイルの削除
Delete Table 表の削除
Design デザイン
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Word 文書を既定で WordCraft で開くには: Finder で文書を選び、ファイル › 情報を見る を選んで、「このアプリケーションで開く」で WordCraft を選び、「すべてを変更」をクリックします。
WordCraft is now the default app for Word documents. WordCraft が Word 文書の既定のアプリになりました。
development build 開発ビルド
Diagonal 対角線
Diamond ひし形
1 # Japanese (ja) interface catalog. Same format and clean-room rules as zh-hans.tsv.
77
78
79
80
81
82
83
106
107
108
109
110
111
112
127
128
129
130
131
132
133
134
135
324
325
326
327
328
329
330
331
+7
View File
@@ -2053,3 +2053,10 @@
{name} already exists. Choose Save again to replace it. Plik {name} już istnieje. Wybierz ponownie Zapisz, aby go zastąpić.
{name} wasn't found. Nie znaleziono: {name}.
“{text}” ({row}, {series}) isn't a number. „{text}” ({row}, {series}) nie jest liczbą.
Couldn't make WordCraft the default: {error} Nie udało się ustawić WordCraft jako domyślnego: {error}
In Default apps, choose WordCraft for the document types you want it to open. W Aplikacjach domyślnych wybierz WordCraft dla typów dokumentów, które ma otwierać.
Make WordCraft the default for Word documents… Ustaw WordCraft jako domyślny dla dokumentów Word…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Od teraz pliki .docx, .doc, .rtf i .odt oraz szablony Word otwierają się w WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Otwiera Ustawienia › Aplikacje domyślne, gdzie wybierasz WordCraft dla .docx i innych typów dokumentów.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Aby otwierać dokumenty Word domyślnie w WordCraft: zaznacz jeden w Finderze, wybierz Plik › Pokaż info, wybierz WordCraft w „Otwórz za pomocą”, a następnie kliknij „Zmień wszystkie”.
WordCraft is now the default app for Word documents. WordCraft jest teraz domyślną aplikacją dla dokumentów Word.
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -271,6 +271,7 @@
Copy Copiar
Copy Formatting Copiar formatação
Corrections Correções
Couldn't make WordCraft the default: {error} Não foi possível tornar o WordCraft o aplicativo padrão: {error}
Count words in text boxes and notes Contar palavras em caixas de texto e notas
Cover Page Capa
Create Criar
@@ -308,11 +309,15 @@
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. Arraste um retângulo para desenhar uma tabela, ou uma linha sobre as células para dividi-las. Esc encerra.
Draw Table Desenhar tabela
Edit Comment Editar comentário
In Default apps, choose WordCraft for the document types you want it to open. Em Aplicativos padrão, escolha o WordCraft para os tipos de documento que você quer que ele abra.
Left Margin Margem esquerda
Indents and Spacing Recuos e espaçamento
Line breaking Quebra de linhas
Make WordCraft the default for Word documents… Tornar o WordCraft o aplicativo padrão para documentos do Word…
More templates → Mais modelos →
No templates match your search. Nenhum modelo corresponde à pesquisa.
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. A partir de agora, arquivos .docx, .doc, .rtf e .odt e modelos do Word abrem no WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Abre Configurações › Aplicativos padrão, onde você escolhe o WordCraft para .docx e os outros tipos de documento.
Reopen Reabrir
Right Margin Margem direita
Distribute letters Distribuir letras
@@ -322,6 +327,8 @@
Right (vertical) Direita (vertical)
Ruby text: Texto ruby:
Search for templates Pesquisar modelos
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Para abrir documentos do Word com o WordCraft por padrão: selecione um no Finder, escolha Arquivo › Obter Informações, selecione o WordCraft em “Abrir com” e clique em “Alterar Tudo”.
WordCraft is now the default app for Word documents. O WordCraft agora é o aplicativo padrão para documentos do Word.
development build versão de desenvolvimento
Diagonal Diagonal
Diamond Losango
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -1998,6 +1998,13 @@ preview Title Пример
Search icons Поиск значков
No icons match your search. Нет значков, соответствующих поиску.
Recolor a one-color picture, such as an icon Перекрасить одноцветный рисунок, например значок
Couldn't make WordCraft the default: {error} Не удалось сделать WordCraft приложением по умолчанию: {error}
In Default apps, choose WordCraft for the document types you want it to open. В разделе «Приложения по умолчанию» выберите WordCraft для нужных типов документов.
Make WordCraft the default for Word documents… Сделать WordCraft приложением по умолчанию для документов Word…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Отныне файлы .docx, .doc, .rtf и .odt и шаблоны Word будут открываться в WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Открывает «Параметры» › «Приложения по умолчанию», где можно выбрать WordCraft для .docx и других типов документов.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Чтобы открывать документы Word в WordCraft по умолчанию: выберите документ в Finder, выберите «Файл» › «Свойства», укажите WordCraft в разделе «Открывать в программе» и нажмите «Изменить все».
WordCraft is now the default app for Word documents. WordCraft теперь приложение по умолчанию для документов Word.
Templates Шаблоны
Templates and Add-ins Шаблоны и надстройки
Attach Template Присоединить шаблон
Can't render this file because it contains an unexpected character in line 7 and column 25.
+7
View File
@@ -104,6 +104,7 @@
Color: {color} Boja: {color}
Compress punctuation at the start of a line Sažmi interpunkciju na početku reda
Confirm password: Potvrdite lozinku:
Couldn't make WordCraft the default: {error} WordCraft nije mogao da postane podrazumevana aplikacija: {error}
Custom dictionary Prilagođeni rečnik
Dark page (white text on black) Tamna stranica (beo tekst na crnom)
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. Prevucite pravougaonik da nacrtate tabelu ili liniju preko ćelija da ih podelite. Esc završava.
@@ -148,6 +149,10 @@
Number format Format broja
Number style for this level: Stil broja za ovaj nivo:
Outside border Spoljna ivica
In Default apps, choose WordCraft for the document types you want it to open. U podrazumevanim aplikacijama izaberite WordCraft za vrste dokumenata koje želite da otvara.
Make WordCraft the default for Word documents… Postavi WordCraft kao podrazumevanu aplikaciju za Word dokumente…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Od sada će se .docx, .doc, .rtf i .odt datoteke i Word šabloni otvarati u WordCraft-u.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Otvara Podešavanja › Podrazumevane aplikacije, gde birate WordCraft za .docx i druge vrste dokumenata.
Overtype Prepisivanje
Overtype (typing replaces the characters after the caret) Prepisivanje (otkucano zamenjuje znakove posle kursora)
Page display Prikaz strane
@@ -367,6 +372,8 @@
Delete Style Obriši stil
Delete Table Obriši tabelu
Design Dizajn
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Da bi se Word dokumenti podrazumevano otvarali u WordCraft-u: izaberite jedan u Finder-u, izaberite Datoteka › Prikaži informacije, pod „Otvori pomoću” izaberite WordCraft, pa kliknite „Promeni sve”.
WordCraft is now the default app for Word documents. WordCraft je sada podrazumevana aplikacija za Word dokumente.
development build razvojna verzija
Diagonal Dijagonalno
Diamond Dijamant
Can't render this file because it contains an unexpected character in line 6 and column 25.
+7
View File
@@ -108,6 +108,7 @@
Color: {color} Боја: {color}
Compress punctuation at the start of a line Сажми интерпункцију на почетку реда
Confirm password: Потврдите лозинку:
Couldn't make WordCraft the default: {error} WordCraft није могао да постане подразумевана апликација: {error}
Custom dictionary Прилагођени речник
Dark page (white text on black) Тамна страница (бео текст на црном)
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. Превуците правоугаоник да нацртате табелу или линију преко ћелија да их поделите. Esc завршава.
@@ -152,6 +153,10 @@
Number format Формат броја
Number style for this level: Стил броја за овај ниво:
Outside border Спољна ивица
In Default apps, choose WordCraft for the document types you want it to open. У подразумеваним апликацијама изаберите WordCraft за врсте докумената које желите да отвара.
Make WordCraft the default for Word documents… Постави WordCraft као подразумевану апликацију за Word документе…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Од сада ће се .docx, .doc, .rtf и .odt датотеке и Word шаблони отварати у WordCraft-у.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Отвара Подешавања › Подразумеване апликације, где бирате WordCraft за .docx и друге врсте докумената.
Overtype Преписивање
Overtype (typing replaces the characters after the caret) Преписивање (откуцано замењује знакове после курсора)
Page display Приказ стране
@@ -371,6 +376,8 @@
Delete Style Обриши стил
Delete Table Обриши табелу
Design Дизајн
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Да би се Word документи подразумевано отварали у WordCraft-у: изаберите један у Finder-у, изаберите Датотека › Прикажи информације, под „Отвори помоћу” изаберите WordCraft, па кликните „Промени све”.
WordCraft is now the default app for Word documents. WordCraft је сада подразумевана апликација за Word документе.
development build развојна верзија
Diagonal Дијагонално
Diamond Дијамант
Can't render this file because it contains an unexpected character in line 11 and column 25.
+7
View File
@@ -1623,6 +1623,13 @@
Search icons Simgelerde ara
No icons match your search. Aramanızla eşleşen simge yok.
Recolor a one-color picture, such as an icon Simge gibi tek renkli bir resmi yeniden renklendir
Couldn't make WordCraft the default: {error} WordCraft varsayılan yapılamadı: {error}
In Default apps, choose WordCraft for the document types you want it to open. Varsayılan uygulamalar bölümünde, WordCraft'ın açmasını istediğiniz belge türlerini seçin.
Make WordCraft the default for Word documents… WordCraft'ı Word belgeleri için varsayılan yap…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Bundan sonra .docx, .doc, .rtf ve .odt dosyalarını ve Word şablonlarını WordCraft ile açar.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Ayarlar › Varsayılan uygulamalar bölümünü açar; burada .docx ve diğer belge türleri için WordCraft'ı seçersiniz.
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Word belgelerini varsayılan olarak WordCraft ile açmak için: Finder'da bir belge seçin, Dosya › Bilgi Al'ı seçin, Birlikte aç altında WordCraft'ı seçin ve Tümünü Değiştir'e tıklayın.
WordCraft is now the default app for Word documents. WordCraft artık Word belgeleri için varsayılan uygulama.
Templates Şablonlar
Templates and Add-ins Şablonlar ve Eklentiler
Attach Template Şablonu Ekle
Can't render this file because it contains an unexpected character in line 431 and column 13.
+7
View File
@@ -278,6 +278,7 @@
Copy Копіювати
Copy Formatting Копіювати форматування
Corrections Виправлення
Couldn't make WordCraft the default: {error} Не вдалося зробити WordCraft типовою програмою: {error}
Count words in text boxes and notes Рахувати слова в текстових полях і виносках
Cover Page Титульна сторінка
Create Створити
@@ -315,11 +316,15 @@
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. Перетягніть прямокутник, щоб намалювати таблицю, або лінію через клітинки, щоб їх розділити. Esc завершує.
Draw Table Намалювати таблицю
Edit Comment Редагувати коментар
In Default apps, choose WordCraft for the document types you want it to open. У програмах за замовчуванням виберіть WordCraft для типів документів, які він має відкривати.
Left Margin Ліве поле
Indents and Spacing Відступи й інтервали
Line breaking Розрив рядків
Make WordCraft the default for Word documents… Зробити WordCraft типовою програмою для документів Word…
More templates → Більше шаблонів →
No templates match your search. Немає шаблонів, що відповідають пошуку.
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. Відтепер файли .docx, .doc, .rtf, .odt і шаблони Word відкриватимуться у WordCraft.
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. Відкриває Параметри › Програми за замовчуванням, де ви вибираєте WordCraft для .docx та інших типів документів.
Reopen Відкрити знову
Right Margin Праве поле
Distribute letters Розподілити літери
@@ -329,6 +334,8 @@
Right (vertical) Праворуч (вертикально)
Ruby text: Текст рубі:
Search for templates Пошук шаблонів
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. Щоб документи Word типово відкривалися у WordCraft: виберіть документ у Finder, оберіть Файл › Отримати інфо, виберіть WordCraft у розділі «Відкривати за допомогою» і натисніть «Змінити все».
WordCraft is now the default app for Word documents. WordCraft тепер типова програма для документів Word.
development build Збірка для розробки
Diagonal Діагональ
Diamond Ромб
Can't render this file because it contains an unexpected character in line 6 and column 31.
+7
View File
@@ -89,6 +89,7 @@
Click to switch back to inserting 单击以切换回插入模式
Color only 仅颜色
Compress punctuation at the start of a line 压缩行首标点
Couldn't make WordCraft the default: {error} 无法将 WordCraft 设为默认应用:{error}
Custom dictionary 自定义词典
Dark page (white text on black) 深色页面(黑底白字)
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. 拖出矩形以绘制表格,或拖出穿过单元格的线条以拆分单元格。按 Esc 结束。
@@ -117,6 +118,7 @@
Inside: 内侧:
Latin text font: 拉丁文字字体:
Left border 左框线
In Default apps, choose WordCraft for the document types you want it to open. 请在“默认应用”中,为希望由 WordCraft 打开的文档类型选择 WordCraft。
Left Margin 左边距
Indents and Spacing 缩进和间距
Legal style numbering 正规形式编号
@@ -137,6 +139,9 @@
Number format 编号格式
Number style for this level: 此级别的编号样式:
Outside border 外侧框线
Make WordCraft the default for Word documents… 将 WordCraft 设为 Word 文档的默认应用…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. 今后用 WordCraft 打开 .docx、.doc、.rtf、.odt 文件和 Word 模板。
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. 打开“设置 › 默认应用”,在其中为 .docx 及其他文档类型选择 WordCraft。
Overtype 改写
Overtype (typing replaces the characters after the caret) 改写(键入的内容替换插入点后的字符)
Page display 页面显示
@@ -331,6 +336,8 @@
Delete Style 删除样式
Delete Table 删除表格
Design 设计
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. 要默认用 WordCraft 打开 Word 文档:在访达中选中一个文档,选择“文件 › 显示简介”,在“打开方式”中选择 WordCraft,然后点按“全部更改”。
WordCraft is now the default app for Word documents. WordCraft 现在是 Word 文档的默认应用。
development build 开发版本
Diagonal 斜式
Diamond 菱形
Can't render this file because it contains an unexpected character in line 7 and column 25.
+7
View File
@@ -78,6 +78,7 @@
Click to switch back to inserting 按一下以切換回插入模式
Color only 僅色彩
Compress punctuation at the start of a line 壓縮行首標點
Couldn't make WordCraft the default: {error} 無法將 WordCraft 設為預設應用程式:{error}
Custom dictionary 自訂字典
Dark page (white text on black) 深色頁面(黑底白字)
Drag a rectangle to draw a table, or a line across cells to split them. Esc stops. 拖出矩形以繪製表格,或拖出穿過儲存格的線條以分割儲存格。按 Esc 結束。
@@ -106,6 +107,7 @@
Inside: 內側:
Latin text font: 拉丁文字字型:
Left border 左框線
In Default apps, choose WordCraft for the document types you want it to open. 請在「預設應用程式」中,為要以 WordCraft 開啟的文件類型選擇 WordCraft。
Left Margin 左邊界
Indents and Spacing 縮排和間距
Legal style numbering 正規形式編號
@@ -126,6 +128,9 @@
Number format 編號格式
Number style for this level: 此層級的編號樣式:
Outside border 外側框線
Make WordCraft the default for Word documents… 將 WordCraft 設為 Word 文件的預設應用程式…
Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on. 今後以 WordCraft 開啟 .docx、.doc、.rtf、.odt 檔案和 Word 範本。
Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types. 開啟「設定 › 預設應用程式」,在其中為 .docx 及其他文件類型選擇 WordCraft。
Overtype 取代
Overtype (typing replaces the characters after the caret) 取代(輸入的內容會取代插入點後的字元)
Page display 頁面顯示
@@ -320,6 +325,8 @@
Delete Style 刪除樣式
Delete Table 刪除表格
Design 設計
To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All. 若要預設以 WordCraft 開啟 Word 文件:在 Finder 中選取一份文件,選擇「檔案 › 取得資訊」,在「打開檔案的應用程式」中選擇 WordCraft,然後按一下「全部更改」。
WordCraft is now the default app for Word documents. WordCraft 現在是 Word 文件的預設應用程式。
development build 開發版本
Diagonal 斜向
Diamond 菱形
1 # Traditional Chinese (zh-hant, Taiwan vocabulary) interface catalog. Same format and clean-room
78
79
80
81
82
83
84
107
108
109
110
111
112
113
128
129
130
131
132
133
134
135
136
325
326
327
328
329
330
331
332
+131
View File
@@ -125,6 +125,21 @@ pub struct Services {
pub store_font: Option<Box<dyn Fn(&str, &[u8])>>,
/// Web: forget a stored font (its stored file name) once the user removes it.
pub forget_font: Option<Box<dyn Fn(&str)>>,
/// Desktop: File › Options › General › Make WordCraft the default for Word documents (#295),
/// only from that button (never a programmatic command). Windows opens the Settings app's
/// Default apps page (apps can't set defaults themselves); Linux and BSD set it with
/// `xdg-mime`. `None` (web, macOS) hides the button; macOS shows how to do it in Finder
/// instead. An error means nothing changed.
pub make_default_app: Option<Box<dyn Fn() -> Result<DefaultApp, String>>>,
}
/// What [`Services::make_default_app`] did.
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub enum DefaultApp {
/// The system's default-apps settings opened; the user picks WordCraft there (Windows).
SettingsOpened,
/// WordCraft is now the default app for Word documents (Linux, BSD).
MadeDefault,
}
/// Files delivered asynchronously.
@@ -991,6 +1006,16 @@ impl WordApp {
// page; this is the button on it, and the one programmatic call that opens system UI
// here, like `ui.openFileDialog` — only when the host can print.
"ui.print" => return Some(self.print_to_system(p)),
// File › Options › General › Make WordCraft the default… changes the user's system
// default apps (Linux) or opens system settings (Windows), so only a click on that
// button does it ([`WordApp::make_default_app`]); scripts, the control channel and
// MCP get an error.
"ui.makeDefaultApp" => {
return Some(Err(
"making WordCraft the default app needs a click in File › Options › General; scripts and agents can't change system defaults"
.into(),
));
}
"ui.discord" => {
self.canvas.open_url = Some("https://discord.gg/artcraft".into());
json!({})
@@ -1052,6 +1077,32 @@ impl WordApp {
}
}
/// File › Options › General › Make WordCraft the default…: hand over to the host's
/// [`Services::make_default_app`] and say in the status bar what happened. An error when the
/// host has no hook (web, macOS). Only the button calls this: it is deliberately not a
/// command, so nothing programmatic (control channel, MCP, macros) can change system defaults.
pub(crate) fn make_default_app(&mut self) -> Result<Value, String> {
let Some(hook) = self.services.make_default_app.as_ref() else {
return Err("WordCraft can't change the default apps here; use your system's settings".into());
};
match hook() {
Ok(DefaultApp::SettingsOpened) => {
self.status(tl!("In Default apps, choose WordCraft for the document types you want it to open."));
Ok(json!({"settingsOpened": true}))
}
Ok(DefaultApp::MadeDefault) => {
self.status(tl!("WordCraft is now the default app for Word documents."));
Ok(json!({"default": true}))
}
Err(e) => {
log::warn!("make default app: {e}");
let msg = i18n::fmt(tl!("Couldn't make WordCraft the default: {error}"), &[("error", &e)]);
self.status(msg.clone());
Err(msg)
}
}
}
pub fn status(&mut self, s: impl Into<String>) {
self.status_msg = Some((s.into(), now_ms()));
}
@@ -2391,6 +2442,50 @@ mod tests {
assert!(a.status_msg.as_ref().is_some_and(|(m, _)| m.contains("blocked by the browser")), "the status bar says why");
}
/// Make WordCraft the default… (#295) goes through the host's hook and reports the outcome in
/// the status bar; without a hook (web, macOS) it's an error and nothing runs.
#[test]
fn make_default_app_needs_the_hosts_hook_and_reports_the_outcome() {
let mut a = app();
assert!(a.make_default_app().is_err(), "no hook: an error");
let calls = std::rc::Rc::new(std::cell::Cell::new(0));
let seen = calls.clone();
a.services.make_default_app = Some(Box::new(move || {
seen.set(seen.get() + 1);
Ok(DefaultApp::MadeDefault)
}));
assert_eq!(a.make_default_app().unwrap()["default"], true);
assert_eq!(calls.get(), 1);
assert!(a.status_msg.as_ref().is_some_and(|(m, _)| m.contains("now the default")), "{:?}", a.status_msg);
a.services.make_default_app = Some(Box::new(|| Ok(DefaultApp::SettingsOpened)));
assert_eq!(a.make_default_app().unwrap()["settingsOpened"], true);
assert!(a.status_msg.as_ref().is_some_and(|(m, _)| m.contains("Default apps")), "{:?}", a.status_msg);
a.services.make_default_app = Some(Box::new(|| Err("xdg-mime isn't installed".into())));
let e = a.make_default_app().unwrap_err();
assert!(e.contains("xdg-mime isn't installed"), "{e}");
assert!(a.status_msg.as_ref().is_some_and(|(m, _)| m.contains("xdg-mime isn't installed")), "the status bar says why");
assert!(!a.session.dirty, "the document is untouched");
}
/// Changing the system's default apps needs the user's click: `ui.makeDefaultApp` through
/// `run` (what the control channel, MCP and macros use) is refused and never reaches the hook.
#[test]
fn programmatic_calls_cannot_change_the_default_apps() {
let mut a = app();
let calls = std::rc::Rc::new(std::cell::Cell::new(0));
let seen = calls.clone();
a.services.make_default_app = Some(Box::new(move || {
seen.set(seen.get() + 1);
Ok(DefaultApp::MadeDefault)
}));
let e = a.run("ui.makeDefaultApp", json!({})).unwrap_err();
assert!(e.contains("click"), "{e}");
assert_eq!(calls.get(), 0, "the hook never ran");
}
/// The print settings reach the hook: bad ones print nothing, `copies` repeats the pages.
#[test]
fn ui_print_honours_the_print_settings() {
@@ -2448,6 +2543,42 @@ mod tests {
}
}
/// File › Options shows Make WordCraft the default… only when the host can do it (#295), and
/// the button runs the host's hook.
#[test]
fn the_default_app_button_shows_only_with_the_hosts_hook() {
use egui_kittest::kittest::Queryable;
const LABEL: &str = "Make WordCraft the default for Word documents…";
for hook in [false, true] {
let calls = std::rc::Rc::new(std::cell::Cell::new(0));
let mut a = app();
if hook {
let seen = calls.clone();
a.services.make_default_app = Some(Box::new(move || {
seen.set(seen.get() + 1);
Ok(DefaultApp::MadeDefault)
}));
}
a.run("ui.backstage", json!({"value": true, "page": "options"})).unwrap();
let mut h = egui_kittest::Harness::builder().with_size(egui::vec2(1440.0, 900.0)).build_ui_state(
|ui, app: &mut WordApp| {
let ctx = ui.ctx().clone();
app.logic(&ctx);
app.ui(ui);
},
a,
);
h.run_steps(4);
assert!(h.query_by_label("Show the community button in the title bar").is_some(), "hook {hook}: the Options page rendered");
assert_eq!(h.query_by_label(LABEL).is_some(), hook, "hook {hook}: the button");
if hook {
h.get_by_label(LABEL).click();
h.run_steps(2);
assert_eq!(calls.get(), 1, "the button ran the hook");
}
}
}
/// A prompt about document A outlived an agent replacing A with B, and Don't Save then ran
/// the pending New against B, throwing away B's edits under a question naming A.
#[test]
+24
View File
@@ -140,6 +140,7 @@ fn general(app: &mut WordApp, ui: &mut Ui) {
let _ = app.run("view.darkMode", json!({"value": dark_page}));
}
ui.checkbox(&mut app.ui.show_discord, tl!("Show the community button in the title bar"));
default_app_button(app, ui);
ui.add_space(8.0);
section(ui, "Personalize");
egui::Grid::new("options_user").num_columns(2).spacing(vec2(8.0, 6.0)).show(ui, |ui| {
@@ -480,6 +481,29 @@ fn overlay<T: DeserializeOwned>(root: &mut Value, path: &mut Vec<String>, input:
}
}
/// File ▸ Options ▸ General: make WordCraft the default app for Word documents (#295). Only where
/// the host can (`Services::make_default_app`: Windows opens Default apps, Linux and BSD use
/// `xdg-mime`); macOS shows how to do it in Finder, the web shows nothing.
fn default_app_button(app: &mut WordApp, ui: &mut Ui) {
if app.services.make_default_app.is_some() {
let hint = if cfg!(target_os = "windows") {
tl!("Opens Settings › Default apps, where you choose WordCraft for .docx and the other document types.")
} else {
tl!("Opens .docx, .doc, .rtf and .odt files and Word templates with WordCraft from now on.")
};
if ui.button(tl!("Make WordCraft the default for Word documents…")).on_hover_text(hint).clicked() {
// Straight to the hook, not through `run`: only a click may change system defaults.
let _ = app.make_default_app();
}
} else if cfg!(target_os = "macos") {
ui.label(
egui::RichText::new(tl!("To open Word documents with WordCraft by default: select one in Finder, choose File › Get Info, pick WordCraft under Open with, then click Change All."))
.small()
.weak(),
);
}
}
#[cfg(test)]
mod tests {
use egui_kittest::kittest::Queryable;
+14 -8
View File
@@ -1,6 +1,6 @@
# File-format parity with Microsoft Word
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** trivial (.doc pictures, shapes and text boxes read, #551; previously trivial: import/export fixes for TXT, RTF, ODT, HTML and LaTeX, #433–#440; previously major: first version; every format Word reads or writes, measured from the readers and writers on origin/main) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4, plus Word for Windows' extra formats
> **Last reviewed:** 2026-10-10 · **Last updated:** 2026-10-11 · **Change:** minor (file associations and the default-app button, #295; previously trivial: import/export fixes for TXT, RTF, ODT, HTML and LaTeX, #433–#440; previously major: first version; every format Word reads or writes, measured from the readers and writers on origin/main) · **Target:** Microsoft Word (Microsoft 365) for Mac 16.113.4, plus Word for Windows' extra formats
Every format Word opens or saves, what WordCraft does with it, and how it's tested. Fidelity is the
share of a typical real-world file's content and formatting that survives (read: shows correctly;
@@ -79,8 +79,19 @@ Measured by grepping `crates/docx/src/read` and `src/write` for the OOXML elemen
| Hostile input | ✅ | — | `malformed.rs`, capped allocations, never-crash standard |
| Document paragraph defaults (`w:pPrDefault`) | ✅ | ✅ | Omission and explicit empty defaults remain distinct across repeated saves; nonempty defaults and later default-spacing edits are written |
## Paragraph-default preservation
## Opening files from the system
Double-clicking a document, Open With, and making WordCraft the default app (#295). The installers
register WordCraft for these types but never take over a default; File › Options › General has
**Make WordCraft the default for Word documents…** where the system allows it.
| Platform | Registered types | Default app | Notes |
|---|---|---|---|
| Windows (MSI) | `.docx` `.docm` `.dotx` `.dotm` `.doc` `.dot` `.rtf` `.odt`; `.md` `.txt` under Open With only | Options button opens Settings › Default apps on WordCraft's page | One ProgId per type, `OpenWithProgids`, Capabilities + `RegisteredApplications` (`packaging/windows/wordcraft.wxs`). Not yet tried on a real install |
| Linux, BSD (deb, rpm, Flatpak, AppImage) | Word, ODT, RTF, Markdown, LaTeX, HTML, text (`MimeType=` in the desktop entry, AppStream `mediatype`) | Options button runs `xdg-mime default` for the Word, RTF and ODT types | Not from inside Flatpak (the sandbox can't change host defaults); a bare AppImage needs desktop integration first |
| macOS | `CFBundleDocumentTypes` as Alternate handler (Word, ODT, RTF, Markdown, HTML, text) | Finder › Get Info › Open with › Change All (the Options page says so) | Apple events open the files (#27) |
## Paragraph-default preservation
The styles reader records whether `w:pPrDefault` exists. The writer keeps an omitted
container omitted when its modeled properties are still empty. An explicitly empty
container stays present, and editing document-default spacing writes the new values.
@@ -94,30 +105,24 @@ identical text, glyph/image geometry, page sizes and embedded font-program hashe
two WordCraft save/reopen cycles. All fifteen variants open without repair warnings.
Word PDFs and measurements remain local under ignored `plan/word/`; they are not fixtures.
These checks cover preservation on Word reopen, not WordCraft pagination parity.
The [public OOXML reference](https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.paragraphpropertiesdefault?view=openxml-3.0.1)
describes omission as leaving paragraph defaults application-defined. Real-world corpus
coverage and WordCraft layout matching remain separate gaps.
## Custom XML store preservation
A reduced original bound-control DOCX loses its backing data, item properties and relationship
on main, both without editing and after unrelated edits. Main's content-control support (#381)
preserves control metadata, including binding attributes, while this custom XML path keeps the
backing store through the bounded opaque part graph: payload bytes, content types and
related-part IDs survive two edited save/reopen cycles.
The public [dataBinding contract](https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.wordprocessing.databinding?view=openxml-3.0.1)
maps a control to a custom XML data part; its [item properties](https://learn.microsoft.com/en-us/dotnet/api/documentformat.openxml.customxmldataproperties.datastoreitem?view=openxml-3.0.1)
identify the store. Keeping displayed text alone does not preserve that mapping. This change
preserves stores without evaluating XPath or synchronizing control edits into XML.
Focused original tests cover package/main roots, multiple/shared stores, cycles, external schema
references, missing parts, UTF-16 payloads, strict relationship types and reserved filenames.
The bibliography names used by #532 are reserved; bibliography already loaded into the source
model belongs to its writer. Word-derived files are not fixtures. No readiness estimate rises
from these synthetic package checks, and native Word rendering/binding behavior remains untested.
## Native save-path guarantees
Native `io::save_path_with` serializes (and, for password-protected DOCX, encrypts) before creating an exclusively owned sibling temporary file. It writes and synchronizes that file, closes it, then replaces the destination. Failed preparation or replacement keeps the original bytes; cleanup removes only the save's temporary file, on a best-effort basis. Existing `<name>.tmp` files, directories and links are untouched. A new document gets the default mode (`0666` less the umask). When replacing an existing regular file, the Unix temporary file starts with mode `0600` and then takes the existing file's basic permissions. Serialization and format support are unchanged.
Synthetic CLI cases and `engine/tests/safe_save.rs` cover occupied names, links, blocked replacement, missing directories, Save As session state, password-protected saves and original-file protection on macOS. Unit tests inject preparation errors and interleave two prepared saves. Independent saves use separate files; the last successful replacement wins. This is not document locking or conflict detection.
@@ -156,6 +161,7 @@ raise readiness estimates. No Word-derived files are fixtures.
| Date | Change | Summary |
|---|---|---|
| 2026-10-11 | minor | Opening files from the system: file associations and the default-app button (#295) |
| 2026-10-11 | trivial | `.doc`: inline and floating pictures (BLIP store, PNG/JPEG/DIB/TIFF/EMF/WMF), basic shapes, groups and text boxes read from OfficeArt drawings (#551); fidelity ~55% → ~60% |
| 2026-10-11 | trivial | Word XML Document (Flat OPC) read and written, Word 2003 XML read (#548) |
| 2026-10-11 | trivial | #534: DOCX indents in characters read and written; `.doc` first-line indents (`sprmPDxaLeft1`, its two-byte operand, and `sprmPDxaLeft1_80`), indents in characters (`sprmPDxc*`) and exact/at-least line spacing (LSPD) read correctly |
@@ -11,4 +11,4 @@ StartupNotify=true
StartupWMClass=ai.storyteller.wordcraft
Categories=Office;WordProcessor;
Keywords=word;processor;document;docx;writer;text;letter;report;
MimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.oasis.opendocument.text;application/rtf;text/markdown;text/x-tex;text/html;text/plain;
MimeType=application/vnd.openxmlformats-officedocument.wordprocessingml.document;application/vnd.ms-word.document.macroEnabled.12;application/vnd.openxmlformats-officedocument.wordprocessingml.template;application/vnd.ms-word.template.macroEnabled.12;application/msword;application/msword-template;application/vnd.oasis.opendocument.text;application/rtf;text/rtf;text/markdown;text/x-tex;text/html;text/plain;
@@ -50,8 +50,17 @@
<control>pointing</control>
<control>tablet</control>
</supports>
<!-- Document types WordCraft opens (#295), as in the desktop entry's MimeType=. -->
<provides>
<binary>wordcraft</binary>
<mediatype>application/vnd.openxmlformats-officedocument.wordprocessingml.document</mediatype>
<mediatype>application/vnd.ms-word.document.macroEnabled.12</mediatype>
<mediatype>application/vnd.openxmlformats-officedocument.wordprocessingml.template</mediatype>
<mediatype>application/vnd.ms-word.template.macroEnabled.12</mediatype>
<mediatype>application/msword</mediatype>
<mediatype>application/msword-template</mediatype>
<mediatype>application/vnd.oasis.opendocument.text</mediatype>
<mediatype>application/rtf</mediatype>
</provides>
<content_rating type="oars-1.1"/>
<releases>
+1
View File
@@ -59,6 +59,7 @@
<array>
<string>org.openxmlformats.wordprocessingml.document</string>
<string>org.openxmlformats.wordprocessingml.template</string>
<string>com.microsoft.word.doc</string>
<string>org.oasis-open.opendocument.text</string>
<string>public.rtf</string>
<string>net.daringfireball.markdown</string>
+74
View File
@@ -76,6 +76,80 @@
<RegistryValue Root="HKLM" Key="Software\Microsoft\Windows\CurrentVersion\App Paths\wordcraft.exe" Value="[#WordcraftExe]" Type="string" />
</Component>
<!-- File associations (#295). Each document type gets a WordCraft ProgId (name, icon, open
command) and is listed under the extension's OpenWithProgids, so WordCraft shows in
Explorer's "Open with". The Word, RTF and ODT types are also WordCraft's Capabilities
(RegisteredApplications), so it appears in Settings › Default apps, where the user
makes it the default (File › Options › General opens that page). Nothing here sets an
extension's default: the installer never takes over .docx from another app. Markdown and
plain text are only "Open with" candidates. Removed again on uninstall. -->
<Component Id="WordcraftFileTypes" Guid="EFF89E6A-F9B8-49F9-B3AE-E243347484B4">
<RegistryValue Root="HKLM" Key="Software\RegisteredApplications" Name="WordCraft" Value="Software\WordCraft\Capabilities" Type="string" KeyPath="yes" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities" Name="ApplicationName" Value="WordCraft" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities" Name="ApplicationDescription" Value="Write and design documents; open and save Word files." Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities" Name="ApplicationIcon" Value="&quot;[#WordcraftExe]&quot;,0" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe" Name="FriendlyAppName" Value="WordCraft" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<ProgId Id="WordCraft.Document" Description="Word Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.Document\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.docx\OpenWithProgids" Name="WordCraft.Document" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".docx" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".docx" Value="WordCraft.Document" Type="string" />
<ProgId Id="WordCraft.DocumentMacroEnabled" Description="Word Macro-Enabled Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.DocumentMacroEnabled\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.docm\OpenWithProgids" Name="WordCraft.DocumentMacroEnabled" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".docm" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".docm" Value="WordCraft.DocumentMacroEnabled" Type="string" />
<ProgId Id="WordCraft.Template" Description="Word Template" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.Template\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.dotx\OpenWithProgids" Name="WordCraft.Template" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".dotx" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".dotx" Value="WordCraft.Template" Type="string" />
<ProgId Id="WordCraft.TemplateMacroEnabled" Description="Word Macro-Enabled Template" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.TemplateMacroEnabled\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.dotm\OpenWithProgids" Name="WordCraft.TemplateMacroEnabled" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".dotm" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".dotm" Value="WordCraft.TemplateMacroEnabled" Type="string" />
<ProgId Id="WordCraft.LegacyDocument" Description="Legacy Word Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.LegacyDocument\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.doc\OpenWithProgids" Name="WordCraft.LegacyDocument" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".doc" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".doc" Value="WordCraft.LegacyDocument" Type="string" />
<ProgId Id="WordCraft.LegacyTemplate" Description="Legacy Word Template" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.LegacyTemplate\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.dot\OpenWithProgids" Name="WordCraft.LegacyTemplate" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".dot" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".dot" Value="WordCraft.LegacyTemplate" Type="string" />
<ProgId Id="WordCraft.RichText" Description="Rich Text Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.RichText\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.rtf\OpenWithProgids" Name="WordCraft.RichText" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".rtf" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".rtf" Value="WordCraft.RichText" Type="string" />
<ProgId Id="WordCraft.OpenDocumentText" Description="OpenDocument Text" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.OpenDocumentText\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.odt\OpenWithProgids" Name="WordCraft.OpenDocumentText" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".odt" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\WordCraft\Capabilities\FileAssociations" Name=".odt" Value="WordCraft.OpenDocumentText" Type="string" />
<ProgId Id="WordCraft.Markdown" Description="Markdown Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.Markdown\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.md\OpenWithProgids" Name="WordCraft.Markdown" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".md" Value="" Type="string" />
<ProgId Id="WordCraft.PlainText" Description="Text Document" Icon="WordcraftExe" IconIndex="0" />
<RegistryValue Root="HKLM" Key="Software\Classes\WordCraft.PlainText\shell\open\command" Value="&quot;[#WordcraftExe]&quot; &quot;%1&quot;" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\.txt\OpenWithProgids" Name="WordCraft.PlainText" Value="" Type="string" />
<RegistryValue Root="HKLM" Key="Software\Classes\Applications\wordcraft.exe\SupportedTypes" Name=".txt" Value="" Type="string" />
</Component>
<Component Id="WordcraftCli">
<File Id="WordcraftCliExe" Source="$(var.BinDir)\wordcraft-cli.exe" KeyPath="yes" />
</Component>