|
|
@@ -22,14 +22,17 @@ |
|
|
|
|
|
|
|
import re |
|
|
|
|
|
|
|
from earwigbot import exceptions |
|
|
|
from earwigbot.tasks import Task |
|
|
|
from earwigbot.wiki import constants |
|
|
|
|
|
|
|
class WikiProjectTagger(Task): |
|
|
|
"""A task to tag talk pages with WikiProject banners. |
|
|
|
|
|
|
|
Usage: :command:`earwigbot -t wikiproject_tagger PATH |
|
|
|
--banner BANNER (--category CAT | --file FILE) [--summary SUM] |
|
|
|
[--append TEXT] [--autoassess] [--nocreate] [--recursive NUM]` |
|
|
|
[--append TEXT] [--autoassess] [--nocreate] [--recursive NUM] |
|
|
|
[--site SITE]` |
|
|
|
|
|
|
|
.. glossary:: |
|
|
|
|
|
|
@@ -57,6 +60,8 @@ class WikiProjectTagger(Task): |
|
|
|
``--recursive NUM`` |
|
|
|
recursively go through subcategories up to a maximum depth of ``NUM``, |
|
|
|
or if ``NUM`` isn't provided, go infinitely (this can be dangerous) |
|
|
|
``--site SITE`` |
|
|
|
the ID of the site to tag pages on, defaulting to the... default site |
|
|
|
|
|
|
|
""" |
|
|
|
name = "wikiproject_tagger" |
|
|
@@ -91,7 +96,58 @@ class WikiProjectTagger(Task): |
|
|
|
|
|
|
|
def run(self, **kwargs): |
|
|
|
"""Main entry point for the bot task.""" |
|
|
|
if "file" not in kwargs and "category" not in kwargs: |
|
|
|
log = "No pages to tag; I need either a 'category' or a 'file' passed as kwargs" |
|
|
|
self.logger.error(log) |
|
|
|
return |
|
|
|
if "banner" not in kwargs: |
|
|
|
log = "Needs a banner to add passed as the 'banner' kwarg" |
|
|
|
self.logger.error(log) |
|
|
|
return |
|
|
|
|
|
|
|
banner = kwargs["banner"] |
|
|
|
summary = kwargs.get("summary", "Adding $3 to article talk page.") |
|
|
|
append = kwargs.get("append") |
|
|
|
autoassess = kwargs.get("autoassess", False) |
|
|
|
nocreate = kwargs.get("nocreate", False) |
|
|
|
recursive = kwargs.get("recursive", 0) |
|
|
|
site = self.bot.wiki.get_site(name=kwargs.get("site")) |
|
|
|
|
|
|
|
if "category" in kwargs: |
|
|
|
pass |
|
|
|
elif "file" in kwargs: |
|
|
|
pass |
|
|
|
title = kwargs["category"] |
|
|
|
prefix = name.split(":", 1)[0] |
|
|
|
ns_cat = site.namespace_id_to_name(constants.NS_CATEGORY) |
|
|
|
if prefix == title: |
|
|
|
title = u":".join((ns_cat, title)) |
|
|
|
else: |
|
|
|
try: |
|
|
|
site.namespace_name_to_id(prefix) |
|
|
|
except exceptions.NamespaceNotFoundError: |
|
|
|
title = u":".join((ns_cat, title)) |
|
|
|
self.process_category(title, recursive) |
|
|
|
|
|
|
|
if "file" in kwargs: |
|
|
|
with open(kwargs["file"], "r") as fileobj: |
|
|
|
for line in fileobj: |
|
|
|
if line.strip(): |
|
|
|
line = line.decode("utf8") |
|
|
|
if line.startswith("[[") and line.endswith("]]"): |
|
|
|
line = line[2:-2] |
|
|
|
page = site.get_page(line) |
|
|
|
if page.namespace == constants.NS_CATEGORY: |
|
|
|
self.process_category(page, recursive) |
|
|
|
else: |
|
|
|
self.process_page(page) |
|
|
|
|
|
|
|
def process_category(self, page, recursive): |
|
|
|
for member in page.get_members(): |
|
|
|
if member.namespace == constants.NS_CATEGORY: |
|
|
|
if recursive is True: |
|
|
|
self.process_category(member, True) |
|
|
|
elif recursive: |
|
|
|
self.process_category(member, recursive - 1) |
|
|
|
else: |
|
|
|
self.process_page(member) |
|
|
|
|
|
|
|
def process_page(self, page): |
|
|
|
raise NotImplementedError(page) |