On Jun 7, 2010, at 5:10 PM, Jan Schenkel wrote:

--- On Mon, 6/7/10, Gregory Lypny <[email protected]> wrote:
Hello everyone,

I have a data field with many lines and I'd like to script
a handler that hilites every appearance of a particular word
in yellow?

Regards,

Gregory


It depends a bit on your definition of the term 'word' in this context.

The straightforward solution is to do a replace in the htmlText of the field, wrapping it with a font tag - but this simply hilites every occurence of the search string, rather than the whole word:
##
put the htmlText of field "Data" into tHtmlText
replace "foo" \
   with "<font bgcolor=" & quote & "yellow & quote & ">foo</font>" \
   in tHtmlText
set the htmlText of field "Data" to tHtmlText
##

If you're looking to hilite only complete words, your best option is the wordOffset function and a loop:
##
put the text of field 1 into tText
set the wholeMatches to true
put wordOffset(tWordToFind, tText) into tWordOffset
put 0 into tPrevOffset
repeat until tWordOffset = 0
 add tWordOffset to tPrevOffset
 set the backgroundColor of word tPrevOffset of field 1 to "yellow"
 put wordOffset(tWordToFind, tText, tPrevOffset) into tWordOffset
end repeat
##
If you leave the 'wholeMatches' local property at its default value of 'false' the above script hilites the entire word, if part of it matches tWordToFind.

HTH,

Jan Schenkel

Try something like this:

on mouseUp
   put fld "text" into tText
   put "the" into targetString
   put smartWordOffsets(targetString,tText) into wList
   repeat for each line w in wList
      set the backcolor of char (item 1 of w) to \
             (item 2 of w) of fld "text" to yellow
      -- or whatever formatting you want to do
   end repeat
end mouseUp

function smartWordOffsets targetString,tText
   -- returns a return-delimited list of chunk data
   -- for matches of targetString in tText:
   -- each line = <startChar>,<endChar>
   put length(targetString) into strLength
   put ".,?!$':;()#" & quote into puncList
   repeat for each char c in puncList
      replace c with space in tText
   end repeat
   -- the above handles the punctuation problem
   put offsets(targetString,tText) into offsList
   put empty into wList
   repeat for each item j in offsList
      put the number of words of char 1 to j of tText \
             into wdNbr
      put word wdNbr of tText into testWd
      if testWd <> targetString then next repeat
      -- whole matches only
      put j & comma & j+strLength-1 & cr after wList
   end repeat
   delete char -1 of wList
   return wList
end smartWordOffsets

function offsets str,cntr
   -- returns a comma-delimited list
   -- of all the offsets of str in cntr
   put "" into mosList
   put 0 into startPoint
   repeat
      put offset(str,cntr,startPoint) into os
      if os = 0 then exit repeat
      add os to startPoint
      put startPoint & "," after mosList
   end repeat
   if char -1 of mosList = "," then delete last char of mosList
   if mosList = "" then return "0"
   return mosList
end offsets

Despite several repeat loops, this is extremely fast.

-- Peter

Peter M. Brigham
[email protected]
http://home.comcast.net/~pmbrig


_______________________________________________
use-revolution mailing list
[email protected]
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to