[ic] interpolate

Kevin Walsh kevin at cursor.biz
Sat Mar 25 05:37:02 EST 2006


"Elver Loho" <elver.loho at gmail.com> wrote:
> On 3/24/06, Kevin Walsh <kevin at cursor.biz> wrote:
> > "Elver Loho" <elver.loho at gmail.com> wrote:
> > Well, firstly, it looks as if you're mixing positional and named
> > parameters.  You can either do [lc2 first second] or
> > [lc2 foo=first bar=second], but not mix the two.  That'll be
> > the reason why you always get the default message when you do that.
> 
> How do I unpack named variables? Right now am using my ($code, $message) = @_;
> 
If you have a UserTag like this:

    UserTag foobar Order foo bar baz

then you have three named arguments, which you can use like this:

    [foobar foo="aaa" bar="bbb" baz="ccc"]

You can put the args in any order you like.  The tag code will receive
them in the order you specified in the UserTag "Order" config.

In your UserTag code, you can collect the args like this:

    my ($foo,$bar,$baz) = @_;

The variable names are irrelevant, but it's useful to name them after
the Order values.

If you make your UserTag into a container, like this:

    UserTag foobar HasEndTag 1
    UserTag foobar Order     foo bar baz

then you can use your tag like this:

    [foobar foo="aaa" bar="bbb" baz="ccc"] Tag body [/foobar]

Now you have an extra argument, which you collect like this:

    my ($foo,$bar,$baz,$body) = @_;

If you want your tag body to be interpolated by default (no need
to specify interpolate=1) then you define it like this:

    UserTag foobar HasEndTag   1
    UserTag foobar Interpolate 1
    UserTag foobar Order       foo bar baz

You can also create "on the fly" tag arguments, like this:

    UserTag foobar HasEndTag   1
    UserTag foobar Interpolate 1
    UserTag foobar AddAttr     1
    UserTag foobar Order       foo bar baz

Your collection for the above should look like this:

    my ($foo,$bar,$baz,$body,$opt) = @_;

With AddAttr, you can pass an argument that's not in your "Order"
list and see it in your tag code, for instance:

    [foobar foo="aaa" kevin="bbb"] Tag body [/foobar]

In the above case, $foo will be "aaa", $bar and $baz will be undef.
$body will be " Tag body " and $opt->{kevin} will be "bbb".  Note that
$opt is a hashref.

There are lots of other things you can do, but this article is probably
long enough for the moment. :-)

-- 
   _/   _/  _/_/_/_/  _/    _/  _/_/_/  _/    _/
  _/_/_/   _/_/      _/    _/    _/    _/_/  _/   K e v i n   W a l s h
 _/ _/    _/          _/ _/     _/    _/  _/_/    kevin at cursor.biz
_/   _/  _/_/_/_/      _/    _/_/_/  _/    _/


More information about the interchange-users mailing list