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 |
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__)