Bikarhêner:Balyozxane/tenesort.py

#<nowiki>
import pywikibot
import re
from pywikibot import pagegenerators
from pywikibot.bot import AutomaticTWSummaryBot, ConfigParserBot, SingleSiteBot
from pywikibot.exceptions import NoPageError
from pywikibot.data import api
import requests
import re

def escapeRegExp(text):
    return re.sub(r'[.*+?^${}()|[\]\\]', r'\\&', text)

def sortAlphabetically(content):
    wergerSections = extractWergerSections(content)
    if wergerSections:
        fetchPromises = []
        for wergerSection in wergerSections:
            lines = wergerSection.strip().split("\n")
            langSet = []
            currentMainLang = None

            for line in lines:
                langCodeMatches = re.match(r'\* \{\{Z\|([a-zA-Z-]+)\}\}:', line)
                if langCodeMatches:
                    langCode = langCodeMatches.group(1).lower() or ""
                    if not line.startswith("*:"):  # Lines that don't start with "*:" are normal lines
                        if currentMainLang:
                            langSet.append(currentMainLang)
                        currentMainLang = {
                            'type': 'mainLang',
                            'line': line,
                            'langCode': langCode,
                            'subsets': [],
                        }
                    elif currentMainLang:
                        currentMainLang['subsets'].append(line)
                else:
                    if currentMainLang:
                        currentMainLang['subsets'].append(line)
                    else:
                        langSet.append({
                            'type': 'unknown',  # Mark unknown lines to distinguish from subsets
                            'line': line,
                        })

            if currentMainLang:
                langSet.append(currentMainLang)

            try:
                # Fetch language names and perform sorting here
                langSet = sort_by_kurdish_alphabet(langSet)
                pywikibot.output(f"langSet hat rêzkirin")

                sortedLines = []
                for item in langSet:
                    if item['type'] == 'mainLang':
                        sortedLines.append(item['line'])
                        sortedLines.extend(item['subsets'])
                    else:
                        sortedLines.append(item['line'])
                sortedContent = "\n".join(sortedLines)
                try:
                    content = content.replace(wergerSection, sortedContent)
                except Exception as e:
                    print(f"An error occurred: {str(e)}")
            except Exception as e:
                print(f"An error occurred: {str(e)}")

        return content

def extractWergerSections(content):
    werger_sections = []
    werger_ser_regex = r'\{\{werger-ser(?:\|[^\}]+)?}}'  # Regular expression to match {{werger-ser}} with optional arguments
    matches = re.finditer(werger_ser_regex, content, re.IGNORECASE)

    for match in matches:
        start_index = match.start()
        end_index = content.find("{{werger-bin}}", start_index)

        if end_index != -1:
            section_content = content[start_index + len(match.group(0)):end_index].strip()
            werger_sections.append(section_content)

    return werger_sections

def sort_by_kurdish_alphabet(langSet):
    kurdish_alphabet = "ABCCÇDEÊFGHIÎJKLÎMNOPQRSŞTUÛVWXYZabccçdeêfghiîjklîmnopqrsştuûvwxyzǃǀǁǂ"
    pywikibot.output(f"langSet tê rêzkirin") 
    lang_codes = [item['langCode'] for item in langSet]
    lang_names = fetch_language_names(lang_codes)

    def kurdish_key(lang_item):
        lang_code = lang_item['langCode']
        lang_name = lang_names.get(lang_code, lang_code)
        lang_name = lang_name.lower()
        return [kurdish_alphabet.find(char) for char in lang_name]

    langSet.sort(key=kurdish_key)
    
    return langSet


def fetch_language_names(lang_codes):
    pywikibot.output(f"lang_codes: {lang_codes}")
    language_names = {}
    language_data_url = "https://ku.wiktionary.org/w/index.php?title=MediaWiki:Gadget-translation editor.js/ziman.json&action=raw"

    try:
        response = requests.get(language_data_url)
        data = response.json()
        for lang_code in lang_codes:
            if lang_code in data:
                language_names[lang_code] = data[lang_code]
        pywikibot.output(f"fetched language_names") 
        return language_names
    except Exception as e:
        print(f"Error fetching language names: {e}")
        return {}

class AppendTextBot(
    SingleSiteBot,
    ConfigParserBot,
    AutomaticTWSummaryBot,
):
    summary_key = 'basic-changing'
    use_redirects = False
    update_options = {
        'summary': None,
        'text': '',
        'top': False,
    }

    def treat_page(self) -> None:
        page = self.current_page
        pywikibot.output(f"Processing page: {page.title()}")

        # Get the page content
        page_text = page.text

        # Sort alphabetically
        page_text = sortAlphabetically(page_text)
        pywikibot.output(f"page_text hat rêzkirin")

   
        # Save the updated page content
        self.put_current(page_text, summary="beşa Wergerê rêz kir")

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

    options = {'text': ''}

    for arg in local_args:
        option, _, value = arg.partition(':')
        if option in ('summary', 'text'):
            if not value:
                pywikibot.input(f'Please enter a value for {option}')
            options[option] = value
        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()

#</nowiki>