mirror of https://github.com/antonmedv/fx
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.4 KiB
Go
89 lines
1.4 KiB
Go
package jsonx
|
|
|
|
import (
|
|
"unicode/utf8"
|
|
|
|
"github.com/mattn/go-runewidth"
|
|
)
|
|
|
|
func DropWrapAll(n *Node) {
|
|
for n != nil {
|
|
if n.Value != nil && n.Value[0] == '"' {
|
|
n.dropChunks()
|
|
}
|
|
if n.IsCollapsed() {
|
|
n = n.Collapsed
|
|
} else {
|
|
n = n.Next
|
|
}
|
|
}
|
|
}
|
|
|
|
func WrapAll(n *Node, termWidth int) {
|
|
if termWidth <= 0 {
|
|
return
|
|
}
|
|
for n != nil {
|
|
if n.Value != nil && n.Value[0] == '"' {
|
|
n.dropChunks()
|
|
lines, count := doWrap(n, termWidth)
|
|
if count > 1 {
|
|
n.Chunk = lines[0]
|
|
for i := 1; i < count; i++ {
|
|
child := &Node{
|
|
directParent: n,
|
|
Depth: n.Depth,
|
|
Chunk: lines[i],
|
|
}
|
|
if n.Comma && i == count-1 {
|
|
child.Comma = true
|
|
}
|
|
n.insertChunk(child)
|
|
}
|
|
}
|
|
}
|
|
if n.IsCollapsed() {
|
|
n = n.Collapsed
|
|
} else {
|
|
n = n.Next
|
|
}
|
|
}
|
|
}
|
|
|
|
func doWrap(n *Node, termWidth int) ([][]byte, int) {
|
|
lines := make([][]byte, 0, 1)
|
|
width := int(n.Depth) * 2
|
|
|
|
if n.Key != nil {
|
|
for _, ch := range string(n.Key) {
|
|
width += runewidth.RuneWidth(ch)
|
|
}
|
|
width += 2 // for ": "
|
|
}
|
|
|
|
linesCount := 0
|
|
start, end := 0, 0
|
|
b := n.Value
|
|
|
|
for len(b) > 0 {
|
|
r, size := utf8.DecodeRune(b)
|
|
w := runewidth.RuneWidth(r)
|
|
if width+w > termWidth {
|
|
lines = append(lines, n.Value[start:end])
|
|
start = end
|
|
width = int(n.Depth) * 2
|
|
linesCount++
|
|
}
|
|
width += w
|
|
end += size
|
|
b = b[size:]
|
|
}
|
|
|
|
if start < end {
|
|
lines = append(lines, n.Value[start:])
|
|
linesCount++
|
|
}
|
|
|
|
return lines, linesCount
|
|
}
|