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 }