Module talk:Template wrapper
using positional parameters
editThis module was initially written so that positional parameters in the wrapper template are not passed on to the working template. That's fine for templates like the cs1|2 templates because they do not use positional parameters but is problematic for templates like {{ERIC}}
which wraps {{Catalog_lookup_link}}
.
So I've invented a new parameter for Module:template wrapper: |_pass-all=
which when set to yes
in the module {{#invoke:}}
causes the module to pass all wrapper-template parameters except those listed in |_exclude=
to the working template. Here is {{ERIC/sandbox}}
which uses Module:template wrapper/sandbox with |_pass-all=yes
to wrap {{Catalog_lookup_link/sandbox}}
which invokes Module:Catalog_lookup_link/sandbox:
Here is {{EFloras/sandbox2}}
which uses Module:template wrapper/sandbox without |_pass-all=
to wrap {{cite web}}
which invokes Module:Citation/CS1. Positional parameters are used by {{EFloras}}
and not passed to {{cite web}}
:
{{EFloras/sandbox2|1|233501007|Quercus alba |volume=3 |first=Kevin C. |last=Nixon | access-date = 18 August 2018 }}
- Nixon, Kevin C. (1997). "Quercus alba". Flora of North America North of Mexico (FNA). Vol. 3. New York and Oxford. Retrieved 18 August 2018 – via eFloras.org, Missouri Botanical Garden, St. Louis, MO & Harvard University Herbaria, Cambridge, MA.
{{citation}}
: External link in
(help); Unknown parameter|via=
|editors=
ignored (|editor=
suggested) (help)CS1 maint: location missing publisher (link)
- Nixon, Kevin C. (1997). "Quercus alba". Flora of North America North of Mexico (FNA). Vol. 3. New York and Oxford. Retrieved 18 August 2018 – via eFloras.org, Missouri Botanical Garden, St. Louis, MO & Harvard University Herbaria, Cambridge, MA.
Compare the live {{Efloras}}
:
{{EFloras|1|233501007|Quercus alba |volume=3 |first=Kevin C. |last=Nixon | access-date = 18 August 2018 }}
- Nixon, Kevin C. (1997). "Quercus alba". In Flora of North America Editorial Committee (ed.). Flora of North America North of Mexico (FNA). Vol. 3. New York and Oxford: Oxford University Press. Retrieved 18 August 2018 – via eFloras.org, Missouri Botanical Garden, St. Louis, MO & Harvard University Herbaria, Cambridge, MA.
What have I missed?
—Trappist the monk (talk) 11:29, 19 August 2018 (UTC)
- Unless I'm misunderstanding something, the below looks like it will add all the positional
pframe_args
regardless of|_exclude=
orunset
.I think the below would do what you intend.if pass_all then for i, v in ipairs (pframe_args) do add_parameter (i, v, args, list); end end
It might make more sense to uselocal function pframe_args_get (pframe_args, args, exclude, pass_all, list) for k, v in pairs (pframe_args) do if (pass_all or type (k) ~= 'number') and not is_in_table (exclude, k) then -- do not pass along excluded parameters if v and ('' ~= v) then -- pass along only those parameters that have assigned values if 'unset' == v:lower() then -- special keyword to unset 'default' parameters set in the wrapper template v = ''; -- unset the value in the args table end add_parameter (k, v, args, list) -- add all other parameters to args in the style dictated by list end end end end
|_pass_positional=
instead of|_pass-all=
since|_exclude=
still applies.frame_args_get
should also be adjusted so that the new parameter isn't passed. — JJMC89 (T·C) 18:11, 19 August 2018 (UTC)- I did not intend that positional parameters should be excludable. Perhaps they could be but how is that properly handled? If we pass
{{{1}}}
and exclude{{{2}}}
what do we do with{{{3}}}
et seq.? Does{{{3}}}
become the new{{{2}}}
? I just didn't want to venture along that cow track until there is a demonstrated need to go there.
- I did not intend that positional parameters should be excludable. Perhaps they could be but how is that properly handled? If we pass
-
- I didn't consider the possibility of a positional parameter having the
unset
value. I'll fix that.
- I didn't consider the possibility of a positional parameter having the
-
- Using
ipairs()
as I did ensures that empty positional parameters are passed along to the working template. In thepairs()
version, theif v and ('' ~= v) then
prevents empty positional parameters from being added to theargs
table.
- Using
-
- I overlooked adding
|_pass-all=
toframe_args_get()
; I'll do that. As you can see I was not very successful in finding a good parameter name.|_pass-all=
is the shortest I could come up with and was, I felt, marginally better than|_pass-positional=
which I felt implied 'only' but was shorter than|_include-positional=
which was the best in terms of describing what it does at the expense of length; I was hoping for a single word but was unable to find one that is suitable. I'll change to|_include-positional=
. - —Trappist the monk (talk) 21:29, 19 August 2018 (UTC)
- I misunderstood your comment in the module then. Let's not let positional parameters be excluded with
|_include-positional=
; I agree it would be difficult to properly handle. I made this edit. I think the sandbox looks good now. — JJMC89 (T·C) 21:53, 19 August 2018 (UTC)- Yeah, we edit conflicted over that. I've updated the live module.
- —Trappist the monk (talk) 22:36, 19 August 2018 (UTC)
- @Trappist the monk: Potentially a dumb question, but is there a way to pass all but one positional parameter? I tried a bunch of ways to exclude positional parameter "1" in Template:Multiref2/sandbox before reading this discussion. If there's not a clean solution, I'll leave it as is. Rjjiii (talk) 02:39, 12 July 2023 (UTC)
- I don't think so. But why would you want to? Positional parameters have meaning so suppressing
{{{1}}}
in the call to the working template 'bumps' the subsequent positional parameters: wrapper template{{{2}}}
becomes working template{{{1}}}
and so on. For{{multiref2}}
that doesn't much matter but for other templates it can make a hash of things. - I think that you will need to make a very strong case for a modification to this module.
- —Trappist the monk (talk) 13:07, 12 July 2023 (UTC)
- Gotcha, I'm not asking for a modification, just making sure that I understand how the module works. Rjjiii (talk) 19:20, 12 July 2023 (UTC)
- An additional follow-up: On second thought, it made more sense to style the first positional reference rather than filter it out. Disregard my confusion above. Rjjiii (talk) 06:48, 16 July 2023 (UTC)
- I don't think so. But why would you want to? Positional parameters have meaning so suppressing
- @Trappist the monk: Potentially a dumb question, but is there a way to pass all but one positional parameter? I tried a bunch of ways to exclude positional parameter "1" in Template:Multiref2/sandbox before reading this discussion. If there's not a clean solution, I'll leave it as is. Rjjiii (talk) 02:39, 12 July 2023 (UTC)
- I misunderstood your comment in the module then. Let's not let positional parameters be excluded with
- I overlooked adding
support for aliasing and parameter name reuse;
editI have added code so that the wrapper templates can support parameter aliasing and same-name reuse. Also updated the documentation. Existing applications should not notice the change. But, famous last words, those, report anomalies here.
_substall
edit@Pppery: If you are going to make changes to this module, please document those changes both in the code and in the doc page.
Please explain this:
if mw.isSubsting() and frame.args._substall == "no" then return require("Module:Template invocation").invocation(template, args) else return frame:expandTemplate {title=template, args=args}; -- render the working template end
How is the one different from the other?
—Trappist the monk (talk) 19:09, 19 February 2019 (UTC)
- One of those actually transcludes the template, whereas the other one returns a wikitext version of the template. The purpose of that edit was, as I explained in the edit summary, to make this module easier to use for substituted templates. To demonstrate this, support you have a template {{X1}}, which contains the code
{{#invoke:Template wrapper|wrap|_template=X2|xxx=yyy|_substall={{{_substall}}}|_exclude=_substall}}
. If|_substall=no
is specified, then substing Template:X1 will produce a transclusion of Template:X2, as opposed to a substitution of Template:X2 which is produced without the _substall param. {{3x|p}}ery (talk) 19:14, 19 February 2019 (UTC)- @Pppery: If you are going to make changes to this module, please document those changes both in the code and in the doc page.
- —Trappist the monk (talk) 15:59, 22 February 2019 (UTC)
- A substitute option would indeed be really useful. I see your edit summary when you reverted. Are these problems surmountable? — Martin (MSGJ · talk) 12:32, 8 February 2024 (UTC)