package text
import (
"bytes"
"github.com/yuin/goldmark/util"
)
var space = []byte (" " )
type Segment struct {
Start int
Stop int
Padding int
}
func NewSegment (start , stop int ) Segment {
return Segment {
Start : start ,
Stop : stop ,
Padding : 0 ,
}
}
func NewSegmentPadding (start , stop , n int ) Segment {
return Segment {
Start : start ,
Stop : stop ,
Padding : n ,
}
}
func (t *Segment ) Value (buffer []byte ) []byte {
if t .Padding == 0 {
return buffer [t .Start :t .Stop ]
}
result := make ([]byte , 0 , t .Padding +t .Stop -t .Start +1 )
result = append (result , bytes .Repeat (space , t .Padding )...)
return append (result , buffer [t .Start :t .Stop ]...)
}
func (t *Segment ) Len () int {
return t .Stop - t .Start + t .Padding
}
func (t *Segment ) Between (other Segment ) Segment {
if t .Stop != other .Stop {
panic ("invalid state" )
}
return NewSegmentPadding (
t .Start ,
other .Start ,
t .Padding -other .Padding ,
)
}
func (t *Segment ) IsEmpty () bool {
return t .Start >= t .Stop && t .Padding == 0
}
func (t *Segment ) TrimRightSpace (buffer []byte ) Segment {
v := buffer [t .Start :t .Stop ]
l := util .TrimRightSpaceLength (v )
if l == len (v ) {
return NewSegment (t .Start , t .Start )
}
return NewSegmentPadding (t .Start , t .Stop -l , t .Padding )
}
func (t *Segment ) TrimLeftSpace (buffer []byte ) Segment {
v := buffer [t .Start :t .Stop ]
l := util .TrimLeftSpaceLength (v )
return NewSegment (t .Start +l , t .Stop )
}
func (t *Segment ) TrimLeftSpaceWidth (width int , buffer []byte ) Segment {
padding := t .Padding
for ; width > 0 ; width -- {
if padding == 0 {
break
}
padding --
}
if width == 0 {
return NewSegmentPadding (t .Start , t .Stop , padding )
}
text := buffer [t .Start :t .Stop ]
start := t .Start
for _ , c := range text {
if start >= t .Stop -1 || width <= 0 {
break
}
if c == ' ' {
width --
} else if c == '\t' {
width -= 4
} else {
break
}
start ++
}
if width < 0 {
padding = width * -1
}
return NewSegmentPadding (start , t .Stop , padding )
}
func (t *Segment ) WithStart (v int ) Segment {
return NewSegmentPadding (v , t .Stop , t .Padding )
}
func (t *Segment ) WithStop (v int ) Segment {
return NewSegmentPadding (t .Start , v , t .Padding )
}
func (t *Segment ) ConcatPadding (v []byte ) []byte {
if t .Padding > 0 {
return append (v , bytes .Repeat (space , t .Padding )...)
}
return v
}
type Segments struct {
values []Segment
}
func NewSegments () *Segments {
return &Segments {
values : nil ,
}
}
func (s *Segments ) Append (t Segment ) {
if s .values == nil {
s .values = make ([]Segment , 0 , 20 )
}
s .values = append (s .values , t )
}
func (s *Segments ) AppendAll (t []Segment ) {
if s .values == nil {
s .values = make ([]Segment , 0 , 20 )
}
s .values = append (s .values , t ...)
}
func (s *Segments ) Len () int {
if s .values == nil {
return 0
}
return len (s .values )
}
func (s *Segments ) At (i int ) Segment {
return s .values [i ]
}
func (s *Segments ) Set (i int , v Segment ) {
s .values [i ] = v
}
func (s *Segments ) SetSliced (lo , hi int ) {
s .values = s .values [lo :hi ]
}
func (s *Segments ) Sliced (lo , hi int ) []Segment {
return s .values [lo :hi ]
}
func (s *Segments ) Clear () {
s .values = nil
}
func (s *Segments ) Unshift (v Segment ) {
s .values = append (s .values [0 :1 ], s .values [0 :]...)
s .values [0 ] = v
}
The pages are generated with Golds v0.8.2 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .