Move wcswidth into its own package as it is very slow to build
This commit is contained in:
parent
5dca2a1a25
commit
5703a3370e
2
.gitattributes
vendored
2
.gitattributes
vendored
@ -15,7 +15,7 @@ kittens/diff/options/parse.py linguist-generated=true
|
|||||||
glfw/*.c linguist-vendored=true
|
glfw/*.c linguist-vendored=true
|
||||||
glfw/*.h linguist-vendored=true
|
glfw/*.h linguist-vendored=true
|
||||||
kittens/unicode_input/names.h linguist-generated=true
|
kittens/unicode_input/names.h linguist-generated=true
|
||||||
tools/tui/wcwidth-std.go linguist-generated=true
|
tools/wcswidth/std.go linguist-generated=true
|
||||||
|
|
||||||
*.py text diff=python
|
*.py text diff=python
|
||||||
*.m text diff=objc
|
*.m text diff=objc
|
||||||
|
|||||||
@ -21,7 +21,7 @@ kitty/options/parse.py
|
|||||||
kitty/options/to-c-generated.h
|
kitty/options/to-c-generated.h
|
||||||
kittens/diff/options/types.py
|
kittens/diff/options/types.py
|
||||||
kittens/diff/options/parse.py
|
kittens/diff/options/parse.py
|
||||||
tools/tui/wcwidth-std.go
|
tools/wcswidth/std.go
|
||||||
'''
|
'''
|
||||||
|
|
||||||
ignored = []
|
ignored = []
|
||||||
|
|||||||
@ -560,10 +560,10 @@ def gen_wcwidth() -> None:
|
|||||||
else:
|
else:
|
||||||
p('\treturn 1;\n}')
|
p('\treturn 1;\n}')
|
||||||
|
|
||||||
with create_header('kitty/wcwidth-std.h') as p, open('tools/tui/wcwidth-std.go', 'w') as gof:
|
with create_header('kitty/wcwidth-std.h') as p, open('tools/wcswidth/std.go', 'w') as gof:
|
||||||
gop = partial(print, file=gof)
|
gop = partial(print, file=gof)
|
||||||
gop('package tui\n\n')
|
gop('package wcswidth\n\n')
|
||||||
gop('func Wcwidth(code rune) int {')
|
gop('func Runewidth(code rune) int {')
|
||||||
p('static inline int\nwcwidth_std(int32_t code) {')
|
p('static inline int\nwcwidth_std(int32_t code) {')
|
||||||
p('\tif (LIKELY(0x20 <= code && code <= 0x7e)) { return 1; }')
|
p('\tif (LIKELY(0x20 <= code && code <= 0x7e)) { return 1; }')
|
||||||
p('\tswitch(code) {')
|
p('\tswitch(code) {')
|
||||||
|
|||||||
@ -16,8 +16,8 @@ import (
|
|||||||
|
|
||||||
"kitty"
|
"kitty"
|
||||||
"kitty/tools/tty"
|
"kitty/tools/tty"
|
||||||
"kitty/tools/tui"
|
|
||||||
"kitty/tools/utils"
|
"kitty/tools/utils"
|
||||||
|
"kitty/tools/wcswidth"
|
||||||
)
|
)
|
||||||
|
|
||||||
var RootCmd *cobra.Command
|
var RootCmd *cobra.Command
|
||||||
@ -120,7 +120,7 @@ func format_line_with_indent(output io.Writer, text string, indent string, scree
|
|||||||
var escapes strings.Builder
|
var escapes strings.Builder
|
||||||
|
|
||||||
print_word := func(r rune) {
|
print_word := func(r rune) {
|
||||||
w := tui.Wcswidth(current_word.String())
|
w := wcswidth.Stringwidth(current_word.String())
|
||||||
if x+w > screen_width {
|
if x+w > screen_width {
|
||||||
fmt.Fprintln(output)
|
fmt.Fprintln(output)
|
||||||
fmt.Fprint(output, indent)
|
fmt.Fprint(output, indent)
|
||||||
|
|||||||
@ -18,6 +18,7 @@ import (
|
|||||||
"kitty/tools/cli"
|
"kitty/tools/cli"
|
||||||
"kitty/tools/crypto"
|
"kitty/tools/crypto"
|
||||||
"kitty/tools/tty"
|
"kitty/tools/tty"
|
||||||
|
"kitty/tools/tui"
|
||||||
"kitty/tools/utils"
|
"kitty/tools/utils"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -255,10 +256,9 @@ func get_password(password string, password_file string, password_env string, us
|
|||||||
if ans == "" && password_file != "" {
|
if ans == "" && password_file != "" {
|
||||||
if password_file == "-" {
|
if password_file == "-" {
|
||||||
if tty.IsTerminal(os.Stdin.Fd()) {
|
if tty.IsTerminal(os.Stdin.Fd()) {
|
||||||
var q string
|
ans, err = tui.ReadPassword("Password: ", false)
|
||||||
q, err = tty.ReadPassword("Password: ")
|
if err != nil {
|
||||||
if err == nil {
|
return
|
||||||
ans = string(q)
|
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var q []byte
|
var q []byte
|
||||||
|
|||||||
@ -4,6 +4,8 @@ import (
|
|||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
|
"kitty/tools/wcswidth"
|
||||||
)
|
)
|
||||||
|
|
||||||
type KilledBySignal struct {
|
type KilledBySignal struct {
|
||||||
@ -25,9 +27,9 @@ func ReadPassword(prompt string, kill_if_signaled bool) (password string, err er
|
|||||||
loop.OnInitialize = func(loop *Loop) string { return "\r\n" }
|
loop.OnInitialize = func(loop *Loop) string { return "\r\n" }
|
||||||
|
|
||||||
loop.OnText = func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error {
|
loop.OnText = func(loop *Loop, text string, from_key_event bool, in_bracketed_paste bool) error {
|
||||||
old_width := Wcswidth(password)
|
old_width := wcswidth.Stringwidth(password)
|
||||||
password += text
|
password += text
|
||||||
new_width := Wcswidth(password)
|
new_width := wcswidth.Stringwidth(password)
|
||||||
if new_width > old_width {
|
if new_width > old_width {
|
||||||
extra := strings.Repeat("*", new_width-old_width)
|
extra := strings.Repeat("*", new_width-old_width)
|
||||||
loop.QueueWriteString(extra)
|
loop.QueueWriteString(extra)
|
||||||
@ -40,9 +42,9 @@ func ReadPassword(prompt string, kill_if_signaled bool) (password string, err er
|
|||||||
if event.MatchesPressOrRepeat("backscape") || event.MatchesPressOrRepeat("delete") {
|
if event.MatchesPressOrRepeat("backscape") || event.MatchesPressOrRepeat("delete") {
|
||||||
event.Handled = true
|
event.Handled = true
|
||||||
if len(password) > 0 {
|
if len(password) > 0 {
|
||||||
old_width := Wcswidth(password)
|
old_width := wcswidth.Stringwidth(password)
|
||||||
password = password[:len(password)-1]
|
password = password[:len(password)-1]
|
||||||
new_width := Wcswidth(password)
|
new_width := wcswidth.Stringwidth(password)
|
||||||
delta := new_width - old_width
|
delta := new_width - old_width
|
||||||
if delta > 0 {
|
if delta > 0 {
|
||||||
if delta > len(shadow) {
|
if delta > len(shadow) {
|
||||||
|
|||||||
4
tools/tui/wcwidth-std.go → tools/wcswidth/std.go
generated
4
tools/tui/wcwidth-std.go → tools/wcswidth/std.go
generated
@ -1,6 +1,6 @@
|
|||||||
package tui
|
package wcswidth
|
||||||
|
|
||||||
func Wcwidth(code rune) int {
|
func Runewidth(code rune) int {
|
||||||
switch code {
|
switch code {
|
||||||
// Flags (26 codepoints) {{{
|
// Flags (26 codepoints) {{{
|
||||||
case 0x1f1e6, 0x1f1e7, 0x1f1e8, 0x1f1e9, 0x1f1ea, 0x1f1eb, 0x1f1ec, 0x1f1ed, 0x1f1ee, 0x1f1ef, 0x1f1f0, 0x1f1f1, 0x1f1f2, 0x1f1f3, 0x1f1f4, 0x1f1f5, 0x1f1f6, 0x1f1f7, 0x1f1f8, 0x1f1f9, 0x1f1fa, 0x1f1fb, 0x1f1fc, 0x1f1fd, 0x1f1fe, 0x1f1ff:
|
case 0x1f1e6, 0x1f1e7, 0x1f1e8, 0x1f1e9, 0x1f1ea, 0x1f1eb, 0x1f1ec, 0x1f1ed, 0x1f1ee, 0x1f1ef, 0x1f1f0, 0x1f1f1, 0x1f1f2, 0x1f1f3, 0x1f1f4, 0x1f1f5, 0x1f1f6, 0x1f1f7, 0x1f1f8, 0x1f1f9, 0x1f1fa, 0x1f1fb, 0x1f1fc, 0x1f1fd, 0x1f1fe, 0x1f1ff:
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package tui
|
package wcswidth
|
||||||
|
|
||||||
func IsFlagCodepoint(ch rune) bool {
|
func IsFlagCodepoint(ch rune) bool {
|
||||||
return 0x1F1E6 <= ch && ch <= 0x1F1FF
|
return 0x1F1E6 <= ch && ch <= 0x1F1FF
|
||||||
@ -71,7 +71,7 @@ func (self *WCWidthIterator) Step(ch rune) int {
|
|||||||
if IsFlagCodepoint(ch) {
|
if IsFlagCodepoint(ch) {
|
||||||
self.state = flag_pair_started
|
self.state = flag_pair_started
|
||||||
}
|
}
|
||||||
w := Wcwidth(ch)
|
w := Runewidth(ch)
|
||||||
switch w {
|
switch w {
|
||||||
case -1:
|
case -1:
|
||||||
case 0:
|
case 0:
|
||||||
@ -102,7 +102,7 @@ func (self *WCWidthIterator) Step(ch rune) int {
|
|||||||
return ans
|
return ans
|
||||||
}
|
}
|
||||||
|
|
||||||
func Wcswidth(text string) int {
|
func Stringwidth(text string) int {
|
||||||
var w WCWidthIterator
|
var w WCWidthIterator
|
||||||
ans := 0
|
ans := 0
|
||||||
for _, ch := range []rune(text) {
|
for _, ch := range []rune(text) {
|
||||||
@ -1,4 +1,4 @@
|
|||||||
package tui
|
package wcswidth
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"testing"
|
"testing"
|
||||||
@ -7,13 +7,13 @@ import (
|
|||||||
func TestWCSWidth(t *testing.T) {
|
func TestWCSWidth(t *testing.T) {
|
||||||
|
|
||||||
wcswidth := func(text string, expected int) {
|
wcswidth := func(text string, expected int) {
|
||||||
if w := Wcswidth(text); w != expected {
|
if w := Stringwidth(text); w != expected {
|
||||||
t.Fatalf("The width for %#v was %d instead of %d", text, w, expected)
|
t.Fatalf("The width for %#v was %d instead of %d", text, w, expected)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
wcwidth := func(text string, widths ...int) {
|
wcwidth := func(text string, widths ...int) {
|
||||||
for i, q := range []rune(text) {
|
for i, q := range []rune(text) {
|
||||||
if w := Wcwidth(q); w != widths[i] {
|
if w := Runewidth(q); w != widths[i] {
|
||||||
t.Fatalf("The width of the char: U+%x was %d instead of %d", q, w, widths[i])
|
t.Fatalf("The width of the char: U+%x was %d instead of %d", q, w, widths[i])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user