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