Compare commits

...
2 Commits
Author SHA1 Message Date
xiaoqidun b03cdf3ad0 feat(资源定位): 修复隐藏内容干扰资源定位
build.yaml / build (push) Successful in 52s
2026-10-13 20:29:17 +08:00
xiaoqidun e4d38eb289 feat(资源定位): 优化资源定位与原文汇总 2026-10-13 20:14:15 +08:00
2 changed files with 27 additions and 10 deletions

No files matched your search

+1 -1
View File
@@ -151,7 +151,7 @@ func (r *Renderer) ResourceLocations(ctx context.Context, kind, id string, refer
for id := range wanted { for id := range wanted {
targets[id] = &StructureTarget{ID: id} targets[id] = &StructureTarget{ID: id}
} }
visitor := &structureVisitor{ctx: ctx, renderer: &view, targets: targets} visitor := &structureVisitor{ctx: ctx, renderer: &view, targets: targets, boundsOnly: true}
if err := view.WalkPage(content, visitor); err != nil { if err := view.WalkPage(content, visitor); err != nil {
return nil, err return nil, err
} }
+26 -9
View File
@@ -14,7 +14,10 @@
package ofdgo package ofdgo
import "context" import (
"context"
"strings"
)
// structureVisitor 按引用收集图元及复合图元成员的原文和页面范围 // structureVisitor 按引用收集图元及复合图元成员的原文和页面范围
type structureVisitor struct { type structureVisitor struct {
@@ -22,6 +25,8 @@ type structureVisitor struct {
renderer *Renderer renderer *Renderer
targets map[string]*StructureTarget targets map[string]*StructureTarget
stack []*StructureTarget stack []*StructureTarget
text map[*StructureTarget]*strings.Builder
boundsOnly bool
} }
// BeginObject 记录当前图元的标引目标,使复合图元引用覆盖其成员 // BeginObject 记录当前图元的标引目标,使复合图元引用覆盖其成员
@@ -50,15 +55,15 @@ func (v *structureVisitor) BeginAnnotation(id string) bool { return false }
// 入参: count 跳过的图元数 // 入参: count 跳过的图元数
func (v *structureVisitor) SkipObjects(count int) {} func (v *structureVisitor) SkipObjects(count int) {}
// IncludeHidden 保留隐藏图元的结构语义,但不为其生成可见范围 // IncludeHidden 读取原文时保留隐藏语义,仅定位时跳过隐藏复合图元及注解
// 返回: bool 始终为true // 返回: bool 是否需要隐藏内容
func (v *structureVisitor) IncludeHidden() bool { return true } func (v *structureVisitor) IncludeHidden() bool { return !v.boundsOnly }
// SkipClips 保留裁剪语义,以可见范围定位图元 // SkipClips 保留裁剪语义,以可见范围定位图元
// 返回: bool 始终为false // 返回: bool 始终为false
func (v *structureVisitor) SkipClips() bool { return false } func (v *structureVisitor) SkipClips() bool { return false }
// DrawObject 按继承变换和裁剪度量被引用的图元,不解码图片像素 // DrawObject 按继承变换和裁剪度量被引用的图元,按需汇总原文,不解码图片像素
// 入参: object 页面图元, state 继承状态 // 入参: object 页面图元, state 继承状态
// 返回: error 度量或取消错误 // 返回: error 度量或取消错误
func (v *structureVisitor) DrawObject(object *GraphicObject, state RenderState) error { func (v *structureVisitor) DrawObject(object *GraphicObject, state RenderState) error {
@@ -81,7 +86,7 @@ func (v *structureVisitor) DrawObject(object *GraphicObject, state RenderState)
box = result.Bounds box = result.Bounds
} }
var text string var text string
if object.Type == "TextObject" { if !v.boundsOnly && object.Type == "TextObject" {
text = object.TextObject.Text() text = object.TextObject.Text()
} }
for _, target := range v.stack { for _, target := range v.stack {
@@ -90,10 +95,22 @@ func (v *structureVisitor) DrawObject(object *GraphicObject, state RenderState)
} }
target.Bounds = unionTextBox(target.Bounds, box) target.Bounds = unionTextBox(target.Bounds, box)
if text != "" { if text != "" {
if target.Text != "" { if target.Text == "" {
target.Text += "\n" target.Text = text
continue
} }
target.Text += text if v.text == nil {
v.text = make(map[*StructureTarget]*strings.Builder)
}
builder := v.text[target]
if builder == nil {
builder = new(strings.Builder)
builder.WriteString(target.Text)
v.text[target] = builder
}
builder.WriteByte('\n')
builder.WriteString(text)
target.Text = builder.String()
} }
} }
return nil return nil