Okay, folks, here's the link to see it work:

http://cf.moonbow.com/doom/hilite.cfm

Please note that this still has a few caveats:

**it can break tags already in the text run thru it; that is, if you have
<span> tags already there, highlighting "pan" will break them
**it won't highlight one of the words if two in the wordlist share letters;
that is, if you have "roomate" (note misspelling) and search "room,mate" it
won't highlight the whole word, just "room"
**if you put spaces in the list, it does search for those spaces, so be sure
you meant for them to be there; that was true of previous versions, too

The short version is that I replaced recursion with a single regex call.
Since regex is supposed to be my thing (I am the ninja, after all) I thought
I'd let the engine do the heavy lifting.

If anyone wants to submit this to CFLib, feel free.  Just make sure I get
credit (ie leave my comments).

On a geeky note, to Ray:  if you can do it with tail recursion (which you
did) you can do it iteratively, which generally has less overhead.  I only
point it out because my CS profs beat it into me, as I kept doing the same
thing.  :-)  Here, I avoid both recursion and iteration and let the regex
engine handle it.

Anyway, here's the code :

<cfscript>
/**
 * Applies a simple highlight to a word in a string.
 *
 * @param string   The string to format.
 * @param word   The word to highlight.
 * @param front   This is the HTML that will be placed in front of the
highlighted match. It defaults to <span style=
 * @param back   This is the HTML that will be placed at the end of the
highlighted match. Defaults to </span>
 * @param matchCase   If true, the highlight will only match when the case
is the same. Defaults to false.
 * @author Raymond Camden ([EMAIL PROTECTED])
 * @version 1, July 30, 2001
 */
function highLight(str, wordList) {


/**
 * Modification by Kevin Graeme
 * Added a class descriptor called "hlt" to the global css styles,
 * and changed the span style from a direct style to a called class.
 * This resolves a Netscape 4.x CSS implementation problem.
*/
/* var front = "<span style=""background-color: yellow;"">"; */
var front = "<span class=""hlt"">";
var back = "</span>";
var matchCase = false;
var newwordlist = listchangedelims(wordlist, '|');  // added by Ben -- see
comment below

//check for empty word list, this is the base condition for the recursion
if(ListLen(wordList) Lt 1)
return str;
else
word = ListFirst(wordList);

if(ArrayLen(arguments) GTE 3) front = arguments[3];
if(ArrayLen(arguments) GTE 4) back = arguments[4];
if(ArrayLen(arguments) GTE 5) matchCase = arguments[5];


/**
 * Modification by Benjamin Doom
 * Moonbow Software, Inc.
 * This will run faster and prevent overwrites of span calls.
*/

/*
if(Not matchCase)
CurTxt = REReplaceNoCase(str,"(#word#)","#front#\1#back#","ALL");
else
CurTxt = REReplace(str,"(#word#)","#front#\1#back#","ALL");

return Highlight(CurTxt, ListRest(wordList), front, back, matchCase);
*/

if (matchCase) {
        return rereplace(str, "(#newwordlist#)", "#front#\1#back#", "all"); }
else {
        return rereplacenocase(str, "(#newwordlist#)", "#front#\1#back#", "all"); }


}

</cfscript>


--  Ben Doom
    Programmer & General Lackey
    Moonbow Software, Inc

: -----Original Message-----
: From: Deanna Schneider [mailto:[EMAIL PROTECTED]
: Sent: Monday, September 08, 2003 1:43 PM
: To: CF-Community
: Subject: highlight UDF
:
:
: Hey folks,
: I suck at regex, which is why I helped sponsor that little tool that Mike
: found, but I'm still having trouble figuring this out. And, since it was
: originally written by Raymond, I thought I'd throw this out here.
:
: There's this UDF, which we already modified once to use a span
: class instead
: of just a simple background color, that highlights a search term. But, if
: the search term happens to contain the letters inside the span, like say,
: for instance, if someone searchs for "pan", the UDF overwrites the span
: text. I'm sure there's a way to write the regex to look for the
: search term
: except when it's in this "<span class="hlt">anythinghere</span>"
: but I don't
: know how to do it. Here's the UDF:

<snip />


~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~|
Archives: http://www.houseoffusion.com/lists.cfm?link=t:5
Subscription: http://www.houseoffusion.com/lists.cfm?link=s:5
Unsubscribe: http://www.houseoffusion.com/cf_lists/unsubscribe.cfm?user=89.70.5

This list and all House of Fusion resources hosted by CFHosting.com. The place for 
dependable ColdFusion Hosting.
http://www.cfhosting.com

Reply via email to