diff --git a/wikibot.py b/wikibot.py index f0d7f4128baed49ea2344b447438f7143929116a..4cc80e4caaeacc5b978b014b5ef386c2ef25bb3d 100644 --- a/wikibot.py +++ b/wikibot.py @@ -5,11 +5,14 @@ import datetime import argparse from xmlrpc.client import ServerProxy as Proxy, Error as wikiError +# regex to change a links target while keeping its display name +WIKILINKREG = rf"\[\[\s*{{}}\s*\|(.*?)\]\]" +proxy = Proxy(config.WIKI_API_URL) # TODO + def get_time(): """Return the dokwuikis current time as timestamp.""" - with Proxy(config.WIKI_API_URL) as proxy: - return proxy.dokuwiki.getTime() + return proxy.dokuwiki.getTime() def strip_namespace(full_name): @@ -25,81 +28,85 @@ def strip_namespace(full_name): def move_page(old_pagename, new_pagename, delete=False): """Moves a page, updates links to new page and flags or deletes the old one.""" - with Proxy(config.WIKI_API_URL) as proxy: - # create new page with identical content # - page_content = proxy.wiki.getPage(old_pagename) - if not page_content: - return - proxy.wiki.putPage(new_pagename, page_content, { - "sum": "Moved from " + old_pagename}) - # update back links to new page - change_links(old_pagename, new_pagename) - # either flag or delete original page # - if not delete: - proxy.dokuwiki.appendPage(old_pagename, "\n DELETEME This page was moved to " + new_pagename, - {"sum": "Moved to " + new_pagename + " and marked page for deletion"}) - else: - proxy.wiki.putPage(old_pagename, "", { - "sum": "Moved to " + new_pagename}) - - -def move_pages(original_name_regex, new_name_func, delete=False): + # create new page with identical content # + page_content = proxy.wiki.getPage(old_pagename) + if not page_content: + return + proxy.wiki.putPage(new_pagename, page_content, { + "sum": "Moved from " + old_pagename}) + # update back links to new page + change_links(old_pagename, new_pagename) + # either flag or delete original page # + if not delete: + proxy.dokuwiki.appendPage(old_pagename, "\n DELETEME This page was moved to " + new_pagename, + {"sum": "Moved to " + new_pagename + " and marked page for deletion"}) + else: + proxy.wiki.putPage(old_pagename, "", { + "sum": "Moved to " + new_pagename}) + + +def get_pages(name_regex): + """ Returns all pages which names completly match a given regex.""" + pages = proxy.dokuwiki.getPagelist("") + update_pages = {page for page in pages + if re.fullmatch(name_regex, page.get("id"))} + return update_pages + + +def move_pages_regex(original_name_regex, new_name_func, delete=False): """ Moves a bunch of pages where the complete name is matched by a given regex and new names are given via a function. original_name_regex is a regular expression which the old names have to match completly. new_name_func is a function which gets the matched old name as input and returns the new name. delete is a boolean flag wether old pages are to be deleted or just marked. """ - with Proxy(config.WIKI_API_URL) as proxy: - # move sites # - pages = proxy.dokuwiki.getPagelist("") - update_pages = {page.get("id"): new_name_func(page.get("id")) for page in pages - if re.fullmatch(original_name_regex, page.get("id"))} - for old, new in update_pages.items(): - page_content = proxy.wiki.getPage(old) - proxy.wiki.putPage(new, page_content, {"sum": "Moved from " + old}) - # bulk update for links # - update_backlink_sites = {} - for page in update_pages.keys(): - for link in proxy.wiki.getBackLinks(page): - if update_backlink_sites.get(link): - update_backlink_sites[link].append(page) - else: - update_backlink_sites[link] = [page] - reg = rf"\[\[\s*{{}}\s*\|(.*?)\]\]" - def _replacer(new_name): return ( - lambda matched: "[[" + new_name + "|" + matched.group(1) + "]]") - for page_to_update, old_pages in update_backlink_sites.items(): - page_content = proxy.wiki.getPage(page_to_update) - for old_page in old_pages: - page_content = re.sub(reg.format(old_page), _replacer( - update_pages[old_page]), page_content) - proxy.wiki.putPage(page_to_update, page_content, { - "sum": "Update links due to moving sites"}) - # either flag or delete original pages # - if not delete: - for old_page, new_page in update_pages.items(): - proxy.dokuwiki.appendPage(old_page, "\n\n DELETEME This page was moved to " + new_page, - {"sum": "Moved to " + new_page + " and marked page for deletion"}) - else: - for old_page, new_page in update_pages.items(): - proxy.wiki.putPage( - old_page, "", {"sum": "Moved to " + new_page}) + pages = get_pages(original_name_regex) + # move pages # + update_pages = {page.get("id"): new_name_func( + page.get("id")) for page in pages} + for old, new in update_pages.items(): + page_content = proxy.wiki.getPage(old) + proxy.wiki.putPage(new, page_content, {"sum": "Moved from " + old}) + # bulk update for links # + update_backlink_sites = {} + for page in update_pages.keys(): + for link in proxy.wiki.getBackLinks(page): + if update_backlink_sites.get(link): + update_backlink_sites[link].append(page) + else: + update_backlink_sites[link] = [page] + def _replacer(new_name): return ( + lambda matched: "[[" + new_name + "|" + matched.group(1) + "]]") + for page_to_update, old_pages in update_backlink_sites.items(): + page_content = proxy.wiki.getPage(page_to_update) + for old_page in old_pages: + page_content = re.sub(WIKILINKREG.format(old_page), _replacer( + update_pages[old_page]), page_content) + proxy.wiki.putPage(page_to_update, page_content, { + "sum": "Update links due to moving sites"}) + # either flag or delete original pages # + if not delete: + for old_page, new_page in update_pages.items(): + proxy.dokuwiki.appendPage(old_page, "\n\n DELETEME This page was moved to " + new_page, + {"sum": "Moved to " + new_page + " and marked page for deletion"}) + else: + for old_page, new_page in update_pages.items(): + proxy.wiki.putPage( + old_page, "", {"sum": "Moved to " + new_page}) def change_links(old_pagename, new_pagename): """Updates pages that link to an old page, to link to new page instead.""" - with Proxy(config.WIKI_API_URL) as proxy: - backLinks = proxy.wiki.getBackLinks(old_pagename) - # regex for dokuwiki links we want to replace - reg = rf"\[\[\s*{old_pagename}\s*\|(.*?)\]\]" - - def _replacer(matched): - return "[[" + new_pagename + "|" + matched.group(1) + "]]" - for page in backLinks: - content = proxy.wiki.getPage(page) - content = re.sub(reg, _replacer, content) - proxy.wiki.putPage( - page, content, {"sum": "Update links from " + old_pagename + " to " + new_pagename}) + backLinks = proxy.wiki.getBackLinks(old_pagename) + # regex for dokuwiki links we want to replace + reg = WIKILINKREG.format(old_pagename) + + def _replacer(matched): + return "[[" + new_pagename + "|" + matched.group(1) + "]]" + for page in backLinks: + content = proxy.wiki.getPage(page) + content = re.sub(reg, _replacer, content) + proxy.wiki.putPage( + page, content, {"sum": "Update links from " + old_pagename + " to " + new_pagename}) def find_old_pages(timedelta, namespace=""): @@ -107,24 +114,22 @@ def find_old_pages(timedelta, namespace=""): Used timedelta can be given as datetime.datetime or datetime.timedelta object. Optional a namespace can be given to only get old pages from that namespace. """ - with Proxy(config.WIKI_API_URL) as proxy: - pages = proxy.dokuwiki.getPagelist(namespace) - proxy_time = proxy.dokuwiki.getTime() - old_pages = [] - if type(timedelta) is datetime.timedelta: - old_pages = [page for page in pages if proxy_time - - page.get('rev') > timedelta.total_seconds()] - elif type(timedelta) is datetime.datetime: - old_pages = [page for page in pages if page.get( - 'rev') < timedelta.timestamp()] - return old_pages + pages = proxy.dokuwiki.getPagelist(namespace) + proxy_time = proxy.dokuwiki.getTime() + old_pages = [] + if type(timedelta) is datetime.timedelta: + old_pages = [page for page in pages if proxy_time - + page.get('rev') > timedelta.total_seconds()] + elif type(timedelta) is datetime.datetime: + old_pages = [page for page in pages if page.get( + 'rev') < timedelta.timestamp()] + return old_pages def mark_page(pagename, message, summary="Marked page"): """Puts a message at the beginning of a page""" - with Proxy(config.WIKI_API_URL) as proxy: - content = proxy.wiki.getPage(pagename) - proxy.wiki.putPage(pagename, message+"\n\n"+content, {"sum": summary}) + content = proxy.wiki.getPage(pagename) + proxy.wiki.putPage(pagename, message+"\n\n"+content, {"sum": summary}) def mark_old_pages(timedelta, namespace=""): @@ -135,10 +140,9 @@ def mark_old_pages(timedelta, namespace=""): old_pages = find_old_pages(timedelta, namespace) message = "FIXME This Page is out of date and should be reviewed\n\n" summary = "Marked page due to its age" - with Proxy(config.WIKI_API_URL) as proxy: - for page in old_pages: - if not proxy.wiki.getPage(page.get("id")).startswith("FIXME"): - mark_page(page.get("id"), message, summary) + for page in old_pages: + if not proxy.wiki.getPage(page.get("id")).startswith("FIXME"): + mark_page(page.get("id"), message, summary) if __name__ == "__main__":