Add FX_SHOW_SIZE config option

master
Anton Medvedev 2 years ago
parent 1198ae9984
commit 4d0dbf4b94

@ -65,6 +65,13 @@ func main() {
if termenv.ColorProfile() == termenv.Ascii { if termenv.ColorProfile() == termenv.Ascii {
theme = Themes["0"] theme = Themes["0"]
} }
var showSize bool
if s, ok := os.LookupEnv("FX_SHOW_SIZE"); ok {
if s == "true" {
showSize = true
}
}
stdinIsTty := isatty.IsTerminal(os.Stdin.Fd()) stdinIsTty := isatty.IsTerminal(os.Stdin.Fd())
stdoutIsTty := isatty.IsTerminal(os.Stdout.Fd()) stdoutIsTty := isatty.IsTerminal(os.Stdout.Fd())
filePath := "" filePath := ""
@ -165,6 +172,7 @@ func main() {
fileName: fileName, fileName: fileName,
theme: theme, theme: theme,
json: object, json: object,
showSize: showSize,
width: 80, width: 80,
height: 60, height: 60,
mouseWheelDelta: 3, mouseWheelDelta: 3,
@ -196,6 +204,7 @@ type model struct {
footerHeight int footerHeight int
wrap bool wrap bool
theme Theme theme Theme
showSize bool // Show number of elements in preview
fileName string fileName string
json interface{} json interface{}

@ -2,10 +2,11 @@ package main
import ( import (
"fmt" "fmt"
"strings"
. "github.com/antonmedv/fx/pkg/dict" . "github.com/antonmedv/fx/pkg/dict"
. "github.com/antonmedv/fx/pkg/json" . "github.com/antonmedv/fx/pkg/json"
"github.com/antonmedv/fx/pkg/theme" "github.com/antonmedv/fx/pkg/theme"
"strings"
) )
func (m *model) connect(path string, lineNumber int) { func (m *model) connect(path string, lineNumber int) {
@ -117,46 +118,61 @@ func (m *model) preview(v interface{}, path string, selectableValues bool) strin
if selectableValues && m.cursorPath() == path { if selectableValues && m.cursorPath() == path {
previewStyle = m.theme.Cursor previewStyle = m.theme.Cursor
} }
printValue := func(value interface{}) string { printValue := func(v interface{}) string {
switch value.(type) { switch v := v.(type) {
case nil, bool, Number: case nil, bool, Number:
return previewStyle(fmt.Sprintf("%v", value)) return previewStyle(fmt.Sprintf("%v", v))
case string: case string:
return previewStyle(fmt.Sprintf("%q", value)) return previewStyle(fmt.Sprintf("%q", v))
case *Dict: case *Dict:
return previewStyle("{\u2026}") if m.showSize {
return previewStyle(toLowerNumber(fmt.Sprintf("{\u2026%v\u2026}", len(v.Keys))))
} else {
return previewStyle("{\u2026}")
}
case Array: case Array:
return previewStyle("[\u2026]") if m.showSize {
return previewStyle(toLowerNumber(fmt.Sprintf("[\u2026%v\u2026]", len(v))))
} else {
return previewStyle("[\u2026]")
}
} }
return "..." return "..."
} }
switch v.(type) { switch v := v.(type) {
case *Dict: case *Dict:
output := m.printOpenBracket("{", searchResult, path, selectableValues) output := m.printOpenBracket("{", searchResult, path, selectableValues)
keys := v.(*Dict).Keys keys := v.Keys
for _, k := range keys { for _, k := range keys {
key := fmt.Sprintf("%q", k) key := fmt.Sprintf("%q", k)
output += previewStyle(key + ": ") output += previewStyle(key + ": ")
value, _ := v.(*Dict).Get(k) value, _ := v.Get(k)
output += printValue(value) output += printValue(value)
break break
} }
if len(keys) > 1 { if len(keys) > 1 {
output += previewStyle(", \u2026") if m.showSize {
output += previewStyle(toLowerNumber(fmt.Sprintf(", \u2026%v\u2026", len(v.Keys)-1)))
} else {
output += previewStyle(", \u2026")
}
} }
output += m.printCloseBracket("}", searchResult, path, selectableValues) output += m.printCloseBracket("}", searchResult, path, selectableValues)
return output return output
case Array: case Array:
output := m.printOpenBracket("[", searchResult, path, selectableValues) output := m.printOpenBracket("[", searchResult, path, selectableValues)
slice := v.(Array) for _, value := range v {
for _, value := range slice {
output += printValue(value) output += printValue(value)
break break
} }
if len(slice) > 1 { if len(v) > 1 {
output += previewStyle(", \u2026") if m.showSize {
output += previewStyle(toLowerNumber(fmt.Sprintf(", \u2026%v\u2026", len(v)-1)))
} else {
output += previewStyle(", \u2026")
}
} }
output += m.printCloseBracket("]", searchResult, path, selectableValues) output += m.printCloseBracket("]", searchResult, path, selectableValues)
return output return output

@ -2,6 +2,8 @@ package main
import ( import (
"fmt" "fmt"
"strings"
"github.com/charmbracelet/lipgloss" "github.com/charmbracelet/lipgloss"
) )
@ -33,3 +35,16 @@ func width(s string) int {
func accessor(path string, to interface{}) string { func accessor(path string, to interface{}) string {
return fmt.Sprintf("%v[%v]", path, to) return fmt.Sprintf("%v[%v]", path, to)
} }
func toLowerNumber(s string) string {
var out strings.Builder
for _, r := range s {
switch {
case '0' <= r && r <= '9':
out.WriteRune('\u2080' + (r - '\u0030'))
default:
out.WriteRune(r)
}
}
return out.String()
}

Loading…
Cancel
Save