Revision of Twine bugfix: "and" and "or" in strings in <<set>>, <<print>> and <<if>> from Mon, 07/01/2013 - 22:59

As you know from reading my macro reference, code parameters passed to <<if>>, <<set>>, <<print>> and <<remember>> have their operators ("and", "or", "$", "not", etc.) converted to Javascript equivalents ("&&", "||", etc.) when they're executed.

But, due to a bug, this conversion is also applied to "operators" that are inside strings passed to these macros. So, <<print "Vast and large">> will print "Vast && large", and <<print "You find $10">> will print "You find state.history[0].variables.10".

Now, I've sent out a pullreq to the Twine GitHub repo that fixes this, but in the meantime, if you're stymied by this bug, you can fix it with this script:

(function(){
var bs = String.fromCharCode(92);
if ("\\".length>1) {
  eval(scripts[i].text.replace(new RegExp(bs+"/"+bs+"/","g"),"").replace(new RegExp(bs+bs+"s","g"),bs));
}
else {
Wikifier.parse = function (b) {
    function alter(from,to) {
        //var g = "(?=(?:[^\"'\\\\]*(?:\\\\.|'(?:[^'\\\\]*\\\\.)*[^'\\\\]*'|\"(?:[^\"\\\\]*\\\\.)*[^\"\\\\]*\"))*[^'\"]*$)";
        //return b.replace(new RegExp(from+g,"gi"),to);
    }
    b = alter("\\$","state.history[0].variables.");
    b = alter("\\beq\\b", " == ");
    b = alter("\\bneq\\b", " != ");
    b = alter("\\bgt\\b", " > ");
    b = alter("\\beq\\b", " == ");
    b = alter("\\bneq\\b", " != ");
    b = alter("\\bgt\\b", " > ");
    b = alter("\\bgte\\b", " >= ");
    b = alter("\\blt\\b", " < ");
    b = alter("\\blte\\b", " <= ");
    b = alter("\\band\\b", " && ");
    b = alter("\\bor\\b", " || ");
    b = alter("\\bnot\\b", " ! ");
    return b
};
}
}());

Again, note that in some versions this will be loaded after the Start passage has rendered.

Version history:
* 2/7/13 - Bugfix for "She's cute" string.
* 5/5/13 - Bugfix.
* 25/4/13 - Initial.
Feel free to report any bugs to @webbedspace.