From 632a66eb465b4b7543a1fff1836cbdabdea68fe1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Sat, 17 Oct 2026 00:32:48 -0400 Subject: [PATCH] R7.9: Explorer's New makes docx, xlsx, pptx and md on Windows Each app installs a blank file and points ShellNew at it. Explorer lists a type only through its default class, so a type no program handles (no default, or one naming no class) gets the app's class; an installed handler is never replaced. Uninstall removes only what this install wrote. Co-Authored-By: Claude Opus 5.5 (1M context) --- agents.md | 2 ++ packaging/windows/installer.nsi | 1 + packaging/windows/installer.sh | 4 ++++ packaging/windows/new/new.docx | Bin 0 -> 4951 bytes packaging/windows/new/new.md | 0 packaging/windows/new/new.pptx | Bin 0 -> 8180 bytes packaging/windows/new/new.xlsx | Bin 0 -> 5047 bytes packaging/windows/templates.sh | 25 +++++++++++++++++++++++++ packaging/windows/types.sh | 32 +++++++++++++++++++++++++++++++- tasks/TASKS.md | 1 + tests/scripts/types.sh | 20 ++++++++++++++++---- 11 files changed, 80 insertions(+), 5 deletions(-) create mode 100644 packaging/windows/new/new.docx create mode 100644 packaging/windows/new/new.md create mode 100644 packaging/windows/new/new.pptx create mode 100644 packaging/windows/new/new.xlsx create mode 100644 packaging/windows/templates.sh diff --git a/agents.md b/agents.md index 6d3fd21..c6de9e0 100644 --- a/agents.md +++ b/agents.md @@ -144,6 +144,7 @@ tests/scripts/*.sh *.py 脚本测试(缺工具时报 SKIP) packaging/macos/bundle.sh ely-doc debug 出 dist/ElyDoc.app(带图标、文档类型与该应用的引擎) packaging/macos/release.sh [批次] 该批各应用的 release 包与 dmg,另有装全部的 ElyOffice dmg;ELY_SIGN_IDENTITY 加 ELY_NOTARY_PROFILE 即公证 packaging/windows/bundle.sh 由 dist 里各应用的安装程序出合集 ElyOffice 安装程序(先跑 installer.sh) +packaging/windows/templates.sh 以本构建的内核重写 packaging/windows/new 的空白 DOCX、XLSX、PPTX(右键“新建”用) packaging/icons/masters.py 写出 assets/icons 的全部 SVG 母版(图标设计只改这里) packaging/icons/build.sh 由 assets/icons 的母版渲染 icns、png、ico(只在 macOS) tests/scripts/icons.sh 八个图标齐全、未过期,macOS 为 squircle,其余无底形 @@ -315,4 +316,5 @@ cargo run -p ely-doc 启动一个应用(ElyDoc 先 cargo build -p ely - 2026-10-16(Gitea #4):装了宋体仍报缺少(R7.3)。内核按名找字体时比较 `GetEnglishSearchFontName`(小写 ASCII、去空格、中日韩本地名译为英文名,`宋体` 即 `simsun`),所以文档的 `宋体` 找到并用上 SimSun;缺字检查却比较原名与所用字体名,报为缺失。Linux 上内核以界面语言(英文)为 fontconfig 字体取名,文档里的本地名一律报缺。补丁 `0048-lok-fonts-missing-by-search-name.patch`:缺字检查同样比较检索名。实测(2026-10-16):Arch 容器装 ElyDoc 0.1.5 的 Arch 包与 simsun.ttc,40 行宋体五号、文档网格的 docx 报缺宋体,正文实为 SimSun(无此字体时为方框),与 Windows 同为一页;换上打过 0048 的内核后同一容器不再报缺、仍为一页。用户所说一页变两页未能复现,需其文件:十种宋体版式(44 与 45 行的文档网格、无网格、折行两端对齐、字符网格、粗体、小四、固定行距、1.5 倍行距)在 Windows 与 Linux 内核上页数、断行、分页逐行相同(`.work/r7/pages`),网格下每页 44 行、每行约 39 字,同 Word 的 A4 默认;差别若在,是该文件里 LibreOffice 与 Word 的排版不同,与平台无关。缺字检查测试:`navigate/tests.rs` 以随包的 DejaVu Sans 写作 `DEJAVU SANS`,只报真缺的字体。另见:Linux 上属性栏的字体框为空(字体列表只有 SimSun,文档写宋体),未改。 - 2026-10-16(Gitea #5):每个 PDF 打开即报已损坏(R7.4)。C11.8 把画图块与导出时 MuPDF 的任何警告都算作损坏;读页面时载入未嵌入的字体也发警告(中文文件里写名而不嵌入的宋体等:`non-embedded font using identity encoding`),合法的文件因此转为修复副本、保存一律另存。现在警告监视(`keep_warning`,打开时的扫描、画图块、导出与 Markdown 的 PDF 共用)只略去这一句与紧随其后的 MuPDF 重复计数(`... repeated N times...`);其余照算损坏,含内容的语法错误、无字体写字、坏的嵌入字体与图片流。读文字与搜索也受监视(坏图片读过即被缓存,之后画图块、导出与检查都不再报警告):其间遇到的损坏记入报告与该文档,下一次画图块或检查图片报出,报出之前导出图片与文字一律拒绝。监视开始时,MuPDF 尚未报出的重复计数(来自其余未受监视的读取)按它所重复的那句归类(`ctx->warn.message`):字体提示的重复略去,其余照算。`tests/output.rs` 核对:两个同名未嵌入字体的文件先读文字再画图块、导出图片与文字都不算损坏;无字体写字与 `BT ] ET` 的图块为损坏;`[/FlateDecode /ASCIIHexDecode]` 下校验和错的图片使两种导出都被拒、图块为损坏。先读文字或搜索后,这样的两张图片、颜色键掩码无效的一张图片、以及它在两个未嵌入字体之前或之后画出,画图块、导出与检查图片仍报损坏。 - 2026-10-16(Gitea #3):Windows 与 Linux 打印(R7.6)。`print_pdf` 改为异步:对话框在应用线程上,读页与出作业在自己的线程上(`print::off`),应用不卡。Windows:系统打印对话框(`PrintDlgEx`,Windows 11 显示为新式对话框),打开前把默认打印机的设置改成文档的纸张与方向(按打印机自己的纸型匹配(纸型须装得下页面,至多大 2 毫米,Linux 的 PWG 名同此);没有即自定义尺寸),设置须连同打印机名(`DEVNAMES`)一起交给对话框,否则对话框改用打印机自己的偏好(实测:Letter 文档印成 A4);所选页码范围照办,份数交驱动;勾“打印到文件”时文档输出为 `FILE:`,由打印子系统问文件名。驱动不支持所设纸张时会换成别的(实测“Microsoft Print to PDF”没有自定义尺寸,1000×600 点的页面换成 A4),所以出作业之前(`StartDoc` 之前)按打印机实际的纸张核对每一页:超出纸张半点以上(纸张尺寸至多舍入到整点,`print::ROUNDING`)、转过来也超出即报错,什么也不印(实测:600×842 点的页面原在 A4 上印出、右缘被裁)。页面由 Windows 自带的 PDF 渲染(`Windows.Data.Pdf`)按打印机分辨率分条画出,按原大从纸张的角上放(扣去不可打印的偏移),只在转过来才放得下时左转 90 度;渲染器的尺寸按 DIP 算、乘显示缩放,每次作业先试画一次量出倍数。`ELY_PRINT_TO` 时不弹对话框,经“Microsoft Print to PDF”写成文件(测试用)。`GlobalFree` 成功时返回空,windows-rs 读成错误码 0 的错误,须当作成功(否则打印报“操作成功完成”)。Linux:经 xdg 桌面门户的 `org.freedesktop.portal.Print`(`PreparePrint` 后带其令牌 `Print`,交出 PDF 的文件描述符),页面设置为文档纸张(标准纸型给 PWG 名,否则自定义毫米尺寸),边距为零,只许输出 PDF(`supported_output_file_formats`,否则对话框可选 PostScript,写出的却是 PDF);门户照原样交出所给的字节,对话框的选择由应用排定(`print/linux/sheets.rs`):GTK 设置里的页码范围(从零起)、奇偶页、倒序、份数与逐份、缩放、每张页数与排列,排到对话框所选纸张与方向上,每页为一个表单对象(带可打印批注的外观;带 NoRotate 的批注在转过的页面上绕其左上角转回、保持正立,同 MuPDF;外观的资源名避开页面已有的;可打印却没有外观的批注即报错,链接与弹出说明本无外观),单页按原大乘缩放从纸张左上角放,超出半点以上而转过来放得下即左转,否则报错;方向照 GTK 的写法(`reverse-portrait`,门户文档的页面设置同此);奇偶页只在 GTK 的文件与 lpr 后端时由 Ely 排(设置里有 `output-uri` 或 `lpr-commandline`),CUPS 后端自己把它交给 CUPS(`cups-page-set`,GTK 3.24.52 实测),Ely 再排一次即丢页;份数、每张页数等 GTK 留给应用,Ely 照排;裁剪框超出媒体框的部分不印(取两者的交);页码范围的开放终点 GTK 写作 -1(`1--1`),倒着的范围即报错;多页按格居中,再交内存文件(`memfd`);直接用 zbus:ashpd 0.13.13 的 `PageSetup`、`Settings` 缺任一字段即解析失败,真门户的回复常不带 `PPDName`。页面尺寸由 lopdf 读(CropBox,否则 MediaBox,继承、`/Rotate` 与页面自己的 `/UserUnit`)。打印不再按平台禁用(原 `print::BUILT` 与“此平台尚未构建”删去)。替身门户的测试核对选页、缩放、倒序与份数后交出的页面与位置,与只许 PDF。ElyPDF 的打印副本(`ely_print_copy`)按打印的规则画:可打印(不隐藏)的批注与表单控件,外观画进页面内容(位置照 MuPDF 自己的 `pdf_annot_transform`,与屏上一致;无外观的先由 MuPDF 生成,MuPDF 原只在显示时放在本地表里、不存入文件),其余批注与表单去掉,只留链接;系统的渲染器按屏幕规则画(不打印的照画,“打印但不显示”的不画,实测 Windows),画进内容后各渲染器都只见要打印的;仍画不出的即报错;`tests/output.rs` 渲染副本核对。真窗口(Windows):ElyDoc 的 Ctrl+P、Ely 的打印对话框、系统对话框、“Microsoft Print to PDF”的另存为,印出的 PDF 为文档的 Letter;系统对话框取消时不打印、不报错(`.work/r76/print.ps1`)。未验证:Linux 真桌面上的门户(只对替身门户核对);实体打印机。 +- 2026-10-16(用户定):Windows 资源管理器的右键“新建”可建 DOCX、XLSX、PPTX 与 Markdown 文件(R7.9)。空白文件在 `packaging/windows/new`(`templates.sh` 以本构建的内核把空文件转存而得,无作者与日期;Markdown 为空文件),随所属的应用装在安装目录(列在 `.ely-installed` 里),`HKCU\…\.<扩展名>\ShellNew` 的 `FileName` 指向它。资源管理器只在扩展名有默认 ProgID 时列出新建项(实测:只有 `ShellNew`、或只在 `OpenWithProgids` 下时都不列);所以只在该类型没有任何程序处理时(HKCR 下无默认值,或默认值所指的类不存在:本机 Windows 11 的 `.md` 指向不存在的 `Markdown Document`)把默认值设为本应用的 ProgID(写在 HKCU,用户自己的 `UserChoice` 不动),已有的从不改动(装着 Office、WPS 时新建菜单用它们自己的项);没有处理程序的这四种类型从此由 Ely 打开。卸载只删仍是本安装写下的 `ShellNew` 与默认值。ProgID 的名称为“<应用> Document”(新建菜单与类型列显示它)。`tests/scripts/types.sh` 核对四种都有新建项,默认值只在判空之后写。 - 2026-10-16(用户定):ElyMark 打开的块保持原样(R7.5)。组件库 bff7ebc 起,可视模式里按下的块以原文显示在它合上时的框里(同样的边距与透明边框),字号、行高与颜色同合上时:段落、列表、引用等为正文,标题按其级数的字号、1.3 倍行高、加粗(六级为次要色),照原文写出的块(链接定义等)为等宽次要色;不再加深色底板与另一套边距,按下前后不挪位置。代码块、块公式与 front matter 仍有自己的底板(代码与 front matter 为等宽小号,front matter 为次要色,同合上时)。输入框的着色(源码模式同用)给标题与粗体同一字重(原为半粗,压过所设的加粗),六级标题里的字照为次要色(行内代码照为正文色,2e65b05),front matter 照 front matter 读(原读成分隔线加标题,键名变亮变粗)(1ff993d、962964e)。表格单元格照旧。打字机模式的居中另按两端余量判定(原只按块高与视图高,打开前后同高时首块不再居中)。同批带入组件库 cdc5ce8(标题栏拖动区里的控件按下归控件,Windows)。Windows 真窗口核对(`.work/r75`):段落、三级标题、代码块打开前后位置相同。 diff --git a/packaging/windows/installer.nsi b/packaging/windows/installer.nsi index 9389caf..7bbeb49 100644 --- a/packaging/windows/installer.nsi +++ b/packaging/windows/installer.nsi @@ -1,6 +1,7 @@ ; Per-user installer; pass each define the checks below name. Unicode true !include "MUI2.nsh" +!include "LogicLib.nsh" !ifndef APP_NAME !error "pass -DAPP_NAME" diff --git a/packaging/windows/installer.sh b/packaging/windows/installer.sh index 55058ee..f89a95d 100755 --- a/packaging/windows/installer.sh +++ b/packaging/windows/installer.sh @@ -18,6 +18,10 @@ makensis=${MAKENSIS:-"/c/Program Files (x86)/NSIS/makensis.exe"} } stage=$root/target/stage/$slug "$root/packaging/stage.sh" "$slug" "$stage" +# Explorer's New copies these; the install list owns them. +for ext in $(awk -F'\t' -v slug="$slug" '$1 == slug { print $2 }' "$root/packaging/types.tsv"); do + [ ! -e "$root/packaging/windows/new/new.$ext" ] || cp "$root/packaging/windows/new/new.$ext" "$stage/" +done types=$root/target/stage/$slug-types.nsh "$root/packaging/windows/types.sh" "$slug" >"$types" list=$root/target/stage/$slug-files.txt diff --git a/packaging/windows/new/new.docx b/packaging/windows/new/new.docx new file mode 100644 index 0000000000000000000000000000000000000000..9503e818b9a734fe3756a66821127397961b1197 GIT binary patch literal 4951 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 Jf&KWg{{ii+ENcJ& literal 0 HcmV?d00001 diff --git a/packaging/windows/new/new.md b/packaging/windows/new/new.md new file mode 100644 index 0000000..e69de29 diff --git a/packaging/windows/new/new.pptx b/packaging/windows/new/new.pptx new file mode 100644 index 0000000000000000000000000000000000000000..e1a66d452e3b11eae4b711014a537cad08faae25 GIT binary patch literal 8180 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 PH=nJW(&ii4?bH7Oxg4{6 literal 0 HcmV?d00001 diff --git a/packaging/windows/new/new.xlsx b/packaging/windows/new/new.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..99976f86289314202d863d174fcaae84f31d7481 GIT binary patch literal 5047 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 + exit 1 +} +out=$root/packaging/windows/new +work=$(mktemp -d) +trap 'rm -rf "$work"' EXIT +mkdir "$work/in" +# The kernel reads an empty file as a new document. +for ext in docx xlsx pptx; do + : >"$work/in/new.$ext" + "$soffice" --headless --norestore "-env:UserInstallation=file:///$(cygpath -m "$work/profile")" \ + --convert-to "$ext" --outdir "$(cygpath -w "$out")" "$(cygpath -w "$work/in/new.$ext")" + [ -s "$out/new.$ext" ] || { + echo "templates.sh: the kernel wrote no new.$ext" >&2 + exit 1 + } +done +: >"$out/new.md" diff --git a/packaging/windows/types.sh b/packaging/windows/types.sh index 9d384ce..1e484c9 100755 --- a/packaging/windows/types.sh +++ b/packaging/windows/types.sh @@ -10,11 +10,16 @@ progid="ElyOffice.$name" classes='Software\Classes' exts=$(awk -F'\t' -v slug="$slug" '$1 == slug && $2 != "/" { print $2 }' "$root/packaging/types.tsv") folder=$(awk -F'\t' -v slug="$slug" '$1 == slug && $2 == "/" { print "yes" }' "$root/packaging/types.tsv") +# Types Explorer's New menu makes, from packaging/windows/new. +fresh="" +for ext in $exts; do + [ ! -e "$root/packaging/windows/new/new.$ext" ] || fresh="$fresh $ext" +done # Open With lists the app; the user's default stays theirs. echo '!macro ElyTypesInstall' if [ -n "$exts" ]; then - echo " WriteRegStr HKCU \"$classes\\$progid\" \"\" \"$name\"" + echo " WriteRegStr HKCU \"$classes\\$progid\" \"\" \"$name Document\"" echo " WriteRegStr HKCU \"$classes\\$progid\\DefaultIcon\" \"\" \"\$INSTDIR\\$slug.ico\"" echo " WriteRegStr HKCU \"$classes\\$progid\\shell\\open\\command\" \"\" '\"\$INSTDIR\\$slug.exe\" \"%1\"'" echo " WriteRegStr HKCU \"$classes\\Applications\\$slug.exe\" \"FriendlyAppName\" \"$name\"" @@ -23,6 +28,20 @@ if [ -n "$exts" ]; then echo " WriteRegStr HKCU \"$classes\\Applications\\$slug.exe\\SupportedTypes\" \".$ext\" \"\"" done fi +for ext in $fresh; do + echo " WriteRegStr HKCU \"$classes\\.$ext\\ShellNew\" \"FileName\" \"\$INSTDIR\\new.$ext\"" + # New needs a class; take only a handlerless type. + echo " ReadRegStr \$0 HKCR \".$ext\" \"\"" + echo " ClearErrors" + # A default naming no class handles nothing either. + echo " \${If} \$0 != \"\"" + echo " EnumRegKey \$1 HKCR \"\$0\" 0" + echo " \${EndIf}" + echo " \${If} \$0 == \"\"" + echo " \${OrIf} \${Errors}" + echo " WriteRegStr HKCU \"$classes\\.$ext\" \"\" \"$progid\"" + echo " \${EndIf}" +done if [ -n "$folder" ]; then echo " WriteRegStr HKCU \"$classes\\Directory\\shell\\$progid\" \"\" \"Open in $name\"" echo " WriteRegStr HKCU \"$classes\\Directory\\shell\\$progid\" \"Icon\" \"\$INSTDIR\\$slug.ico\"" @@ -39,6 +58,17 @@ if [ -n "$exts" ]; then echo " DeleteRegValue HKCU \"$classes\\.$ext\\OpenWithProgids\" \"$progid\"" done fi +# Only what this install wrote. +for ext in $fresh; do + echo " ReadRegStr \$0 HKCU \"$classes\\.$ext\\ShellNew\" \"FileName\"" + echo " \${If} \$0 == \"\$INSTDIR\\new.$ext\"" + echo " DeleteRegKey HKCU \"$classes\\.$ext\\ShellNew\"" + echo " \${EndIf}" + echo " ReadRegStr \$0 HKCU \"$classes\\.$ext\" \"\"" + echo " \${If} \$0 == \"$progid\"" + echo " DeleteRegValue HKCU \"$classes\\.$ext\" \"\"" + echo " \${EndIf}" +done if [ -n "$folder" ]; then echo " DeleteRegKey HKCU \"$classes\\Directory\\shell\\$progid\"" fi diff --git a/tasks/TASKS.md b/tasks/TASKS.md index ebe4094..c6af501 100644 --- a/tasks/TASKS.md +++ b/tasks/TASKS.md @@ -284,3 +284,4 @@ - [x] R7.6 Windows 与 Linux 不能打印(#3,§19.3):`print_pdf` 只有 macOS;Windows 用系统打印对话框,Linux 经 xdg 桌面门户的打印接口 - [x] R7.7 发布 0.1.6:版本号,三端建包、签名公证、上传,合集包一并上传,本机装上(v0.1.6 共 46 个文件,出自 a1b8c18:六个公证 dmg 与 ElyOffice dmg、六个安装程序与合集 setup.exe、24 个 Linux 包、一对源码包;`crates.py` 改问 cargo 本机链进的 crate,补 BSD-3-Clause;源码包只由 Linux 上传,重跑遇同名即失败、什么也不传(`ci-upload.sh`);本机六个应用静默装上 0.1.6、冒烟通过 — 第 1 轮:macOS 与 Linux 并行会重复上传源码;第 2 轮:重跑跳过同名会使更新清单与 dmg 散列不符、注释超长;第 3 轮:部分已传的重跑未测、注释超长,修后不再审查) - [x] R7.8 答复 #3 至 #6:每条写已修于 0.1.6;#6 的工作区建议另开 [FEATURE REQUEST] 并链过去(#3、#4、#5、#6 各一条答复,#7 为 [FEATURE REQUEST] 工作区与常用文件夹;#3、#5、#6 关闭,#4 开着等报告者的文件 — 第 1 轮:#5 的答复说只有读不出的内容才算损坏,超出 0.1.6 所修,改为只说未嵌入字体的提示不再算损坏;第 2 轮 PASS) +- [x] R7.9 Windows 右键“新建”(用户 2026-10-16 定,发 0.1.7,只发 Windows):资源管理器的新建菜单可建 DOCX、XLSX、PPTX、Markdown 文件,各由所属的应用装上与卸下(`types.sh` 测试另以两个变体核对:去掉判空、去掉 md 的模板各自失败;本机在 0.1.6 上静默装 0.1.7 的 ElyDoc、ElyTable、ElyShow、ElyMark:新建菜单列出四项,无 `.ely-old`,四个模板按新建的方式复制后在所属应用里打开,日志无错误与警告;卸载 ElyMark 后 `.md` 的新建项与默认值都删去、`UserChoice` 未动,重装复原;`windows-installer.sh`、`windows-bundle.sh` 通过。未送审:用户要求从简) diff --git a/tests/scripts/types.sh b/tests/scripts/types.sh index 26d9b72..5757ec3 100755 --- a/tests/scripts/types.sh +++ b/tests/scripts/types.sh @@ -28,7 +28,19 @@ for slug in $(cut -f1 "$types" | sort -u); do mimes=$(cut -f3 <<<"$rows" | sort -u | wc -l | tr -d ' ') [ "$utis" -eq "$mimes" ] || fail "$slug: macOS declares $utis types, the table $mimes" done -# Never the default: macOS ranks Alternate; Windows only lists. -! grep -q 'Classes\\\.[a-z]*" ""' <(for s in $(cut -f1 "$types" | sort -u); do "$root/packaging/windows/types.sh" "$s"; done) || - fail "Windows sets a default handler" -echo "ok: types ($count file types on three systems)" +# Never the default: Windows fills only a handlerless type. +for s in $(cut -f1 "$types" | sort -u); do + "$root/packaging/windows/types.sh" "$s" | awk -v slug="$s" ' + /WriteRegStr HKCU "Software\\Classes\\\.[a-z]*" ""/ && (prev !~ /\$\{OrIf\} \$\{Errors\}$/ || prev2 !~ /\$\{If\} \$0 == ""$/) { print slug ": " $0; bad = 1 } + { prev2 = prev; prev = $0 } END { exit bad }' || fail "Windows sets a default handler" +done +# Explorer's New makes docx, xlsx, pptx and md. +fresh=0 +for ext in docx xlsx pptx md; do + slug=$(awk -F'\t' -v ext="$ext" '$2 == ext { print $1 }' "$types") + windows=$("$root/packaging/windows/types.sh" "$slug") + grep -qF "\\.$ext\\ShellNew\" \"FileName\" \"\$INSTDIR\\new.$ext\"" <<<"$windows" || + fail "$slug: New misses .$ext" + fresh=$((fresh + 1)) +done +echo "ok: types ($count file types on three systems, $fresh in New)"