From 7841eaa997d77aaf459368b3bf603fadb52aa22f Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Tue, 13 Oct 2026 12:51:48 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E8=B5=84=E6=BA=90=E7=AE=A1=E7=90=86):=20?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E7=BC=BA=E5=A4=B1=E8=B5=84=E6=BA=90=E9=98=BB?= =?UTF-8?q?=E6=96=AD=E9=99=84=E4=BB=B6=E7=AE=A1=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/webui/ofdgo.js | 6 +++--- ofdgo_resource.go | 15 +++++++++++---- 2 files changed, 14 insertions(+), 7 deletions(-) diff --git a/assets/webui/ofdgo.js b/assets/webui/ofdgo.js index c3bf7b3..be1c5ea 100644 --- a/assets/webui/ofdgo.js +++ b/assets/webui/ofdgo.js @@ -5118,7 +5118,7 @@ function renderResourceList() { button.setAttribute("role", "option"); button.setAttribute("aria-selected", String(item === selected)); button.title = item.file || item.name; - for (const value of [item.name, item.file ? formatBytes(item.size) : "外部", item.complete ? String(item.references?.length || 0) : "未知"]) { + for (const value of [item.name, item.missing ? "缺失" : item.file ? formatBytes(item.size) : "外部", item.complete ? String(item.references?.length || 0) : "未知"]) { const span = document.createElement("span"); span.textContent = value; button.append(span); @@ -5159,8 +5159,8 @@ function updateResourceControls() { resourceElements.Add.hidden = resourceElements.Replace.hidden = resourceElements.Delete.hidden = !editing; resourceElements.Add.disabled = disabled; resourceElements.Reference.disabled = disabled || !item?.references?.length; - resourceElements.Preview.disabled = disabled || !item?.file || item.kind === "Attachment"; - resourceElements.Export.disabled = disabled || !item?.file; + resourceElements.Preview.disabled = disabled || !item?.file || item.missing || item.kind === "Attachment"; + resourceElements.Export.disabled = disabled || !item?.file || item.missing; resourceElements.Replace.disabled = disabled || !item || !item.complete; resourceElements.Replace.textContent = item?.kind === "Font" ? item.file ? "外置" : "嵌入" : "替换"; resourceElements.Delete.disabled = disabled || !item?.complete || Boolean(item?.references?.length); diff --git a/ofdgo_resource.go b/ofdgo_resource.go index 610b622..3f0da64 100644 --- a/ofdgo_resource.go +++ b/ofdgo_resource.go @@ -27,6 +27,7 @@ import ( // ResourceInfo 描述当前文档及所选版本的字体、图片、音视频或附件,Size为文件字节数 // Kind为Font、Image、Audio、Video或Attachment,标识仅在当前文档及同类资源内有效 // Complete表示已完整识别引用;不包含其他文档和历史版本的引用,空File表示外部字体 +// Missing表示声明的文件不在包内,与外部字体及零字节文件区分,不表示文件解码结果 type ResourceInfo struct { Kind string `json:"kind"` ID string `json:"id"` @@ -34,6 +35,7 @@ type ResourceInfo struct { Format string `json:"format"` File string `json:"file"` Size uint64 `json:"size"` + Missing bool `json:"missing"` Complete bool `json:"complete"` References []ResourceReference `json:"references"` } @@ -54,7 +56,7 @@ type resourceCatalog struct { nodes map[string]editorFontText } -// Resources 列出当前文档及所选版本的资源,不读取二进制内容或执行媒体动作 +// Resources 列出当前文档及所选版本的资源,标记缺失文件,不读取二进制内容或执行媒体动作 // 入参: ctx 取消上下文 // 返回: []ResourceInfo 资源及引用位置, error 结构或读取错误 func (r *Reader) Resources(ctx context.Context) ([]ResourceInfo, error) { @@ -202,10 +204,15 @@ func (r *Reader) resourceCatalog(ctx context.Context) (*resourceCatalog, error) } item.References = refs[key] if item.File != "" { - item.Size, err = outputResourceSize(r, nil, item.File) - if err != nil { - return nil, err + if data, ok := r.files[cleanPackagePath(item.File)]; ok { + item.Size = uint64(len(data)) + } else if file, ok := r.packageFile(item.File); ok { + item.Size = file.UncompressedSize64 + } else { + item.Missing = true } + } else { + item.Missing = item.Kind != "Font" } } return catalog, ctx.Err()