Toggle menu
Toggle preferences menu
Toggle personal menu
Not logged in
Your IP address will be publicly visible if you make any edits.

User:WindBOT/CoreSource: Difference between revisions

From the Portal Wiki
m backport changes from tf wiki
Added new built-in filter: Simplify anchors
 
(6 intermediate revisions by the same user not shown)
Line 30: Line 30:
import wikiUpload
import wikiUpload
import feedparser
import feedparser
import steam
try:
import steam
except:
steam = None
from wikiUpload import wikiUploader
from wikiUpload import wikiUploader


from botConfig import config
from botConfig import config
steam.set_api_key(config['steamAPI'])
if steam is not None and 'steamAPI' in config:
steam.set_api_key(config['steamAPI'])
config['runtime'] = {
config['runtime'] = {
'rcid': -1,
'rcid': -1,
Line 148: Line 152:
summary = getSummary(summary)
summary = getSummary(summary)
p = page(p)
p = page(p)
print 'Editing', p.title, 'with summary', summary
try:
print 'Editing', p.title, 'with summary', summary
except:
pass
try:
try:
if nocreate:
if nocreate:
Line 200: Line 207:
except:
except:
warning('Couldn\'t update edit count.')
warning('Couldn\'t update edit count.')
# Because SOME LIBRARY will not use singletons, this has to be done at the bot level
# rather than the individual filter level to avoid loading the damn thing twice.
steamGameSchemas = {}
def steamGetGameSchema(game):
global steamGameSchemas
if steam is None:
return None
if game not in steamGameSchemas:
steamGameSchemas[game] = game.item_schema()
return steamGameSchemas[game]
steamGameAssets = {}
def steamGetGameAssets(game):
global steamGameAssets
if steam is None:
return None
if game not in steamGameAssets:
steamGameAssets[game] = game.assets()
return steamGameAssets[game]


def compileRegex(regex, flags=re.IGNORECASE):
def compileRegex(regex, flags=re.IGNORECASE):
Line 232: Line 258:
self.setLabel(None)
self.setLabel(None)
self.setLink(u'')
self.setLink(u'')
self.anchor = None
self.joined = False
self.joined = False
if len(content) > 2:
if len(content) > 2:
Line 241: Line 268:
if lnk.find(u':') == -1:
if lnk.find(u':') == -1:
lnk = lnk.replace(u'_', u' ')
lnk = lnk.replace(u'_', u' ')
anchor = None
if lnk.find(u'#') != -1:
lnk, anchor = lnk.split(u'#', 1)
self.setAnchor(anchor)
self.setLink(lnk)
self.setLink(lnk)
if len(split) == 2:
if len(split) == 2:
Line 246: Line 277:
else:
else:
self.setLabel(split[0])
self.setLabel(split[0])
self.joined = True
self.joined = anchor is None
elif content[0] == u'[' and content[-1] == u']':
elif content[0] == u'[' and content[-1] == u']':
split = content[1:-1].split(u' ', 1)
split = content[1:-1].split(u' ', 1)
Line 259: Line 290:
def getBody(self):
def getBody(self):
return u(self.body)
return u(self.body)
def getLink(self):
def getLink(self, withAnchor=False):
if withAnchor and self.getAnchor() is not None:
return u(self.link) + u'#' + self.getAnchor()
return u(self.link)
return u(self.link)
def getAnchor(self):
return self.anchor
def getLabel(self):
def getLabel(self):
if self.label is None:
if self.label is None:
Line 272: Line 307:
self.body = u(body)
self.body = u(body)
def setLink(self, link):
def setLink(self, link):
self.link = u(link)
link = u(link)
if self.getType() == u'internal' and link.find(u'#') != -1:
link, anchor = link.split(u'#', 1)
self.setAnchor(anchor)
self.link = link
if self.joined:
if self.joined:
self.label = u(link)
self.label = u(link)
replaceDots = compileRegex(r'(?:\.[a-f\d][a-f\d])+')
def _replaceDots(self, g):
s = ''
g = g.group(0)
for i in xrange(0, len(g), 3):
s += chr(int(g[i + 1:i + 3], 16))
return s.decode('utf8')
def setAnchor(self, anchor):
if self.getType() == u'internal':
u(anchor).replace(u'_', u' ')
try:
anchor = link.replaceDots.sub(self._replaceDots, anchor)
except:
pass
self.anchor = anchor
def setLabel(self, label):
def setLabel(self, label):
if label is None:
if label is None:
Line 288: Line 342:
def __unicode__(self):
def __unicode__(self):
label = self.getLabel()
label = self.getLabel()
tmpLink = self.getLink()
tmpLink = self.getLink(withAnchor=True)
if self.getType() == u'internal':
if self.getType() == u'internal':
tmpLink2 = tmpLink.replace(u'_', u' ')
tmpLink2 = tmpLink.replace(u'_', u' ')
Line 585: Line 639:
content = content.replace(s[0], s[1])
content = content.replace(s[0], s[1])
return content
return content
def regReplaceCallBack(sub, match):
def regReplaceCallBack(sub, match):
groupcount = 1
groupcount = 1
Line 700: Line 753:
f, params = f
f, params = f
for i in range(len(linklist)):
for i in range(len(linklist)):
if linklist[i] is not None:
if linklist[i] is not None and isinstance(linklist[i], link):
oldLink = u(linklist[i])
oldLink = u(linklist[i])
linklist[i] = f(linklist[i], **kwargs)
linklist[i] = f(linklist[i], **kwargs)
Line 716: Line 769:
f, params = f
f, params = f
for i in range(len(templatelist)):
for i in range(len(templatelist)):
if templatelist[i] is not None:
if templatelist[i] is not None and isinstance(templatelist[i], template):
oldTemplate = u(templatelist[i])
oldTemplate = u(templatelist[i])
templatelist[i] = f(templatelist[i], **kwargs)
templatelist[i] = f(templatelist[i], **kwargs)
Line 748: Line 801:
return setFilterName(curry(dumbReplacement, rs), u'DumbReplacements(' + u(rs) + u')')
return setFilterName(curry(dumbReplacement, rs), u'DumbReplacements(' + u(rs) + u')')
def dumbReplace(subject, replacement):
def dumbReplace(subject, replacement):
return setFilterName(dumbReplaces({subject: replacement}), u'DumbReplacement(' + u(subject) + u' -> ' + u(replacement) + u')')
return setFilterName(dumbReplaces({subject: replacement}), u'DumbReplacement(' + u(subject) + u' \u2192 ' + u(replacement) + u')')
def wordRegex(word, **kwargs):
def wordRegex(word, **kwargs):
flags = None
flags = None
Line 755: Line 808:
word = word[0]
word = word[0]
word = u(re.sub(r'[-_ ]+', r'[-_ ]', u(word)))
word = u(re.sub(r'[-_ ]+', r'[-_ ]', u(word)))
word = u(r"(?<![\u00E8-\u00F8\xe8-\xf8\w])(?<!'')(?<!" + r'"' + r")(?:\b|^)" + word + r"(?:\b(?![\u00E8-\u00F8\xe8-\xf8\w])(?!''|" + r'"' + r")|$)")
word = u(r"(?<![\u00E8-\u00F8\xe8-\xf8\w])(?<!'')(?<!" + r'"' + ")(?:\\b|(?<=[ \\[\\]\\(\\):;.,\"'*\\xab\\xbb])|^)" + word + r"(?:\b(?![\u00E8-\u00F8\xe8-\xf8\w])(?!''|" + r'"' + ")|(?=[ \\[\\]\(\\):;.,\"'*\\xab\\xbb])|$)")
if flags is None:
if flags is None:
return word
return word
Line 780: Line 833:
else:
else:
rs[wordRegex(w, **kwargs)] = correct
rs[wordRegex(w, **kwargs)] = correct
return setFilterName(regexes(rs), u'WordFilter(' + u'/'.join(badwords2) + u' -> ' + correct + u')')
return setFilterName(regexes(rs), u'WordFilter(' + u'/'.join(badwords2) + u' \u2192 ' + correct + u')')
def enforceCapitalization(*words, **kwargs):
def enforceCapitalization(*words, **kwargs):
for w in words:
for w in words:
Line 994: Line 1,047:
except:
except:
error('Couldn\'t grab page', p)
error('Couldn\'t grab page', p)
coderegex = compileRegex(r'^(?: [^\r\n]*(?:[\r\n]+|$))+', re.MULTILINE)
coderegex = compileRegex(r'^(?: [^\r\n]*(?:[\r\n]+|$))+', re.MULTILINE)
trimcode = compileRegex(r'^ |</?nowiki>', re.MULTILINE)
trimcode = compileRegex(r'^ |</?nowiki>', re.MULTILINE)
for m in coderegex.finditer(code):
for m in coderegex.finditer(code):
try:
try:
Line 1,174: Line 1,227:
for f in fs:
for f in fs:
try:
try:
os.remove(tempFile)
os.remove(f)
except:
except:
pass
pass