reprogl

Форк
0
/
job_history.go 
146 строк · 2.6 Кб
1
package container
2

3
import (
4
	"cmp"
5
	"fmt"
6
	"regexp"
7
	"slices"
8
	"time"
9

10
	"xelbot.com/reprogl/utils"
11
)
12

13
type JobHistory []Job
14

15
type Job struct {
16
	Company   string    `toml:"company"`
17
	Link      string    `toml:"link,omitempty"`
18
	Title     string    `toml:"title"`
19
	StartDate time.Time `toml:"start"`
20
	EndDate   time.Time `toml:"end"`
21

22
	CustomEmoji string `toml:"emoji,omitempty"`
23
}
24

25
func (jh JobHistory) Last() Job {
26
	var c Job
27
	for _, job := range jh {
28
		if job.StartDate.After(c.StartDate) {
29
			c = job
30
		}
31
	}
32

33
	return c
34
}
35

36
func (jh JobHistory) Sort() JobHistory {
37
	jhCopy := slices.Clone(jh)
38
	slices.SortFunc(
39
		jhCopy,
40
		func(a, b Job) int {
41
			return cmp.Compare(b.StartDate.Unix(), a.StartDate.Unix())
42
		},
43
	)
44

45
	return jhCopy
46
}
47

48
func (j *Job) LinkShort() (result string) {
49
	matches := regexp.MustCompile(`^https?:\/\/([^\/]+)`).FindStringSubmatch(j.Link)
50
	if matches != nil && matches[1] != "" {
51
		result = matches[1]
52
	}
53

54
	return
55
}
56

57
func (j *Job) Start() string {
58
	return utils.RuMonthName(j.StartDate.Month(), false) + " " + j.StartDate.Format("2006")
59
}
60

61
func (j *Job) End() string {
62
	now := time.Now()
63
	if j.EndDate.After(now) {
64
		return "текущее"
65
	}
66

67
	return utils.RuMonthName(j.EndDate.Month(), false) + " " + j.EndDate.Format("2006")
68
}
69

70
func (j *Job) Duration() string {
71
	var end time.Time
72
	now := time.Now()
73
	if j.EndDate.After(now) {
74
		end = now
75
	} else {
76
		end = j.EndDate
77
	}
78

79
	y0 := j.StartDate.Year()
80
	y1 := end.Year()
81

82
	m0 := int(j.StartDate.Month())
83
	m1 := int(end.Month())
84

85
	d0 := j.StartDate.Day()
86
	d1 := end.Day()
87

88
	return durationString(12*(y1-y0) + (m1 - m0) + int(0.5+float32(d1-d0)/30.0))
89
}
90

91
func (j *Job) Emoji() string {
92
	var symbols []rune
93
	if j.CustomEmoji == "electrical" {
94
		// https://emojipedia.org/man-mechanic
95
		symbols = []rune{
96
			rune(0x1F468),
97
			rune(0x200D),
98
			rune(0x1F527),
99
		}
100
	} else {
101
		// https://emojipedia.org/man-technologist
102
		symbols = []rune{
103
			rune(0x1F468),
104
			rune(0x200D),
105
			rune(0x1F4BB),
106
		}
107
	}
108

109
	return string(symbols)
110
}
111

112
func durationString(delta int) string {
113
	m := delta % 12
114
	y := delta / 12
115

116
	if y == 0 {
117
		return fmt.Sprintf("%d мес.", m)
118
	}
119

120
	var monthPart string
121
	if m > 0 {
122
		monthPart = fmt.Sprintf(" %d мес.", m)
123
	}
124

125
	if y == 1 {
126
		return "1 год" + monthPart
127
	}
128

129
	if y == 2 || y == 3 || y == 4 {
130
		return fmt.Sprintf("%d года", y) + monthPart
131
	}
132

133
	if y >= 5 && y <= 20 {
134
		return fmt.Sprintf("%d лет", y) + monthPart
135
	}
136

137
	if y%10 == 1 {
138
		return fmt.Sprintf("%d год", y) + monthPart
139
	}
140

141
	if y%10 == 0 || y%10 >= 5 {
142
		return fmt.Sprintf("%d лет", y) + monthPart
143
	}
144

145
	return fmt.Sprintf("%d года", y) + monthPart
146
}
147

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.