commit 1f923f8
delthas
·
2022-11-15 10:35:40 +0000 UTC
parent 3be8783
Print date as dd/mm or mm/dd depending on the user locale Overkill, but this was a nice weekend project :-) Fixes: https://todo.sr.ht/~taiite/senpai/107
3 files changed,
+60,
-9
M
go.mod
+1,
-1
1@@ -4,7 +4,7 @@ go 1.16
2
3 require (
4 git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc
5- github.com/gdamore/encoding v1.0.0
6+ github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1
7 github.com/gdamore/tcell/v2 v2.5.4-0.20221017224006-ede1dd5ee680
8 github.com/mattn/go-runewidth v0.0.14
9 golang.org/x/net v0.0.0-20220722155237-a158d28d115b
M
go.sum
+2,
-0
1@@ -2,6 +2,8 @@ git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc h1:51BD67xFX+bozd
2 git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc/go.mod h1:t+Ww6SR24yYnXzEWiNlOY0AFo5E9B73X++10lrSpp4U=
3 github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
4 github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
5+github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1 h1:sCu9bac1vv1LMBOsnUymZsi4iTO5PBQqn2Z3KJiGXXg=
6+github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1/go.mod h1:sG54BxlyQgIskYURLrg7mvhoGBe0Qq12DNtYRALwNa4=
7 github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko=
8 github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg=
9 github.com/gdamore/tcell/v2 v2.5.4-0.20221017224006-ede1dd5ee680 h1:bCjGvZsZNvhzJZ+gDmXpKdDPyf358nSPqepaTI1AsMQ=
+57,
-8
1@@ -2,8 +2,12 @@ package ui
2
3 import (
4 "fmt"
5+ "strings"
6+ "sync"
7 "time"
8
9+ "github.com/delthas/go-localeinfo"
10+
11 "github.com/gdamore/tcell/v2"
12 )
13
14@@ -42,17 +46,62 @@ func printNumber(screen tcell.Screen, x *int, y int, st tcell.Style, n int) {
15 printString(screen, x, y, s)
16 }
17
18+var dateConfig sync.Once
19+var dateMonthFirst bool
20+
21+func loadDateInfo() {
22+ // Very overkill, but I like it :)
23+ // Try to extract from the user locale whether they'd rather have the date
24+ // printed as dd/mm or mm/dd.
25+ // If we're not sure, print dd/mm.
26+ l, err := localeinfo.NewLocale("")
27+ if err != nil {
28+ return
29+ }
30+ format := l.DateFormat()
31+ dayIndex := -1
32+ for _, s := range []string{"%d", "%e"} {
33+ dayIndex = strings.Index(format, s)
34+ if dayIndex >= 0 {
35+ break
36+ }
37+ }
38+ if dayIndex == -1 {
39+ return
40+ }
41+ monthIndex := -1
42+ for _, s := range []string{"%m", "%b", "%B"} {
43+ monthIndex = strings.Index(format, s)
44+ if monthIndex >= 0 {
45+ break
46+ }
47+ }
48+ if monthIndex == -1 {
49+ return
50+ }
51+ if monthIndex < dayIndex {
52+ dateMonthFirst = true
53+ }
54+}
55+
56 func printDate(screen tcell.Screen, x int, y int, st tcell.Style, t time.Time) {
57+ dateConfig.Do(loadDateInfo)
58 _, m, d := t.Date()
59- d0 := rune(d/10) + '0'
60- d1 := rune(d%10) + '0'
61- m0 := rune(m/10) + '0'
62- m1 := rune(m%10) + '0'
63- screen.SetContent(x+0, y, d0, nil, st)
64- screen.SetContent(x+1, y, d1, nil, st)
65+ var left, right int
66+ if dateMonthFirst {
67+ left, right = int(m), d
68+ } else {
69+ left, right = d, int(m)
70+ }
71+ l0 := rune(left/10) + '0'
72+ l1 := rune(left%10) + '0'
73+ r0 := rune(right/10) + '0'
74+ r1 := rune(right%10) + '0'
75+ screen.SetContent(x+0, y, l0, nil, st)
76+ screen.SetContent(x+1, y, l1, nil, st)
77 screen.SetContent(x+2, y, '/', nil, st)
78- screen.SetContent(x+3, y, m0, nil, st)
79- screen.SetContent(x+4, y, m1, nil, st)
80+ screen.SetContent(x+3, y, r0, nil, st)
81+ screen.SetContent(x+4, y, r1, nil, st)
82 }
83
84 func printTime(screen tcell.Screen, x int, y int, st tcell.Style, t time.Time) {