|
| 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 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):
|