-
Notifications
You must be signed in to change notification settings - Fork 21
/
publish_header.go
134 lines (117 loc) · 3.29 KB
/
publish_header.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
package html
import (
"io"
"github.com/elliotchance/gedcom/v39"
"github.com/elliotchance/gedcom/v39/html/core"
)
const (
selectedIndividualsTab = "individuals"
selectedPlacesTab = "places"
selectedFamiliesTab = "families"
selectedSurnamesTab = "surnames"
selectedSourcesTab = "sources"
selectedStatisticsTab = "statistics"
selectedExtraTab = "extra"
)
// PublishHeader is the tabbed section at the top of each page. The PublishHeader will be the
// same on all pages except that some pages will use an extra tab for that page.
type PublishHeader struct {
document *gedcom.Document
extraTab string
selectedTab string
options *PublishShowOptions
indexLetters []rune
placesMap map[string]*place
}
func NewPublishHeader(document *gedcom.Document, extraTab string, selectedTab string, options *PublishShowOptions, indexLetters []rune, placesMap map[string]*place) *PublishHeader {
return &PublishHeader{
document: document,
extraTab: extraTab,
selectedTab: selectedTab,
options: options,
indexLetters: indexLetters,
placesMap: placesMap,
}
}
func (c *PublishHeader) WriteHTMLTo(w io.Writer) (int64, error) {
items := []*core.NavItem{}
if c.options.ShowIndividuals {
badge := core.NewCountBadge(len(c.document.Individuals()))
title := core.NewComponents(core.NewText("Individuals "), badge)
item := core.NewNavItem(
title,
c.selectedTab == selectedIndividualsTab,
PageIndividuals(c.indexLetters[0]),
)
items = append(items, item)
}
if c.options.ShowPlaces {
badge := core.NewCountBadge(len(c.placesMap))
item := core.NewNavItem(
core.NewComponents(core.NewText("Places "), badge),
c.selectedTab == selectedPlacesTab,
PagePlaces(),
)
items = append(items, item)
}
if c.options.ShowFamilies {
badge := core.NewCountBadge(len(c.document.Families()))
item := core.NewNavItem(
core.NewComponents(core.NewText("Families "), badge),
c.selectedTab == selectedFamiliesTab,
PageFamilies(),
)
items = append(items, item)
}
if c.options.ShowSurnames {
badge := core.NewCountBadge(getSurnames(c.document).Len())
item := core.NewNavItem(
core.NewComponents(core.NewText("Surnames "), badge),
c.selectedTab == selectedSurnamesTab,
PageSurnames(),
)
items = append(items, item)
}
if c.options.ShowSources {
badge := core.NewCountBadge(len(c.document.Sources()))
item := core.NewNavItem(
core.NewComponents(core.NewText("Sources "), badge),
c.selectedTab == selectedSourcesTab,
PageSources(),
)
items = append(items, item)
}
if c.options.ShowStatistics {
item := core.NewNavItem(
core.NewText("Statistics"),
c.selectedTab == selectedStatisticsTab,
PageStatistics(),
)
items = append(items, item)
}
if c.extraTab != "" {
item := core.NewNavItem(
core.NewText(c.extraTab),
c.selectedTab == selectedExtraTab,
"#",
)
items = append(items, item)
}
return core.NewComponents(
core.NewSpace(),
core.NewNavTabs(items),
core.NewSpace(),
).WriteHTMLTo(w)
}
var surnames = gedcom.NewStringSet()
func getSurnames(document *gedcom.Document) *gedcom.StringSet {
if surnames.Len() == 0 {
for _, individual := range document.Individuals() {
surname := individual.Name().Surname()
if surname != "" {
surnames.Add(surname)
}
}
}
return surnames
}