14.7.1 Dynamic Replace Strings | |
Sometimes a constant replace string isn't enough. The replace text may vary depending on the context of the search hit. Even the special replace characters available in <sandr> like \1 may not be enough. In such situations we want complete control over what the replace text is, at every instance. We can use <fmtcp SANDCALL> for this.
Let's say we have a chunk of text that contains some double-quoted sections. We want to print this in HTML, and turn the double-quoted sections into bold. Simple: replace quote, text, quote with open-bold-tag, text, close-bold-tag. An astute REX user can accomplish this with a single <sandr> :
<sandr '>>"=!"*"' "<B>\2</B>" $text> |
But that assumes all the sections are properly double-quoted. We have human-written text, so of course it's inconsistent. Some sections are quoted with pairs of single-quotes instead, or a pair of backquotes, or even various combinations.
Writing <sandr> expressions to cover all these possibilities is cumbersome. All we really need to know is whether each match is a start or end quote. With <fmtcp SANDCALL> we can keep track of this:
(Run this example. Download the source.)
<SCRIPT LANGUAGE=vortex> <A NAME=main PUBLIC> <FORM METHOD=post ACTION=$url/markup.html> Enter text with double-quoted sections:<BR> <TEXTAREA NAME=text ROWS=5 COLS=60>$text</TEXTAREA><BR> <INPUT TYPE=submit> </FORM> </A> <A NAME=markup PUBLIC> <main> <P>Formatted text:<P> <$search = '"' "''" "``"> <fmtcp SANDCALL $search boldit> <sb><PRE>$text</PRE></sb> </A> <A NAME=boldit PRIVATE> <IF $inq eq "y"></B><$inq = "n"><ELSE><B><$inq = "y"></IF> </A> </SCRIPT> |
In our example, we accept the raw text from the user with a form and submit it to the <markup> function.
In <markup> , we use <fmtcp nbsp;SANDCALL> to search for all the possible start and end quote strings. For each, instead of a constant replace string, we call the function <boldit> to print the replace string. Then we start markup with <sb> as before.
The <boldit> function will get called for each quote string in $tex t. We print either an open or close bold tag to replace it. Which one depends on the state of the $inq variable: if y , we're currently inside a quoted section, so we end it with a close tag. Otherwise, we're outside a quoted section, so we start one with an open tag.
Let's run our example with some text (next page):
Back: In-line Search and Replace | Next: Dynamic Replace Strings - Continued |