feat(资源管理): 完善资源管理与校验,优化性能
build.yaml / build (push) Successful in 50s

This commit is contained in:
xiaoqidun committed 2026-10-13 14:24:37 +08:00
1 parent 0e423c9713
commit 7bdb03f7bd
12 files changed
+319 -68

No files matched your search

+53 -1
View File
@@ -17,6 +17,7 @@ package ofdgo
import (
"bytes"
"context"
"io"
"path"
"slices"
"strconv"
@@ -40,6 +41,7 @@ func packagePagePath(directory, id string) string {
}
// packageName 为新增条目分配文档内路径,不覆盖原文件或本次资源
// 无暂存资源冲突时直接返回路径,避免重复构建资源映射
// 入参: relative 文档相对路径
// 返回: string 未占用路径
func (e *Editor) packageName(relative string) string {
@@ -47,11 +49,16 @@ func (e *Editor) packageName(relative string) string {
if e.source != nil {
reader = e.source.reader
}
name := path.Join(e.packageDirectory(), relative)
candidate := packageAvailableName(reader, nil, name)
if !slices.ContainsFunc(e.resources, func(resource editorResource) bool { return resource.name == candidate }) {
return candidate
}
files := make(map[string][]byte, len(e.resources))
for _, resource := range e.resources {
files[resource.name] = nil
}
return packageAvailableName(reader, files, path.Join(e.packageDirectory(), relative))
return packageAvailableName(reader, files, name)
}
// packageAvailableName 仅在包内同名条目冲突时添加序号,路径区分大小写
@@ -78,6 +85,51 @@ func packageAvailableName(reader *Reader, files map[string][]byte, name string)
}
}
// packageDataEqual 流式比较包内文件与给定数据,文件缺失时返回false
// 入参: ctx 取消上下文, reader 原包, name 包内路径, data 待比较内容
// 返回: bool 内容是否相同, error 读取或取消错误
func packageDataEqual(ctx context.Context, reader *Reader, name string, data []byte) (bool, error) {
if err := ctx.Err(); err != nil {
return false, err
}
name = cleanPackagePath(name)
if current, ok := reader.files[name]; ok {
return bytes.Equal(current, data), ctx.Err()
}
if _, ok := reader.packageFile(name); !ok {
return false, nil
}
stream, err := reader.openFile(name)
if err != nil {
return false, err
}
defer stream.Close()
input := imageInput{ReadCloser: stream, context: ctx}
var buffer [32 << 10]byte
for len(data) != 0 {
block := buffer[:min(len(buffer), len(data))]
_, err := io.ReadFull(input, block)
if err == io.EOF || err == io.ErrUnexpectedEOF {
return false, ctx.Err()
}
if err != nil {
return false, err
}
if !bytes.Equal(block, data[:len(block)]) {
return false, ctx.Err()
}
data = data[len(block):]
}
_, err = io.ReadFull(input, buffer[:1])
if err == io.EOF {
return true, ctx.Err()
}
if err == nil {
err = ctx.Err()
}
return false, err
}
// mergePackageResources 合并新增资源定义,保留原索引、路径基准与未知字段
// 入参: ctx 取消上下文, reader 原包, parts 待写入条目, doc 文档, directory 文档目录, added 新增资源XML,文件引用使用绝对包路径
// 返回: string 资源索引路径, bool 是否需要新增文档引用, error 读取、解析或取消错误