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
M go.sum
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) {