-
Notifications
You must be signed in to change notification settings - Fork 0
/
column.go
141 lines (132 loc) · 3.66 KB
/
column.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
package bootstrapper
import (
"errors"
"fmt"
"github.com/grokify/mogo/html/htmlutil"
"github.com/grokify/mogo/type/stringsutil"
"golang.org/x/net/html/atom"
)
const (
ColSizeXs = "xs" // for phones - screens less than 768px wide
ColSizeSm = "sm" // for tablets - screens equal to or greater than 768px wide
ColSizeMd = "md" // for small laptops - screens equal to or greater than 992px wide
ColSizeLg = "lg" // for laptops and desktops - screens equal to or greater than 1200px wide
ColMaxWidth = 12
)
type Column struct {
htmlutil.Element
//ElementBase
SizeDefaultWidth int
SizeAllHidden bool
XsWidth int
XsHidden bool
SmWidth int
SmHidden bool
MdWidth int
MdHidden bool
LgWidth int
LgHidden bool
}
var (
ErrWidthTooLarge = errors.New("max width of 12 exceeded")
ErrWidthIsNegative = errors.New("width cannot be negative")
)
// Classes returns a list of column-related Bootstrap classes.
func (col *Column) Classes() ([]string, error) {
classes := []string{}
var err error
classes, err = colClassAppendNotErr(classes, ColSizeXs, col.XsWidth, col.SizeDefaultWidth)
if err != nil {
return classes, err
}
classes, err = colClassAppendNotErr(classes, ColSizeSm, col.SmWidth, col.SizeDefaultWidth)
if err != nil {
return classes, err
}
classes, err = colClassAppendNotErr(classes, ColSizeMd, col.MdWidth, col.SizeDefaultWidth)
if err != nil {
return classes, err
}
classes, err = colClassAppendNotErr(classes, ColSizeLg, col.LgWidth, col.SizeDefaultWidth)
if err != nil {
return classes, err
}
if col.XsHidden || col.SizeAllHidden {
classes = append(classes, "hidden-"+ColSizeXs)
}
if col.SmHidden || col.SizeAllHidden {
classes = append(classes, "hidden-"+ColSizeSm)
}
if col.MdHidden || col.SizeAllHidden {
classes = append(classes, "hidden-"+ColSizeMd)
}
if col.LgHidden || col.SizeAllHidden {
classes = append(classes, "hidden-"+ColSizeLg)
}
// classes = append(classes, col.AdditionalClasses...)
classes = stringsutil.SliceCondenseSpace(classes, true, true)
return classes, nil
// return strings.Join(classes, " "), nil
}
func colClassAppendNotErr(s []string, size string, width, defaultWidth int) ([]string, error) {
computedWidth := width
if computedWidth <= 0 && defaultWidth > 0 {
computedWidth = defaultWidth
}
cls, err := ColWidthToClass(size, computedWidth)
if err != nil {
return s, err
} else if len(cls) > 0 {
s = append(s, cls)
}
return s, nil
}
func (col *Column) String() (string, error) {
col.Element.TagName = atom.Div.String()
classes, err := col.Classes()
if err != nil {
return "", err
}
err = col.Element.AddAttribute(htmlutil.AttributeClass, classes...)
if err != nil {
return "", err
}
return col.Element.String() // from `html.Element`
/*
attrs := map[string]string{}
for k, v := range col.AdditionalProperties {
attrs[k] = v
}
cls, err := col.Class()
if err != nil {
return "", err
} else if len(cls) > 0 {
attrs["class"] = cls
}
innerHTML := ""
for _, el := range col.InnerHTML {
if el == nil {
continue
}
elHTML, err := el.HTML()
if err != nil {
return "", err
}
if len(innerHTML) > 0 {
innerHTML += elHTML
}
}
return fmt.Sprintf(`%s%s</div>`, TagOpening("div", attrs, false), innerHTML), nil
*/
}
// ColWidthToClass creates a class string where `size` must be in `[xs,sm,md,lg]` and size must be `[1,12]`.
func ColWidthToClass(size string, width int) (string, error) {
if width > ColMaxWidth {
return "", ErrWidthTooLarge
} else if width < 0 {
return "", ErrWidthIsNegative
} else if width == 0 {
return "", nil
}
return fmt.Sprintf("col-%x-%d", size, width), nil
}