From 1f923f8972d8c9207238ec57850dea10bd2e9d42 Mon Sep 17 00:00:00 2001 From: delthas Date: Tue, 15 Nov 2022 11:35:40 +0100 Subject: 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 --- go.mod | 2 +- go.sum | 2 ++ ui/draw_utils.go | 65 +++++++++++++++++++++++++++++++++++++++++++++++++------- 3 files changed, 60 insertions(+), 9 deletions(-) diff --git a/go.mod b/go.mod index 6bc57ac..2c304cd 100644 --- a/go.mod +++ b/go.mod @@ -4,7 +4,7 @@ go 1.16 require ( git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc - github.com/gdamore/encoding v1.0.0 + github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1 github.com/gdamore/tcell/v2 v2.5.4-0.20221017224006-ede1dd5ee680 github.com/mattn/go-runewidth v0.0.14 golang.org/x/net v0.0.0-20220722155237-a158d28d115b diff --git a/go.sum b/go.sum index cb2a317..afa9274 100644 --- a/go.sum +++ b/go.sum @@ -2,6 +2,8 @@ git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc h1:51BD67xFX+bozd git.sr.ht/~emersion/go-scfg v0.0.0-20201019143924-142a8aa629fc/go.mod h1:t+Ww6SR24yYnXzEWiNlOY0AFo5E9B73X++10lrSpp4U= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1 h1:sCu9bac1vv1LMBOsnUymZsi4iTO5PBQqn2Z3KJiGXXg= +github.com/delthas/go-localeinfo v0.0.0-20221115102303-5a7785a1acc1/go.mod h1:sG54BxlyQgIskYURLrg7mvhoGBe0Qq12DNtYRALwNa4= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/gdamore/tcell/v2 v2.5.4-0.20221017224006-ede1dd5ee680 h1:bCjGvZsZNvhzJZ+gDmXpKdDPyf358nSPqepaTI1AsMQ= diff --git a/ui/draw_utils.go b/ui/draw_utils.go index 3d04f11..62f2d79 100644 --- a/ui/draw_utils.go +++ b/ui/draw_utils.go @@ -2,8 +2,12 @@ package ui import ( "fmt" + "strings" + "sync" "time" + "github.com/delthas/go-localeinfo" + "github.com/gdamore/tcell/v2" ) @@ -42,17 +46,62 @@ func printNumber(screen tcell.Screen, x *int, y int, st tcell.Style, n int) { printString(screen, x, y, s) } +var dateConfig sync.Once +var dateMonthFirst bool + +func loadDateInfo() { + // Very overkill, but I like it :) + // Try to extract from the user locale whether they'd rather have the date + // printed as dd/mm or mm/dd. + // If we're not sure, print dd/mm. + l, err := localeinfo.NewLocale("") + if err != nil { + return + } + format := l.DateFormat() + dayIndex := -1 + for _, s := range []string{"%d", "%e"} { + dayIndex = strings.Index(format, s) + if dayIndex >= 0 { + break + } + } + if dayIndex == -1 { + return + } + monthIndex := -1 + for _, s := range []string{"%m", "%b", "%B"} { + monthIndex = strings.Index(format, s) + if monthIndex >= 0 { + break + } + } + if monthIndex == -1 { + return + } + if monthIndex < dayIndex { + dateMonthFirst = true + } +} + func printDate(screen tcell.Screen, x int, y int, st tcell.Style, t time.Time) { + dateConfig.Do(loadDateInfo) _, m, d := t.Date() - d0 := rune(d/10) + '0' - d1 := rune(d%10) + '0' - m0 := rune(m/10) + '0' - m1 := rune(m%10) + '0' - screen.SetContent(x+0, y, d0, nil, st) - screen.SetContent(x+1, y, d1, nil, st) + var left, right int + if dateMonthFirst { + left, right = int(m), d + } else { + left, right = d, int(m) + } + l0 := rune(left/10) + '0' + l1 := rune(left%10) + '0' + r0 := rune(right/10) + '0' + r1 := rune(right%10) + '0' + screen.SetContent(x+0, y, l0, nil, st) + screen.SetContent(x+1, y, l1, nil, st) screen.SetContent(x+2, y, '/', nil, st) - screen.SetContent(x+3, y, m0, nil, st) - screen.SetContent(x+4, y, m1, nil, st) + screen.SetContent(x+3, y, r0, nil, st) + screen.SetContent(x+4, y, r1, nil, st) } func printTime(screen tcell.Screen, x int, y int, st tcell.Style, t time.Time) { -- cgit v1.2.3