From a3594d1280260efcc37a11992feb3e66e6801583 Mon Sep 17 00:00:00 2001 From: xiaoqidun Date: Tue, 13 Oct 2026 09:04:16 +0800 Subject: [PATCH] =?UTF-8?q?feat(=E7=BC=96=E8=BE=91=E8=83=BD=E5=8A=9B):=20?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E8=B5=84=E6=BA=90=E6=89=AB=E6=8F=8F=E4=B8=8E?= =?UTF-8?q?=E8=A3=81=E5=89=AA=E4=BF=9D=E6=8A=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ofdgo_editor_reference.go | 8 ++++++++ ofdgo_editor_resource_graph.go | 9 +++++++-- ofdgo_editor_resources.go | 2 +- 3 files changed, 16 insertions(+), 3 deletions(-) diff --git a/ofdgo_editor_reference.go b/ofdgo_editor_reference.go index b241856..c34d80d 100644 --- a/ofdgo_editor_reference.go +++ b/ofdgo_editor_reference.go @@ -144,6 +144,10 @@ func (s *editorReferenceScan) accept(token xml.Token) bool { return false } if len(s.stack) == 0 { + if s.seen { + s.safe = false + return false + } s.seen = true if token.Name.Local == "Document" { if s.refs.documents == nil { @@ -216,6 +220,10 @@ func (s *editorReferenceScan) accept(token xml.Token) bool { s.capture = true } case xml.CharData: + if len(s.stack) == 0 && len(bytes.Trim(token, " \t\r\n")) != 0 { + s.safe = false + return false + } if s.capture { s.text.Write(token) } diff --git a/ofdgo_editor_resource_graph.go b/ofdgo_editor_resource_graph.go index 8abc8cd..05dfd1e 100644 --- a/ofdgo_editor_resource_graph.go +++ b/ofdgo_editor_resource_graph.go @@ -15,6 +15,7 @@ package ofdgo import ( + "bufio" "bytes" "context" "encoding/xml" @@ -49,7 +50,11 @@ func editorResourceDefinitions(ctx context.Context, data []byte, name string, so result.definitions = make(map[string]*editorResourceRefs) outer := &editorResourceRefs{ids: make(map[string]bool), files: make(map[string]bool), fonts: make(map[string]*editorFontUsage)} scan := editorReferenceScan{refs: outer, name: name, safe: true} - decoder := xml.NewDecoder(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx}) + input := bufio.NewReader(imageInput{ReadCloser: io.NopCloser(bytes.NewReader(data)), context: ctx}) + if found, err := editorXMLPrefix(input); err != nil || !found { + return nil, err + } + decoder := xml.NewDecoder(input) for { if err := ctx.Err(); err != nil { return nil, err @@ -66,7 +71,7 @@ func editorResourceDefinitions(ctx context.Context, data []byte, name string, so } depth := len(scan.stack) if node, ok := token.(xml.StartElement); ok { - if depth == 0 && (scan.seen || node.Name.Local != "Res") || depth == 1 && editorResourceElement(node.Name.Local) == "" { + if depth == 0 && node.Name.Local != "Res" || depth == 1 && editorResourceElement(node.Name.Local) == "" { return nil, nil } if depth == 2 { diff --git a/ofdgo_editor_resources.go b/ofdgo_editor_resources.go index c36ebe5..e09b135 100644 --- a/ofdgo_editor_resources.go +++ b/ofdgo_editor_resources.go @@ -328,7 +328,7 @@ func (r *editorResourceRefs) scan(input io.Reader, name string) (bool, bool) { for { token, err := decoder.Token() if err == io.EOF { - return scan.resource, len(scan.stack) == 0 + return scan.resource, scan.seen && len(scan.stack) == 0 } if err != nil { return false, false