Bikarhêner:Balyozxane/skrîpt/py/addcontrolauth.py

#!/usr/bin/python3
import pywikibot
import re
from pywikibot import pagegenerators
from pywikibot.bot import AutomaticTWSummaryBot, ConfigParserBot, SingleSiteBot
from pywikibot.exceptions import LockedPageError
from kucosmetics import CANCEL, CosmeticChangesToolkit

TESTING = True

def reorder_templates_and_remove_categories(text):

    # Find and remove Koord or Coord templates
    koord_templates = find_koord_templates(text)
    text = remove_koord_templates(text)

    # Find and remove other templates
    template_regex = r'{{\s*([^\}]+\-şitil|[Şş]iti?l|[Kk]urt|[Ss]tub|[Şş]itlek|[^\}]+\-şitil\-[^\}]+)\s*}}'
    templates = re.findall(template_regex, text)
    text = re.sub(template_regex, '', text)


    # Find and remove other templates
    template_sitil_regex = r'{{\s*([Şş]itil-[^\}]+)\s*}}'
    template_sitil = re.findall(template_sitil_regex, text)
    text = re.sub(template_sitil_regex, '', text)


    # Find and remove categories
    category_regex = r'\[\[Kategorî:[^\]]+\]\]'
    categories = re.findall(category_regex, text)
    text = re.sub(category_regex, '', text)

    # Find and remove DEFAULTSORT
    defaultsort_regex = r'{{\s*(DEFAULTSORT:[^}]+|Salê kat bike heke sal hebe)\s*}}'
    defaultsort = re.findall(defaultsort_regex, text)
    defaultsort = defaultsort[0] if defaultsort else ""  # Use an empty string if no DEFAULTSORT is found
    text = re.sub(defaultsort_regex, '', text)

    return text, koord_templates, templates, categories, defaultsort, template_sitil

def find_koord_templates(text):
    # Find Koord or Coord templates
    koord_regex = r'{{\s*([Kk]oord|[Cc]oord)\s*\|\s*([^}]+display\s*=\s*title)\s*}}'
    return [match[1] for match in re.findall(koord_regex, text)]


def remove_koord_templates(text):
    # Remove Koord or Coord templates
    koord_regex = r'{{\s*([Kk]oord|[Cc]oord)\s*\|\s*[^}]+display\s*=\s*title\s*}}'
    return re.sub(koord_regex, '', text)


def append_templates_and_categories(text, koord_templates, templates, categories, defaultsort, template_sitil):
    # Append other text, Koord or Coord templates, DEFAULTSORT, and categories in the specified order
    updated_text = text.rstrip('\n\n')
    
    if not re.search(r'\{\{\s*([kK]ontrola otorîtey?ê?|[aA]uthority control|Kontrola otorîte)\s*\}\}', text, re.IGNORECASE):
        updated_text += "\n{{Kontrola otorîteyê}}"

    if template_sitil and template_sitil != "":
        updated_text +=  "\n"+ '\n'.join('{{' + template_s + '}}' for template_s in template_sitil)

    if templates and templates != "":
        updated_text += "\n"+'\n'.join('{{' + template + '}}' for template in templates)

    if koord_templates and koord_templates != "":
        updated_text += "\n"+'\n'.join('{{Koord|' + koord_template + '}}' for koord_template in koord_templates)

    if defaultsort and defaultsort != "":
        updated_text += '\n' + '{{' + defaultsort + '}}'

    if categories and categories != "":
        updated_text += '\n\n' + '\n'.join(categories)

    # Remove empty lines at the end of the page
    updated_text = re.sub(r'\n\n\n*', '\n\n', updated_text)

    return updated_text

class AppendTextBot(
    SingleSiteBot,
    ConfigParserBot,
    AutomaticTWSummaryBot,
):
    summary_key = 'basic-changing'
    use_redirects = False

    update_options = {
        'async': False,
        'showdiff': False,
        'ignore': CANCEL.MATCH,
    }

    def do_kozmetik(self, old_text):
        kozmetik_cebu = ""
        cc_toolkit = CosmeticChangesToolkit(self.current_page,
                                            ignore=self.opt.ignore)
        new_text, summaries = cc_toolkit.change(old_text)
        applies_summaries = ', '.join(summaries.values())
        if new_text is not False and new_text != old_text:
            kozmetik_cebu = "; paqijiyên kozmetîk"
            if applies_summaries:
                kozmetik_cebu += f' ({applies_summaries}.)'

        return new_text, kozmetik_cebu

    def treat_page(self) -> None:
        page = self.current_page

        try:
            page_text = page.text
        except LockedPageError:
            pywikibot.warning('Page {} is locked?!'
                              .format(page.title(as_link=True)))
            return  # Skip locked page

        if not page.exists():
            print("Page does not exist.")
            return

        # Get the categories of the current page
        categories = [category.title() for category in page.categories()]

        # Check if the page is in the category "Rûpelên cudakirinê"
        if 'Kategorî:Rûpelên cudakirinê' in categories:
            if TESTING:
                print(f"Skipping page '{page}' as it is in the category 'Rûpelên cudakirinê'")
            return

        if re.search(r'\{\{\s*(kontrola otorîteyê|Authority control|Kontrola otorîte)\s*}}', page_text, re.IGNORECASE):
            if TESTING:
                pywikibot.output("Template already exists. Skipping page.")
            return

        # Find and remove templates, categories, etc.
        text, koord_templates, templates, categories, defaultsort, template_sitil = reorder_templates_and_remove_categories(page_text)

        # Append other text, templates, DEFAULTSORT, and categories in the specified order
        updated_text = append_templates_and_categories(text, koord_templates, templates, categories, defaultsort, template_sitil)

        cleaned_new_text, kozmetik_cebu = self.do_kozmetik(updated_text)

        summary = f"Bot: +{{{{[[Şablon:Kontrola otorîteyê|Kontrola otorîteyê]]}}}} (bnr. [[Taybet:PermanentLink/1295521#Şablona_Kontrola_otorîteyê|gotûbêjê]]){kozmetik_cebu}"

        self.put_current(
            cleaned_new_text,
            summary=summary,
            asynchronous=self.opt['async'],
            show_diff=self.opt['showdiff']
        )


def main(*args: str) -> None:
    local_args = pywikibot.handle_args(args)
    gen_factory = pagegenerators.GeneratorFactory()
    local_args = gen_factory.handle_args(local_args)

    options = {}

    # Parse your own command line arguments
    for arg in local_args:
        arg, _, value = arg.partition(':')
        option = arg[1:]
        if option in ('-always', '-async', '-showdiff'):
            options[option[1:]] = True
        elif option == '-ignore':
            value = value.upper()
            try:
                options['ignore'] = getattr(CANCEL, value)
            except AttributeError:
                raise ValueError(f'Unknown ignore mode {value!r}!')

        # take the remaining options as booleans.
        # You will get a hint if they aren't pre-defined in your bot class
        else:
            options[option] = True

    gen = gen_factory.getCombinedGenerator(preload=True)

    if not pywikibot.bot.suggest_help(missing_generator=not gen):
        bot = AppendTextBot(generator=gen, **options)
        bot.run()


if __name__ == '__main__':
    main()