From 2771d05a51241b5aeb46b0c2ea1c233f3e13bba6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 15 Feb 2023 16:08:28 +0800 Subject: [PATCH] shrink xmlns --- empty.go | 2 +- structdoc.go | 46 +++++++++++++++++++++++++++++++------ structdrawing.go | 60 ++++++++++++++++++++++++++++++++++++++++++++---- structlink.go | 4 ++-- structpara.go | 8 +++---- structrel.go | 2 +- structrun.go | 24 +++++++++---------- structtext.go | 2 +- 8 files changed, 116 insertions(+), 32 deletions(-) diff --git a/empty.go b/empty.go index 1181721..57feef5 100644 --- a/empty.go +++ b/empty.go @@ -23,7 +23,7 @@ func newEmptyFile() *Docx { }, }, DocRelation: Relationships{ - Xmlns: XMLNS, + Xmlns: XMLNS_REL, Relationships: []*Relationship{ { ID: "rId1", diff --git a/structdoc.go b/structdoc.go index cb7063b..d68b0b3 100644 --- a/structdoc.go +++ b/structdoc.go @@ -1,6 +1,9 @@ package docxlib -import "encoding/xml" +import ( + "encoding/xml" + "io" +) const ( XMLNS_W = `http://schemas.openxmlformats.org/wordprocessingml/2006/main` @@ -19,15 +22,44 @@ func getAtt(atts []xml.Attr, name string) string { } type Body struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main body"` - Paragraphs []*Paragraph `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main p"` + XMLName xml.Name `xml:"w:body"` + Paragraphs []*Paragraph `xml:"w:p,omitempty"` } type Document struct { XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main document"` - XMLW string `xml:"xmlns:w,attr"` - XMLR string `xml:"xmlns:r,attr"` - XMLWP string `xml:"xmlns:wp,attr"` - XMLWP14 string `xml:"xmlns:wp14,attr"` + XMLW string `xml:"xmlns:w,attr"` // cannot be unmarshalled in + XMLR string `xml:"xmlns:r,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 Body *Body } + +func (doc *Document) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { + if doc.Body == nil { + doc.Body = &Body{ + Paragraphs: make([]*Paragraph, 0, 64), + } + } + for { + t, err := d.Token() + if err == io.EOF { + break + } + + switch tt := t.(type) { + case xml.StartElement: + switch tt.Name.Local { + case "p": + var value Paragraph + d.DecodeElement(&value, &start) + doc.Body.Paragraphs = append(doc.Body.Paragraphs, &value) + default: + continue + } + } + + } + return nil + +} diff --git a/structdrawing.go b/structdrawing.go index 7c46d19..44c2a47 100644 --- a/structdrawing.go +++ b/structdrawing.go @@ -7,7 +7,7 @@ import ( // Drawing element contains photos type Drawing struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main drawing,omitempty"` + XMLName xml.Name `xml:"w:drawing,omitempty"` Inline *WPInline } @@ -42,13 +42,17 @@ func (r *Drawing) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { // WPInline wp:inline type WPInline struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing inline,omitempty"` + XMLName xml.Name `xml:"wp:inline,omitempty"` DistT string `xml:"distT,attr"` DistB string `xml:"distB,attr"` DistL string `xml:"distL,attr"` DistR string `xml:"distR,attr"` AnchorID string `xml:"wp14:anchorId,attr"` EditID string `xml:"wp14:editId,attr"` + + Extent *WPExtent + EffectExtent *WPEffectExtent + DocPr *WPDocPr } func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { @@ -61,8 +65,19 @@ func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { switch tt := t.(type) { case xml.StartElement: switch tt.Name.Local { - case "inline": - + case "extent": + r.Extent.CX = getAtt(tt.Attr, "cx") + r.Extent.CY = getAtt(tt.Attr, "cy") + case "effectExtent": + r.EffectExtent.L = getAtt(tt.Attr, "l") + r.EffectExtent.T = getAtt(tt.Attr, "t") + r.EffectExtent.R = getAtt(tt.Attr, "r") + r.EffectExtent.B = getAtt(tt.Attr, "b") + case "docPr": + r.DocPr.ID = getAtt(tt.Attr, "id") + r.DocPr.Name = getAtt(tt.Attr, "name") + r.DocPr.Macro = getAtt(tt.Attr, "macro") + r.DocPr.Hidden = getAtt(tt.Attr, "hidden") default: continue } @@ -72,3 +87,40 @@ func (r *WPInline) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { return nil } + +// WPExtent represents the extent of a drawing in a Word document. +type WPExtent struct { + XMLName xml.Name `xml:"wp:extent,omitempty"` + CX string `xml:"cx,attr"` + CY string `xml:"cy,attr"` +} + +// WPEffectExtent represents the effect extent of a drawing in a Word document. +type WPEffectExtent struct { + XMLName xml.Name `xml:"wp:effectExtent,omitempty"` + L string `xml:"l,attr"` + T string `xml:"t,attr"` + R string `xml:"r,attr"` + B string `xml:"b,attr"` +} + +// WPDocPr represents the document properties of a drawing in a Word document. +type WPDocPr struct { + XMLName xml.Name `xml:"wp:docPr,omitempty"` + ID string `xml:"id,attr"` + Name string `xml:"name,attr,omitempty"` + Macro string `xml:"macro,attr,omitempty"` + Hidden string `xml:"hidden,attr,omitempty"` +} + +// AGraphic represents a graphic in a Word document. +type AGraphic struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main graphic,omitempty"` + GraphicData *AGraphicData +} + +// AGraphicData represents the data of a graphic in a Word document. +type AGraphicData struct { + XMLName xml.Name `xml:"http://schemas.openxmlformats.org/drawingml/2006/main graphicData,omitempty"` + URI string `xml:"uri,attr"` +} diff --git a/structlink.go b/structlink.go index 29043e6..7f015b5 100644 --- a/structlink.go +++ b/structlink.go @@ -7,8 +7,8 @@ import ( // Hyperlink element contains links type Hyperlink struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main hyperlink,omitempty"` - ID string `xml:"http://schemas.openxmlformats.org/officeDocument/2006/relationships id,attr"` + XMLName xml.Name `xml:"w:hyperlink,omitempty"` + ID string `xml:"r:id,attr"` Run Run } diff --git a/structpara.go b/structpara.go index 29a5b13..0aa74af 100644 --- a/structpara.go +++ b/structpara.go @@ -6,13 +6,13 @@ import ( ) type ParagraphChild struct { - Link *Hyperlink `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main hyperlink,omitempty"` - Run *Run `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main r,omitempty"` - Properties *RunProperties `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main rPr,omitempty"` + Link *Hyperlink `xml:"w:hyperlink,omitempty"` + Run *Run `xml:"w:r,omitempty"` + Properties *RunProperties `xml:"w:rPr,omitempty"` } type Paragraph struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main p"` + XMLName xml.Name `xml:"w:p,omitempty"` Children []ParagraphChild // Children will generate an unnecessary tag ... and we skip it by a self-defined xml.Marshaler file *Docx diff --git a/structrel.go b/structrel.go index 8c96b0d..411632b 100644 --- a/structrel.go +++ b/structrel.go @@ -3,7 +3,7 @@ package docxlib import "encoding/xml" const ( - XMLNS = `http://schemas.openxmlformats.org/package/2006/relationships` + XMLNS_REL = `http://schemas.openxmlformats.org/package/2006/relationships` REL_HYPERLINK = `http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink` REL_TARGETMODE = "External" diff --git a/structrun.go b/structrun.go index 02101bc..e6d7745 100644 --- a/structrun.go +++ b/structrun.go @@ -8,9 +8,9 @@ import ( // Run is part of a paragraph that has its own style. It could be // a piece of text in bold, or a link type Run struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main r,omitempty"` - RunProperties *RunProperties `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main rPr,omitempty"` - InstrText string `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main instrText,omitempty"` + XMLName xml.Name `xml:"w:r,omitempty"` + RunProperties *RunProperties `xml:"w:rPr,omitempty"` + InstrText string `xml:"w:instrText,omitempty"` Text *Text Drawing *Drawing } @@ -54,11 +54,11 @@ func (r *Run) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { // RunProperties encapsulates visual properties of a run type RunProperties struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main rPr,omitempty"` - Color *Color `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main color,omitempty"` - Size *Size `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main sz,omitempty"` - RunStyle *RunStyle `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main rStyle,omitempty"` - Style *Style `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main pStyle,omitempty"` + XMLName xml.Name `xml:"w:rPr,omitempty"` + Color *Color `xml:"w:color,omitempty"` + Size *Size `xml:"w:sz,omitempty"` + RunStyle *RunStyle `xml:"w:rStyle,omitempty"` + Style *Style `xml:"w:pStyle,omitempty"` } func (r *RunProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { @@ -100,25 +100,25 @@ func (r *RunProperties) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err // RunStyle contains styling for a run type RunStyle struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main rStyle,omitempty"` + XMLName xml.Name `xml:"w:rStyle,omitempty"` Val string `xml:"w:val,attr"` } // Style contains styling for a paragraph type Style struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main pStyle,omitempty"` + XMLName xml.Name `xml:"w:pStyle,omitempty"` Val string `xml:"w:val,attr"` } // Color contains the sound of music. :D // I'm kidding. It contains the color type Color struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main color"` + XMLName xml.Name `xml:"w:color"` Val string `xml:"w:val,attr"` } // Size contains the font size type Size struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main sz"` + XMLName xml.Name `xml:"w:sz"` Val string `xml:"w:val,attr"` } diff --git a/structtext.go b/structtext.go index 9055187..b0c8782 100644 --- a/structtext.go +++ b/structtext.go @@ -7,7 +7,7 @@ import ( // Text object contains the actual text type Text struct { - XMLName xml.Name `xml:"http://schemas.openxmlformats.org/wordprocessingml/2006/main t"` + XMLName xml.Name `xml:"w:t"` XMLSpace string `xml:"xml:space,attr,omitempty"` Text string `xml:",chardata"` }