diff --git a/ofdgo_editor_font_binding.go b/ofdgo_editor_font_binding.go index b40efbe..dc83341 100644 --- a/ofdgo_editor_font_binding.go +++ b/ofdgo_editor_font_binding.go @@ -546,17 +546,19 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s if len(removed) == 0 { return nil } - files, structures := make(map[string]bool), map[string]bool{"OFD.xml": true} - for i := range reader.DocumentCount() { - _, xmlFiles, err := reader.documentDependencies(ctx, i) - if err != nil { - if ctx.Err() != nil { - return ctx.Err() - } - return nil + indexes := make([]int, reader.DocumentCount()) + for index := range indexes { + if err := ctx.Err(); err != nil { + return err } - maps.Copy(structures, xmlFiles) + indexes[index] = index } + _, structures, err := reader.documentDependencies(ctx, indexes...) + if err != nil { + return ctx.Err() + } + structures["OFD.xml"] = true + files := make(map[string]bool) versions := make(map[string]*editorFontXML) names := slices.Sorted(maps.Keys(structures)) for _, name := range slices.Sorted(maps.Keys(reader.fileNames)) { diff --git a/ofdgo_editor_font_cleanup.go b/ofdgo_editor_font_cleanup.go index 404796a..379fc9b 100644 --- a/ofdgo_editor_font_cleanup.go +++ b/ofdgo_editor_font_cleanup.go @@ -17,6 +17,7 @@ package ofdgo import ( "bytes" "context" + "fmt" "io" "maps" "slices" @@ -46,14 +47,31 @@ func (e *Editor) compactVersionFonts(ctx context.Context, parts map[string][]byt if err := view.initRootContext(ctx); err != nil { return err } + data, err := view.readFileViewContext(ctx, "OFD.xml") + if err != nil { + return err + } + root, err := parseEditorXMLContext(ctx, data) + if err != nil { + return err + } candidates, seen := make(map[string]bool), make(map[string]bool) - for index := range view.DocumentCount() { - view.documentIndex = index - versions, err := view.DocumentVersionsContext(ctx) + for _, body := range root.children { + if err := ctx.Err(); err != nil { + return err + } + if !body.matchesOFD("DocBody") { + continue + } + versions, err := parseVersionEntries(ctx, body) if err != nil { return err } - for _, version := range versions { + for _, entry := range versions { + version, err := view.readDocumentVersionContext(ctx, entry.ID, entry.Location) + if err != nil { + return fmt.Errorf("version %s: %w", entry.ID, err) + } for _, file := range version.Files { if err := ctx.Err(); err != nil { return err diff --git a/ofdgo_version.go b/ofdgo_version.go index 411f6da..f56edbf 100644 --- a/ofdgo_version.go +++ b/ofdgo_version.go @@ -109,6 +109,16 @@ func (r *Reader) documentVersionEntriesContext(ctx context.Context) ([]DocumentV if body == nil { return nil, fmt.Errorf("document body not found: %d", r.documentIndex) } + return parseVersionEntries(ctx, body) +} + +// parseVersionEntries 校验一个文档的版本列表,复用已解析的主入口节点 +// 入参: ctx 取消上下文, body 文档入口节点 +// 返回: []DocumentVersionInfo 版本入口属性, error 结构或取消错误 +func parseVersionEntries(ctx context.Context, body *editorXML) ([]DocumentVersionInfo, error) { + if err := ctx.Err(); err != nil { + return nil, err + } versions := body.child("Versions") if versions == nil { return nil, nil