> The problem is that a large number of macros rely on the current
> behaviour, and that a fix would break these macros.

> The correct fix would be to remove the call to readMacroParams() in
> invokeMacro() and then have any macros parse their parameters
> themselves. But as I said, this will break a large number of plugins.

I have extensively studied this issue, and have a robust, simple
solution that works:

1) In invokeMacro(), change this line of code

m.handler(place,macro,
   params.readMacroParams(),
   wikifier,params,tiddler);

to

m.handler(place,macro,
   !m.noPreParse?params.readMacroParams():[],
   wikifier,params,tiddler);


Then, for any macro that does it's own invocation of parseParams() or
readMacroParams(), simply set the .noPreParse flag... e.g.:

config.macros.tiddler.noPreParse=true;

If the flag is not defined (or is set to false), the *current* macro
param processing behavior will be performed.  Only when the flag is
set to TRUE will any change in behavior occur.  Thus, this change is
100% backward-compatible with all existing macros, and also allows
remediation of existing core and plugin-defined macros, simply by
adding one line to each macro definition, and/or by adding a single
block of code during startup that adds the flag to all the desired
macros... i.e.,:

var names=['macroname','macroname','macroname',...];
for (var i=0;i<names.length;i++)
   config.macros[names[i]].noPreParse=true;

The current behavior for parsing 'eval params' is *extremely*
problematic: because of the multiple evals, any code within the param
that is not idempotent will produce incorrect, and potentially
corrupted, results.

For example, suppose a macro handler that directly invokes parseParams
() expects a 'next available index' param (perhaps to generate a new,
auto-numbered tiddler).  Let's also assume that the current value is
stored in some global tracking variable (e.g.,
config.options.txtNextIndex).

When the following macro code is invoked:
   <<myMacro {{config.options.txtNextIndex++}}>>
the current index is retrieved and the global variable is
incremented.  But, because of the 'multi-parse' problem, the macro
handler re-parses the param and increments it *again*, producing
incorrect results from the macro.

Similarly, it is also very problematic to invoke functions in eval
params that produce user-visible output, such as:
   <<tiddler {{alert('This message is shown TWICE')}}>>
or
   <<tiddler {{wikify('rendered TWICE',place)}}>>

Please, let's fix this ASAP.

your thoughts?

-e

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"TiddlyWikiDev" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/tiddlywikidev?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to