package docxlib import ( "encoding/xml" "io" ) // 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:"w:r,omitempty"` RunProperties *RunProperties `xml:"w:rPr,omitempty"` InstrText string `xml:"w:instrText,omitempty"` Text *Text Drawing *Drawing } func (r *Run) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error { for { t, err := d.Token() if err == io.EOF { break } if err != nil { return err } switch tt := t.(type) { case xml.StartElement: switch tt.Name.Local { case "rPr": var value RunProperties d.DecodeElement(&value, &start) r.RunProperties = &value case "instrText": var value string d.DecodeElement(&value, &start) r.InstrText = value case "t": var value Text d.DecodeElement(&value, &start) r.Text = &value case "drawing": var value Drawing d.DecodeElement(&value, &start) r.Drawing = &value default: continue } } } return nil } // RunProperties encapsulates visual properties of a run type RunProperties struct { 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 { for { t, err := d.Token() if err == io.EOF { break } if err != nil { return err } switch tt := t.(type) { case xml.StartElement: switch tt.Name.Local { case "color": var value Color value.Val = getAtt(tt.Attr, "val") r.Color = &value case "sz": var value Size value.Val = getAtt(tt.Attr, "val") r.Size = &value case "rStyle": var value RunStyle value.Val = getAtt(tt.Attr, "val") r.RunStyle = &value case "pStyle": var value Style value.Val = getAtt(tt.Attr, "val") r.Style = &value default: continue } } } return nil } // RunStyle contains styling for a run type RunStyle struct { 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:"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:"w:color"` Val string `xml:"w:val,attr"` } // Size contains the font size type Size struct { XMLName xml.Name `xml:"w:sz"` Val string `xml:"w:val,attr"` }