mherkender / lua.js

An ECMAscript framework to compile and run Lua code, allowing Lua to run in a browser or in Flash
http://blog.brokenfunction.com/
600 stars 73 forks source link

partially implemented string pattern functions (find,gmatch,gsub,match) #9

Open ghoulsblade opened 12 years ago

ghoulsblade commented 12 years ago

https://github.com/ghoulsblade/love-webplayer/blob/master/js/lua-parser-utils.js include this file to add support for :

string.find
string.gmatch
string.gsub
string.match

my implementation of them is only partial, it covers a lot of common usecases, but it isn't 100% compatible to native lua behavior.

mherkender commented 12 years ago

I added support for table.concat. There's a bug in your version (when sep is null in a javascript join, it is replaced with ", " not "" as in lua's table.concat), so it ended up a little different.

I'm not quite ready to add partial support for the string functions. I should probably hammer out a real version at some point.

ghoulsblade commented 12 years ago

no hurry, it wasn't meant as pull request, i just wanted to put it here so people running into them can find a workaround easier =)

jimbauwens commented 12 years ago

I've been busy on some functions to convert a pattern into a regular expression. Here is the code I have so far:

rT  = [];
rT["a"]="w";
rT["A"]="W";
rT["l"]="[a-z]";
rT["L"]="[^a-z]";
rT["u"]="[A-Z]";
rT["U"]="[^A-Z]";
rT["p"]="[\\.\\!\\?\\,\\;\\:\\'\\]";
rT["P"]="[^\\.\\!\\?\\,\\;\\:\\'\\]";
rT["s"]="[\\s\\f\\n\\t\\r\\v]";
rT["S"]="[\\s\\f\\n\\t\\r\\v]";
rT["w"]="[a-Z0-9]";
rT["W"]="[^a-Z0-9]";
rT["x"]="[a-fA-F0-9]";
rT["X"]="[^a-fA-F0-9]";
rT["z"]="\\0";
rT["Z"]="[^\\0]";

function toReg(match){
    var pcmd    = match[1];

    if (rT[pcmd])
        return "\\" + rT[pcmd];
    else if (pcmd == "b"){
        var a   = match[2];
        var b   = match[3];
        return "(" +a+ "[^" +a+b+ "]*" +b+ ")";
    }
    else
        return "\\" + pcmd;
}

saveRegExp  = /([\\\{\}\!])/g
luaPattern  = /%b(.{2})|%(.)/g

function patToRegExp(pattern){
    //Replace certain characters that could be interpreter wrongly by the JS RegExp engine
    var regexp  = pattern.replace(saveRegExp, "\\$1")
    regexp  = regexp.replace(luaPattern, toReg)
    return regexp;
}

a   = "The Game+yuo";
pattern = "([*%/%-+()<>=%[%]])";
regg    = patToRegExp(pattern)
console.log(regg);
reg = new RegExp(regg, "g");
console.log(a.replace(reg, "-$1-"));

There are still some bugs, but maybe you can use the idea as a starting point :) Currently I have no time at all to work on it.