Browse Source

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
pull/184/head 1.0.18
Rasmus Lindroth 3 years ago committed by GitHub
parent
commit
b2ec9b546b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 4
      config.example.ini
  2. 3
      config/config.go
  3. 4
      config/default_config.go
  4. 26
      go.mod
  5. 47
      go.sum
  6. 2
      main.go
  7. 58
      ui/composeview.go
  8. 4
      ui/input.go
  9. 3
      ui/item.go
  10. 1
      ui/item_list.go
  11. 204
      util/langs.go
  12. 2
      util/util.go

4
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'

3
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)

4
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'

26
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
)

47
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=

2
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")

58
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 {

4
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(

3
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 {

1
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)))

204
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: "ⵜⴰⵎⴰⵣⵉⵖⵜ"},
}

2
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)

Loading…
Cancel
Save