From b2ec9b546b5fd364c8ed292c3c6a1821e36ae3a4 Mon Sep 17 00:00:00 2001 From: Rasmus Lindroth Date: Thu, 17 Nov 2022 19:29:36 +0100 Subject: [PATCH] 1.0.18 (#175) * update version and modules * don't repeat open on lists * create config dir if it doesn't exist * add language support * add default lang to config --- config.example.ini | 4 + config/config.go | 3 + config/default_config.go | 4 + go.mod | 26 ++--- go.sum | 47 +++++++++ main.go | 2 +- ui/composeview.go | 58 +++++++++++ ui/input.go | 4 + ui/item.go | 3 + ui/item_list.go | 1 + util/langs.go | 204 +++++++++++++++++++++++++++++++++++++++ util/util.go | 2 +- 12 files changed, 343 insertions(+), 15 deletions(-) create mode 100644 util/langs.go diff --git a/config.example.ini b/config.example.ini index 260c1d8..bd849c6 100644 --- a/config.example.ini +++ b/config.example.ini @@ -673,6 +673,10 @@ compose-toggle-content-warning="[T]oggle CW",'t','T' # default="[V]isibility",'v','V' compose-visibility="[V]isibility",'v','V' +# Edit the language of a toot +# default="[L]ang",'l','L' +compose-language="[L]ang",'l','L' + # Switch to creating a poll # default="P[O]ll",'o','O' compose-poll="P[O]ll",'o','O' diff --git a/config/config.go b/config/config.go index 7395677..4212f4b 100644 --- a/config/config.go +++ b/config/config.go @@ -389,6 +389,7 @@ type Input struct { ComposePost Key ComposeToggleContentWarning Key ComposeVisibility Key + ComposeLanguage Key ComposePoll Key MediaDelete Key @@ -1270,6 +1271,7 @@ func parseInput(cfg *ini.File) Input { ComposePost: inputStrOrErr([]string{"\"[P]ost\"", "'p'", "'P'"}, false), ComposeToggleContentWarning: inputStrOrErr([]string{"\"[T]oggle CW\"", "'t'", "'T'"}, false), ComposeVisibility: inputStrOrErr([]string{"\"[V]isibility\"", "'v'", "'V'"}, false), + ComposeLanguage: inputStrOrErr([]string{"\"[L]ang\"", "'l'", "'L'"}, false), ComposePoll: inputStrOrErr([]string{"\"P[O]ll\"", "'o'", "'O'"}, false), MediaDelete: inputStrOrErr([]string{"\"[D]elete\"", "'d'", "'D'"}, false), @@ -1343,6 +1345,7 @@ func parseInput(cfg *ini.File) Input { ic.ComposePost = inputOrErr(cfg, "compose-post", false, ic.ComposePost) ic.ComposeToggleContentWarning = inputOrErr(cfg, "compose-toggle-content-warning", false, ic.ComposeToggleContentWarning) ic.ComposeVisibility = inputOrErr(cfg, "compose-visibility", false, ic.ComposeVisibility) + ic.ComposeLanguage = inputOrErr(cfg, "compose-language", false, ic.ComposeLanguage) ic.ComposePoll = inputOrErr(cfg, "compose-poll", false, ic.ComposePoll) ic.MediaDelete = inputOrErr(cfg, "media-delete", false, ic.MediaDelete) diff --git a/config/default_config.go b/config/default_config.go index 3a5779f..798c37b 100644 --- a/config/default_config.go +++ b/config/default_config.go @@ -675,6 +675,10 @@ compose-toggle-content-warning="[T]oggle CW",'t','T' # default="[V]isibility",'v','V' compose-visibility="[V]isibility",'v','V' +# Edit the language of a toot +# default="[L]ang",'l','L' +compose-language="[L]ang",'l','L' + # Switch to creating a poll # default="P[O]ll",'o','O' compose-poll="P[O]ll",'o','O' diff --git a/go.mod b/go.mod index 3c047f1..b1f321e 100644 --- a/go.mod +++ b/go.mod @@ -3,17 +3,17 @@ module github.com/RasmusLindroth/tut go 1.18 require ( - github.com/RasmusLindroth/go-mastodon v0.0.8 + github.com/RasmusLindroth/go-mastodon v0.0.9 github.com/atotto/clipboard v0.1.4 - github.com/gdamore/tcell/v2 v2.5.2 - github.com/gen2brain/beeep v0.0.0-20220518085355-d7852edf42fc + github.com/gdamore/tcell/v2 v2.5.3 + github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 github.com/gobwas/glob v0.2.3 - github.com/icza/gox v0.0.0-20220812133721-0fbf7a534d8e - github.com/microcosm-cc/bluemonday v1.0.19 - github.com/pelletier/go-toml/v2 v2.0.2 - github.com/rivo/tview v0.0.0-20220812085834-0e6b21a48e96 - github.com/rivo/uniseg v0.3.4 - golang.org/x/net v0.0.0-20220812174116-3211cb980234 + github.com/icza/gox v0.0.0-20221026131554-a08a8cdc726a + github.com/microcosm-cc/bluemonday v1.0.21 + github.com/pelletier/go-toml/v2 v2.0.6 + github.com/rivo/tview v0.0.0-20221117065207-09f052e6ca98 + github.com/rivo/uniseg v0.4.3 + golang.org/x/net v0.2.0 gopkg.in/ini.v1 v1.67.0 ) @@ -25,11 +25,11 @@ require ( github.com/gorilla/css v1.0.0 // indirect github.com/gorilla/websocket v1.5.0 // indirect github.com/lucasb-eyer/go-colorful v1.2.0 // indirect - github.com/mattn/go-runewidth v0.0.13 // indirect + github.com/mattn/go-runewidth v0.0.14 // indirect github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d // indirect github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af // indirect github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 // indirect - golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab // indirect - golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 // indirect - golang.org/x/text v0.3.7 // indirect + golang.org/x/sys v0.2.0 // indirect + golang.org/x/term v0.2.0 // indirect + golang.org/x/text v0.4.0 // indirect ) diff --git a/go.sum b/go.sum index eabf057..2123dbb 100644 --- a/go.sum +++ b/go.sum @@ -1,17 +1,24 @@ github.com/RasmusLindroth/go-mastodon v0.0.8 h1:t2rrbdNgS4h0JhmPNsmUOQBByDxmUPawnERGn6oR2eA= github.com/RasmusLindroth/go-mastodon v0.0.8/go.mod h1:4L0oyiNwq1tUoiByczzhSikxR9RiANzELtZgexxKpPM= +github.com/RasmusLindroth/go-mastodon v0.0.9 h1:3Moqcs5mr65SUgofwfB4eEiKgwMpbRl3ncfyxu+DFjw= +github.com/RasmusLindroth/go-mastodon v0.0.9/go.mod h1:Lr6n8V1U2b+9P89YZKsICkNc+oNeJXkygY7raei9SXE= github.com/atotto/clipboard v0.1.4 h1:EH0zSVneZPSuFR11BlR9YppQTVDbh5+16AmcJi4g1z4= github.com/atotto/clipboard v0.1.4/go.mod h1:ZY9tmq7sm5xIbd9bOK4onWV4S6X0u6GY7Vn0Yu86PYI= github.com/aymerick/douceur v0.2.0 h1:Mv+mAeH1Q+n9Fr+oyamOlAkUNPWPlA8PPGR0QAaYuPk= github.com/aymerick/douceur v0.2.0/go.mod h1:wlT5vV2O3h55X9m7iVYN0TBM0NH/MmbLnd30/FjWUq4= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 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.2 h1:tKzG29kO9p2V++3oBY2W9zUjYu7IK1MENFeY/BzJSVY= github.com/gdamore/tcell/v2 v2.5.2/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= +github.com/gdamore/tcell/v2 v2.5.3 h1:b9XQrT6QGbgI7JvZOJXFNczOQeIYbo8BfeSMzt2sAV0= +github.com/gdamore/tcell/v2 v2.5.3/go.mod h1:wSkrPaXoiIWZqW/g7Px4xc79di6FTcpB8tvaKJ6uGBo= github.com/gen2brain/beeep v0.0.0-20220518085355-d7852edf42fc h1:6ZZLxG+lB+Qbg+chtzAEeetwqjlPnY0BXbhL3lQWYOg= github.com/gen2brain/beeep v0.0.0-20220518085355-d7852edf42fc/go.mod h1:/WeFVhhxMOGypVKS0w8DUJxUBbHypnWkUVnW7p5c9Pw= +github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6 h1:jFEK/SA/7E8lg9T33+y8D4Z0I782+bbiEjmyyklRzRQ= +github.com/gen2brain/beeep v0.0.0-20220909211152-5a9ec94374f6/go.mod h1:/WeFVhhxMOGypVKS0w8DUJxUBbHypnWkUVnW7p5c9Pw= github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4 h1:qZNfIGkIANxGv/OqtnntR4DfOY2+BgwR60cAcu/i3SE= github.com/go-toast/toast v0.0.0-20190211030409-01e6764cf0a4/go.mod h1:kW3HQ4UdaAyrUCSSDR4xUzBKW6O2iA4uHhk7AtyYp10= github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= @@ -24,46 +31,86 @@ github.com/gorilla/websocket v1.5.0 h1:PPwGk2jz7EePpoHN/+ClbZu8SPxiqlu12wZP/3sWm github.com/gorilla/websocket v1.5.0/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/icza/gox v0.0.0-20220812133721-0fbf7a534d8e h1:vD4inAaWEbFk4Dpu1Y+m9URk8s6dOif7pBW5pW7fAak= github.com/icza/gox v0.0.0-20220812133721-0fbf7a534d8e/go.mod h1:VbcN86fRkkUMPX2ufM85Um8zFndLZswoIW1eYtpAcVk= +github.com/icza/gox v0.0.0-20221026131554-a08a8cdc726a h1:ctOSka++0Y+9xF7VLtZ8TOJjyXjOGYywzuhbzj3IEHw= +github.com/icza/gox v0.0.0-20221026131554-a08a8cdc726a/go.mod h1:VbcN86fRkkUMPX2ufM85Um8zFndLZswoIW1eYtpAcVk= github.com/lucasb-eyer/go-colorful v1.2.0 h1:1nnpGOrhyZZuNyfu1QjKiUICQ74+3FNCN69Aj6K7nkY= github.com/lucasb-eyer/go-colorful v1.2.0/go.mod h1:R4dSotOR9KMtayYi1e77YzuveK+i7ruzyGqttikkLy0= github.com/mattn/go-runewidth v0.0.13 h1:lTGmDsbAYt5DmK6OnoV7EuIF1wEIFAcxld6ypU4OSgU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.14 h1:+xnbZSEeDbOIg5/mE6JF0w6n9duR1l3/WmbinWVwUuU= +github.com/mattn/go-runewidth v0.0.14/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/microcosm-cc/bluemonday v1.0.19 h1:OI7hoF5FY4pFz2VA//RN8TfM0YJ2dJcl4P4APrCWy6c= github.com/microcosm-cc/bluemonday v1.0.19/go.mod h1:QNzV2UbLK2/53oIIwTOyLUSABMkjZ4tqiyC1g/DyqxE= +github.com/microcosm-cc/bluemonday v1.0.21 h1:dNH3e4PSyE4vNX+KlRGHT5KrSvjeUkoNPwEORjffHJg= +github.com/microcosm-cc/bluemonday v1.0.21/go.mod h1:ytNkv4RrDrLJ2pqlsSI46O6IVXmZOBBD4SaJyDwwTkM= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d h1:VhgPp6v9qf9Agr/56bj7Y/xa04UccTW04VP0Qed4vnQ= github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U= github.com/pelletier/go-toml/v2 v2.0.2 h1:+jQXlF3scKIcSEKkdHzXhCTDLPFi5r1wnK6yPS+49Gw= github.com/pelletier/go-toml/v2 v2.0.2/go.mod h1:MovirKjgVRESsAvNZlAjtFwV867yGuwRkXbG66OzopI= +github.com/pelletier/go-toml/v2 v2.0.5 h1:ipoSadvV8oGUjnUbMub59IDPPwfxF694nG/jwbMiyQg= +github.com/pelletier/go-toml/v2 v2.0.5/go.mod h1:OMHamSCAODeSsVrwwvcJOaoN0LIUIaFVNZzmWyNfXas= +github.com/pelletier/go-toml/v2 v2.0.6 h1:nrzqCb7j9cDFj2coyLNLaZuJTLjWjlaz6nvTvIwycIU= +github.com/pelletier/go-toml/v2 v2.0.6/go.mod h1:eumQOmlWiOPt5WriQQqoM5y18pDHwha2N+QD+EUNTek= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/rivo/tview v0.0.0-20220812085834-0e6b21a48e96 h1:O435d1KIgG6KxpP7NDdmj7SdaLIzq4F+PG8ZB/BHC4c= github.com/rivo/tview v0.0.0-20220812085834-0e6b21a48e96/go.mod h1:hyzpnqn4KWzZopTEjL1AxvlzOLMH1IuKo4lTw6vyOQc= +github.com/rivo/tview v0.0.0-20221029100920-c4a7e501810d h1:jKIUJdMcIVGOSHi6LSqJqw9RqblyblE2ZrHvFbWR3S0= +github.com/rivo/tview v0.0.0-20221029100920-c4a7e501810d/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= +github.com/rivo/tview v0.0.0-20221115143349-ed3ea789e9f7 h1:9m4q3Li2CP/O4yfbZYJhySCuUg/VpV4jZhpvUcUYu8E= +github.com/rivo/tview v0.0.0-20221115143349-ed3ea789e9f7/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= +github.com/rivo/tview v0.0.0-20221117065207-09f052e6ca98 h1:0nVxhPi+jdqG11c3n4zTcZQbjGy0yi60ym/6B+NITPU= +github.com/rivo/tview v0.0.0-20221117065207-09f052e6ca98/go.mod h1:YX2wUZOcJGOIycErz2s9KvDaP0jnWwRCirQMPLPpQ+Y= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= github.com/rivo/uniseg v0.3.4 h1:3Z3Eu6FGHZWSfNKJTOUiPatWwfc7DzJRU04jFUqJODw= github.com/rivo/uniseg v0.3.4/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.2 h1:YwD0ulJSJytLpiaWua0sBDusfsCZohxjxzVTYjwxfV8= +github.com/rivo/uniseg v0.4.2/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= +github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.7.2 h1:4jaiDzPyXQvSd7D0EjG45355tLlV3VOECpq10pLC+8s= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af h1:6yITBqGTE2lEeTPG04SN9W+iWHCRyHqlVYILiSXziwk= github.com/tadvi/systray v0.0.0-20190226123456-11a2b8fa57af/go.mod h1:4F09kP5F+am0jAwlQLddpoMDM+iewkxxt6nxUQ5nq5o= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80 h1:nrZ3ySNYwJbSpD6ce9duiP+QkD3JuLCcWkdaehUS/3Y= github.com/tomnomnom/linkheader v0.0.0-20180905144013-02ca5825eb80/go.mod h1:iFyPdL66DjUD96XmzVL3ZntbzcflLnznH0fr99w5VqE= golang.org/x/net v0.0.0-20220812174116-3211cb980234 h1:RDqmgfe7SvlMWoqC3xwQ2blLO3fcWcxMa3eBLRdRW7E= golang.org/x/net v0.0.0-20220812174116-3211cb980234/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b h1:ZmngSVLe/wycRns9MKikG9OWIEjGcGAkacif7oYQaUY= +golang.org/x/net v0.0.0-20220826154423-83b083e8dc8b/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk= +golang.org/x/net v0.1.0 h1:hZ/3BUoy5aId7sCpA/Tc5lt8DkFgdVS2onTpJsZ/fl0= +golang.org/x/net v0.1.0/go.mod h1:Cx3nUiGt4eDBEyega/BKRp+/AlGL8hYe7U9odMt2Cco= +golang.org/x/net v0.2.0 h1:sZfSu1wtKLGlWI4ZZayP0ck9Y73K1ynO6gqzTdBVdPU= +golang.org/x/net v0.2.0/go.mod h1:KqCZLdyyvdV855qA2rE3GC2aiw5xGR5TEjj8smXukLY= golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20220318055525-2edf467146b5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220319134239-a9b59b0215f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab h1:2QkjZIsXupsJbJIdSjjUOgWK3aEtzyuh2mPt3l/CkeU= golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64 h1:UiNENfZ8gDvpiWw7IpOMQ27spWmThO1RwwdQVbJahJM= +golang.org/x/sys v0.0.0-20220825204002-c680a09ffe64/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.2.0 h1:ljd4t30dBnAvMZaQCevtY0xLLD0A+bRZXbgLMLU1F/A= +golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/term v0.0.0-20201210144234-2321bbc49cbf/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035 h1:Q5284mrmYTpACcm+eAKjKJH48BBwSyfJqmmGDTtT8Vc= golang.org/x/term v0.0.0-20220722155259-a9ba230a4035/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.2.0 h1:z85xZCsEl7bi/KwbNADeBYoOP0++7W1ipu+aGnpwzRM= +golang.org/x/term v0.2.0/go.mod h1:TVmDHMZPmdnySmBfhjOoOdhjzdE1h4u1VwSiw2l1Nuc= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.7 h1:olpwvP2KacW1ZWvsR7uQhoyTYvKAupfQrRGBFM352Gk= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.4.0 h1:BrVqGRd7+k1DiOgtnFvAkoQEWQvBc25ouMJM6429SFg= +golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/ini.v1 v1.67.0 h1:Dgnx+6+nfE+IfzjUEISNeydPJh9AXNNsWbGP9KzCsOA= gopkg.in/ini.v1 v1.67.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/main.go b/main.go index 0a41ce4..2f96356 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( "github.com/rivo/tview" ) -const version = "1.0.17" +const version = "1.0.18" func main() { util.SetTerminalTitle("tut") diff --git a/ui/composeview.go b/ui/composeview.go index d3cbea9..885e409 100644 --- a/ui/composeview.go +++ b/ui/composeview.go @@ -25,6 +25,7 @@ type msgToot struct { ScheduledAt *time.Time QuoteIncluded bool Visibility string + Language string } type ComposeView struct { @@ -36,6 +37,7 @@ type ComposeView struct { info *tview.TextView controls *tview.Flex visibility *tview.DropDown + lang *tview.DropDown media *MediaList msg *msgToot } @@ -62,6 +64,7 @@ func NewComposeView(tv *TutView) *ComposeView { controls: NewControlView(tv.tut.Config), info: NewTextView(tv.tut.Config), visibility: NewDropDown(tv.tut.Config), + lang: NewDropDown(tv.tut.Config), media: NewMediaList(tv), } cv.content.SetDynamicColors(true) @@ -80,6 +83,7 @@ func newComposeUI(cv *ComposeView) *tview.Flex { AddItem(tview.NewBox(), 2, 0, false). AddItem(tview.NewFlex().SetDirection(tview.FlexRow). AddItem(cv.visibility, 1, 0, false). + AddItem(cv.lang, 1, 0, false). AddItem(cv.info, 5, 0, false). AddItem(cv.media.View, 0, 1, false), 0, 1, false), 0, 1, false). AddItem(cv.input.View, 1, 0, false). @@ -118,6 +122,7 @@ func (cv *ComposeView) SetControls(ctrl ComposeControls) { items = append(items, NewControl(cv.tutView.tut.Config, cv.tutView.tut.Config.Input.ComposeEditSpoiler, true)) items = append(items, NewControl(cv.tutView.tut.Config, cv.tutView.tut.Config.Input.ComposeMediaFocus, true)) items = append(items, NewControl(cv.tutView.tut.Config, cv.tutView.tut.Config.Input.ComposePoll, true)) + items = append(items, NewControl(cv.tutView.tut.Config, cv.tutView.tut.Config.Input.ComposeLanguage, true)) if cv.msg.Status != nil { items = append(items, NewControl(cv.tutView.tut.Config, cv.tutView.tut.Config.Input.ComposeIncludeQuote, true)) } @@ -143,9 +148,13 @@ func (cv *ComposeView) SetStatus(status *mastodon.Status) { msg := &msgToot{} me := cv.tutView.tut.Client.Me visibility := mastodon.VisibilityPublic + lang := "" if me.Source != nil && me.Source.Privacy != nil { visibility = *me.Source.Privacy } + if me.Source != nil && me.Source.Language != nil { + lang = *me.Source.Language + } if status != nil { if status.Reblog != nil { status = status.Reblog @@ -160,6 +169,7 @@ func (cv *ComposeView) SetStatus(status *mastodon.Status) { } } msg.Visibility = visibility + msg.Language = lang cv.msg = msg cv.msg.Text = cv.getAccs() if cv.tutView.tut.Config.General.QuoteReply { @@ -176,6 +186,18 @@ func (cv *ComposeView) SetStatus(status *mastodon.Status) { cv.visibility.SetOptions(visibilitiesStr, cv.visibilitySelected) cv.visibility.SetCurrentOption(index) cv.visibility.SetInputCapture(cv.visibilityInput) + + cv.lang.SetLabel("Lang: ") + langStrs := []string{} + for i, l := range util.Languages { + if msg.Language == l.Code { + index = i + } + langStrs = append(langStrs, fmt.Sprintf("%s (%s)", l.Local, l.English)) + } + cv.lang.SetOptions(langStrs, cv.langSelected) + cv.lang.SetCurrentOption(index) + cv.UpdateContent() cv.SetControls(ComposeNormal) } @@ -321,6 +343,41 @@ func (cv *ComposeView) FocusVisibility() { cv.tutView.tut.App.QueueEvent(ev) } +func (cv *ComposeView) langInput(event *tcell.EventKey) *tcell.EventKey { + if cv.tutView.tut.Config.Input.GlobalDown.Match(event.Key(), event.Rune()) { + return tcell.NewEventKey(tcell.KeyDown, 0, tcell.ModNone) + } + if cv.tutView.tut.Config.Input.GlobalUp.Match(event.Key(), event.Rune()) { + return tcell.NewEventKey(tcell.KeyUp, 0, tcell.ModNone) + } + if cv.tutView.tut.Config.Input.GlobalExit.Match(event.Key(), event.Rune()) || + cv.tutView.tut.Config.Input.GlobalBack.Match(event.Key(), event.Rune()) { + cv.exitLang() + return nil + } + return event +} + +func (cv *ComposeView) exitLang() { + cv.tutView.tut.App.SetInputCapture(cv.tutView.Input) + cv.tutView.tut.App.SetFocus(cv.content) +} + +func (cv *ComposeView) langSelected(s string, index int) { + i, _ := cv.lang.GetCurrentOption() + if i >= 0 && i < len(util.Languages) { + cv.msg.Language = util.Languages[i].Code + } + cv.exitLang() +} + +func (cv *ComposeView) FocusLang() { + cv.tutView.tut.App.SetInputCapture(cv.langInput) + cv.tutView.tut.App.SetFocus(cv.lang) + ev := tcell.NewEventKey(tcell.KeyDown, 0, tcell.ModNone) + cv.tutView.tut.App.QueueEvent(ev) +} + func (cv *ComposeView) Post() { toot := cv.msg send := mastodon.Toot{ @@ -367,6 +424,7 @@ func (cv *ComposeView) Post() { send.Poll = cv.tutView.PollView.GetPoll() } send.Visibility = cv.msg.Visibility + send.Language = cv.msg.Language _, err := cv.tutView.tut.Client.Client.PostStatus(context.Background(), &send) if err != nil { diff --git a/ui/input.go b/ui/input.go index b87803e..b2eae75 100644 --- a/ui/input.go +++ b/ui/input.go @@ -694,6 +694,10 @@ func (tv *TutView) InputComposeView(event *tcell.EventKey) *tcell.EventKey { tv.ComposeView.FocusVisibility() return nil } + if tv.tut.Config.Input.ComposeLanguage.Match(event.Key(), event.Rune()) { + tv.ComposeView.FocusLang() + return nil + } if tv.tut.Config.Input.GlobalBack.Match(event.Key(), event.Rune()) || tv.tut.Config.Input.GlobalExit.Match(event.Key(), event.Rune()) { tv.ModalView.Run( diff --git a/ui/item.go b/ui/item.go index 399203e..42fa921 100644 --- a/ui/item.go +++ b/ui/item.go @@ -95,7 +95,10 @@ func DrawItemControls(tv *TutView, item api.Item, controls *tview.Flex, ft feed. } case api.NotificationType: drawNotification(tv, item, item.Raw().(*api.NotificationData), nil, controls) + case api.ListsType: + drawList(tv, item.Raw().(*mastodon.List), nil, controls) } + } func OutputDate(cfg *config.Config, status time.Time) string { diff --git a/ui/item_list.go b/ui/item_list.go index e5102ef..162264e 100644 --- a/ui/item_list.go +++ b/ui/item_list.go @@ -12,6 +12,7 @@ type List struct { func drawList(tv *TutView, data *mastodon.List, main *tview.TextView, controls *tview.Flex) { btn := NewControl(tv.tut.Config, tv.tut.Config.Input.ListOpenFeed, true) + controls.Clear() controls.AddItem(NewControlButton(tv, btn), btn.Len, 0, false) main.SetText(fmt.Sprintf("List %s", tview.Escape(data.Title))) diff --git a/util/langs.go b/util/langs.go new file mode 100644 index 0000000..fb60da1 --- /dev/null +++ b/util/langs.go @@ -0,0 +1,204 @@ +package util + +type Language struct { + Code string + English string + Local string +} + +var Languages = []Language{ + {Code: "", English: "None", Local: "None"}, + {Code: "aa", English: "Afar", Local: "Afaraf"}, + {Code: "ab", English: "Abkhaz", Local: "аҧсуа бызшәа"}, + {Code: "ae", English: "Avestan", Local: "avesta"}, + {Code: "af", English: "Afrikaans", Local: "Afrikaans"}, + {Code: "ak", English: "Akan", Local: "Akan"}, + {Code: "am", English: "Amharic", Local: "አማርኛ"}, + {Code: "an", English: "Aragonese", Local: "aragonés"}, + {Code: "ar", English: "Arabic", Local: "اللغة العربية"}, + {Code: "as", English: "Assamese", Local: "অসমীয়া"}, + {Code: "av", English: "Avaric", Local: "авар мацӀ"}, + {Code: "ay", English: "Aymara", Local: "aymar aru"}, + {Code: "az", English: "Azerbaijani", Local: "azərbaycan dili"}, + {Code: "ba", English: "Bashkir", Local: "башҡорт теле"}, + {Code: "be", English: "Belarusian", Local: "беларуская мова"}, + {Code: "bg", English: "Bulgarian", Local: "български език"}, + {Code: "bh", English: "Bihari", Local: "भोजपुरी"}, + {Code: "bi", English: "Bislama", Local: "Bislama"}, + {Code: "bm", English: "Bambara", Local: "bamanankan"}, + {Code: "bn", English: "Bengali", Local: "বাংলা"}, + {Code: "bo", English: "Tibetan", Local: "བོད་ཡིག"}, + {Code: "br", English: "Breton", Local: "brezhoneg"}, + {Code: "bs", English: "Bosnian", Local: "bosanski jezik"}, + {Code: "ca", English: "Catalan", Local: "Català"}, + {Code: "ce", English: "Chechen", Local: "нохчийн мотт"}, + {Code: "ch", English: "Chamorro", Local: "Chamoru"}, + {Code: "co", English: "Corsican", Local: "corsu"}, + {Code: "cr", English: "Cree", Local: "ᓀᐦᐃᔭᐍᐏᐣ"}, + {Code: "cs", English: "Czech", Local: "čeština"}, + {Code: "cu", English: "Old Church Slavonic", Local: "ѩзыкъ словѣньскъ"}, + {Code: "cv", English: "Chuvash", Local: "чӑваш чӗлхи"}, + {Code: "cy", English: "Welsh", Local: "Cymraeg"}, + {Code: "da", English: "Danish", Local: "dansk"}, + {Code: "de", English: "German", Local: "Deutsch"}, + {Code: "dv", English: "Divehi", Local: "Dhivehi"}, + {Code: "dz", English: "Dzongkha", Local: "རྫོང་ཁ"}, + {Code: "ee", English: "Ewe", Local: "Eʋegbe"}, + {Code: "el", English: "Greek", Local: "Ελληνικά"}, + {Code: "en", English: "English", Local: "English"}, + {Code: "eo", English: "Esperanto", Local: "Esperanto"}, + {Code: "es", English: "Spanish", Local: "Español"}, + {Code: "et", English: "Estonian", Local: "eesti"}, + {Code: "eu", English: "Basque", Local: "euskara"}, + {Code: "fa", English: "Persian", Local: "فارسی"}, + {Code: "ff", English: "Fula", Local: "Fulfulde"}, + {Code: "fi", English: "Finnish", Local: "suomi"}, + {Code: "fj", English: "Fijian", Local: "Vakaviti"}, + {Code: "fo", English: "Faroese", Local: "føroyskt"}, + {Code: "fr", English: "French", Local: "Français"}, + {Code: "fy", English: "Western Frisian", Local: "Frysk"}, + {Code: "ga", English: "Irish", Local: "Gaeilge"}, + {Code: "gd", English: "Scottish Gaelic", Local: "Gàidhlig"}, + {Code: "gl", English: "Galician", Local: "galego"}, + {Code: "gu", English: "Gujarati", Local: "ગુજરાતી"}, + {Code: "gv", English: "Manx", Local: "Gaelg"}, + {Code: "ha", English: "Hausa", Local: "هَوُسَ"}, + {Code: "he", English: "Hebrew", Local: "עברית"}, + {Code: "hi", English: "Hindi", Local: "हिन्दी"}, + {Code: "ho", English: "Hiri Motu", Local: "Hiri Motu"}, + {Code: "hr", English: "Croatian", Local: "Hrvatski"}, + {Code: "ht", English: "Haitian", Local: "Kreyòl ayisyen"}, + {Code: "hu", English: "Hungarian", Local: "magyar"}, + {Code: "hy", English: "Armenian", Local: "Հայերեն"}, + {Code: "hz", English: "Herero", Local: "Otjiherero"}, + {Code: "ia", English: "Interlingua", Local: "Interlingua"}, + {Code: "id", English: "Indonesian", Local: "Bahasa Indonesia"}, + {Code: "ie", English: "Interlingue", Local: "Interlingue"}, + {Code: "ig", English: "Igbo", Local: "Asụsụ Igbo"}, + {Code: "ii", English: "Nuosu", Local: "ꆈꌠ꒿ Nuosuhxop"}, + {Code: "ik", English: "Inupiaq", Local: "Iñupiaq"}, + {Code: "io", English: "Ido", Local: "Ido"}, + {Code: "is", English: "Icelandic", Local: "Íslenska"}, + {Code: "it", English: "Italian", Local: "Italiano"}, + {Code: "iu", English: "Inuktitut", Local: "ᐃᓄᒃᑎᑐᑦ"}, + {Code: "ja", English: "Japanese", Local: "日本語"}, + {Code: "jv", English: "Javanese", Local: "basa Jawa"}, + {Code: "ka", English: "Georgian", Local: "ქართული"}, + {Code: "kg", English: "Kongo", Local: "Kikongo"}, + {Code: "ki", English: "Kikuyu", Local: "Gĩkũyũ"}, + {Code: "kj", English: "Kwanyama", Local: "Kuanyama"}, + {Code: "kk", English: "Kazakh", Local: "қазақ тілі"}, + {Code: "kl", English: "Kalaallisut", Local: "kalaallisut"}, + {Code: "km", English: "Khmer", Local: "ខេមរភាសា"}, + {Code: "kn", English: "Kannada", Local: "ಕನ್ನಡ"}, + {Code: "ko", English: "Korean", Local: "한국어"}, + {Code: "kr", English: "Kanuri", Local: "Kanuri"}, + {Code: "ks", English: "Kashmiri", Local: "कश्मीरी"}, + {Code: "ku", English: "Kurmanji (Kurdish)", Local: "Kurmancî"}, + {Code: "kv", English: "Komi", Local: "коми кыв"}, + {Code: "kw", English: "Cornish", Local: "Kernewek"}, + {Code: "ky", English: "Kyrgyz", Local: "Кыргызча"}, + {Code: "la", English: "Latin", Local: "latine"}, + {Code: "lb", English: "Luxembourgish", Local: "Lëtzebuergesch"}, + {Code: "lg", English: "Ganda", Local: "Luganda"}, + {Code: "li", English: "Limburgish", Local: "Limburgs"}, + {Code: "ln", English: "Lingala", Local: "Lingála"}, + {Code: "lo", English: "Lao", Local: "ລາວ"}, + {Code: "lt", English: "Lithuanian", Local: "lietuvių kalba"}, + {Code: "lu", English: "Luba-Katanga", Local: "Tshiluba"}, + {Code: "lv", English: "Latvian", Local: "latviešu valoda"}, + {Code: "mg", English: "Malagasy", Local: "fiteny malagasy"}, + {Code: "mh", English: "Marshallese", Local: "Kajin M̧ajeļ"}, + {Code: "mi", English: "Māori", Local: "te reo Māori"}, + {Code: "mk", English: "Macedonian", Local: "македонски јазик"}, + {Code: "ml", English: "Malayalam", Local: "മലയാളം"}, + {Code: "mn", English: "Mongolian", Local: "Монгол хэл"}, + {Code: "mr", English: "Marathi", Local: "मराठी"}, + {Code: "ms", English: "Malay", Local: "Bahasa Melayu"}, + {Code: "mt", English: "Maltese", Local: "Malti"}, + {Code: "my", English: "Burmese", Local: "ဗမာစာ"}, + {Code: "na", English: "Nauru", Local: "Ekakairũ Naoero"}, + {Code: "nb", English: "Norwegian Bokmål", Local: "Norsk bokmål"}, + {Code: "nd", English: "Northern Ndebele", Local: "isiNdebele"}, + {Code: "ne", English: "Nepali", Local: "नेपाली"}, + {Code: "ng", English: "Ndonga", Local: "Owambo"}, + {Code: "nl", English: "Dutch", Local: "Nederlands"}, + {Code: "nn", English: "Norwegian Nynorsk", Local: "Norsk Nynorsk"}, + {Code: "no", English: "Norwegian", Local: "Norsk"}, + {Code: "nr", English: "Southern Ndebele", Local: "isiNdebele"}, + {Code: "nv", English: "Navajo", Local: "Diné bizaad"}, + {Code: "ny", English: "Chichewa", Local: "chiCheŵa"}, + {Code: "oc", English: "Occitan", Local: "occitan"}, + {Code: "oj", English: "Ojibwe", Local: "ᐊᓂᔑᓈᐯᒧᐎᓐ"}, + {Code: "om", English: "Oromo", Local: "Afaan Oromoo"}, + {Code: "or", English: "Oriya", Local: "ଓଡ଼ିଆ"}, + {Code: "os", English: "Ossetian", Local: "ирон æвзаг"}, + {Code: "pa", English: "Panjabi", Local: "ਪੰਜਾਬੀ"}, + {Code: "pi", English: "Pāli", Local: "पाऴि"}, + {Code: "pl", English: "Polish", Local: "Polski"}, + {Code: "ps", English: "Pashto", Local: "پښتو"}, + {Code: "pt", English: "Portuguese", Local: "Português"}, + {Code: "qu", English: "Quechua", Local: "Runa Simi"}, + {Code: "rm", English: "Romansh", Local: "rumantsch grischun"}, + {Code: "rn", English: "Kirundi", Local: "Ikirundi"}, + {Code: "ro", English: "Romanian", Local: "Română"}, + {Code: "ru", English: "Russian", Local: "Русский"}, + {Code: "rw", English: "Kinyarwanda", Local: "Ikinyarwanda"}, + {Code: "sa", English: "Sanskrit", Local: "संस्कृतम्"}, + {Code: "sc", English: "Sardinian", Local: "sardu"}, + {Code: "sd", English: "Sindhi", Local: "सिन्धी"}, + {Code: "se", English: "Northern Sami", Local: "Davvisámegiella"}, + {Code: "sg", English: "Sango", Local: "yângâ tî sängö"}, + {Code: "si", English: "Sinhala", Local: "සිංහල"}, + {Code: "sk", English: "Slovak", Local: "slovenčina"}, + {Code: "sl", English: "Slovenian", Local: "slovenščina"}, + {Code: "sn", English: "Shona", Local: "chiShona"}, + {Code: "so", English: "Somali", Local: "Soomaaliga"}, + {Code: "sq", English: "Albanian", Local: "Shqip"}, + {Code: "sr", English: "Serbian", Local: "српски језик"}, + {Code: "ss", English: "Swati", Local: "SiSwati"}, + {Code: "st", English: "Southern Sotho", Local: "Sesotho"}, + {Code: "su", English: "Sundanese", Local: "Basa Sunda"}, + {Code: "sv", English: "Swedish", Local: "Svenska"}, + {Code: "sw", English: "Swahili", Local: "Kiswahili"}, + {Code: "ta", English: "Tamil", Local: "தமிழ்"}, + {Code: "te", English: "Telugu", Local: "తెలుగు"}, + {Code: "tg", English: "Tajik", Local: "тоҷикӣ"}, + {Code: "th", English: "Thai", Local: "ไทย"}, + {Code: "ti", English: "Tigrinya", Local: "ትግርኛ"}, + {Code: "tk", English: "Turkmen", Local: "Türkmen"}, + {Code: "tl", English: "Tagalog", Local: "Wikang Tagalog"}, + {Code: "tn", English: "Tswana", Local: "Setswana"}, + {Code: "to", English: "Tonga", Local: "faka Tonga"}, + {Code: "tr", English: "Turkish", Local: "Türkçe"}, + {Code: "ts", English: "Tsonga", Local: "Xitsonga"}, + {Code: "tt", English: "Tatar", Local: "татар теле"}, + {Code: "tw", English: "Twi", Local: "Twi"}, + {Code: "ty", English: "Tahitian", Local: "Reo Tahiti"}, + {Code: "ug", English: "Uyghur", Local: "ئۇيغۇرچە‎"}, + {Code: "uk", English: "Ukrainian", Local: "Українська"}, + {Code: "ur", English: "Urdu", Local: "اردو"}, + {Code: "uz", English: "Uzbek", Local: "Ўзбек"}, + {Code: "ve", English: "Venda", Local: "Tshivenḓa"}, + {Code: "vi", English: "Vietnamese", Local: "Tiếng Việt"}, + {Code: "vo", English: "Volapük", Local: "Volapük"}, + {Code: "wa", English: "Walloon", Local: "walon"}, + {Code: "wo", English: "Wolof", Local: "Wollof"}, + {Code: "xh", English: "Xhosa", Local: "isiXhosa"}, + {Code: "yi", English: "Yiddish", Local: "ייִדיש"}, + {Code: "yo", English: "Yoruba", Local: "Yorùbá"}, + {Code: "za", English: "Zhuang", Local: "Saɯ cueŋƅ"}, + {Code: "zh", English: "Chinese", Local: "中文"}, + {Code: "zu", English: "Zulu", Local: "isiZulu"}, + {Code: "ast", English: "Asturian", Local: "Asturianu"}, + {Code: "ckb", English: "Sorani (Kurdish)", Local: "سۆرانی"}, + {Code: "jbo", English: "Lojban", Local: "la .lojban."}, + {Code: "kab", English: "Kabyle", Local: "Taqbaylit"}, + {Code: "kmr", English: "Kurmanji (Kurdish)", Local: "Kurmancî"}, + {Code: "ldn", English: "Láadan", Local: "Láadan"}, + {Code: "lfn", English: "Lingua Franca Nova", Local: "lingua franca nova"}, + {Code: "sco", English: "Scots", Local: "Scots"}, + {Code: "tok", English: "Toki Pona", Local: "toki pona"}, + {Code: "zba", English: "Balaibalan", Local: "باليبلن"}, + {Code: "zgh", English: "Standard Moroccan Tamazight", Local: "ⵜⴰⵎⴰⵣⵉⵖⵜ"}, +} diff --git a/util/util.go b/util/util.go index 64c30a9..133c1c2 100644 --- a/util/util.go +++ b/util/util.go @@ -82,7 +82,7 @@ func MakeDirs() { os.Exit(1) } dir := cd + "/tut" - err = os.Mkdir(dir, 0755) + err = os.MkdirAll(dir, os.ModePerm) if err != nil && !os.IsExist(err) { log.Printf("couldn't create dirs. Error: %v\n", err) os.Exit(1)