mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 14:53:44 +08:00
1 parent
52d7b6aa64
commit
10e724d57f
13 files changed
+127
-46
No files matched your search
@@ -27,7 +27,7 @@ func (r *Reader) compressionFontUsage(ctx context.Context, documents map[string]
|
|||||||
selected := ""
|
selected := ""
|
||||||
if r.OFD.DocBody[r.documentIndex].versioned {
|
if r.OFD.DocBody[r.documentIndex].versioned {
|
||||||
var err error
|
var err error
|
||||||
selected, err = r.DocumentRoot()
|
selected, err = r.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ func (r *Reader) compressionFontUsage(ctx context.Context, documents map[string]
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
root, err := parseEditorXML(data)
|
root, err := parseEditorXMLContext(ctx, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -333,7 +333,7 @@ func (e *Editor) editDocumentsContext(ctx context.Context, edit func(*Reader, []
|
|||||||
}
|
}
|
||||||
before := e.transactionSnapshot()
|
before := e.transactionSnapshot()
|
||||||
reader.documentIndex, reader.doc = index, nil
|
reader.documentIndex, reader.doc = index, nil
|
||||||
if err := reader.initRoot(); err != nil {
|
if err := reader.initRootContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
current := reader.OFD.DocBody[index]
|
current := reader.OFD.DocBody[index]
|
||||||
|
|||||||
@@ -497,7 +497,7 @@ func (e *Editor) commitFontSnapshot(ctx context.Context, reader *Reader) error {
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
clean := &Reader{Zip: reader.Zip, files: maps.Clone(reader.files), documentIndex: reader.DocumentIndex(), encryption: e.encryption, selectedVersion: reader.selectedVersion}
|
clean := &Reader{Zip: reader.Zip, files: maps.Clone(reader.files), documentIndex: reader.DocumentIndex(), encryption: e.encryption, selectedVersion: reader.selectedVersion}
|
||||||
if err := clean.initRoot(); err != nil {
|
if err := clean.initRootContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
next, err := clean.Editor()
|
next, err := clean.Editor()
|
||||||
@@ -571,13 +571,13 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s
|
|||||||
if files[name] && !structures[name] {
|
if files[name] && !structures[name] {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
data, err := reader.readFile(name)
|
data, err := reader.readFileViewContext(ctx, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
root, err := parseEditorXML(data)
|
root, err := parseEditorXMLContext(ctx, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
base := ""
|
base := ""
|
||||||
if root.matchesOFD("Res") {
|
if root.matchesOFD("Res") {
|
||||||
@@ -588,6 +588,9 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s
|
|||||||
}
|
}
|
||||||
var retains func(*editorXML) bool
|
var retains func(*editorXML) bool
|
||||||
retains = func(node *editorXML) bool {
|
retains = func(node *editorXML) bool {
|
||||||
|
if ctx.Err() != nil {
|
||||||
|
return true
|
||||||
|
}
|
||||||
if classifyOFDNamespace(node.name.Space) == ofdXMLUnknown || slices.Contains([]string{"CustomTags", "Extensions", "ExtendData", "Data"}, node.name.Local) {
|
if classifyOFDNamespace(node.name.Space) == ofdXMLUnknown || slices.Contains([]string{"CustomTags", "Extensions", "ExtendData", "Data"}, node.name.Local) {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
@@ -617,7 +620,7 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s
|
|||||||
return slices.ContainsFunc(node.children, retains)
|
return slices.ContainsFunc(node.children, retains)
|
||||||
}
|
}
|
||||||
if retains(root) || len(removed) == 0 {
|
if retains(root) || len(removed) == 0 {
|
||||||
return nil
|
return ctx.Err()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
@@ -625,9 +628,15 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s
|
|||||||
}
|
}
|
||||||
updates := make(map[string][]byte)
|
updates := make(map[string][]byte)
|
||||||
for name, file := range versions {
|
for name, file := range versions {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
var patches []editorXMLPatch
|
var patches []editorXMLPatch
|
||||||
if list := file.root.child("FileList"); list != nil {
|
if list := file.root.child("FileList"); list != nil {
|
||||||
for _, node := range list.children {
|
for _, node := range list.children {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if node.matchesOFD("File") && removed[resolveResourcePath(name, "", strings.TrimSpace(editorImportText(file.data, node)))] {
|
if node.matchesOFD("File") && removed[resolveResourcePath(name, "", strings.TrimSpace(editorImportText(file.data, node)))] {
|
||||||
patches = append(patches, editorXMLPatch{start: node.start, end: node.end})
|
patches = append(patches, editorXMLPatch{start: node.start, end: node.end})
|
||||||
}
|
}
|
||||||
@@ -640,17 +649,26 @@ func pruneExternalFontFiles(ctx context.Context, reader *Reader, candidates ...s
|
|||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if reader.files == nil {
|
view := *reader
|
||||||
reader.files = make(map[string][]byte)
|
view.files = maps.Clone(reader.files)
|
||||||
|
if view.files == nil {
|
||||||
|
view.files = make(map[string][]byte)
|
||||||
|
}
|
||||||
|
maps.Copy(view.files, updates)
|
||||||
|
for name := range view.files {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
}
|
}
|
||||||
maps.Copy(reader.files, updates)
|
|
||||||
for name := range reader.files {
|
|
||||||
if removed[cleanPackagePath(name)] {
|
if removed[cleanPackagePath(name)] {
|
||||||
delete(reader.files, name)
|
delete(view.files, name)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if reader.Zip != nil {
|
if view.Zip != nil {
|
||||||
reader.Zip = &zip.Reader{Comment: reader.Zip.Comment, File: slices.DeleteFunc(slices.Clone(reader.Zip.File), func(file *zip.File) bool { return removed[cleanPackagePath(file.Name)] })}
|
view.Zip = &zip.Reader{Comment: view.Zip.Comment, File: slices.DeleteFunc(slices.Clone(view.Zip.File), func(file *zip.File) bool { return removed[cleanPackagePath(file.Name)] })}
|
||||||
}
|
}
|
||||||
return reader.initRoot()
|
if err := view.initRootContext(ctx); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
*reader = view
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
@@ -43,13 +43,13 @@ func (e *Editor) compactVersionFonts(ctx context.Context, parts map[string][]byt
|
|||||||
view.files = make(map[string][]byte)
|
view.files = make(map[string][]byte)
|
||||||
}
|
}
|
||||||
maps.Copy(view.files, parts)
|
maps.Copy(view.files, parts)
|
||||||
if err := view.initRoot(); err != nil {
|
if err := view.initRootContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
candidates, seen := make(map[string]bool), make(map[string]bool)
|
candidates, seen := make(map[string]bool), make(map[string]bool)
|
||||||
for index := range view.DocumentCount() {
|
for index := range view.DocumentCount() {
|
||||||
view.documentIndex = index
|
view.documentIndex = index
|
||||||
versions, err := view.DocumentVersions()
|
versions, err := view.DocumentVersionsContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ type editorFontDeclaration struct {
|
|||||||
// 返回: *editorFontDocument 字体引用, error 读取或结构错误
|
// 返回: *editorFontDocument 字体引用, error 读取或结构错误
|
||||||
func scanEditorFonts(ctx context.Context, reader *Reader, index int) (*editorFontDocument, error) {
|
func scanEditorFonts(ctx context.Context, reader *Reader, index int) (*editorFontDocument, error) {
|
||||||
scan := &editorFontDocument{reader: reader, index: index, files: make(map[string]*editorFontXML), fonts: make(map[string]*editorFontDeclaration)}
|
scan := &editorFontDocument{reader: reader, index: index, files: make(map[string]*editorFontXML), fonts: make(map[string]*editorFontDeclaration)}
|
||||||
entry, err := reader.documentEntry(index)
|
entry, err := reader.documentEntryContext(ctx, index)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -68,11 +68,11 @@ func scanEditorFonts(ctx context.Context, reader *Reader, index int) (*editorFon
|
|||||||
if scan.files[name] != nil {
|
if scan.files[name] != nil {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
data, err := reader.readFile(name)
|
data, err := reader.readFileViewContext(ctx, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
root, err := parseEditorXML(data)
|
root, err := parseEditorXMLContext(ctx, data)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -84,6 +84,9 @@ func scanEditorFonts(ctx context.Context, reader *Reader, index int) (*editorFon
|
|||||||
}
|
}
|
||||||
var visit func(*editorXML) error
|
var visit func(*editorXML) error
|
||||||
visit = func(node *editorXML) error {
|
visit = func(node *editorXML) error {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if classifyOFDNamespace(node.name.Space) == ofdXMLUnknown {
|
if classifyOFDNamespace(node.name.Space) == ofdXMLUnknown {
|
||||||
scan.unsafe = true
|
scan.unsafe = true
|
||||||
return nil
|
return nil
|
||||||
@@ -176,7 +179,7 @@ func (s *editorFontDocument) apply(ctx context.Context, changes map[string][]byt
|
|||||||
next.files = make(map[string][]byte)
|
next.files = make(map[string][]byte)
|
||||||
}
|
}
|
||||||
maps.Copy(next.files, parts)
|
maps.Copy(next.files, parts)
|
||||||
if err := next.initRoot(); err != nil {
|
if err := next.initRootContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
|
|||||||
@@ -761,7 +761,7 @@ func (e *Editor) sourceReader(ctx context.Context, progress editorProgress) (*Re
|
|||||||
}
|
}
|
||||||
maps.Copy(files, parts)
|
maps.Copy(files, parts)
|
||||||
reader := &Reader{Zip: e.source.reader.Zip, files: files, encryption: e.encryption, documentIndex: e.source.reader.documentIndex, selectedVersion: e.source.reader.selectedVersion}
|
reader := &Reader{Zip: e.source.reader.Zip, files: files, encryption: e.encryption, documentIndex: e.source.reader.documentIndex, selectedVersion: e.source.reader.selectedVersion}
|
||||||
if err := reader.initRoot(); err != nil {
|
if err := reader.initRootContext(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if _, err := reader.Doc(); err != nil {
|
if _, err := reader.Doc(); err != nil {
|
||||||
|
|||||||
@@ -44,7 +44,7 @@ func scanEditorResources(ctx context.Context, reader *Reader, parts map[string][
|
|||||||
}
|
}
|
||||||
queue := []string{"OFD.xml"}
|
queue := []string{"OFD.xml"}
|
||||||
if reader != nil && reader.OFD.DocBody[reader.documentIndex].versioned {
|
if reader != nil && reader.OFD.DocBody[reader.documentIndex].versioned {
|
||||||
entry, err := reader.DocumentRoot()
|
entry, err := reader.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, nil, nil, false, err
|
return nil, nil, nil, false, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -107,7 +107,7 @@ func (e *Editor) compactResourceReferences(parts map[string][]byte, reader *Read
|
|||||||
for _, name := range resources {
|
for _, name := range resources {
|
||||||
data, ok := parts[name]
|
data, ok := parts[name]
|
||||||
if !ok {
|
if !ok {
|
||||||
data, err = reader.readFile(name)
|
data, err = reader.readFileViewContext(ctx, name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ func (e *Editor) compactResourceReferences(parts map[string][]byte, reader *Read
|
|||||||
if multiple || prune {
|
if multiple || prune {
|
||||||
selected := ""
|
selected := ""
|
||||||
if reader != nil && reader.OFD.DocBody[reader.documentIndex].versioned {
|
if reader != nil && reader.OFD.DocBody[reader.documentIndex].versioned {
|
||||||
selected, err = reader.DocumentRoot()
|
selected, err = reader.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,7 +129,7 @@ func (e *Editor) AddVersionContext(ctx context.Context, name string) (string, er
|
|||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
entry, err := reader.DocumentRoot()
|
entry, err := reader.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
@@ -384,7 +384,7 @@ func (r *Reader) versionSnapshotFiles(ctx context.Context) (map[string]bool, err
|
|||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
entry, err := r.DocumentRoot()
|
entry, err := r.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -444,7 +444,7 @@ func (r *Reader) retireVersionFiles(ctx context.Context, candidates map[string]b
|
|||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
view := *r
|
view := *r
|
||||||
if err := view.initRoot(); err != nil {
|
if err := view.initRootContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
indexes := make([]int, view.DocumentCount())
|
indexes := make([]int, view.DocumentCount())
|
||||||
|
|||||||
+42
-9
@@ -457,17 +457,30 @@ func (r *Reader) Extensions() ([]Extension, error) {
|
|||||||
// initRoot 读取根节点信息
|
// initRoot 读取根节点信息
|
||||||
// 返回: error 错误信息
|
// 返回: error 错误信息
|
||||||
func (r *Reader) initRoot() error {
|
func (r *Reader) initRoot() error {
|
||||||
if err := r.indexPackage(); err != nil {
|
return r.initRootContext(context.Background())
|
||||||
|
}
|
||||||
|
|
||||||
|
// initRootContext 重建包索引与主入口,取消或失败时保留原阅读状态
|
||||||
|
// 入参: ctx 取消上下文
|
||||||
|
// 返回: error 索引、读取、解析或取消错误
|
||||||
|
func (r *Reader) initRootContext(ctx context.Context) error {
|
||||||
|
view := *r
|
||||||
|
if err := view.indexPackageContext(ctx); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
data, err := r.readFile("OFD.xml")
|
data, err := view.readFileViewContext(ctx, "OFD.xml")
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("failed to read ofd.xml: %w", err)
|
return fmt.Errorf("failed to read ofd.xml: %w", err)
|
||||||
}
|
}
|
||||||
var ofd OFD
|
var ofd OFD
|
||||||
if err := xml.Unmarshal(data, &ofd); err != nil {
|
decoder := xml.NewDecoder(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx})
|
||||||
|
if err := decoder.Decode(&ofd); err != nil {
|
||||||
return fmt.Errorf("failed to unmarshal ofd.xml: %w", err)
|
return fmt.Errorf("failed to unmarshal ofd.xml: %w", err)
|
||||||
}
|
}
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r.fileIndex, r.fileNames = view.fileIndex, view.fileNames
|
||||||
r.OFD = &ofd
|
r.OFD = &ofd
|
||||||
r.doc, r.versionInfo = nil, nil
|
r.doc, r.versionInfo = nil, nil
|
||||||
r.documentRoot, r.RootDir = "", ""
|
r.documentRoot, r.RootDir = "", ""
|
||||||
@@ -490,14 +503,27 @@ func (r *Reader) initRoot() error {
|
|||||||
// indexPackage 按大小写敏感路径建立包索引,拒绝规范化后重复的ZIP条目
|
// indexPackage 按大小写敏感路径建立包索引,拒绝规范化后重复的ZIP条目
|
||||||
// 返回: error 错误信息
|
// 返回: error 错误信息
|
||||||
func (r *Reader) indexPackage() error {
|
func (r *Reader) indexPackage() error {
|
||||||
|
return r.indexPackageContext(context.Background())
|
||||||
|
}
|
||||||
|
|
||||||
|
// indexPackageContext 建立大小写敏感的包索引,取消或路径校验失败时保留原索引
|
||||||
|
// 入参: ctx 取消上下文
|
||||||
|
// 返回: error 路径或取消错误
|
||||||
|
func (r *Reader) indexPackageContext(ctx context.Context) error {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
count := 0
|
count := 0
|
||||||
if r.Zip != nil {
|
if r.Zip != nil {
|
||||||
count = len(r.Zip.File)
|
count = len(r.Zip.File)
|
||||||
}
|
}
|
||||||
r.fileIndex = make(map[string]*zip.File, count)
|
index := make(map[string]*zip.File, count)
|
||||||
r.fileNames = make(map[string]bool, count+len(r.files))
|
names := make(map[string]bool, count+len(r.files))
|
||||||
if r.Zip != nil {
|
if r.Zip != nil {
|
||||||
for _, f := range r.Zip.File {
|
for _, f := range r.Zip.File {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if f.FileInfo().IsDir() {
|
if f.FileInfo().IsDir() {
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -505,19 +531,26 @@ func (r *Reader) indexPackage() error {
|
|||||||
if !validPackagePath(name) {
|
if !validPackagePath(name) {
|
||||||
return fmt.Errorf("invalid package path: %q", f.Name)
|
return fmt.Errorf("invalid package path: %q", f.Name)
|
||||||
}
|
}
|
||||||
if previous, ok := r.fileIndex[name]; ok {
|
if previous, ok := index[name]; ok {
|
||||||
return fmt.Errorf("ambiguous package paths: %q and %q", previous.Name, f.Name)
|
return fmt.Errorf("ambiguous package paths: %q and %q", previous.Name, f.Name)
|
||||||
}
|
}
|
||||||
r.fileIndex[name] = f
|
index[name] = f
|
||||||
r.fileNames[name] = true
|
names[name] = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
for name := range r.files {
|
for name := range r.files {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
if name != cleanPackagePath(name) || !validPackagePath(name) {
|
if name != cleanPackagePath(name) || !validPackagePath(name) {
|
||||||
return fmt.Errorf("invalid package path: %q", name)
|
return fmt.Errorf("invalid package path: %q", name)
|
||||||
}
|
}
|
||||||
r.fileNames[name] = true
|
names[name] = true
|
||||||
}
|
}
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
r.fileIndex, r.fileNames = index, names
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -203,7 +203,7 @@ func (r *Reader) versionResourceFiles(ctx context.Context, parts map[string][]by
|
|||||||
if r == nil || !r.OFD.DocBody[r.documentIndex].versioned {
|
if r == nil || !r.OFD.DocBody[r.documentIndex].versioned {
|
||||||
return nil, nil
|
return nil, nil
|
||||||
}
|
}
|
||||||
entry, err := r.DocumentRoot()
|
entry, err := r.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@@ -292,7 +292,7 @@ func (r *Reader) versionOutputChanges(ctx context.Context, changes map[string][]
|
|||||||
if err := ctx.Err(); err != nil {
|
if err := ctx.Err(); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
entry, err := r.DocumentRoot()
|
entry, err := r.DocumentRootContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|||||||
+32
-5
@@ -14,12 +14,26 @@
|
|||||||
|
|
||||||
package ofdgo
|
package ofdgo
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"context"
|
||||||
|
"fmt"
|
||||||
|
)
|
||||||
|
|
||||||
// DocumentRoot 获取当前阅读入口的包内路径,不改写OFD中的主入口
|
// DocumentRoot 获取当前阅读入口的包内路径,不改写OFD中的主入口
|
||||||
// 未显式选择时使用唯一的Current版本;没有默认版本时使用主入口,多个默认版本返回错误
|
// 未显式选择时使用唯一的Current版本;没有默认版本时使用主入口,多个默认版本返回错误
|
||||||
// 返回: string 阅读入口, error 版本选择或描述错误
|
// 返回: string 阅读入口, error 版本选择或描述错误
|
||||||
func (r *Reader) DocumentRoot() (string, error) {
|
func (r *Reader) DocumentRoot() (string, error) {
|
||||||
|
return r.DocumentRootContext(context.Background())
|
||||||
|
}
|
||||||
|
|
||||||
|
// DocumentRootContext 获取当前阅读入口,解析版本列表和文件清单时响应取消
|
||||||
|
// 取消或失败时不缓存本次选择结果,入口选择规则与DocumentRoot相同
|
||||||
|
// 入参: ctx 取消上下文
|
||||||
|
// 返回: string 阅读入口, error 版本选择、读取或取消错误
|
||||||
|
func (r *Reader) DocumentRootContext(ctx context.Context) (string, error) {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
if r.documentRoot != "" {
|
if r.documentRoot != "" {
|
||||||
return r.documentRoot, nil
|
return r.documentRoot, nil
|
||||||
}
|
}
|
||||||
@@ -34,12 +48,15 @@ func (r *Reader) DocumentRoot() (string, error) {
|
|||||||
}
|
}
|
||||||
return root, err
|
return root, err
|
||||||
}
|
}
|
||||||
entries, err := r.documentVersionEntries()
|
entries, err := r.documentVersionEntriesContext(ctx)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return "", err
|
||||||
}
|
}
|
||||||
var selected *DocumentVersionInfo
|
var selected *DocumentVersionInfo
|
||||||
for i := range entries {
|
for i := range entries {
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
entry := &entries[i]
|
entry := &entries[i]
|
||||||
if r.selectedVersion != nil && entry.ID == *r.selectedVersion || r.selectedVersion == nil && entry.Current {
|
if r.selectedVersion != nil && entry.ID == *r.selectedVersion || r.selectedVersion == nil && entry.Current {
|
||||||
if selected != nil {
|
if selected != nil {
|
||||||
@@ -58,11 +75,14 @@ func (r *Reader) DocumentRoot() (string, error) {
|
|||||||
}
|
}
|
||||||
return root, err
|
return root, err
|
||||||
}
|
}
|
||||||
info, err := r.readDocumentVersion(selected.ID, selected.Location)
|
info, err := r.readDocumentVersionContext(ctx, selected.ID, selected.Location)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", fmt.Errorf("version %s: %w", selected.ID, err)
|
return "", fmt.Errorf("version %s: %w", selected.ID, err)
|
||||||
}
|
}
|
||||||
info.Index, info.Current = selected.Index, selected.Current
|
info.Index, info.Current = selected.Index, selected.Current
|
||||||
|
if err := ctx.Err(); err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
r.documentRoot, r.versionInfo = info.DocRoot, &info
|
r.documentRoot, r.versionInfo = info.DocRoot, &info
|
||||||
return r.documentRoot, nil
|
return r.documentRoot, nil
|
||||||
}
|
}
|
||||||
@@ -98,13 +118,20 @@ func (r *Reader) DocumentVersion(id string) (*Reader, error) {
|
|||||||
// 入参: index 文档索引
|
// 入参: index 文档索引
|
||||||
// 返回: string 包内路径, error 选择错误
|
// 返回: string 包内路径, error 选择错误
|
||||||
func (r *Reader) documentEntry(index int) (string, error) {
|
func (r *Reader) documentEntry(index int) (string, error) {
|
||||||
|
return r.documentEntryContext(context.Background(), index)
|
||||||
|
}
|
||||||
|
|
||||||
|
// documentEntryContext 解析指定文档的阅读入口,当前文档保留显式选择
|
||||||
|
// 入参: ctx 取消上下文, index 文档索引
|
||||||
|
// 返回: string 包内路径, error 选择、读取或取消错误
|
||||||
|
func (r *Reader) documentEntryContext(ctx context.Context, index int) (string, error) {
|
||||||
if index == r.documentIndex {
|
if index == r.documentIndex {
|
||||||
return r.DocumentRoot()
|
return r.DocumentRootContext(ctx)
|
||||||
}
|
}
|
||||||
view := *r
|
view := *r
|
||||||
view.documentIndex, view.documentRoot = index, ""
|
view.documentIndex, view.documentRoot = index, ""
|
||||||
view.selectedVersion, view.versionInfo = nil, nil
|
view.selectedVersion, view.versionInfo = nil, nil
|
||||||
return view.DocumentRoot()
|
return view.DocumentRootContext(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
// versionSignatures 按OFD入口解析包级签名路径,选中版本仅使用文件清单内的签名入口
|
// versionSignatures 按OFD入口解析包级签名路径,选中版本仅使用文件清单内的签名入口
|
||||||
|
|||||||
+1
-1
@@ -273,7 +273,7 @@ func (e *Editor) readerContext(ctx context.Context, progress editorProgress) (*R
|
|||||||
}, progress); err != nil {
|
}, progress); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if err := r.initRoot(); err != nil {
|
if err := r.initRootContext(ctx); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
if _, err := r.Doc(); err != nil {
|
if _, err := r.Doc(); err != nil {
|
||||||
|
|||||||
Reference in new issue
Block a user