github.com/jmigpin/editor@v1.6.0/util/drawutil/drawer4/wordhighlight.go (about)

     1  package drawer4
     2  
     3  import (
     4  	"github.com/jmigpin/editor/util/iout/iorw"
     5  )
     6  
     7  func updateWordHighlightWord(d *Drawer) {
     8  	if !d.Opt.WordHighlight.On {
     9  		return
    10  	}
    11  	if !d.Opt.Cursor.On {
    12  		return
    13  	}
    14  
    15  	if d.opt.wordH.updatedWord {
    16  		return
    17  	}
    18  	d.opt.wordH.updatedWord = true
    19  
    20  	// find word
    21  	d.opt.wordH.word = nil
    22  	ci := d.opt.cursor.offset
    23  	rd := iorw.NewLimitedReaderAtPad(d.reader, ci, ci, 250)
    24  	word, _, err := iorw.WordAtIndex(rd, ci)
    25  	if err != nil {
    26  		return
    27  	}
    28  	d.opt.wordH.word = word
    29  }
    30  
    31  //----------
    32  
    33  func updateWordHighlightOps(d *Drawer) {
    34  	if !d.Opt.WordHighlight.On {
    35  		d.Opt.WordHighlight.Group.Ops = nil
    36  		return
    37  	}
    38  
    39  	if d.opt.wordH.updatedOps {
    40  		return
    41  	}
    42  	d.opt.wordH.updatedOps = true
    43  
    44  	d.Opt.WordHighlight.Group.Ops = wordHOps(d)
    45  }
    46  
    47  func wordHOps(d *Drawer) []*ColorizeOp {
    48  	word := d.opt.wordH.word
    49  	if word == nil {
    50  		return nil
    51  	}
    52  
    53  	// offsets to search
    54  	o, n, _, _ := d.visibleLen()
    55  	a, b := o, o+n
    56  	a -= len(word)
    57  	b += len(word)
    58  
    59  	// limits
    60  	a0 := d.reader.Min()
    61  	if a < a0 {
    62  		a = a0
    63  	}
    64  	b0 := d.reader.Max()
    65  	if b > b0 {
    66  		b = b0
    67  	}
    68  
    69  	// search
    70  	var ops []*ColorizeOp
    71  	for i := a; i < b; {
    72  		// find word
    73  		rd := iorw.NewLimitedReaderAt(d.reader, i, b)
    74  		j, _, err := iorw.Index(rd, i, word, false)
    75  		if err != nil {
    76  			return nil
    77  		}
    78  		if j < 0 {
    79  			break
    80  		}
    81  
    82  		// isolated word
    83  		if iorw.WordIsolated(d.reader, j, len(word)) {
    84  			op1 := &ColorizeOp{
    85  				Offset: j,
    86  				Fg:     d.Opt.WordHighlight.Fg,
    87  				Bg:     d.Opt.WordHighlight.Bg,
    88  			}
    89  			op2 := &ColorizeOp{Offset: j + len(word)}
    90  			ops = append(ops, op1, op2)
    91  		}
    92  
    93  		i = j + len(word)
    94  	}
    95  	return ops
    96  }