feat(参照标准): 规范包内路径与资源引用
build.yaml / build (push) Successful in 44s

This commit is contained in:
xiaoqidun committed 2026-10-11 21:12:09 +08:00
1 parent d7e9604282
commit 225f60919b
6 files changed
+30 -30

No files matched your search

+1 -1
View File
@@ -63,7 +63,7 @@ func (e *Editor) CaptureAnnotations(page int, ids []string) (*AnnotationSelectio
if e.originalPage(page) { if e.originalPage(page) {
origin := e.source.pages[e.pages[page].ID] origin := e.source.pages[e.pages[page].ID]
for _, name := range content.PageRes { for _, name := range content.PageRes {
selection.resources = append(selection.resources, e.source.reader.ResPath(resolveResourcePath(origin.ref.BaseLoc, "", name))) selection.resources = append(selection.resources, resolveResourcePath(e.source.reader.ResPath(origin.ref.BaseLoc), "", name))
} }
} }
return selection, nil return selection, nil
+7 -8
View File
@@ -857,17 +857,16 @@ func (m *editorPageImport) documentReference(group, kind, source, id, loc string
return nil, fmt.Errorf("missing %s reference %q", kind, source) return nil, fmt.Errorf("missing %s reference %q", kind, source)
} }
// resolve 按所在XML解析包内路径,兼容阅读器接受的文档相对路径 // resolve 按所在XML和资源基准目录解析包内路径
// 入参: name 所在XML, base 资源目录, value 路径值 // 入参: name 所在XML, base 资源目录, value 路径值
// 返回: string 包内路径, error 错误信息 // 返回: string 包内路径, error 错误信息
func (m *editorPageImport) resolve(name, base, value string) (string, error) { func (m *editorPageImport) resolve(name, base, value string) (string, error) {
for _, candidate := range []string{resolveResourcePath(name, base, value), m.reader.ResPath(value)} { candidate := resolveResourcePath(name, base, value)
if m.reader.files[candidate] != nil { if _, ok := m.reader.files[candidate]; ok {
return candidate, nil return candidate, nil
} }
if file, ok := m.reader.packageFile(candidate); ok { if file, ok := m.reader.packageFile(candidate); ok {
return cleanPackagePath(file.Name), nil return cleanPackagePath(file.Name), nil
}
} }
return "", fmt.Errorf("import reference %q in %s not found", value, name) return "", fmt.Errorf("import reference %q in %s not found", value, name)
} }
+10 -8
View File
@@ -213,17 +213,19 @@ func pruneCreatedPageReferences(data []byte, removed map[string]bool) ([]byte, e
return editorPatchXML(data, patches), nil return editorPatchXML(data, patches), nil
} }
// editorPageLocation 解析标准XML引用,优先使用所在文件的相对路径 // editorPageLocation 按所在XML解析引用,绝对路径以包根目录为基准
// 入参: reader 原包, parts 覆盖条目, name 所在XML, value 路径 // 入参: reader 原包, parts 覆盖条目, name 所在XML, value 路径
// 返回: string 包内路径, error 路径不存在 // 返回: string 包内路径, error 路径不存在
func editorPageLocation(reader *Reader, parts map[string][]byte, name, value string) (string, error) { func editorPageLocation(reader *Reader, parts map[string][]byte, name, value string) (string, error) {
for _, candidate := range []string{resolveResourcePath(name, "", value), reader.ResPath(value)} { candidate := resolveResourcePath(name, "", value)
if _, ok := parts[candidate]; ok || reader.files[candidate] != nil { if _, ok := parts[candidate]; ok {
return candidate, nil return candidate, nil
} }
if file, ok := reader.packageFile(candidate); ok { if _, ok := reader.files[candidate]; ok {
return cleanPackagePath(file.Name), nil return candidate, nil
} }
if file, ok := reader.packageFile(candidate); ok {
return cleanPackagePath(file.Name), nil
} }
return "", fmt.Errorf("page reference %q in %s not found", value, name) return "", fmt.Errorf("page reference %q in %s not found", value, name)
} }
+9 -10
View File
@@ -282,7 +282,7 @@ func (r *Reader) PageArea(page Page) (PageArea, error) {
return r.resolvePageArea(content.Area, content.Template) return r.resolvePageArea(content.Area, content.Template)
} }
// ResPath 获取资源的完整路径 // ResPath 按当前文档目录解析ST_Loc,包内绝对路径以根目录为基准
// 入参: resLink 资源链接 // 入参: resLink 资源链接
// 返回: string 完整路径 // 返回: string 完整路径
func (r *Reader) ResPath(resLink string) string { func (r *Reader) ResPath(resLink string) string {
@@ -299,10 +299,7 @@ func (r *Reader) ResPath(resLink string) string {
} }
resLink = path.Clean(resLink) resLink = path.Clean(resLink)
rootDir := strings.TrimPrefix(strings.ReplaceAll(r.RootDir, "\\", "/"), "/") rootDir := strings.TrimPrefix(strings.ReplaceAll(r.RootDir, "\\", "/"), "/")
if rootDir != "" && (resLink == rootDir || strings.HasPrefix(resLink, rootDir+"/")) { return cleanPackagePath(path.Join(rootDir, resLink))
return resLink
}
return cleanPackagePath(path.Join(r.RootDir, resLink))
} }
// ResData 获取资源文件数据 // ResData 获取资源文件数据
@@ -443,6 +440,7 @@ func (r *Reader) AttachmentData(id string) ([]byte, error) {
} }
// CustomTags 获取自定义标引 // CustomTags 获取自定义标引
// 返回的文件路径可直接传入ResData读取
// 返回: []CustomTag 自定义标引列表, error 错误信息 // 返回: []CustomTag 自定义标引列表, error 错误信息
func (r *Reader) CustomTags() ([]CustomTag, error) { func (r *Reader) CustomTags() ([]CustomTag, error) {
doc, err := r.Doc() doc, err := r.Doc()
@@ -457,8 +455,8 @@ func (r *Reader) CustomTags() ([]CustomTag, error) {
} }
for i := range customTags.CustomTag { for i := range customTags.CustomTag {
tag := &customTags.CustomTag[i] tag := &customTags.CustomTag[i]
tag.SchemaLoc = resolveResourcePath(partPath, "", tag.SchemaLoc) tag.SchemaLoc = r.resourceLocation(partPath, "", tag.SchemaLoc)
tag.FileLoc = resolveResourcePath(partPath, "", tag.FileLoc) tag.FileLoc = r.resourceLocation(partPath, "", tag.FileLoc)
} }
if customTags.CustomTag == nil { if customTags.CustomTag == nil {
customTags.CustomTag = []CustomTag{} customTags.CustomTag = []CustomTag{}
@@ -482,6 +480,7 @@ func (r *Reader) CustomDatas() ([]CustomData, error) {
} }
// Extensions 获取扩展项 // Extensions 获取扩展项
// 返回的文件路径可直接传入ResData读取
// 返回: []Extension 扩展项列表, error 错误信息 // 返回: []Extension 扩展项列表, error 错误信息
func (r *Reader) Extensions() ([]Extension, error) { func (r *Reader) Extensions() ([]Extension, error) {
doc, err := r.Doc() doc, err := r.Doc()
@@ -497,7 +496,7 @@ func (r *Reader) Extensions() ([]Extension, error) {
for i := range extensions.Extension { for i := range extensions.Extension {
extension := &extensions.Extension[i] extension := &extensions.Extension[i]
for j := range extension.ExtendData { for j := range extension.ExtendData {
extension.ExtendData[j] = resolveResourcePath(partPath, "", extension.ExtendData[j]) extension.ExtendData[j] = r.resourceLocation(partPath, "", extension.ExtendData[j])
} }
} }
if extensions.Extension == nil { if extensions.Extension == nil {
@@ -866,7 +865,7 @@ func (r *Reader) readPageContent(page Page, textOnly, template bool) (*PageConte
content.Template = nil content.Template = nil
} }
for _, res := range content.PageRes { for _, res := range content.PageRes {
r.loadRes(resolveResourcePath(page.BaseLoc, "", res)) r.loadRes("/" + resolveResourcePath(fullPath, "", res))
} }
content.Area, err = r.resolvePageArea(content.Area, content.Template) content.Area, err = r.resolvePageArea(content.Area, content.Template)
if err != nil { if err != nil {
@@ -883,7 +882,7 @@ func (r *Reader) loadPageResources(page Page) {
return return
} }
for _, res := range header.PageRes { for _, res := range header.PageRes {
r.loadRes(resolveResourcePath(page.BaseLoc, "", res)) r.loadRes("/" + resolveResourcePath(r.ResPath(page.BaseLoc), "", res))
} }
} }
+2 -2
View File
@@ -200,13 +200,13 @@ func (r *Reader) parseSignatures(doc *Document) error {
var sealData []byte var sealData []byte
if sigFile.SignedInfo.Seal.BaseLoc != "" { if sigFile.SignedInfo.Seal.BaseLoc != "" {
sealPath := resolveResourcePath(sigPath, "", sigFile.SignedInfo.Seal.BaseLoc) sealPath := resolveResourcePath(sigPath, "", sigFile.SignedInfo.Seal.BaseLoc)
if data, err := r.ResData(sealPath); err == nil { if data, err := r.readFile(sealPath); err == nil {
sealType, sealData = extractSeal(data) sealType, sealData = extractSeal(data)
} }
} }
if len(sealData) == 0 && sigFile.SignedValue != "" { if len(sealData) == 0 && sigFile.SignedValue != "" {
signedValuePath := resolveResourcePath(sigPath, "", sigFile.SignedValue) signedValuePath := resolveResourcePath(sigPath, "", sigFile.SignedValue)
if data, err := r.ResData(signedValuePath); err == nil { if data, err := r.readFile(signedValuePath); err == nil {
if sig, err := parseSESSignature(data); err == nil { if sig, err := parseSESSignature(data); err == nil {
sealType, sealData = sig.Seal.PicType, sig.Seal.PicData sealType, sealData = sig.Seal.PicType, sig.Seal.PicData
} else { } else {
+1 -1
View File
@@ -555,7 +555,7 @@ func (e *Editor) usedResources() (fonts, images []editorResource, spaces []Color
} }
if origin := e.objectOrigin(editorObjectID(object)); origin != nil && origin.page != nil && (!exists || before.Type != object.Type || !reflect.DeepEqual(before.CompositeGraphicUnit, object.CompositeGraphicUnit)) { if origin := e.objectOrigin(editorObjectID(object)); origin != nil && origin.page != nil && (!exists || before.Type != object.Type || !reflect.DeepEqual(before.CompositeGraphicUnit, object.CompositeGraphicUnit)) {
for _, name := range origin.page.original.PageRes { for _, name := range origin.page.original.PageRes {
files[e.source.reader.ResPath(resolveResourcePath(origin.page.ref.BaseLoc, "", name))] = true files[resolveResourcePath(e.source.reader.ResPath(origin.page.ref.BaseLoc), "", name)] = true
} }
} }
} }