You need to call $frame->expand( $argument ) on each argument value to get
the actual value. #if is an example of doing this
.
This structure is to allow dead code elimination. Any argument not expanded
is not processed which has an effect on efficiency. Most of the time that's
not something to worry about, but it makes a big difference for control
structures like #if.
I probably should have said Parser::SFH_OBJECT_ARGS instead of just
SFH_OBJECT_ARGS. I think the non class prefixed constant is deprecated.
--
Brian
On Monday, February 15, 2021, Yaron Koren <yaron(a)wikiworks.com> wrote:
Hi Brian,
Thank you! That... mostly worked. I added SFH_OBJECT_ARGS
to setFunctionHook(),and then the new $frame value passed in was indeed
easy to use - I just had to call $frame->getArgument('ParameterName')"
to
get the value for that template parameter.
Unfortunately, now I don't know how to get all of the actual arguments to
the parser function. Before, the call func_get_args() did that. Now,
neither that function, nor just getting the $args argument, seems to get
all the arguments - I think they get arguments that are entirely static,
but an argument like "flag image={{{Flag image|}}}" leads to a strange
structure within $args that doesn't seem to include the actual value. Is
there a fix for that?
-Yaron
On Mon, Feb 15, 2021 at 1:02 PM Brian Wolff <bawolff(a)gmail.com> wrote:
I think what you have to do is set the
SFH_OBJECT_ARGS flag in the third
argument of setFunctionHook.
That will change the function signature of your callback to ($parser,
$frame, $args). Note that $args might no longer be an array of strings but
PPNode (or something) stuff you may have to call $frame->expand() on (i
think. It was something like that).
This new form has a PPFrame object as a second arg. You should be able to
call $frame->getParent() on it which should give you what you need.
--
Brian
On Monday, February 15, 2021, Yaron Koren <yaron57(a)gmail.com> wrote:
Hi,
When you have a parser function called from within a template, you can
of course pass in to it any template parameters, like:
{{#flagicon:{{{Flag image|}}} }}
(This is a silly example, but bear with me.) I would like to instead be
able to call the parser function without the parameter, like this:
{{#flagicon:}}
...and have the parser function directly get the value of the "Flag
image" parameter.
I believe this can be done within Lua: when a Lua module is invoked from
a template, it can get the names and values of the parameters/arguments
that have been passed to that template using (I believe) code that looks
like the following:
frame = mw.getCurrentFrame()
origArgs = frame:getParent().args
I tried to do something similar within a parser function's code, using
various calls like the following, but nothing worked:
$frame = $parser->getPreProcessor()->newFrame()->newChild();
$args = $frame->getArguments();
Can this be done? Ideally, it would be great to get an array of all the
arguments that have been passed to the template - but just being able to
get the value for a specified parameter name would be good enough.
-Yaron
--
WikiWorks · MediaWiki Consulting ·
http://wikiworks.com
_______________________________________________
MediaWiki-l mailing list
To unsubscribe, go to:
https://lists.wikimedia.org/mailman/listinfo/mediawiki-l
--
WikiWorks · MediaWiki Consulting ·
http://wikiworks.com