mirror of
https://github.com/fumiama/go-docx.git
synced 2026-06-25 05:20:46 +08:00
fix: recursive paragraph unmarshalling
This commit is contained in:
4
empty.go
4
empty.go
@@ -6,7 +6,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func newEmptyFile() *Docx {
|
func newEmptyFile() *Docx {
|
||||||
return &Docx{
|
docx := &Docx{
|
||||||
Document: Document{
|
Document: Document{
|
||||||
XMLName: xml.Name{
|
XMLName: xml.Name{
|
||||||
Space: "w",
|
Space: "w",
|
||||||
@@ -45,4 +45,6 @@ func newEmptyFile() *Docx {
|
|||||||
rId: 3,
|
rId: 3,
|
||||||
buf: bytes.NewBuffer(make([]byte, 0, 1024*1024*4)),
|
buf: bytes.NewBuffer(make([]byte, 0, 1024*1024*4)),
|
||||||
}
|
}
|
||||||
|
docx.Document.file = docx
|
||||||
|
return docx
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -33,6 +33,8 @@ type Document struct {
|
|||||||
XMLWP string `xml:"xmlns:wp,attr,omitempty"` // cannot be unmarshalled in
|
XMLWP string `xml:"xmlns:wp,attr,omitempty"` // cannot be unmarshalled in
|
||||||
XMLWP14 string `xml:"xmlns:wp14,attr,omitempty"` // cannot be unmarshalled in
|
XMLWP14 string `xml:"xmlns:wp14,attr,omitempty"` // cannot be unmarshalled in
|
||||||
Body *Body
|
Body *Body
|
||||||
|
|
||||||
|
file *Docx
|
||||||
}
|
}
|
||||||
|
|
||||||
func (doc *Document) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
func (doc *Document) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
@@ -50,11 +52,16 @@ func (doc *Document) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
|
|||||||
switch tt := t.(type) {
|
switch tt := t.(type) {
|
||||||
case xml.StartElement:
|
case xml.StartElement:
|
||||||
switch tt.Name.Local {
|
switch tt.Name.Local {
|
||||||
|
case "body":
|
||||||
case "p":
|
case "p":
|
||||||
var value Paragraph
|
var value Paragraph
|
||||||
d.DecodeElement(&value, &start)
|
d.DecodeElement(&value, &start)
|
||||||
doc.Body.Paragraphs = append(doc.Body.Paragraphs, &value)
|
if len(value.Children) > 0 {
|
||||||
|
value.file = doc.file
|
||||||
|
doc.Body.Paragraphs = append(doc.Body.Paragraphs, &value)
|
||||||
|
}
|
||||||
default:
|
default:
|
||||||
|
d.Skip()
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@@ -53,6 +53,7 @@ type WPInline struct {
|
|||||||
Extent *WPExtent
|
Extent *WPExtent
|
||||||
EffectExtent *WPEffectExtent
|
EffectExtent *WPEffectExtent
|
||||||
DocPr *WPDocPr
|
DocPr *WPDocPr
|
||||||
|
Graphic *AGraphic
|
||||||
}
|
}
|
||||||
|
|
||||||
func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
@@ -66,18 +67,25 @@ func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
|||||||
case xml.StartElement:
|
case xml.StartElement:
|
||||||
switch tt.Name.Local {
|
switch tt.Name.Local {
|
||||||
case "extent":
|
case "extent":
|
||||||
|
r.Extent = new(WPExtent)
|
||||||
r.Extent.CX = getAtt(tt.Attr, "cx")
|
r.Extent.CX = getAtt(tt.Attr, "cx")
|
||||||
r.Extent.CY = getAtt(tt.Attr, "cy")
|
r.Extent.CY = getAtt(tt.Attr, "cy")
|
||||||
case "effectExtent":
|
case "effectExtent":
|
||||||
|
r.EffectExtent = new(WPEffectExtent)
|
||||||
r.EffectExtent.L = getAtt(tt.Attr, "l")
|
r.EffectExtent.L = getAtt(tt.Attr, "l")
|
||||||
r.EffectExtent.T = getAtt(tt.Attr, "t")
|
r.EffectExtent.T = getAtt(tt.Attr, "t")
|
||||||
r.EffectExtent.R = getAtt(tt.Attr, "r")
|
r.EffectExtent.R = getAtt(tt.Attr, "r")
|
||||||
r.EffectExtent.B = getAtt(tt.Attr, "b")
|
r.EffectExtent.B = getAtt(tt.Attr, "b")
|
||||||
case "docPr":
|
case "docPr":
|
||||||
|
r.DocPr = new(WPDocPr)
|
||||||
r.DocPr.ID = getAtt(tt.Attr, "id")
|
r.DocPr.ID = getAtt(tt.Attr, "id")
|
||||||
r.DocPr.Name = getAtt(tt.Attr, "name")
|
r.DocPr.Name = getAtt(tt.Attr, "name")
|
||||||
r.DocPr.Macro = getAtt(tt.Attr, "macro")
|
r.DocPr.Macro = getAtt(tt.Attr, "macro")
|
||||||
r.DocPr.Hidden = getAtt(tt.Attr, "hidden")
|
r.DocPr.Hidden = getAtt(tt.Attr, "hidden")
|
||||||
|
case "graphic":
|
||||||
|
var value AGraphic
|
||||||
|
d.DecodeElement(&value, &start)
|
||||||
|
r.Graphic = &value
|
||||||
default:
|
default:
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
@@ -119,8 +127,64 @@ type AGraphic struct {
|
|||||||
GraphicData *AGraphicData
|
GraphicData *AGraphicData
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *AGraphic) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
|
||||||
|
for {
|
||||||
|
t, err := d.Token()
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
switch tt := t.(type) {
|
||||||
|
case xml.StartElement:
|
||||||
|
switch tt.Name.Local {
|
||||||
|
case "graphicData":
|
||||||
|
var value AGraphicData
|
||||||
|
d.DecodeElement(&value, &start)
|
||||||
|
value.URI = getAtt(tt.Attr, "uri")
|
||||||
|
a.GraphicData = &value
|
||||||
|
default:
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
// AGraphicData represents the data of a graphic in a Word document.
|
// AGraphicData represents the data of a graphic in a Word document.
|
||||||
type AGraphicData struct {
|
type AGraphicData struct {
|
||||||
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main graphicData,omitempty"`
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main graphicData,omitempty"`
|
||||||
URI string `xml:"uri,attr"`
|
URI string `xml:"uri,attr"`
|
||||||
|
Pic PICPic
|
||||||
|
}
|
||||||
|
|
||||||
|
// PICPic represents a picture in a Word document.
|
||||||
|
type PICPic struct {
|
||||||
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/picture pic,omitempty"`
|
||||||
|
NonVisualPicProperties PICNonVisualPicProperties
|
||||||
|
BlipFill PICBlipFill
|
||||||
|
}
|
||||||
|
|
||||||
|
// PICNonVisualPicProperties represents the non-visual properties of a picture in a Word document.
|
||||||
|
type PICNonVisualPicProperties struct {
|
||||||
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/picture nvPicPr,omitempty"`
|
||||||
|
NonVisualDrawingProperties PICNonVisualDrawingProperties
|
||||||
|
}
|
||||||
|
|
||||||
|
// PICNonVisualDrawingProperties represents the non-visual drawing properties of a picture in a Word document.
|
||||||
|
type PICNonVisualDrawingProperties struct {
|
||||||
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/picture cNvPr,omitempty"`
|
||||||
|
ID string `xml:"id,attr"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// PICBlipFill represents the blip fill of a picture in a Word document.
|
||||||
|
type PICBlipFill struct {
|
||||||
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/picture blipFill,omitempty"`
|
||||||
|
Blip ABlip
|
||||||
|
}
|
||||||
|
|
||||||
|
// ABlip represents the blip of a picture in a Word document.
|
||||||
|
type ABlip struct {
|
||||||
|
XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main blip,omitempty"`
|
||||||
|
Embed string `xml:"r:embed,attr"`
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user