mirror of
https://github.com/Mikaela/Limnoria.git
synced 2025-02-06 17:44:09 +01:00
Upgraded to 2.3.
This commit is contained in:
parent
b7cb48b19b
commit
1cae9664a7
@ -31,17 +31,12 @@
|
|||||||
|
|
||||||
"""
|
"""
|
||||||
Allows 'aliases' for other commands.
|
Allows 'aliases' for other commands.
|
||||||
|
|
||||||
Commands include:
|
|
||||||
alias
|
|
||||||
unalias
|
|
||||||
freeze
|
|
||||||
unfreeze
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from baseplugin import *
|
from baseplugin import *
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import sets
|
||||||
|
|
||||||
import conf
|
import conf
|
||||||
import debug
|
import debug
|
||||||
@ -109,7 +104,7 @@ def makeNewAlias(name, alias):
|
|||||||
class Alias(callbacks.Privmsg):
|
class Alias(callbacks.Privmsg):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
callbacks.Privmsg.__init__(self)
|
callbacks.Privmsg.__init__(self)
|
||||||
self.frozen = set()
|
self.frozen = sets.Set()
|
||||||
|
|
||||||
def freeze(self, irc, msg, args):
|
def freeze(self, irc, msg, args):
|
||||||
"""<alias>
|
"""<alias>
|
||||||
|
@ -43,6 +43,7 @@ Commands include:
|
|||||||
from baseplugin import *
|
from baseplugin import *
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import sets
|
||||||
|
|
||||||
import ircdb
|
import ircdb
|
||||||
import ircmsgs
|
import ircmsgs
|
||||||
@ -63,7 +64,7 @@ def subber(m):
|
|||||||
class BadWords(callbacks.Privmsg):
|
class BadWords(callbacks.Privmsg):
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
callbacks.Privmsg.__init__(self)
|
callbacks.Privmsg.__init__(self)
|
||||||
self.badwords = set()
|
self.badwords = sets.Set()
|
||||||
|
|
||||||
def outFilter(self, irc, msg):
|
def outFilter(self, irc, msg):
|
||||||
if hasattr(self, 'regexp') and msg.command == 'PRIVMSG':
|
if hasattr(self, 'regexp') and msg.command == 'PRIVMSG':
|
||||||
|
@ -121,7 +121,7 @@ class ChannelStats(callbacks.Privmsg, ChannelDBHandler):
|
|||||||
words=words+%s,
|
words=words+%s,
|
||||||
msgs=msgs+1,
|
msgs=msgs+1,
|
||||||
actions=actions+%s""",
|
actions=actions+%s""",
|
||||||
smileys, frowns, chars, words, isAction)
|
smileys, frowns, chars, words, int(isAction))
|
||||||
try:
|
try:
|
||||||
name = ircdb.users.getUserName(msg.prefix)
|
name = ircdb.users.getUserName(msg.prefix)
|
||||||
except KeyError:
|
except KeyError:
|
||||||
@ -136,7 +136,7 @@ class ChannelStats(callbacks.Privmsg, ChannelDBHandler):
|
|||||||
%s, %s, 1, %s,
|
%s, %s, 1, %s,
|
||||||
0, 0, 0, 0, 0, 0 )""",
|
0, 0, 0, 0, 0, 0 )""",
|
||||||
name, int(time.time()), msg.args[1],
|
name, int(time.time()), msg.args[1],
|
||||||
smileys, frowns, chars, words, isAction)
|
smileys, frowns, chars, words, int(isAction))
|
||||||
else:
|
else:
|
||||||
cursor.execute("""UPDATE user_stats SET
|
cursor.execute("""UPDATE user_stats SET
|
||||||
last_seen=%s, last_msg=%s, chars=chars+%s,
|
last_seen=%s, last_msg=%s, chars=chars+%s,
|
||||||
@ -145,7 +145,8 @@ class ChannelStats(callbacks.Privmsg, ChannelDBHandler):
|
|||||||
frowns=frowns+%s
|
frowns=frowns+%s
|
||||||
WHERE name=%s""",
|
WHERE name=%s""",
|
||||||
int(time.time()), s,
|
int(time.time()), s,
|
||||||
chars, words, isAction, smileys, frowns, name)
|
chars, words, int(isAction),
|
||||||
|
smileys, frowns, name)
|
||||||
db.commit()
|
db.commit()
|
||||||
|
|
||||||
def doJoin(self, irc, msg):
|
def doJoin(self, irc, msg):
|
||||||
|
@ -36,6 +36,7 @@ Handles relaying between networks.
|
|||||||
from baseplugin import *
|
from baseplugin import *
|
||||||
|
|
||||||
import re
|
import re
|
||||||
|
import sets
|
||||||
import time
|
import time
|
||||||
|
|
||||||
import conf
|
import conf
|
||||||
@ -95,7 +96,7 @@ class Relay(callbacks.Privmsg):
|
|||||||
self.started = False
|
self.started = False
|
||||||
self.ircstates = {}
|
self.ircstates = {}
|
||||||
self.lastmsg = ircmsgs.ping('this is just a fake message')
|
self.lastmsg = ircmsgs.ping('this is just a fake message')
|
||||||
self.channels = set()
|
self.channels = sets.Set()
|
||||||
self.abbreviations = {}
|
self.abbreviations = {}
|
||||||
|
|
||||||
def inFilter(self, irc, msg):
|
def inFilter(self, irc, msg):
|
||||||
|
@ -35,6 +35,7 @@ from fix import *
|
|||||||
|
|
||||||
import os
|
import os
|
||||||
import sys
|
import sys
|
||||||
|
import sets
|
||||||
import struct
|
import struct
|
||||||
import os.path
|
import os.path
|
||||||
import cPickle as pickle
|
import cPickle as pickle
|
||||||
@ -273,7 +274,7 @@ class ReaderWriter(IterableMap):
|
|||||||
self._readJournal()
|
self._readJournal()
|
||||||
self._openFiles()
|
self._openFiles()
|
||||||
self.adds = {}
|
self.adds = {}
|
||||||
self.removals = set()
|
self.removals = sets.Set()
|
||||||
|
|
||||||
def _openFiles(self):
|
def _openFiles(self):
|
||||||
self.cdb = Reader(self.filename)
|
self.cdb = Reader(self.filename)
|
||||||
@ -294,7 +295,7 @@ class ReaderWriter(IterableMap):
|
|||||||
self.journal.flush()
|
self.journal.flush()
|
||||||
|
|
||||||
def _readJournal(self):
|
def _readJournal(self):
|
||||||
removals = set()
|
removals = sets.Set()
|
||||||
adds = {}
|
adds = {}
|
||||||
try:
|
try:
|
||||||
fd = file(self.journalName, 'r')
|
fd = file(self.journalName, 'r')
|
||||||
@ -395,7 +396,7 @@ class ReaderWriter(IterableMap):
|
|||||||
has_key = __contains__
|
has_key = __contains__
|
||||||
|
|
||||||
def iteritems(self):
|
def iteritems(self):
|
||||||
already = set()
|
already = sets.Set()
|
||||||
for (key, value) in self.cdb.iteritems():
|
for (key, value) in self.cdb.iteritems():
|
||||||
if key in self.removals or key in already:
|
if key in self.removals or key in already:
|
||||||
continue
|
continue
|
||||||
|
@ -31,6 +31,7 @@
|
|||||||
|
|
||||||
from fix import *
|
from fix import *
|
||||||
|
|
||||||
|
import sets
|
||||||
import os.path
|
import os.path
|
||||||
|
|
||||||
###
|
###
|
||||||
@ -79,7 +80,7 @@ allowEval = True
|
|||||||
# defaultCapabilities: Capabilities allowed to everyone by default. You almost
|
# defaultCapabilities: Capabilities allowed to everyone by default. You almost
|
||||||
# certainly want to have !owner and !admin in here.
|
# certainly want to have !owner and !admin in here.
|
||||||
###
|
###
|
||||||
defaultCapabilities = set(['!owner', '!admin'])
|
defaultCapabilities = sets.Set(['!owner', '!admin'])
|
||||||
|
|
||||||
###
|
###
|
||||||
# reply%s: Stock replies for various reasons.
|
# reply%s: Stock replies for various reasons.
|
||||||
@ -177,7 +178,7 @@ detailedTracebacks = True
|
|||||||
# bot will be found.
|
# bot will be found.
|
||||||
###
|
###
|
||||||
driverModule = 'asyncoreDrivers'
|
driverModule = 'asyncoreDrivers'
|
||||||
driverModule = 'twistedDrivers'
|
#driverModule = 'twistedDrivers'
|
||||||
|
|
||||||
###############################
|
###############################
|
||||||
###############################
|
###############################
|
||||||
|
186
src/fix.py
186
src/fix.py
@ -49,109 +49,109 @@ def catch(f, *args, **kwargs):
|
|||||||
except:
|
except:
|
||||||
return None
|
return None
|
||||||
|
|
||||||
class bool(int):
|
## class bool(int):
|
||||||
"""Just a holdover until 2.3 comes out with its wonderful new bool type."""
|
## """2.3 came out."""
|
||||||
def __new__(cls, val=0):
|
## def __new__(cls, val=0):
|
||||||
# This constructor always returns an existing instance
|
## # This constructor always returns an existing instance
|
||||||
if val:
|
## if val:
|
||||||
return True
|
## return True
|
||||||
else:
|
## else:
|
||||||
return False
|
## return False
|
||||||
|
|
||||||
def __repr__(self):
|
## def __repr__(self):
|
||||||
if self:
|
## if self:
|
||||||
return "True"
|
## return "True"
|
||||||
else:
|
## else:
|
||||||
return "False"
|
## return "False"
|
||||||
|
|
||||||
__str__ = __repr__
|
## __str__ = __repr__
|
||||||
|
|
||||||
def __and__(self, other):
|
## def __and__(self, other):
|
||||||
if isinstance(other, bool):
|
## if isinstance(other, bool):
|
||||||
return bool(int(self) & int(other))
|
## return bool(int(self) & int(other))
|
||||||
else:
|
## else:
|
||||||
return int.__and__(self, other)
|
## return int.__and__(self, other)
|
||||||
|
|
||||||
__rand__ = __and__
|
## __rand__ = __and__
|
||||||
|
|
||||||
def __or__(self, other):
|
## def __or__(self, other):
|
||||||
if isinstance(other, bool):
|
## if isinstance(other, bool):
|
||||||
return bool(int(self) | int(other))
|
## return bool(int(self) | int(other))
|
||||||
else:
|
## else:
|
||||||
return int.__or__(self, other)
|
## return int.__or__(self, other)
|
||||||
|
|
||||||
__ror__ = __or__
|
## __ror__ = __or__
|
||||||
|
|
||||||
def __xor__(self, other):
|
## def __xor__(self, other):
|
||||||
if isinstance(other, bool):
|
## if isinstance(other, bool):
|
||||||
return bool(int(self) ^ int(other))
|
## return bool(int(self) ^ int(other))
|
||||||
else:
|
## else:
|
||||||
return int.__xor__(self, other)
|
## return int.__xor__(self, other)
|
||||||
|
|
||||||
__rxor__ = __xor__
|
## __rxor__ = __xor__
|
||||||
|
|
||||||
False = int.__new__(bool, 0)
|
## False = int.__new__(bool, 0)
|
||||||
True = int.__new__(bool, 1)
|
## True = int.__new__(bool, 1)
|
||||||
|
|
||||||
|
|
||||||
class set(object):
|
## class set(object):
|
||||||
"""Just a holdover until 2.3 comes out with its wonderful new set type."""
|
## """2.3 came out."""
|
||||||
__slots__ = ('d',)
|
## __slots__ = ('d',)
|
||||||
def __init__(self, seq=()):
|
## def __init__(self, seq=()):
|
||||||
self.d = {}
|
## self.d = {}
|
||||||
for x in seq:
|
## for x in seq:
|
||||||
self.d[x] = None
|
## self.d[x] = None
|
||||||
|
|
||||||
def __contains__(self, x):
|
## def __contains__(self, x):
|
||||||
return x in self.d
|
## return x in self.d
|
||||||
|
|
||||||
def __iter__(self):
|
## def __iter__(self):
|
||||||
return self.d.iterkeys()
|
## return self.d.iterkeys()
|
||||||
|
|
||||||
def __repr__(self):
|
## def __repr__(self):
|
||||||
return '%s([%s])' % (self.__class__.__name__,
|
## return '%s([%s])' % (self.__class__.__name__,
|
||||||
', '.join(map(repr, self.d.iterkeys())))
|
## ', '.join(map(repr, self.d.iterkeys())))
|
||||||
|
|
||||||
def __nonzero__(self):
|
## def __nonzero__(self):
|
||||||
if self.d:
|
## if self.d:
|
||||||
return True
|
## return True
|
||||||
else:
|
## else:
|
||||||
return False
|
## return False
|
||||||
|
|
||||||
def __getstate__(self):
|
|
||||||
return (self.d.keys(),)
|
|
||||||
|
|
||||||
def __setstate__(self, (L,)):
|
|
||||||
self.d = {}
|
|
||||||
for x in L:
|
|
||||||
self.d[x] = None
|
|
||||||
|
|
||||||
def __len__(self):
|
|
||||||
return len(self.d)
|
|
||||||
|
|
||||||
def add(self, x):
|
|
||||||
self.d[x] = None
|
|
||||||
|
|
||||||
def remove(self, x):
|
|
||||||
del self.d[x]
|
|
||||||
|
|
||||||
def discard(self, x):
|
|
||||||
try:
|
|
||||||
del self.d[x]
|
|
||||||
except KeyError:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def __eq__(self, other):
|
|
||||||
return self.d == other.d
|
|
||||||
|
|
||||||
def __ne__(self, other):
|
|
||||||
return not self.d == other.d
|
|
||||||
|
|
||||||
## def __getstate__(self):
|
## def __getstate__(self):
|
||||||
## return self.d
|
## return (self.d.keys(),)
|
||||||
|
|
||||||
## def __setstate__(self, d):
|
## def __setstate__(self, (L,)):
|
||||||
## self.d = d
|
## self.d = {}
|
||||||
|
## for x in L:
|
||||||
|
## self.d[x] = None
|
||||||
|
|
||||||
|
## def __len__(self):
|
||||||
|
## return len(self.d)
|
||||||
|
|
||||||
|
## def add(self, x):
|
||||||
|
## self.d[x] = None
|
||||||
|
|
||||||
|
## def remove(self, x):
|
||||||
|
## del self.d[x]
|
||||||
|
|
||||||
|
## def discard(self, x):
|
||||||
|
## try:
|
||||||
|
## del self.d[x]
|
||||||
|
## except KeyError:
|
||||||
|
## pass
|
||||||
|
|
||||||
|
## def __eq__(self, other):
|
||||||
|
## return self.d == other.d
|
||||||
|
|
||||||
|
## def __ne__(self, other):
|
||||||
|
## return not self.d == other.d
|
||||||
|
|
||||||
|
## ## def __getstate__(self):
|
||||||
|
## ## return self.d
|
||||||
|
|
||||||
|
## ## def __setstate__(self, d):
|
||||||
|
## ## self.d = d
|
||||||
|
|
||||||
|
|
||||||
class IterableMap(object):
|
class IterableMap(object):
|
||||||
@ -227,6 +227,22 @@ def window(L, size):
|
|||||||
for i in xrange(len(L) - (size-1)):
|
for i in xrange(len(L) - (size-1)):
|
||||||
yield L[i:i+size]
|
yield L[i:i+size]
|
||||||
|
|
||||||
|
## def group(seq, groupSize):
|
||||||
|
## L = []
|
||||||
|
## LL = []
|
||||||
|
## i = groupSize
|
||||||
|
## for elt in seq:
|
||||||
|
## if i > 0:
|
||||||
|
## LL.append(elt)
|
||||||
|
## i -= 1
|
||||||
|
## else:
|
||||||
|
## L.append(LL)
|
||||||
|
## i = groupSize
|
||||||
|
## LL = []
|
||||||
|
## if LL:
|
||||||
|
## L.append(LL)
|
||||||
|
## return L
|
||||||
|
|
||||||
def itersplit(iterable, isSeparator, yieldEmpty=False):
|
def itersplit(iterable, isSeparator, yieldEmpty=False):
|
||||||
acc = []
|
acc = []
|
||||||
for element in iterable:
|
for element in iterable:
|
||||||
|
23
src/ircdb.py
23
src/ircdb.py
@ -32,6 +32,7 @@
|
|||||||
from fix import *
|
from fix import *
|
||||||
|
|
||||||
import os
|
import os
|
||||||
|
import sets
|
||||||
import time
|
import time
|
||||||
import atexit
|
import atexit
|
||||||
import string
|
import string
|
||||||
@ -86,37 +87,37 @@ def normalize(s):
|
|||||||
return s.translate(_normal)
|
return s.translate(_normal)
|
||||||
|
|
||||||
|
|
||||||
class CapabilitySet(set):
|
class CapabilitySet(sets.Set):
|
||||||
def __init__(self, capabilities=()):
|
def __init__(self, capabilities=()):
|
||||||
set.__init__(self)
|
sets.Set.__init__(self)
|
||||||
for capability in capabilities:
|
for capability in capabilities:
|
||||||
self.add(capability)
|
self.add(capability)
|
||||||
|
|
||||||
def add(self, capability):
|
def add(self, capability):
|
||||||
capability = ircutils.toLower(capability)
|
capability = ircutils.toLower(capability)
|
||||||
inverted = invertCapability(capability)
|
inverted = invertCapability(capability)
|
||||||
if set.__contains__(self, inverted):
|
if sets.Set.__contains__(self, inverted):
|
||||||
set.remove(self, inverted)
|
sets.Set.remove(self, inverted)
|
||||||
set.add(self, capability)
|
sets.Set.add(self, capability)
|
||||||
|
|
||||||
def remove(self, capability):
|
def remove(self, capability):
|
||||||
capability = ircutils.toLower(capability)
|
capability = ircutils.toLower(capability)
|
||||||
set.remove(self, capability)
|
sets.Set.remove(self, capability)
|
||||||
|
|
||||||
def __contains__(self, capability):
|
def __contains__(self, capability):
|
||||||
capability = ircutils.toLower(capability)
|
capability = ircutils.toLower(capability)
|
||||||
if set.__contains__(self, capability):
|
if sets.Set.__contains__(self, capability):
|
||||||
return True
|
return True
|
||||||
if set.__contains__(self, invertCapability(capability)):
|
if sets.Set.__contains__(self, invertCapability(capability)):
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def check(self, capability):
|
def check(self, capability):
|
||||||
capability = ircutils.toLower(capability)
|
capability = ircutils.toLower(capability)
|
||||||
if set.__contains__(self, capability):
|
if sets.Set.__contains__(self, capability):
|
||||||
return True
|
return True
|
||||||
elif set.__contains__(self, invertCapability(capability)):
|
elif sets.Set.__contains__(self, invertCapability(capability)):
|
||||||
return False
|
return False
|
||||||
else:
|
else:
|
||||||
raise KeyError, capability
|
raise KeyError, capability
|
||||||
@ -319,6 +320,7 @@ class UsersDictionary(object):
|
|||||||
fd = file(filename, 'r')
|
fd = file(filename, 'r')
|
||||||
s = fd.read()
|
s = fd.read()
|
||||||
fd.close()
|
fd.close()
|
||||||
|
Set = sets.Set
|
||||||
self.dict = eval(normalize(s))
|
self.dict = eval(normalize(s))
|
||||||
self.cache = {} # hostmasks to nicks.
|
self.cache = {} # hostmasks to nicks.
|
||||||
self.revcache = ircutils.IrcDict() # nicks to hostmasks.
|
self.revcache = ircutils.IrcDict() # nicks to hostmasks.
|
||||||
@ -405,6 +407,7 @@ class ChannelsDictionary(object):
|
|||||||
fd = file(filename, 'r')
|
fd = file(filename, 'r')
|
||||||
s = fd.read()
|
s = fd.read()
|
||||||
fd.close()
|
fd.close()
|
||||||
|
Set = sets.Set
|
||||||
self.dict = eval(normalize(s))
|
self.dict = eval(normalize(s))
|
||||||
|
|
||||||
def getChannel(self, channel):
|
def getChannel(self, channel):
|
||||||
|
@ -33,6 +33,7 @@ from fix import *
|
|||||||
from structures import queue, RingBuffer
|
from structures import queue, RingBuffer
|
||||||
|
|
||||||
import copy
|
import copy
|
||||||
|
import sets
|
||||||
import time
|
import time
|
||||||
import atexit
|
import atexit
|
||||||
|
|
||||||
@ -110,7 +111,7 @@ class IrcMsgQueue(object):
|
|||||||
self.highpriority = queue()
|
self.highpriority = queue()
|
||||||
self.normal = queue()
|
self.normal = queue()
|
||||||
self.lowpriority = queue()
|
self.lowpriority = queue()
|
||||||
self.msgs = set()
|
self.msgs = sets.Set()
|
||||||
|
|
||||||
def enqueue(self, msg):
|
def enqueue(self, msg):
|
||||||
if msg in self.msgs:
|
if msg in self.msgs:
|
||||||
@ -139,7 +140,7 @@ class IrcMsgQueue(object):
|
|||||||
return msg
|
return msg
|
||||||
|
|
||||||
def __nonzero__(self):
|
def __nonzero__(self):
|
||||||
return (self.highpriority or self.normal or self.lowpriority)
|
return bool(self.highpriority or self.normal or self.lowpriority)
|
||||||
|
|
||||||
|
|
||||||
###
|
###
|
||||||
@ -150,10 +151,10 @@ class Channel(object):
|
|||||||
__slots__ = ('users', 'ops', 'halfops', 'voices', 'topic')
|
__slots__ = ('users', 'ops', 'halfops', 'voices', 'topic')
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.topic = ''
|
self.topic = ''
|
||||||
self.users = set()
|
self.users = sets.Set()
|
||||||
self.ops = set()
|
self.ops = sets.Set()
|
||||||
self.halfops = set()
|
self.halfops = sets.Set()
|
||||||
self.voices = set()
|
self.voices = sets.Set()
|
||||||
|
|
||||||
def addUser(self, user):
|
def addUser(self, user):
|
||||||
nick = user.lstrip('@%+')
|
nick = user.lstrip('@%+')
|
||||||
@ -330,9 +331,9 @@ class Irc(object):
|
|||||||
|
|
||||||
Handles PING commands already.
|
Handles PING commands already.
|
||||||
"""
|
"""
|
||||||
_nickSetters = set(['001', '002', '003', '004', '250', '251', '252', '254',
|
_nickSetters = sets.Set(['001', '002', '003', '004', '250', '251', '252',
|
||||||
'255', '265', '266', '372', '375', '376', '333', '353',
|
'254', '255', '265', '266', '372', '375', '376',
|
||||||
'332', '366'])
|
'333', '353', '332', '366'])
|
||||||
def __init__(self, nick, user='', ident='', password='', callbacks=None):
|
def __init__(self, nick, user='', ident='', password='', callbacks=None):
|
||||||
world.ircs.append(self)
|
world.ircs.append(self)
|
||||||
self.nick = nick
|
self.nick = nick
|
||||||
|
@ -184,6 +184,9 @@ class queue(object):
|
|||||||
def __len__(self):
|
def __len__(self):
|
||||||
return len(self.front) + len(self.back)
|
return len(self.front) + len(self.back)
|
||||||
|
|
||||||
|
def __nonzero__(self):
|
||||||
|
return bool(self.back or self.front)
|
||||||
|
|
||||||
def __contains__(self, elt):
|
def __contains__(self, elt):
|
||||||
return elt in self.front or elt in self.back
|
return elt in self.front or elt in self.back
|
||||||
|
|
||||||
|
@ -198,7 +198,9 @@ def soundex(s, length=4):
|
|||||||
|
|
||||||
def dqrepr(s):
|
def dqrepr(s):
|
||||||
"""Returns a repr() of s guaranteed to be in double quotes."""
|
"""Returns a repr() of s guaranteed to be in double quotes."""
|
||||||
return '"' + repr("'\x00" + s)[6:]
|
# The wankers-that-be decided not to use double-quotes anymore in 2.3.
|
||||||
|
# return '"' + repr("'\x00" + s)[6:]
|
||||||
|
return '"%s"' % s.encode('unicode_escape').replace('"', '\\"')
|
||||||
|
|
||||||
nonEscapedSlashes = re.compile(r'(?<!\\)/')
|
nonEscapedSlashes = re.compile(r'(?<!\\)/')
|
||||||
def perlReToPythonRe(s):
|
def perlReToPythonRe(s):
|
||||||
|
Loading…
Reference in New Issue
Block a user