Hi everyone,

I hereby release the new eval <http://tobibeer.github.io/tw5-plugins/#eval> 
plugin (or 
tobibeer/eval <http://tobibeer.github.io/tw5-plugins/#eval>) which provides 
an *eval* filter and an *eval* widget ...the latter working similar to the 
*calc* widget in mklauber/math.js <http://mklauber.github.io/tiddly-mathjs/>, 
however leveraging a "plug-and-play" library model (and then some).

The *eval* plugin was born out of my desire (and Jeremy's suggestion) to 
overcome the constraints of let filter 
<http://let.tiddlyspot.com/#GettingStarted>, (henceforth abandoned,) which 
started out with similar aspirations, allowing to compute and compare with 
tidbits, however, somewhat at the wrong end of the stick.

If you prefer to learn by example, take a look at the examples 
<http://tobibeer.github.io/tw5-plugins/#eval-Examples>.

The repo and the commented, non-minified source code is at:
https://github.com/tobibeer/tw5-eval

Although quite neatly designed, thoroughly tested and refactored, I have 
flagged this release as *BETA* so as to invite you to test it, and also to 
indicate that — architecturally speaking — things might nevertheless still 
change, perhaps. With or without further modifications, I intend to take it 
out of BETA in, say, a couple of weeks.

Eval is capable of evaluating expressions leveraging different libraries, 
for now supporting:

   - *math.js*
      - you need to separately install tobibeer/math.js 
      <http://tobibeer.github.io/tw5-plugins/#math.js> which contains 
      nothing but math.js <http://mathjs.org/> itself
         - and avails it at *$:/lib/math.js*
      - should you already use mklauber/math.js 
      <http://mklauber.github.io/tiddly-mathjs/>, *eval* will load the 
      *math.js* version it ships with
         - so there's no need to install *tobibeer/math.js*
      - *js*
      - allows to evaluate native javascript
      - needs to be specifically enabled, see configuration 
      <http://tobibeer.github.io/tw5-plugins/#eval-Configure>
      - in other words, you don't even need any *math.js* if...
         - you are confident to do your math in nothing but js
         - wish to trim those resource requirements
      
The eval filter provides the following capabilities:

   - a *main* expression to be evaluated, obviously ...being the operand
      - you can specify more expressions, predefined or custom 
      variables, and options, all in the operand
         - separate different operand declarations via backslash (*\*), 
         defined as *name:value* e.g...
      - an *init* value — initializing the *value* before taking off to 
   evaluate the main expression against each input title
   - a *final* expression — a final computation after the *main *expression 
   had been evaluated against the last input title
   - the *value* and *title* run-time variables — automatically set for 
   each input title, for use in the *main* or *final* expression
   - a *format* option — to have math.js nicely format your output value
   - a *lib* option — to specify for each filter instance which library to 
   use in order to evaluate the given expression(s)
   - custom *variables — *any name that is not a predefined variable or 
   option
      - to help make your *main* or *final* expression more readable
   - the suffix — to define what to return
      - *no suffix:* returns just the final *value*
      - *output mode* suffixes, prefixed *$*, use one at a time, 
      returning...
         - *$* — those input titles where value is truthy
         - *$all* — all input titles if the value is truthy for any input 
         title
         - *$val* — a list of values, one for each input title
         - *$expr* — a list of expressions, one for each input title
         - *$eq* — a list of equations, one for each input title => great 
         for debugging
      
Both *text references* as well as *wikitext-variables* can be used freely 
in the operand and are substituted in any expression or variable. (*Note*: 
custom variables are only evaluated on init, not during iterations. They 
shall also not reference each other).

Ok, so... hope to see you give it a test-ride and let me know what you 
think, what things may not work (as expected) but also which work just 
about right. ;-)

~

For loading libraries, the *eval* plugin does some neat dependency 
resolving, the gist of which I hope will eventually find its way into the 
core, in one form or another. That way, we don't ship and install things 
like *vis* or *math.js* or any other library with any plugins that build on 
them. Nor does plugin A require plugin B, just to not duplicate a given 
library. For math.js, for example, there barely any needs for a plugin to 
depend on a given version of math.js. But even that can be catered for with 
some minor amends as to version handling / dedicated library versions 
resolved in just about the same way as *eval* does right now.

Best wishes,

Tobias.

-- 
You received this message because you are subscribed to the Google Groups 
"TiddlyWiki" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/tiddlywiki.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/tiddlywiki/3e46b014-527c-4b49-83dc-224c57bc852f%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to