diff --git a/ofdgo_editor_package.go b/ofdgo_editor_package.go index 4f162a1..d4f807c 100644 --- a/ofdgo_editor_package.go +++ b/ofdgo_editor_package.go @@ -91,7 +91,7 @@ func (e *Editor) sourcePartsPrepared(progress editorProgress, generated map[stri known.refs = scan.refs } generated[name] = known - if reader.OFD.DocBody[reader.documentIndex].versioned && !known.stagedLeaf(nil) { + if (reader.DocumentCount() > 1 || reader.OFD.DocBody[reader.documentIndex].versioned) && !known.stagedLeaf(nil) { input := data.open() if e.output != nil { input = imageInput{ReadCloser: input, context: e.output.ctx} @@ -592,24 +592,33 @@ func (e *Editor) writeSource(writer io.Writer, fonts map[string][]byte, progress return 0, err } maps.Copy(parts, fonts) + reader := e.source.reader + ctx := context.Background() + if e.output != nil { + ctx = e.output.ctx + } + versioned := reader.OFD.DocBody[reader.documentIndex].versioned + if !versioned && reader.DocumentCount() > 1 { + parts, err = reader.versionOutputChanges(ctx, parts, nil, generated) + if err != nil { + return 0, err + } + } removed, err := e.compactSourceReferences(parts, progress, generated) if err != nil { return 0, err } - reader := e.source.reader if removed == nil { removed = make(map[string]bool) } if err := e.compressResourceReferences(parts, reader, removed, generated); err != nil { return 0, err } - ctx := context.Background() - if e.output != nil { - ctx = e.output.ctx - } - parts, err = reader.versionOutputChanges(ctx, parts, removed, generated) - if err != nil { - return 0, err + if versioned { + parts, err = reader.versionOutputChanges(ctx, parts, removed, generated) + if err != nil { + return 0, err + } } if len(parts) != 0 || len(removed) != 0 || e.output != nil && e.output.options.Mode != CompressionUnchanged && !e.output.protected { name := "OFD.xml" diff --git a/ofdgo_version_edit.go b/ofdgo_version_edit.go index b2ac121..4385517 100644 --- a/ofdgo_version_edit.go +++ b/ofdgo_version_edit.go @@ -255,14 +255,14 @@ func (r *Reader) versionResourceFiles(ctx context.Context, parts map[string][]by return files, nil } -// versionChanges 隔离当前入口修改涉及的共享文件,同步版本清单,不修改输入包或修改集 +// versionChanges 隔离当前文档或版本修改涉及的共享文件,同步版本清单,不修改输入包或修改集 // 入参: ctx 取消上下文, changes 待写入条目 // 返回: map[string][]byte 隔离后的修改集, error 读取、引用或结构错误 func (r *Reader) versionChanges(ctx context.Context, changes map[string][]byte) (map[string][]byte, error) { return r.versionOutputChanges(ctx, changes, nil, nil) } -// versionOutputChanges 隔离版本改动并同步删除清单,保留其他入口仍需使用的文件 +// versionOutputChanges 隔离文档或版本改动并同步删除清单,保留其他入口仍需使用的文件 // 入参: ctx 取消上下文, changes 待写入条目, removed 待删除条目,返回前移除受保护路径, generated 本次自产页面及引用,随隔离路径更新 // 返回: map[string][]byte 隔离后的修改集, error 读取、引用或结构错误 func (r *Reader) versionOutputChanges(ctx context.Context, changes map[string][]byte, removed map[string]bool, generated map[string]editorGeneratedReferences) (map[string][]byte, error) { @@ -273,7 +273,7 @@ func (r *Reader) versionOutputChanges(ctx context.Context, changes map[string][] if err != nil { return nil, err } - if !r.OFD.DocBody[r.documentIndex].versioned || len(changes) == 0 && len(removed) == 0 { + if r.DocumentCount() == 1 && !r.OFD.DocBody[r.documentIndex].versioned || len(changes) == 0 && len(removed) == 0 { return changes, ctx.Err() } parts := maps.Clone(changes) @@ -295,6 +295,18 @@ func (r *Reader) versionOutputChanges(ctx context.Context, changes map[string][] if err != nil { return nil, err } + if r.versionInfo == nil && len(removed) == 0 { + changed := false + for name := range parts { + if name != "OFD.xml" && shared[name] { + changed = true + break + } + } + if !changed { + return parts, ctx.Err() + } + } graph, err := r.versionEditGraph(ctx, entry, parts, generated) if err != nil { return nil, err