I've not done much template work since parser functions were new. Grabbing some old code examples, found it didn't work anymore. Workaround?
===
Ancient code (expected single space):
{{{{{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 --> }}
Also tried (expected double space, hoped for single space):
{{{{{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 --> }}
===
Each category should be on a new line. If the par* doesn't exist, then the }} that begins the next line would slurp up the newline, leaving no blank line.
Example {{subst:testing|par1=A|par2=B|key2=C|subst=subst:}}
As I remember, should yield something like:
[[Category:A]] <!-- bpar1 --> [[Category:B|C]] <!-- bpar2 -->
Currently output:
[[Category:A]] <!-- bpar1 -->[[Category:B]] <!-- bpar2 -->
Did the evaluation order change, so the inner {{subst:!}} happens first instead of second, and loses the C parameter (interpreting it as "else")?
And the leading and trailing linebreaks are slurped up and ignored?
Any known work around? (I tried searching meta and elsewhere, but no joy.)