Show More
Commit Description:
Merge pull request #17 from nattee/master...
Commit Description:
Merge pull request #17 from nattee/master
upgrade to current working snapshot
References:
File last commit:
Show/Diff file:
Action:
lib/assets/libs/_jsre.js
| 252 lines
| 9.8 KiB
| application/javascript
| JavascriptLexer
|
r584 | var $module=(function($B){ | |||
var _b_ = $B.builtins | ||||
var $s=[] | ||||
for(var $b in _b_) $s.push('var ' + $b +'=_b_["'+$b+'"]') | ||||
eval($s.join(';')) | ||||
var JSObject = $B.JSObject | ||||
var obj = {__class__:$module, | ||||
__str__: function(){return "<module 're'>"} | ||||
} | ||||
obj.A = obj.ASCII = 256 | ||||
obj.I = obj.IGNORECASE = 2 // 'i' | ||||
obj.L = obj.LOCALE = 4 | ||||
obj.M = obj.MULTILINE = 8 // 'm' | ||||
obj.S = obj.DOTALL = 16 | ||||
obj.U = obj.UNICODE = 32 | ||||
obj.X = obj.VERBOSE = 64 | ||||
obj._is_valid = function(pattern) { | ||||
if ($B.$options.re=='pyre') return false //force use of python's re module | ||||
if ($B.$options.re=='jsre') return true //force use of brythons re module | ||||
// FIXME: Improve | ||||
if (!isinstance(pattern, str)) { | ||||
// this is probably a SRE_PATTERN, so return false, and let | ||||
// python's re module handle this. | ||||
return false | ||||
} | ||||
var is_valid = false; | ||||
try { | ||||
new RegExp(pattern); | ||||
is_valid = true; | ||||
} | ||||
catch(e) {} | ||||
if (!is_valid) return false //if js won't parse the pattern return false | ||||
// using reference http://www.regular-expressions.info/ | ||||
// to compare python re and javascript regex libraries | ||||
// look for things javascript does not support | ||||
// check for name capturing group | ||||
var mylist=['?P=', '?P<', '(?#', '(?<=', '(?<!', '(?('] | ||||
for(var i=0, _len_i = mylist.length; i < _len_i; i++) { | ||||
if (pattern.indexOf(mylist[i]) > -1) return false | ||||
} | ||||
var re_list=['\{,\d+\}'] | ||||
for(var i=0, _len_i = re_list.length; i < _len_i; i++) { | ||||
var _re=new RegExp(re_list[i]) | ||||
if (_re.test(pattern)) return false | ||||
} | ||||
// it looks like the pattern has passed all our tests so lets assume | ||||
// javascript can handle this pattern. | ||||
return true | ||||
} | ||||
var $SRE_PatternDict = { | ||||
__class__:$B.$type, | ||||
__name__:'SRE_Pattern' | ||||
} | ||||
$SRE_PatternDict.__mro__ = [$SRE_PatternDict,object.$dict] | ||||
$SRE_PatternDict.findall = function(self,string){ | ||||
return obj.findall(self.pattern,string,self.flags) | ||||
} | ||||
$SRE_PatternDict.finditer = function(self,string){ | ||||
return obj.finditer(self.pattern,string,self.flags) | ||||
} | ||||
$SRE_PatternDict.match = function(self,string){ | ||||
return obj.match(self.pattern,string,self.flags) | ||||
} | ||||
$SRE_PatternDict.search = function(self,string){ | ||||
return obj.search(self.pattern,string,self.flags) | ||||
} | ||||
function normflags(flags) { | ||||
return ((flags & obj.I)? 'i' : '') + ((flags & obj.M)? 'm' : ''); | ||||
} | ||||
obj.compile = function(pattern,flags){ | ||||
return { | ||||
__class__:$SRE_PatternDict, | ||||
pattern:pattern, | ||||
flags:normflags(flags) | ||||
} | ||||
} | ||||
obj.escape = function(string){ | ||||
// Escape all the characters in pattern except ASCII letters, numbers | ||||
// and '_'. This is useful if you want to match an arbitrary literal | ||||
// string that may have regular expression metacharacters in it. | ||||
var res = '' | ||||
var ok = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_' | ||||
for(var i=0, _len_i = string.length; i < _len_i;i++){ | ||||
if(ok.search(string.charAt(i))>-1){res += string.charAt(i)} | ||||
} | ||||
return res | ||||
} | ||||
obj.findall = function(pattern,string,flags){ | ||||
var $ns=$B.args('re.findall',2, | ||||
{pattern:null, string:null}, ['pattern', 'string'], | ||||
arguments,{},'args','kw') , | ||||
args = $ns['args'] , | ||||
_flags = 0; | ||||
if(args.length>0){var flags=args[0]} | ||||
else{var _flags = getattr($ns['kw'], 'get')('flags',0)} | ||||
var flags = normflags(); | ||||
flags += 'gm' | ||||
var jsp = new RegExp(pattern,flags) , | ||||
jsmatch = string.match(jsp); | ||||
if(jsmatch===null){return []} | ||||
return jsmatch | ||||
} | ||||
obj.finditer = function(pattern,string,flags){ | ||||
var $ns=$B.args('re.finditer',2, | ||||
{pattern:null, sring:null}, ['pattern','string'], | ||||
arguments,{},'args','kw'), | ||||
args = $ns['args'], | ||||
_flags = 0; | ||||
if(args.length>0){var flags=args[0]} | ||||
else{var _flags = getattr($ns['kw'], 'get')('flags',0)} | ||||
var flags = normflags(); | ||||
flags += 'gm' | ||||
var jsp = new RegExp(pattern,flags), | ||||
jsmatch = string.match(jsp); | ||||
if(jsmatch===null){return []} | ||||
var _list=[] | ||||
for (var j=0, _len_j = jsmatch.length; j < _len_j; j++) { | ||||
var mo = {} | ||||
mo._match=jsmatch[j] | ||||
mo.group = function(){ | ||||
var res = [] | ||||
for(var i=0, _len_i = arguments.length; i < _len_i;i++){ | ||||
if(jsmatch[arguments[i]]===undefined){res.push(None)} | ||||
else{res.push(jsmatch[arguments[i]])} | ||||
} | ||||
if(arguments.length===1){return res[0]} | ||||
return tuple(res) | ||||
} | ||||
mo.groups = function(_default){ | ||||
if(_default===undefined){_default=None} | ||||
var res = [] | ||||
for(var i=1, _len_i = jsmatch.length; i < _len_i;i++){ | ||||
if(jsmatch[i]===undefined){res.push(_default)} | ||||
else{res.push(jsmatch[i])} | ||||
} | ||||
return tuple(res) | ||||
} | ||||
mo.start = function(){return mo._match.index} | ||||
mo.end = function(){return mo._match.length-mo._match.index} | ||||
mo.string = string | ||||
_list.push(JSObject(mo)) | ||||
} | ||||
return _list | ||||
} | ||||
obj.search = function(pattern,string){ | ||||
var $ns=$B.args('re.search', 2, | ||||
{pattern:null, string:null},['pattern','string'], | ||||
arguments,{},'args','kw') | ||||
var args = $ns['args'] | ||||
if(args.length>0){var flags=args[0]} | ||||
else{var flags = getattr($ns['kw'],'get')('flags','')} | ||||
flags = normflags(flags); | ||||
var jsp = new RegExp(pattern,flags) | ||||
var jsmatch = string.match(jsp) | ||||
if(jsmatch===null){return None} | ||||
var mo = new Object() | ||||
mo.group = function(){ | ||||
var res = [] | ||||
for(var i=0, _len_i = arguments.length; i < _len_i;i++){ | ||||
if(jsmatch[arguments[i]]===undefined){res.push(None)} | ||||
else{res.push(jsmatch[arguments[i]])} | ||||
} | ||||
if(arguments.length===1){return res[0]} | ||||
return tuple(res) | ||||
} | ||||
mo.groups = function(_default){ | ||||
if(_default===undefined){_default=None} | ||||
var res = [] | ||||
for(var i=1, _len_i = jsmatch.length; i < _len_i;i++){ | ||||
if(jsmatch[i]===undefined){res.push(_default)} | ||||
else{res.push(jsmatch[i])} | ||||
} | ||||
return tuple(res) | ||||
} | ||||
mo.start = function(){return jsmatch.index} | ||||
mo.end = function(){return jsmatch.length-jsmatch.index} | ||||
mo.string = string | ||||
return JSObject(mo) | ||||
} | ||||
obj.sub = function(pattern,repl,string){ | ||||
var $ns=$B.args('re.search', 3, | ||||
{pattern:null, repl:null, string:null}, | ||||
['pattern','repl','string'], | ||||
arguments,{},'args','kw') | ||||
for($var in $ns){eval("var "+$var+"=$ns[$var]")} | ||||
var args = $ns['args'] | ||||
var count = _b_.dict.$dict.get($ns['kw'],'count',0) | ||||
var flags = _b_.dict.$dict.get($ns['kw'],'flags','') | ||||
if(args.length>0){var count=args[0]} | ||||
if(args.length>1){var flags=args[1]} | ||||
flags = normflags(flags); | ||||
if(typeof repl==="string"){ | ||||
// backreferences are \1, \2... in Python but $1,$2... in Javascript | ||||
repl = repl.replace(/\\(\d+)/g,'$$$1') | ||||
}else if(typeof repl==="function"){ | ||||
// the argument passed to the Python function is the match object | ||||
// the arguments passed to the Javascript function are : | ||||
// - the matched substring | ||||
// - the matched groups | ||||
// - the offset of the matched substring inside the string | ||||
// - the string being examined | ||||
var $repl1 = function(){ | ||||
var mo = Object() | ||||
mo.string = arguments[arguments.length-1] | ||||
var start = arguments[arguments.length-2] | ||||
var end = start + arguments[0].length | ||||
mo.start = function(){return start} | ||||
mo.end = function(){return end} | ||||
groups = [] | ||||
for(var i=1, _len_i = arguments.length-2; i < _len_i;i++){groups.push(arguments[i])} | ||||
mo.groups = function(_default){ | ||||
if(_default===undefined){_default=None} | ||||
var res = [] | ||||
for(var i=0, _len_i = groups.length; i < _len_i;i++){ | ||||
if(groups[i]===undefined){res.push(_default)} | ||||
else{res.push(groups[i])} | ||||
} | ||||
return res | ||||
} | ||||
return repl(JSObject(mo)) | ||||
} | ||||
} | ||||
if(count==0){flags+='g'} | ||||
var jsp = new RegExp(pattern,flags) | ||||
if(typeof repl==='function'){return string.replace(jsp,$repl1)} | ||||
else{return string.replace(jsp,repl)} | ||||
} | ||||
obj.match = (function(search_func){ | ||||
return function(){ | ||||
// match is like search but pattern must start with ^ | ||||
var pattern = arguments[0] | ||||
if(pattern.charAt(0)!=='^'){pattern = '^'+pattern} | ||||
var args = [pattern] | ||||
for(var i=1, _len_i = arguments.length; i < _len_i;i++){args.push(arguments[i])} | ||||
return search_func.apply(null,args) | ||||
} | ||||
})(obj.search) | ||||
return obj | ||||
} | ||||
)(__BRYTHON__) | ||||