Tim Starling <tstarling <at> wikimedia.org> writes:
{{subst:!}} no longer works as a separator between parser function parameters, it just works as a literal character. Welcome to MediaWiki 1.12.
Seems like it was intended to be the | in [[category:foo|bar]], except that someone forgot a | from the code. Correctly it would be:
{{{{{subst|}}}#if:{{{par1|}}}|[[Category:{{{par1}}}{{{{{subst|}}}#if: {{{key1|}}}|{{{{{subst|}}}!}}{{{key1}}}}}]] <!-- bpar1 --> }}{{{{{subst|}}}#if:{{{par2|}}}|[[Category:{{{par2}}}{{{{{subst|}}}#if: {{{key2|}}}|{{{{{subst|}}}!}}{{{key2}}}}}]] <!-- bpar2 --> }}{{{{{subst|}}}#if:{{{par3|}}}|[[Category:{{{par3}}}{{{{{subst|}}}#if: {{{key3|}}}|{{{{{subst|}}}!}}{{{key3}}}}}]] <!-- bpar3 --> }}
(Note that I added extra linebreaks after #if: so that gmane doesn't complain for lines being too long.)
The workarounds that come to mind for the line break issue are fairly obscure and complex. If I were you I'd just put the categories on the same line and be done with it.
Just put the templates on separate lines and wrap the whole thing in another #if to discard additional newlines at the end:
{{#if:1| {{{{{subst|}}}#if:{{{par1|1}}}|[[Category:{{{par1}}}{{{{{subst|}}}#if: {{{key1|1}}}|{{{{{subst|}}}!}}{{{key1}}}}}]]}} {{{{{subst|}}}#if:{{{par2|}}}|[[Category:{{{par2}}}{{{{{subst|}}}#if: {{{key2|}}}|{{{{{subst|}}}!}}{{{key2}}}}}]]}} {{{{{subst|}}}#if:{{{par3|}}}|[[Category:{{{par3}}}{{{{{subst|}}}#if: {{{key3|}}}|{{{{{subst|}}}!}}{{{key3}}}}}]]}} }}
(This assumes that whenever par2 is missing, par3 is missing too.)