The trick here (useful in a wide variety of situations) is to use a $list
widget with a filter consisting of a “tiddler list” of the items you want to loop over, here the field names. We'll assign these to the variable field
, and pass that variable's value as the parameter to the contact-info-item
procedure:
\procedure contact-info-item(field)
<% if [all[current]has<field>] %>
<li>
''<<field>>'':
<$transclude $field=<<field>>/>
</li>
<% endif %>
\end
<ul>
<$list filter="email phone family manager" variable="field">
<$transclude $variable="contact-info-item" field=<<field>> />
</$list>
</ul>
One can imagine taking this even further, getting the actual procedure call down to a single line:
\procedure contact-info-item(field)
<% if [all[current]has<field>] %>
<li>
''<<field>>'':
<$transclude $field=<<field>>/>
</li>
<% endif %>
\end
\procedure contact-info(fields)
<ul>
<$list filter=<<fields>> variable="field">
<$transclude $variable="contact-info-item" field=<<field>>/>
</$list>
</ul>
\end
<<contact-info "email phone family manager">>
...but at some point, adding additional layers of abstraction makes your wikitext harder to understand, rather than easier.