unioffice/document/styles.go

204 lines
6.4 KiB
Go
Raw Normal View History

// Copyright 2017 FoxyUtils ehf. All rights reserved.
2017-08-28 20:56:18 -05:00
//
// Use of this source code is governed by the terms of the Affero GNU General
// Public License version 3.0 as published by the Free Software Foundation and
// appearing in the file LICENSE included in the packaging of this file. A
// commercial license can be purchased on https://unidoc.io.
2017-08-28 20:56:18 -05:00
package document
import (
"fmt"
"github.com/unidoc/unioffice"
"github.com/unidoc/unioffice/measurement"
"github.com/unidoc/unioffice/schema/soo/ofc/sharedTypes"
"github.com/unidoc/unioffice/schema/soo/wml"
2017-08-28 20:56:18 -05:00
)
// Styles is the document wide styles contained in styles.xml.
type Styles struct {
x *wml.Styles
}
// NewStyles constructs a new empty Styles
func NewStyles() Styles {
return Styles{wml.NewStyles()}
}
// X returns the inner wrapped XML type.
func (s Styles) X() *wml.Styles {
return s.x
}
// Clear clears the styes.
func (s Styles) Clear() {
s.x.DocDefaults = nil
s.x.LatentStyles = nil
s.x.Style = nil
}
// AddStyle adds a new empty style.
func (s Styles) AddStyle(styleID string, t wml.ST_StyleType, isDefault bool) Style {
ss := wml.NewCT_Style()
ss.TypeAttr = t
if isDefault {
ss.DefaultAttr = &sharedTypes.ST_OnOff{}
ss.DefaultAttr.Bool = unioffice.Bool(isDefault)
2017-08-28 20:56:18 -05:00
}
ss.StyleIdAttr = unioffice.String(styleID)
2017-08-28 20:56:18 -05:00
s.x.Style = append(s.x.Style, ss)
return Style{ss}
}
// InitializeDefault constructs the default styles.
func (s Styles) InitializeDefault() {
s.initializeDocDefaults()
s.initializeStyleDefaults()
}
func (s Styles) initializeStyleDefaults() {
2017-08-28 20:56:18 -05:00
// Normal
normal := s.AddStyle("Normal", wml.ST_StyleTypeParagraph, true)
normal.SetName("Normal")
normal.SetPrimaryStyle(true)
// DefaultParagraphFont
dpf := s.AddStyle("DefaultParagraphFont", wml.ST_StyleTypeCharacter, true)
dpf.SetName("Default Paragraph Font")
dpf.SetUISortOrder(1)
dpf.SetSemiHidden(true)
dpf.SetUnhideWhenUsed(true)
// Title
titleChar := s.AddStyle("TitleChar", wml.ST_StyleTypeCharacter, false)
titleChar.SetName("Title Char")
titleChar.SetBasedOn(dpf.StyleID())
titleChar.SetLinkedStyle("Title")
titleChar.SetUISortOrder(10)
titleChar.RunProperties().Fonts().SetASCIITheme(wml.ST_ThemeMajorAscii)
titleChar.RunProperties().Fonts().SetEastAsiaTheme(wml.ST_ThemeMajorEastAsia)
titleChar.RunProperties().Fonts().SetHANSITheme(wml.ST_ThemeMajorHAnsi)
titleChar.RunProperties().Fonts().SetCSTheme(wml.ST_ThemeMajorBidi)
titleChar.RunProperties().SetSize(28 * measurement.Point)
titleChar.RunProperties().SetKerning(14 * measurement.Point)
titleChar.RunProperties().SetCharacterSpacing(-10 * measurement.Twips)
titlePara := s.AddStyle("Title", wml.ST_StyleTypeParagraph, false)
titlePara.SetName("Title")
titlePara.SetBasedOn(normal.StyleID())
titlePara.SetNextStyle(normal.StyleID())
titlePara.SetLinkedStyle(titleChar.StyleID())
titlePara.SetUISortOrder(10)
titlePara.SetPrimaryStyle(true)
titlePara.ParagraphProperties().SetContextualSpacing(true)
titlePara.RunProperties().Fonts().SetASCIITheme(wml.ST_ThemeMajorAscii)
titlePara.RunProperties().Fonts().SetEastAsiaTheme(wml.ST_ThemeMajorEastAsia)
titlePara.RunProperties().Fonts().SetHANSITheme(wml.ST_ThemeMajorHAnsi)
titlePara.RunProperties().Fonts().SetCSTheme(wml.ST_ThemeMajorBidi)
titlePara.RunProperties().SetSize(28 * measurement.Point)
titlePara.RunProperties().SetKerning(14 * measurement.Point)
titlePara.RunProperties().SetCharacterSpacing(-10 * measurement.Twips)
2017-08-28 20:56:18 -05:00
// TableNormal
tbl := s.AddStyle("TableNormal", wml.ST_StyleTypeTable, false)
2017-08-28 20:56:18 -05:00
tbl.SetName("Normal Table")
tbl.SetUISortOrder(99)
tbl.SetSemiHidden(true)
tbl.SetUnhideWhenUsed(true)
tbl.X().TblPr = wml.NewCT_TblPrBase()
tw := NewTableWidth()
tbl.X().TblPr.TblInd = tw.X()
tw.SetValue(0 * measurement.Dxa)
tbl.X().TblPr.TblCellMar = wml.NewCT_TblCellMar()
tw = NewTableWidth()
tbl.X().TblPr.TblCellMar.Top = tw.X()
tw.SetValue(0 * measurement.Dxa)
tw = NewTableWidth()
tbl.X().TblPr.TblCellMar.Bottom = tw.X()
tw.SetValue(0 * measurement.Dxa)
tw = NewTableWidth()
tbl.X().TblPr.TblCellMar.Left = tw.X()
tw.SetValue(108 * measurement.Dxa)
tw = NewTableWidth()
tbl.X().TblPr.TblCellMar.Right = tw.X()
tw.SetValue(108 * measurement.Dxa)
// NoList
nbr := s.AddStyle("NoList", wml.ST_StyleTypeNumbering, false)
2017-08-28 20:56:18 -05:00
nbr.SetName("No List")
nbr.SetUISortOrder(1)
nbr.SetSemiHidden(true)
nbr.SetUnhideWhenUsed(true)
fontSizes := []measurement.Distance{16, 13, 12, 11, 11, 11, 11, 11, 11}
spacing := []measurement.Distance{240, 40, 40, 40, 40, 40, 40, 40, 40}
for i := 0; i < 9; i++ {
id := fmt.Sprintf("Heading%d", i+1)
hdngChar := s.AddStyle(id+"Char", wml.ST_StyleTypeCharacter, false)
hdngChar.SetName(fmt.Sprintf("Heading %d Char", i+1))
hdngChar.SetBasedOn(dpf.StyleID())
hdngChar.SetLinkedStyle(id)
hdngChar.SetUISortOrder(9 + i)
hdngChar.RunProperties().SetSize(fontSizes[i] * measurement.Point)
2017-08-28 20:56:18 -05:00
hdng := s.AddStyle(id, wml.ST_StyleTypeParagraph, false)
hdng.SetName(fmt.Sprintf("heading %d", i+1))
hdng.SetNextStyle(normal.StyleID())
hdng.SetLinkedStyle(hdng.StyleID())
hdng.SetUISortOrder(9 + i)
hdng.SetPrimaryStyle(true)
hdng.ParagraphProperties().SetKeepNext(true)
hdng.ParagraphProperties().SetSpacing(spacing[i]*measurement.Twips, 0)
hdng.ParagraphProperties().SetOutlineLevel(i)
hdng.RunProperties().SetSize(fontSizes[i] * measurement.Point)
2017-08-28 20:56:18 -05:00
}
}
func (s Styles) initializeDocDefaults() {
s.x.DocDefaults = wml.NewCT_DocDefaults()
s.x.DocDefaults.RPrDefault = wml.NewCT_RPrDefault()
s.x.DocDefaults.RPrDefault.RPr = wml.NewCT_RPr()
rpr := RunProperties{s.x.DocDefaults.RPrDefault.RPr}
rpr.SetSize(12 * measurement.Point)
rpr.Fonts().SetASCIITheme(wml.ST_ThemeMajorAscii)
rpr.Fonts().SetEastAsiaTheme(wml.ST_ThemeMajorEastAsia)
rpr.Fonts().SetHANSITheme(wml.ST_ThemeMajorHAnsi)
rpr.Fonts().SetCSTheme(wml.ST_ThemeMajorBidi)
rpr.X().Lang = wml.NewCT_Language()
rpr.X().Lang.ValAttr = unioffice.String("en-US")
rpr.X().Lang.EastAsiaAttr = unioffice.String("en-US")
rpr.X().Lang.BidiAttr = unioffice.String("ar-SA")
s.x.DocDefaults.PPrDefault = wml.NewCT_PPrDefault()
2017-08-28 20:56:18 -05:00
}
// Styles returns all styles.
func (s Styles) Styles() []Style {
ret := []Style{}
for _, s := range s.x.Style {
ret = append(ret, Style{s})
}
return ret
}
// ParagraphStyles returns only the paragraph styles.
func (s Styles) ParagraphStyles() []Style {
ret := []Style{}
for _, s := range s.x.Style {
if s.TypeAttr != wml.ST_StyleTypeParagraph {
continue
}
ret = append(ret, Style{s})
}
return ret
}