feat(编辑字体): 优化多文档及版本字体清理
build.yaml / build (push) Successful in 47s

This commit is contained in:
xiaoqidun committed 2026-10-11 20:38:07 +08:00
1 parent 8864f6c7ba
commit 2e3809179b
3 files changed
+43 -13

No files matched your search

+11 -9
View File
@@ -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)) {
+22 -4
View File
@@ -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
+10
View File
@@ -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