mirror of
https://github.com/xiaoqidun/ofdgo.git
synced 2026-10-29 14:31:12 +08:00
This commit is contained in:
1 parent
cfbaa8a177
commit
2c06e5ff69
43 files changed
+3211
-397
No files matched your search
+41
-6
@@ -15,6 +15,7 @@
|
||||
package ofdgo
|
||||
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"strconv"
|
||||
"strings"
|
||||
@@ -54,32 +55,53 @@ func (r *Reader) DocumentVersionCount() (int, error) {
|
||||
// 返回独立副本;没有版本列表时返回nil,不以版本号推测默认版本
|
||||
// 返回: []DocumentVersionInfo 版本信息, error 读取或描述错误
|
||||
func (r *Reader) DocumentVersions() ([]DocumentVersionInfo, error) {
|
||||
entries, err := r.documentVersionEntries()
|
||||
return r.DocumentVersionsContext(context.Background())
|
||||
}
|
||||
|
||||
// DocumentVersionsContext 按入口顺序读取版本信息,支持取消描述文件和文件清单的解析
|
||||
// 返回独立副本,不切换当前版本,也不读取文件清单中的内容
|
||||
// 入参: ctx 取消上下文
|
||||
// 返回: []DocumentVersionInfo 版本信息, error 读取、描述或取消错误
|
||||
func (r *Reader) DocumentVersionsContext(ctx context.Context) ([]DocumentVersionInfo, error) {
|
||||
entries, err := r.documentVersionEntriesContext(ctx)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
for i, entry := range entries {
|
||||
info, err := r.readDocumentVersion(entry.ID, entry.Location)
|
||||
info, err := r.readDocumentVersionContext(ctx, entry.ID, entry.Location)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("version %s: %w", entry.ID, err)
|
||||
}
|
||||
info.Index, info.Current = entry.Index, entry.Current
|
||||
entries[i] = info
|
||||
}
|
||||
if err := ctx.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return entries, nil
|
||||
}
|
||||
|
||||
// documentVersionEntries 读取当前文档的版本入口,不提前加载各版本描述
|
||||
// 返回: []DocumentVersionInfo 入口属性, error 读取或描述错误
|
||||
func (r *Reader) documentVersionEntries() ([]DocumentVersionInfo, error) {
|
||||
return r.documentVersionEntriesContext(context.Background())
|
||||
}
|
||||
|
||||
// documentVersionEntriesContext 读取版本入口,在读取和解析过程中检查取消状态
|
||||
// 入参: ctx 取消上下文
|
||||
// 返回: []DocumentVersionInfo 入口属性, error 读取、描述或取消错误
|
||||
func (r *Reader) documentVersionEntriesContext(ctx context.Context) ([]DocumentVersionInfo, error) {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if r.documentIndex < 0 || r.documentIndex >= r.DocumentCount() {
|
||||
return nil, fmt.Errorf("no docbody found")
|
||||
}
|
||||
data, err := r.readFile("OFD.xml")
|
||||
data, err := r.readFileViewContext(ctx, "OFD.xml")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
root, err := parseEditorXML(data)
|
||||
root, err := parseEditorXMLContext(ctx, data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -97,6 +119,9 @@ func (r *Reader) documentVersionEntries() ([]DocumentVersionInfo, error) {
|
||||
var result []DocumentVersionInfo
|
||||
ids := make(map[string]bool)
|
||||
for _, node := range versions.children {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if !node.matchesOFD("Version") {
|
||||
continue
|
||||
}
|
||||
@@ -135,12 +160,19 @@ func (r *Reader) documentVersionEntries() ([]DocumentVersionInfo, error) {
|
||||
// 入参: id 入口中的版本标识, location 描述文件路径
|
||||
// 返回: DocumentVersionInfo 版本信息, error 读取或描述错误
|
||||
func (r *Reader) readDocumentVersion(id, location string) (DocumentVersionInfo, error) {
|
||||
return r.readDocumentVersionContext(context.Background(), id, location)
|
||||
}
|
||||
|
||||
// readDocumentVersionContext 读取版本描述,按描述文件位置解析清单和文档入口
|
||||
// 入参: ctx 取消上下文, id 入口中的版本标识, location 描述文件路径
|
||||
// 返回: DocumentVersionInfo 版本信息, error 读取、描述或取消错误
|
||||
func (r *Reader) readDocumentVersionContext(ctx context.Context, id, location string) (DocumentVersionInfo, error) {
|
||||
var info DocumentVersionInfo
|
||||
data, err := r.readFile(location)
|
||||
data, err := r.readFileViewContext(ctx, location)
|
||||
if err != nil {
|
||||
return info, err
|
||||
}
|
||||
root, err := parseEditorXML(data)
|
||||
root, err := parseEditorXMLContext(ctx, data)
|
||||
if err != nil {
|
||||
return info, err
|
||||
}
|
||||
@@ -162,6 +194,9 @@ func (r *Reader) readDocumentVersion(id, location string) (DocumentVersionInfo,
|
||||
ids := map[string]bool{id: true}
|
||||
found := false
|
||||
for _, node := range list.children {
|
||||
if err := ctx.Err(); err != nil {
|
||||
return DocumentVersionInfo{}, err
|
||||
}
|
||||
if !node.matchesOFD("File") {
|
||||
continue
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user