diff --git a/structdrawing.go b/structdrawing.go index 745ce7b..d23e145 100644 --- a/structdrawing.go +++ b/structdrawing.go @@ -21,6 +21,8 @@ package docx import ( + "crypto/md5" + "encoding/hex" "encoding/xml" "io" "strconv" @@ -215,6 +217,64 @@ func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err err return nil } +// String ... +func (r *WPInline) String() string { + sb := strings.Builder{} + if r.Graphic.GraphicData.Pic != nil { + sb.WriteString("![inlnim ") + switch { + case r.DocPr != nil: + sb.WriteString(r.DocPr.Name) + case r.Graphic.GraphicData.Pic.NonVisualPicProperties != nil: + sb.WriteString(r.Graphic.GraphicData.Pic.NonVisualPicProperties.NonVisualDrawingProperties.Name) + default: + sb.WriteString(r.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) + } + sb.WriteString("](") + if r.Graphic.GraphicData.Pic.BlipFill != nil { + tgt, err := r.file.ReferTarget(r.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) + if err != nil { + sb.WriteString(err.Error()) + } else { + h := md5.Sum(r.file.Media(tgt[6:]).Data) + sb.WriteString(hex.EncodeToString(h[:])) + } + } + sb.WriteByte(')') + return sb.String() + } + if r.Graphic.GraphicData.Shape != nil { + sb.WriteString("![inlnsp ") + switch { + case r.DocPr != nil: + sb.WriteString(r.DocPr.Name) + case r.Graphic.GraphicData.Shape.CNvPr != nil: + sb.WriteString(r.Graphic.GraphicData.Shape.CNvPr.Name) + case r.Graphic.GraphicData.Shape.SpPr != nil: + sb.WriteString(r.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) + default: + sb.WriteString("nil") + } + sb.WriteString("](") + if r.Graphic.GraphicData.Shape.SpPr != nil { + sb.WriteString(r.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) + } + sb.WriteByte(')') + return sb.String() + } + if r.Graphic.GraphicData.Canvas != nil { + sb.WriteString("![inlncv ") + if r.DocPr != nil { + sb.WriteString(r.DocPr.Name) + } else { + sb.WriteString("nil") + } + sb.WriteString("]()") + return sb.String() + } + return "![inln?](unknown)" +} + // WPExtent represents the extent of a drawing in a Word document. // // CX CY 's unit is English Metric Units, which is 1/914400 inch @@ -1230,6 +1290,66 @@ func (r *WPAnchor) UnmarshalXML(d *xml.Decoder, start xml.StartElement) (err err return nil } +// String ... +func (r *WPAnchor) String() string { + sb := strings.Builder{} + if r.Graphic != nil && r.Graphic.GraphicData != nil { + if r.Graphic.GraphicData.Pic != nil { + sb.WriteString("![anchim ") + switch { + case r.DocPr != nil: + sb.WriteString(r.DocPr.Name) + case r.Graphic.GraphicData.Pic.NonVisualPicProperties != nil: + sb.WriteString(r.Graphic.GraphicData.Pic.NonVisualPicProperties.NonVisualDrawingProperties.Name) + default: + sb.WriteString(r.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) + } + sb.WriteString("](") + if r.Graphic.GraphicData.Pic.BlipFill != nil { + tgt, err := r.file.ReferTarget(r.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) + if err != nil { + sb.WriteString(err.Error()) + } else { + h := md5.Sum(r.file.Media(tgt[6:]).Data) + sb.WriteString(hex.EncodeToString(h[:])) + } + } + sb.WriteByte(')') + return sb.String() + } + if r.Graphic.GraphicData.Shape != nil { + sb.WriteString("![anchsp ") + switch { + case r.DocPr != nil: + sb.WriteString(r.DocPr.Name) + case r.Graphic.GraphicData.Shape.CNvPr != nil: + sb.WriteString(r.Graphic.GraphicData.Shape.CNvPr.Name) + case r.Graphic.GraphicData.Shape.SpPr != nil: + sb.WriteString(r.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) + default: + sb.WriteString("nil") + } + sb.WriteString("](") + if r.Graphic.GraphicData.Shape.SpPr != nil { + sb.WriteString(r.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) + } + sb.WriteByte(')') + return sb.String() + } + if r.Graphic.GraphicData.Canvas != nil { + sb.WriteString("![anchcv ") + if r.DocPr != nil { + sb.WriteString(r.DocPr.Name) + } else { + sb.WriteString("nil") + } + sb.WriteString("]()") + return sb.String() + } + } + return "![anch?](unknown)" +} + // WPSimplePos represents the position of an object in a Word document. type WPSimplePos struct { XMLName xml.Name `xml:"wp:simplePos,omitempty"` diff --git a/structpara.go b/structpara.go index 9163a20..8544726 100644 --- a/structpara.go +++ b/structpara.go @@ -21,8 +21,6 @@ package docx import ( - "crypto/md5" - "encoding/hex" "encoding/xml" "io" "strconv" @@ -202,113 +200,13 @@ func (p *Paragraph) String() string { case *BarterRabbet: sb.WriteByte('\n') case *Drawing: - if x.Inline != nil && x.Inline.Graphic != nil && x.Inline.Graphic.GraphicData != nil { - if x.Inline.Graphic.GraphicData.Pic != nil { - sb.WriteString("![inlnim ") - switch { - case x.Inline.DocPr != nil: - sb.WriteString(x.Inline.DocPr.Name) - case x.Inline.Graphic.GraphicData.Pic.NonVisualPicProperties != nil: - sb.WriteString(x.Inline.Graphic.GraphicData.Pic.NonVisualPicProperties.NonVisualDrawingProperties.Name) - default: - sb.WriteString(x.Inline.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) - } - sb.WriteString("](") - if x.Inline.Graphic.GraphicData.Pic.BlipFill != nil { - tgt, err := p.file.ReferTarget(x.Inline.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) - if err != nil { - sb.WriteString(err.Error()) - } else { - h := md5.Sum(p.file.Media(tgt[6:]).Data) - sb.WriteString(hex.EncodeToString(h[:])) - } - } - sb.WriteByte(')') - continue - } - if x.Inline.Graphic.GraphicData.Shape != nil { - sb.WriteString("![inlnsp ") - switch { - case x.Inline.DocPr != nil: - sb.WriteString(x.Inline.DocPr.Name) - case x.Inline.Graphic.GraphicData.Shape.CNvPr != nil: - sb.WriteString(x.Inline.Graphic.GraphicData.Shape.CNvPr.Name) - case x.Inline.Graphic.GraphicData.Shape.SpPr != nil: - sb.WriteString(x.Inline.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) - default: - sb.WriteString("nil") - } - sb.WriteString("](") - if x.Inline.Graphic.GraphicData.Shape.SpPr != nil { - sb.WriteString(x.Inline.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) - } - sb.WriteByte(')') - continue - } - if x.Inline.Graphic.GraphicData.Canvas != nil { - sb.WriteString("![inlncv ") - if x.Inline.DocPr != nil { - sb.WriteString(x.Inline.DocPr.Name) - } else { - sb.WriteString("nil") - } - sb.WriteString("]()") - continue - } + if x.Inline != nil { + sb.WriteString(x.Inline.String()) + continue } - if x.Anchor != nil && x.Anchor.Graphic != nil && x.Anchor.Graphic.GraphicData != nil { - if x.Anchor.Graphic.GraphicData.Pic != nil { - sb.WriteString("![anchim ") - switch { - case x.Anchor.DocPr != nil: - sb.WriteString(x.Anchor.DocPr.Name) - case x.Anchor.Graphic.GraphicData.Pic.NonVisualPicProperties != nil: - sb.WriteString(x.Anchor.Graphic.GraphicData.Pic.NonVisualPicProperties.NonVisualDrawingProperties.Name) - default: - sb.WriteString(x.Anchor.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) - } - sb.WriteString("](") - if x.Anchor.Graphic.GraphicData.Pic.BlipFill != nil { - tgt, err := p.file.ReferTarget(x.Anchor.Graphic.GraphicData.Pic.BlipFill.Blip.Embed) - if err != nil { - sb.WriteString(err.Error()) - } else { - h := md5.Sum(p.file.Media(tgt[6:]).Data) - sb.WriteString(hex.EncodeToString(h[:])) - } - } - sb.WriteByte(')') - continue - } - if x.Anchor.Graphic.GraphicData.Shape != nil { - sb.WriteString("![anchsp ") - switch { - case x.Anchor.DocPr != nil: - sb.WriteString(x.Anchor.DocPr.Name) - case x.Anchor.Graphic.GraphicData.Shape.CNvPr != nil: - sb.WriteString(x.Anchor.Graphic.GraphicData.Shape.CNvPr.Name) - case x.Anchor.Graphic.GraphicData.Shape.SpPr != nil: - sb.WriteString(x.Anchor.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) - default: - sb.WriteString("nil") - } - sb.WriteString("](") - if x.Anchor.Graphic.GraphicData.Shape.SpPr != nil { - sb.WriteString(x.Anchor.Graphic.GraphicData.Shape.SpPr.PrstGeom.Prst) - } - sb.WriteByte(')') - continue - } - if x.Anchor.Graphic.GraphicData.Canvas != nil { - sb.WriteString("![anchcv ") - if x.Anchor.DocPr != nil { - sb.WriteString(x.Anchor.DocPr.Name) - } else { - sb.WriteString("nil") - } - sb.WriteString("]()") - continue - } + if x.Anchor != nil { + sb.WriteString(x.Anchor.String()) + continue } } }