From 11e7c6477bebfb1bdd32c62eb5b14a48e86040d4 Mon Sep 17 00:00:00 2001 From: lokas Date: Sun, 1 Oct 2023 23:16:01 +0300 Subject: [PATCH 1/7] add --- tasks/tahdith_tashkila/__init__.py | 0 tasks/tahdith_tashkila/run.py | 4 + tasks/tahdith_tashkila/src/bot.py | 88 +++++++++++++++++++ .../src/data_extraction/__init__.py | 0 .../src/data_extraction/data_extractor.py | 53 +++++++++++ .../src/data_extraction/templates/__init__.py | 0 .../templates/football_squad.py | 69 +++++++++++++++ tasks/tahdith_tashkila/src/logger/__init__.py | 0 .../src/logger/abstract_logger.py | 31 +++++++ .../src/logger/console_logger.py | 13 +++ .../src/logger/error_logger.py | 12 +++ .../src/logger/file_logger.py | 12 +++ 12 files changed, 282 insertions(+) create mode 100644 tasks/tahdith_tashkila/__init__.py create mode 100644 tasks/tahdith_tashkila/run.py create mode 100644 tasks/tahdith_tashkila/src/bot.py create mode 100644 tasks/tahdith_tashkila/src/data_extraction/__init__.py create mode 100644 tasks/tahdith_tashkila/src/data_extraction/data_extractor.py create mode 100644 tasks/tahdith_tashkila/src/data_extraction/templates/__init__.py create mode 100644 tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py create mode 100644 tasks/tahdith_tashkila/src/logger/__init__.py create mode 100644 tasks/tahdith_tashkila/src/logger/abstract_logger.py create mode 100644 tasks/tahdith_tashkila/src/logger/console_logger.py create mode 100644 tasks/tahdith_tashkila/src/logger/error_logger.py create mode 100644 tasks/tahdith_tashkila/src/logger/file_logger.py diff --git a/tasks/tahdith_tashkila/__init__.py b/tasks/tahdith_tashkila/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/run.py b/tasks/tahdith_tashkila/run.py new file mode 100644 index 00000000..d20520ca --- /dev/null +++ b/tasks/tahdith_tashkila/run.py @@ -0,0 +1,4 @@ +from tasks.tahdith_tashkila.src.bot import BotFactory + +bot = BotFactory() +bot.run("قالب:تشكيلة_شيفيلد_يونايتد") diff --git a/tasks/tahdith_tashkila/src/bot.py b/tasks/tahdith_tashkila/src/bot.py new file mode 100644 index 00000000..ba89ef0d --- /dev/null +++ b/tasks/tahdith_tashkila/src/bot.py @@ -0,0 +1,88 @@ +import pywikibot + +from tasks.tahdith_tashkila.src.data_extraction.templates.football_squad import FootballSquad +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger +from tasks.tahdith_tashkila.src.logger.console_logger import ConsoleLogger +from tasks.tahdith_tashkila.src.logger.error_logger import ErrorLogger +from tasks.tahdith_tashkila.src.logger.file_logger import FileLogger + + +class BotFactory: + BOT_STATUS_STARTED = 0 + BOT_STATUS_LOADING_PAGE = 1 + BOT_STATUS_DATA_EXTRACTED = 2 + + def getChainOfLoggers(self) -> AbstractLogger: + errorLogger = ErrorLogger(AbstractLogger.ERROR) + fileLogger = FileLogger(AbstractLogger.DEBUG) + consoleLogger = ConsoleLogger(AbstractLogger.INFO) + + errorLogger.nextLogger = fileLogger + fileLogger.nextLogger = consoleLogger + + return errorLogger + + def run(self, page_title: str): + self.logger.logMessage(AbstractLogger.INFO, "Bot started") + self.load_page(page_title=page_title) + self.data_extractor() + self.logger.logMessage(AbstractLogger.INFO, "Bot finished") + + def __init__(self): + self.logger = self.getChainOfLoggers() + # ar page + self.ar_site = pywikibot.Site("ar", "wikipedia") + self.ar_page = None + self.ar_text = None + # en page + self.en_site = pywikibot.Site("en", "wikipedia") + self.en_page = None + self.en_text = None + self.status = self.BOT_STATUS_STARTED + + self.data_extractor_list = [] + + def load_page(self, page_title: str): + self.logger.logMessage(AbstractLogger.INFO, "start loading page") + self.ar_page = pywikibot.Page(self.ar_site, page_title) + if not self.ar_page.exists(): + self.logger.logMessage(AbstractLogger.ERROR, "page does not exist") + return + self.logger.logMessage(AbstractLogger.INFO, "page exists") + en_title = None + for item in self.ar_page.langlinks(): + if str(item).startswith("[[en:"): + en_title = item.title + break + if en_title is None: + self.logger.logMessage(AbstractLogger.ERROR, "en page not found") + en_title_with_template = "template:" + en_title + self.logger.logMessage(AbstractLogger.INFO, "start geting en page") + self.en_page = pywikibot.Page(self.en_site, en_title_with_template) + + if not self.en_page.exists(): + self.logger.logMessage(AbstractLogger.ERROR, "page does not exist") + return + + self.logger.logMessage(AbstractLogger.INFO, "en page exists") + + self.en_text = self.en_page.text + + self.ar_text = self.ar_text + + self.logger.logMessage(AbstractLogger.INFO, "end fill page") + + self.status = self.BOT_STATUS_LOADING_PAGE + + def data_extractor(self): + self.logger.logMessage(AbstractLogger.INFO, "start extract template") + extractor = FootballSquad( + text_page=self.en_text, + logger=self.logger + ) + extractor.parse() + if not extractor.check(): + self.logger.logMessage(AbstractLogger.ERROR, "cannot found data in this template") + + self.data_extractor_list = extractor.list + self.status = self.BOT_STATUS_DATA_EXTRACTED diff --git a/tasks/tahdith_tashkila/src/data_extraction/__init__.py b/tasks/tahdith_tashkila/src/data_extraction/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_extraction/data_extractor.py b/tasks/tahdith_tashkila/src/data_extraction/data_extractor.py new file mode 100644 index 00000000..327ed899 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_extraction/data_extractor.py @@ -0,0 +1,53 @@ +from abc import abstractmethod, ABC + +import wikitextparser as wtp + +from core.utils.helpers import prepare_str +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class DataExtractor(ABC): + def __init__(self, text_page: str, logger: AbstractLogger): + self.text_page = text_page + self.logger = logger + self.list = [] + + @abstractmethod + def template_name(self) -> str: + pass + + @abstractmethod + def parameters_list(self) -> list: + pass + + def check(self) -> bool: + return len(self.list) + + def parse(self): + self.logger.logMessage(AbstractLogger.INFO, "start extract data") + parsed = wtp.parse(self.text_page) + self.logger.logMessage(AbstractLogger.INFO, "end extract data") + self.logger.logMessage(AbstractLogger.INFO, "start extract template") + templates = parsed.templates + if not len(templates): + self.logger.logMessage(AbstractLogger.WARNING, "no template found in page") + return + if self.template_name() is None: + self.logger.logMessage(AbstractLogger.ERROR, "no template name set in class you are using") + return + if self.parameters_list() is None or len(self.parameters_list()) == 0: + self.logger.logMessage(AbstractLogger.ERROR, "no parameters set in class you are using") + return + + for template in templates: + if prepare_str(template.name) == prepare_str(self.template_name()): + self.logger.logMessage(AbstractLogger.INFO, "start extract parameters") + for parameter in self.parameters_list(): + for param in template.arguments: + if prepare_str(param.name) == prepare_str(parameter): + self.logger.logMessage(AbstractLogger.INFO, f"{param.name}: {param.value}") + self.list.append({ + "name": param.name, + "value": param.value + }) + break diff --git a/tasks/tahdith_tashkila/src/data_extraction/templates/__init__.py b/tasks/tahdith_tashkila/src/data_extraction/templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py new file mode 100644 index 00000000..58dad900 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py @@ -0,0 +1,69 @@ +from abc import ABC + +import wikitextparser as wtp + +from core.utils.helpers import prepare_str +from tasks.tahdith_tashkila.src.data_extraction.data_extractor import DataExtractor +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class FootballSquad(DataExtractor, ABC): + def __init__(self, text_page: str, logger: AbstractLogger): + super().__init__(text_page=text_page, logger=logger) + + def template_name(self) -> str: + return "Football squad" + + def parameters_list(self) -> list: + return [ + "no##", + "manager##", + "manager_type##", + "list" + ] + + def parse(self): + self.logger.logMessage(AbstractLogger.INFO, "start extract data") + parsed = wtp.parse(self.text_page) + self.logger.logMessage(AbstractLogger.INFO, "end extract data") + self.logger.logMessage(AbstractLogger.INFO, "start extract template") + templates = parsed.templates + if not len(templates): + self.logger.logMessage(AbstractLogger.WARNING, "no template found in page") + return + if self.template_name() is None: + self.logger.logMessage(AbstractLogger.ERROR, "no template name set in class you are using") + return + if self.parameters_list() is None or len(self.parameters_list()) == 0: + self.logger.logMessage(AbstractLogger.ERROR, "no parameters set in class you are using") + return + + for template in templates: + if prepare_str(template.name) == prepare_str(self.template_name()): + self.logger.logMessage(AbstractLogger.INFO, "start extract parameters") + + have_list_argument = False + + for argument in template.arguments: + if prepare_str(argument.name) == prepare_str('list'): + have_list_argument = True + break + + if have_list_argument: + for sub_template in parsed.templates: + if prepare_str(sub_template.name) == prepare_str("football squad2 player"): + self.list.append(sub_template.arguments) + + if prepare_str(sub_template.name) == prepare_str("football squad manager"): + self.list.append(sub_template.arguments) + + # if not have_list_argument: + # for param in template.arguments: + # for parameter in self.parameters_list(): + # tem_parameter = str(parameter).replace("#", "") + # if prepare_str(param.name).startswith(tem_parameter): + # self.logger.logMessage(AbstractLogger.INFO, f"{param.name}: {param.value}") + # self.list.append({ + # "name": param.name, + # "value": param.value + # }) diff --git a/tasks/tahdith_tashkila/src/logger/__init__.py b/tasks/tahdith_tashkila/src/logger/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/logger/abstract_logger.py b/tasks/tahdith_tashkila/src/logger/abstract_logger.py new file mode 100644 index 00000000..e18be231 --- /dev/null +++ b/tasks/tahdith_tashkila/src/logger/abstract_logger.py @@ -0,0 +1,31 @@ +from abc import ABC, abstractmethod + + +class AbstractLogger(ABC): + INFO: int = 1 + DEBUG: int = 2 + WARNING: int = 3 + ERROR: int = 4 + FATAL: int = 5 + + _level: int = None + # next element in chain or responsibility + _nextLogger = None + + @property + def nextLogger(self): + return self._nextLogger + + @nextLogger.setter + def nextLogger(self, value): + self._nextLogger = value + + def logMessage(self, level, message): + if self._level <= level: + self.write(message) + if self._nextLogger is not None: + self._nextLogger.logMessage(level, message) + + @abstractmethod + def write(self, message): + pass diff --git a/tasks/tahdith_tashkila/src/logger/console_logger.py b/tasks/tahdith_tashkila/src/logger/console_logger.py new file mode 100644 index 00000000..db7e601a --- /dev/null +++ b/tasks/tahdith_tashkila/src/logger/console_logger.py @@ -0,0 +1,13 @@ +from abc import ABC + +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class ConsoleLogger(AbstractLogger, ABC): + def __init__(self, level): + super().__init__() + self._level = level + + def write(self, message): + # todo: add Timestamps, context, etc + print("Standard Console::Logger: " + message) diff --git a/tasks/tahdith_tashkila/src/logger/error_logger.py b/tasks/tahdith_tashkila/src/logger/error_logger.py new file mode 100644 index 00000000..fad41bc4 --- /dev/null +++ b/tasks/tahdith_tashkila/src/logger/error_logger.py @@ -0,0 +1,12 @@ +from abc import ABC + +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class ErrorLogger(AbstractLogger, ABC): + def __init__(self, level): + super().__init__() + self._level = level + + def write(self, message): + print("Error Console::Logger: " + message) diff --git a/tasks/tahdith_tashkila/src/logger/file_logger.py b/tasks/tahdith_tashkila/src/logger/file_logger.py new file mode 100644 index 00000000..bf0381e3 --- /dev/null +++ b/tasks/tahdith_tashkila/src/logger/file_logger.py @@ -0,0 +1,12 @@ +from abc import ABC + +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class FileLogger(AbstractLogger, ABC): + def __init__(self, level): + super().__init__() + self._level = level + + def write(self, message): + print("FileLogger::Logger: " + message) From 2aa5f473a7f8feae0475d3553cb8f403b1381856 Mon Sep 17 00:00:00 2001 From: lokas Date: Sun, 1 Oct 2023 23:31:14 +0300 Subject: [PATCH 2/7] add Player model --- tasks/tahdith_tashkila/src/models/__init__.py | 0 tasks/tahdith_tashkila/src/models/player.py | 45 +++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 tasks/tahdith_tashkila/src/models/__init__.py create mode 100644 tasks/tahdith_tashkila/src/models/player.py diff --git a/tasks/tahdith_tashkila/src/models/__init__.py b/tasks/tahdith_tashkila/src/models/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/models/player.py b/tasks/tahdith_tashkila/src/models/player.py new file mode 100644 index 00000000..391390a8 --- /dev/null +++ b/tasks/tahdith_tashkila/src/models/player.py @@ -0,0 +1,45 @@ +class Player: + _name = None + _number = None + _is_manager = None + _title = None + + @property + def name(self) -> str: + return self._name + + @property + def number(self) -> int: + return self._number + + @property + def is_manger(self) -> bool: + return self._is_manager + + @property + def title(self) -> str: + return self.title + + @property + def has_number(self) -> bool: + return bool(self._number) + + @property + def has_title(self) -> bool: + return bool(self._title) + + @name.setter + def name(self, value): + self._name = str(value) + + @number.setter + def number(self, value): + self._number = int(value) + + @is_manger.setter + def is_manager(self, value): + self._is_manager = bool(value) + + @title.setter + def title(self, value): + self._title = value From 8a7f21b28456e3d14547b15bf985a234826ca900 Mon Sep 17 00:00:00 2001 From: lokas Date: Mon, 2 Oct 2023 16:00:56 +0300 Subject: [PATCH 3/7] add Player model to data --- .../templates/football_squad.py | 23 +++++++++++++++++-- tasks/tahdith_tashkila/src/models/player.py | 6 ++--- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py index 58dad900..ec1afba3 100644 --- a/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py +++ b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py @@ -5,6 +5,7 @@ from core.utils.helpers import prepare_str from tasks.tahdith_tashkila.src.data_extraction.data_extractor import DataExtractor from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger +from tasks.tahdith_tashkila.src.models.player import Player class FootballSquad(DataExtractor, ABC): @@ -52,10 +53,28 @@ def parse(self): if have_list_argument: for sub_template in parsed.templates: if prepare_str(sub_template.name) == prepare_str("football squad2 player"): - self.list.append(sub_template.arguments) + temp_dic = {} + for temp_arg in sub_template.arguments: + temp_dic[temp_arg.name] = temp_arg.value + print("==========") + print(temp_dic["no"]) + player = Player() + player.title = None + player.name = temp_dic["name"] if 'name' in temp_dic else None + player.number = temp_dic["no"] if 'no' in temp_dic else None + player.is_manager = False + self.list.append(player) if prepare_str(sub_template.name) == prepare_str("football squad manager"): - self.list.append(sub_template.arguments) + temp_dic = {} + for temp_arg in sub_template.arguments: + temp_dic[temp_arg.name] = temp_arg.value + player = Player() + player.title = temp_dic['title'] if 'title' in temp_dic else None + player.name = temp_dic["name"] if 'name' in temp_dic else None + player.number = None + player.is_manager = True + self.list.append(player) # if not have_list_argument: # for param in template.arguments: diff --git a/tasks/tahdith_tashkila/src/models/player.py b/tasks/tahdith_tashkila/src/models/player.py index 391390a8..76e2f446 100644 --- a/tasks/tahdith_tashkila/src/models/player.py +++ b/tasks/tahdith_tashkila/src/models/player.py @@ -13,7 +13,7 @@ def number(self) -> int: return self._number @property - def is_manger(self) -> bool: + def is_manager(self) -> bool: return self._is_manager @property @@ -34,9 +34,9 @@ def name(self, value): @number.setter def number(self, value): - self._number = int(value) + self._number = int(value) if type(value) is int else None - @is_manger.setter + @is_manager.setter def is_manager(self, value): self._is_manager = bool(value) From 13763c0f1a3fc35a8579280c8a9b27e5f7d5ec60 Mon Sep 17 00:00:00 2001 From: lokas Date: Mon, 2 Oct 2023 16:15:48 +0300 Subject: [PATCH 4/7] add DataTranslation --- .../src/data_translator/__init__.py | 0 .../src/data_translator/classification_context.py | 13 +++++++++++++ .../data_translator/data_classification/__init__.py | 0 .../has_ar_post_classification_strategy.py | 10 ++++++++++ .../not_has_ar_post_classification_strategy.py | 10 ++++++++++ .../data_translator/data_translation/__init__.py | 0 .../has_ar_post_classification_strategy.py | 7 +++++++ .../not_has_ar_post_classification_strategy.py | 7 +++++++ .../src/data_translator/data_translation_handler.py | 7 +++++++ .../src/data_translator/translation_chain.py | 0 .../value_classification_strategy.py | 7 +++++++ 11 files changed, 61 insertions(+) create mode 100644 tasks/tahdith_tashkila/src/data_translator/__init__.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/classification_context.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_classification/__init__.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_translation/__init__.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/data_translation_handler.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/translation_chain.py create mode 100644 tasks/tahdith_tashkila/src/data_translator/value_classification_strategy.py diff --git a/tasks/tahdith_tashkila/src/data_translator/__init__.py b/tasks/tahdith_tashkila/src/data_translator/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_translator/classification_context.py b/tasks/tahdith_tashkila/src/data_translator/classification_context.py new file mode 100644 index 00000000..41765f2e --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/classification_context.py @@ -0,0 +1,13 @@ +class ClassificationContext: + def __init__(self): + self.strategies = [] + + def add_strategy(self, strategy): + self.strategies.append(strategy) + + def classify(self, value): + for strategy in self.strategies: + result = strategy.classify(value) + if result: + return result + return "unknown" diff --git a/tasks/tahdith_tashkila/src/data_translator/data_classification/__init__.py b/tasks/tahdith_tashkila/src/data_translator/data_classification/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py new file mode 100644 index 00000000..fbfc1960 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py @@ -0,0 +1,10 @@ +from tasks.tahdith_tashkila.src.data_translator.value_classification_strategy import ValueClassificationStrategy + + +class HasArPostClassificationStrategy(ValueClassificationStrategy): + def classify(self, value): + try: + float(value) + return "has_ar_post" + except ValueError: + return None diff --git a/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py new file mode 100644 index 00000000..0348fb49 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py @@ -0,0 +1,10 @@ +from tasks.tahdith_tashkila.src.data_translator.value_classification_strategy import ValueClassificationStrategy + + +class NotHasArPostClassificationStrategy(ValueClassificationStrategy): + def classify(self, value): + try: + float(value) + return "not_has_ar_post" + except ValueError: + return None diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/__init__.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py new file mode 100644 index 00000000..5f883157 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py @@ -0,0 +1,7 @@ +from tasks.tahdith_tashkila.src.data_translator.data_translation_handler import DataTranslationHandler + + +class HasArPostTranslationHandler(DataTranslationHandler): + def translate(self, value): + # Translate the wiki link to Arabic (implement this logic) + return value diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py new file mode 100644 index 00000000..34aae1d9 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py @@ -0,0 +1,7 @@ +from tasks.tahdith_tashkila.src.data_translator.data_translation_handler import DataTranslationHandler + + +class NotHasArPostTranslationHandler(DataTranslationHandler): + def translate(self, value): + # Translate the wiki link to Arabic (implement this logic) + return value diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation_handler.py b/tasks/tahdith_tashkila/src/data_translator/data_translation_handler.py new file mode 100644 index 00000000..ebbc1590 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation_handler.py @@ -0,0 +1,7 @@ +from abc import abstractmethod, ABC + + +class DataTranslationHandler(ABC): + @abstractmethod + def translate(self, value): + pass diff --git a/tasks/tahdith_tashkila/src/data_translator/translation_chain.py b/tasks/tahdith_tashkila/src/data_translator/translation_chain.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/data_translator/value_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/value_classification_strategy.py new file mode 100644 index 00000000..404f54a6 --- /dev/null +++ b/tasks/tahdith_tashkila/src/data_translator/value_classification_strategy.py @@ -0,0 +1,7 @@ +from abc import abstractmethod, ABC + + +class ValueClassificationStrategy(ABC): + @abstractmethod + def classify(self, value): + pass From 30d1c301f5b897757eab706fbd07b64b5df35a65 Mon Sep 17 00:00:00 2001 From: lokas Date: Mon, 2 Oct 2023 17:18:47 +0300 Subject: [PATCH 5/7] add base of translated_value --- tasks/tahdith_tashkila/src/bot.py | 44 ++++++++++++++++++- .../data_translator/classification_context.py | 2 +- .../has_ar_post_classification_strategy.py | 18 +++++++- ...not_has_ar_post_classification_strategy.py | 18 +++++++- .../has_ar_post_classification_strategy.py | 2 +- ...not_has_ar_post_classification_strategy.py | 2 +- .../src/data_translator/translation_chain.py | 13 ++++++ tasks/tahdith_tashkila/src/models/player.py | 25 +++++++++++ 8 files changed, 118 insertions(+), 6 deletions(-) diff --git a/tasks/tahdith_tashkila/src/bot.py b/tasks/tahdith_tashkila/src/bot.py index ba89ef0d..1a06635e 100644 --- a/tasks/tahdith_tashkila/src/bot.py +++ b/tasks/tahdith_tashkila/src/bot.py @@ -1,6 +1,16 @@ import pywikibot from tasks.tahdith_tashkila.src.data_extraction.templates.football_squad import FootballSquad +from tasks.tahdith_tashkila.src.data_translator.classification_context import ClassificationContext +from tasks.tahdith_tashkila.src.data_translator.data_classification.has_ar_post_classification_strategy import \ + HasArPostClassificationStrategy +from tasks.tahdith_tashkila.src.data_translator.data_classification.not_has_ar_post_classification_strategy import \ + NotHasArPostClassificationStrategy +from tasks.tahdith_tashkila.src.data_translator.data_translation.has_ar_post_classification_strategy import \ + HasArPostTranslationHandler +from tasks.tahdith_tashkila.src.data_translator.data_translation.not_has_ar_post_classification_strategy import \ + NotHasArPostTranslationHandler +from tasks.tahdith_tashkila.src.data_translator.translation_chain import TranslationChain from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger from tasks.tahdith_tashkila.src.logger.console_logger import ConsoleLogger from tasks.tahdith_tashkila.src.logger.error_logger import ErrorLogger @@ -11,7 +21,7 @@ class BotFactory: BOT_STATUS_STARTED = 0 BOT_STATUS_LOADING_PAGE = 1 BOT_STATUS_DATA_EXTRACTED = 2 - + BOT_STATUS_DATA_TRANSLATED = 3 def getChainOfLoggers(self) -> AbstractLogger: errorLogger = ErrorLogger(AbstractLogger.ERROR) fileLogger = FileLogger(AbstractLogger.DEBUG) @@ -26,6 +36,7 @@ def run(self, page_title: str): self.logger.logMessage(AbstractLogger.INFO, "Bot started") self.load_page(page_title=page_title) self.data_extractor() + self.data_translator() self.logger.logMessage(AbstractLogger.INFO, "Bot finished") def __init__(self): @@ -86,3 +97,34 @@ def data_extractor(self): self.data_extractor_list = extractor.list self.status = self.BOT_STATUS_DATA_EXTRACTED + + def data_translator(self): + # Create classification context and add classification strategies + + classification_context = ClassificationContext() + classification_context.add_strategy(HasArPostClassificationStrategy()) + classification_context.add_strategy(NotHasArPostClassificationStrategy()) + + # Create translation chain and add translation handlers + + translation_chain = TranslationChain() + translation_chain.add_handler(HasArPostTranslationHandler()) + translation_chain.add_handler(NotHasArPostTranslationHandler()) + + updated_data_extractor_list = [] + + for item in self.data_extractor_list: + classification = classification_context.classify(item) + item.classification = classification + updated_data_extractor_list.append(item) + + self.data_extractor_list = updated_data_extractor_list + updated_data_extractor_list = [] + + for item in self.data_extractor_list: + translated_value = translation_chain.translate(item) + item.translated_value = translated_value + + self.data_extractor_list = updated_data_extractor_list + updated_data_extractor_list = [] + self.status = self.BOT_STATUS_DATA_TRANSLATED diff --git a/tasks/tahdith_tashkila/src/data_translator/classification_context.py b/tasks/tahdith_tashkila/src/data_translator/classification_context.py index 41765f2e..54382592 100644 --- a/tasks/tahdith_tashkila/src/data_translator/classification_context.py +++ b/tasks/tahdith_tashkila/src/data_translator/classification_context.py @@ -1,10 +1,10 @@ class ClassificationContext: def __init__(self): self.strategies = [] + self.logger = None def add_strategy(self, strategy): self.strategies.append(strategy) - def classify(self, value): for strategy in self.strategies: result = strategy.classify(value) diff --git a/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py index fbfc1960..62121603 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_classification/has_ar_post_classification_strategy.py @@ -1,10 +1,26 @@ +from pywikibot.scripts.generate_user_files import pywikibot + from tasks.tahdith_tashkila.src.data_translator.value_classification_strategy import ValueClassificationStrategy +from tasks.tahdith_tashkila.src.models.player import Player class HasArPostClassificationStrategy(ValueClassificationStrategy): def classify(self, value): try: - float(value) + self.check_if_has(value) return "has_ar_post" except ValueError: return None + + def check_if_has(self, model: Player): + en_site = pywikibot.Site("en", "wikipedia") + en_page = pywikibot.Page(en_site, model.page_title) + ar_title = None + if en_page.exists(): + for item in en_page.langlinks(): + if str(item).startswith("[[ar:"): + ar_title = item.title + break + + if ar_title is None: + raise ValueError("ar page not found") diff --git a/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py index 0348fb49..5a562ce0 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_classification/not_has_ar_post_classification_strategy.py @@ -1,10 +1,26 @@ +import pywikibot + from tasks.tahdith_tashkila.src.data_translator.value_classification_strategy import ValueClassificationStrategy +from tasks.tahdith_tashkila.src.models.player import Player class NotHasArPostClassificationStrategy(ValueClassificationStrategy): def classify(self, value): try: - float(value) + self.check_if_has(value) return "not_has_ar_post" except ValueError: return None + + def check_if_has(self, model: Player): + en_site = pywikibot.Site("en", "wikipedia") + en_page = pywikibot.Page(en_site, model.page_title) + ar_title = None + if en_page.exists(): + for item in en_page.langlinks(): + if str(item).startswith("[[ar:"): + ar_title = item.title + break + + if ar_title is not None: + raise ValueError("ar page found") diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py index 5f883157..c1a6d971 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py @@ -4,4 +4,4 @@ class HasArPostTranslationHandler(DataTranslationHandler): def translate(self, value): # Translate the wiki link to Arabic (implement this logic) - return value + return "{{لاعب تشكيلة فريق كرة قدم|الرقم=2|الاسم=[[ميتش آباو]]}}" diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py index 34aae1d9..ade952ed 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py @@ -4,4 +4,4 @@ class NotHasArPostTranslationHandler(DataTranslationHandler): def translate(self, value): # Translate the wiki link to Arabic (implement this logic) - return value + return "{{لاعب تشكيلة فريق كرة قدم|الرقم=2|الاسم=[[ميتش آباو]]}}" diff --git a/tasks/tahdith_tashkila/src/data_translator/translation_chain.py b/tasks/tahdith_tashkila/src/data_translator/translation_chain.py index e69de29b..fa0f4a02 100644 --- a/tasks/tahdith_tashkila/src/data_translator/translation_chain.py +++ b/tasks/tahdith_tashkila/src/data_translator/translation_chain.py @@ -0,0 +1,13 @@ +class TranslationChain: + def __init__(self): + self.handlers = [] + + def add_handler(self, handler): + self.handlers.append(handler) + + def translate(self, value): + for handler in self.handlers: + translated_value = handler.translate(value) + if translated_value: + return translated_value + return value diff --git a/tasks/tahdith_tashkila/src/models/player.py b/tasks/tahdith_tashkila/src/models/player.py index 76e2f446..d1fa84f1 100644 --- a/tasks/tahdith_tashkila/src/models/player.py +++ b/tasks/tahdith_tashkila/src/models/player.py @@ -3,11 +3,28 @@ class Player: _number = None _is_manager = None _title = None + _classification = None + _translated_value = None @property def name(self) -> str: return self._name + @property + def page_title(self) -> str: + if not self._name.strip().startswith("[["): + return self._name + temp_name = self.name.replace("[[", "").replace("]]", "").strip() + return temp_name.split("|")[0] if len(temp_name.split("|")) > 0 else temp_name + + @property + def classification(self) -> str: + return self._classification + + @property + def translated_value(self) -> str: + return self._translated_value + @property def number(self) -> int: return self._number @@ -43,3 +60,11 @@ def is_manager(self, value): @title.setter def title(self, value): self._title = value + + @classification.setter + def classification(self, value): + self._classification = value + + @translated_value.setter + def translated_value(self, value): + self._translated_value = value From 3aa2a35df13c9f5c910711e8c44902a04ebcfaec Mon Sep 17 00:00:00 2001 From: lokas Date: Mon, 2 Oct 2023 18:06:48 +0300 Subject: [PATCH 6/7] add translated_value --- tasks/tahdith_tashkila/src/bot.py | 1 + .../has_ar_post_classification_strategy.py | 42 ++++++++++++++++++- ...not_has_ar_post_classification_strategy.py | 29 ++++++++++++- tasks/tahdith_tashkila/src/models/player.py | 2 +- 4 files changed, 69 insertions(+), 5 deletions(-) diff --git a/tasks/tahdith_tashkila/src/bot.py b/tasks/tahdith_tashkila/src/bot.py index 1a06635e..34ad0fd3 100644 --- a/tasks/tahdith_tashkila/src/bot.py +++ b/tasks/tahdith_tashkila/src/bot.py @@ -123,6 +123,7 @@ def data_translator(self): for item in self.data_extractor_list: translated_value = translation_chain.translate(item) + print(translated_value) item.translated_value = translated_value self.data_extractor_list = updated_data_extractor_list diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py index c1a6d971..128f6f83 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/has_ar_post_classification_strategy.py @@ -1,7 +1,45 @@ +import pywikibot + from tasks.tahdith_tashkila.src.data_translator.data_translation_handler import DataTranslationHandler +from tasks.tahdith_tashkila.src.models.player import Player class HasArPostTranslationHandler(DataTranslationHandler): - def translate(self, value): + def translate(self, model: Player): + if model.classification != "has_ar_post": + return + + template_format = "{{template_name|الرقم=number|الاسم=page_title}}" + template_format = template_format.replace("template_name", self.template_name(model)) + if model.is_manager: + template_format = template_format.replace("|الرقم=number", "") + else: + template_format = template_format.replace("number", self.number(model)) + template_format = template_format.replace("page_title", self.name(model)) + # Translate the wiki link to Arabic (implement this logic) - return "{{لاعب تشكيلة فريق كرة قدم|الرقم=2|الاسم=[[ميتش آباو]]}}" + return template_format + + def template_name(self, model: Player): + template = "لاعب تشكيلة فريق كرة قدم" + if model.is_manager: + template = "مدرب تشكيلة فريق كرة قدم" + return template + + def number(self, model: Player): + return str(model.number) + + def name(self, model: Player): + en_site = pywikibot.Site("en", "wikipedia") + en_page = pywikibot.Page(en_site, model.page_title) + ar_title = None + if en_page.exists(): + for item in en_page.langlinks(): + if str(item).startswith("[[ar:"): + ar_title = item.title + break + + if ar_title is None: + return model.page_title + else: + return "[[" + ar_title + "]]" diff --git a/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py index ade952ed..05385024 100644 --- a/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py +++ b/tasks/tahdith_tashkila/src/data_translator/data_translation/not_has_ar_post_classification_strategy.py @@ -1,7 +1,32 @@ from tasks.tahdith_tashkila.src.data_translator.data_translation_handler import DataTranslationHandler +from tasks.tahdith_tashkila.src.models.player import Player class NotHasArPostTranslationHandler(DataTranslationHandler): - def translate(self, value): + def translate(self, model: Player): + if model.classification != "not_has_ar_post": + return + + template_format = "{{template_name|الرقم=number|الاسم=page_title}}" + template_format = template_format.replace("template_name", self.template_name(model)) + if model.is_manager: + template_format = template_format.replace("|الرقم=number", "") + else: + template_format = template_format.replace("number", self.number(model)) + template_format = template_format.replace("page_title", self.name(model)) + # Translate the wiki link to Arabic (implement this logic) - return "{{لاعب تشكيلة فريق كرة قدم|الرقم=2|الاسم=[[ميتش آباو]]}}" + return template_format + + def template_name(self, model: Player): + template = "لاعب تشكيلة فريق كرة قدم" + if model.is_manager: + template = "مدرب تشكيلة فريق كرة قدم" + return template + + def number(self, model: Player): + return str(model.number) + + def name(self, model: Player): + temp_template = "{{وإو|ar_name|en_name}}" + return temp_template.replace("ar_name", model.page_title).replace("en_name", model.page_title) diff --git a/tasks/tahdith_tashkila/src/models/player.py b/tasks/tahdith_tashkila/src/models/player.py index d1fa84f1..a0bd7815 100644 --- a/tasks/tahdith_tashkila/src/models/player.py +++ b/tasks/tahdith_tashkila/src/models/player.py @@ -51,7 +51,7 @@ def name(self, value): @number.setter def number(self, value): - self._number = int(value) if type(value) is int else None + self._number = int(value) if type(value) is str else value @is_manager.setter def is_manager(self, value): From a95ba5761a749abdc602cc3f625ac22774ee8e6c Mon Sep 17 00:00:00 2001 From: lokas Date: Wed, 4 Oct 2023 19:03:50 +0300 Subject: [PATCH 7/7] update code --- tasks/tahdith_tashkila/src/bot.py | 26 +++++++- .../templates/football_squad.py | 3 +- .../src/template_integration/__init__.py | 0 .../template_integrator.py | 27 +++++++++ .../templates/__init__.py | 0 .../templates/football_squad.py | 36 +++++++++++ tasks/tahdith_tashkila/table.py | 59 +++++++++++++++++++ tasks/tahdith_tashkila/test.py | 40 +++++++++++++ 8 files changed, 187 insertions(+), 4 deletions(-) create mode 100644 tasks/tahdith_tashkila/src/template_integration/__init__.py create mode 100644 tasks/tahdith_tashkila/src/template_integration/template_integrator.py create mode 100644 tasks/tahdith_tashkila/src/template_integration/templates/__init__.py create mode 100644 tasks/tahdith_tashkila/src/template_integration/templates/football_squad.py create mode 100644 tasks/tahdith_tashkila/table.py create mode 100644 tasks/tahdith_tashkila/test.py diff --git a/tasks/tahdith_tashkila/src/bot.py b/tasks/tahdith_tashkila/src/bot.py index 34ad0fd3..dedba6b4 100644 --- a/tasks/tahdith_tashkila/src/bot.py +++ b/tasks/tahdith_tashkila/src/bot.py @@ -15,6 +15,8 @@ from tasks.tahdith_tashkila.src.logger.console_logger import ConsoleLogger from tasks.tahdith_tashkila.src.logger.error_logger import ErrorLogger from tasks.tahdith_tashkila.src.logger.file_logger import FileLogger +from tasks.tahdith_tashkila.src.template_integration.templates.football_squad import \ + FootballSquad as FootballSquadIntegration class BotFactory: @@ -37,6 +39,8 @@ def run(self, page_title: str): self.load_page(page_title=page_title) self.data_extractor() self.data_translator() + self.template_integrator() + self.save() self.logger.logMessage(AbstractLogger.INFO, "Bot finished") def __init__(self): @@ -79,7 +83,7 @@ def load_page(self, page_title: str): self.en_text = self.en_page.text - self.ar_text = self.ar_text + self.ar_text = self.ar_page.text self.logger.logMessage(AbstractLogger.INFO, "end fill page") @@ -123,9 +127,27 @@ def data_translator(self): for item in self.data_extractor_list: translated_value = translation_chain.translate(item) - print(translated_value) item.translated_value = translated_value + updated_data_extractor_list.append(item) self.data_extractor_list = updated_data_extractor_list updated_data_extractor_list = [] self.status = self.BOT_STATUS_DATA_TRANSLATED + + def template_integrator(self): + temp_text = self.ar_text + template_integrator = FootballSquadIntegration( + text_page=temp_text, + logger=self.logger + ) + template_integrator.new_data = self.data_extractor_list + temp_text = template_integrator.parse() + self.ar_text = temp_text + + def save(self): + temp_title_page = str(self.ar_page.title()).replace("قالب:", "مستخدم:LokasBot/تحديث تشكيلة/") + self.temp_page = pywikibot.Page(self.ar_site, temp_title_page) + self.temp_page.text = self.ar_text + self.temp_page.save( + "بوت:تحديث تشكيلة v0.0.1-beta" + ) diff --git a/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py index ec1afba3..943f47e2 100644 --- a/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py +++ b/tasks/tahdith_tashkila/src/data_extraction/templates/football_squad.py @@ -56,8 +56,7 @@ def parse(self): temp_dic = {} for temp_arg in sub_template.arguments: temp_dic[temp_arg.name] = temp_arg.value - print("==========") - print(temp_dic["no"]) + player = Player() player.title = None player.name = temp_dic["name"] if 'name' in temp_dic else None diff --git a/tasks/tahdith_tashkila/src/template_integration/__init__.py b/tasks/tahdith_tashkila/src/template_integration/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/template_integration/template_integrator.py b/tasks/tahdith_tashkila/src/template_integration/template_integrator.py new file mode 100644 index 00000000..4f78adf5 --- /dev/null +++ b/tasks/tahdith_tashkila/src/template_integration/template_integrator.py @@ -0,0 +1,27 @@ +from abc import ABC, abstractmethod + +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger + + +class TemplateIntegrator(ABC): + + def __init__(self, text_page: str, logger: AbstractLogger): + self.text_page = text_page + self.logger = logger + self.new_data = None + + @abstractmethod + def template_name(self): + pass + + @property + def new_data(self): + return self._new_data + + @new_data.setter + def new_data(self, value): + self._new_data = value + + @abstractmethod + def parse(self, page_text: str): + pass diff --git a/tasks/tahdith_tashkila/src/template_integration/templates/__init__.py b/tasks/tahdith_tashkila/src/template_integration/templates/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/tasks/tahdith_tashkila/src/template_integration/templates/football_squad.py b/tasks/tahdith_tashkila/src/template_integration/templates/football_squad.py new file mode 100644 index 00000000..b52d0132 --- /dev/null +++ b/tasks/tahdith_tashkila/src/template_integration/templates/football_squad.py @@ -0,0 +1,36 @@ +import copy +from abc import ABC + +import wikitextparser as wtp + +from core.utils.helpers import prepare_str +from tasks.tahdith_tashkila.src.logger.abstract_logger import AbstractLogger +from tasks.tahdith_tashkila.src.template_integration.template_integrator import TemplateIntegrator + + +class FootballSquad(TemplateIntegrator, ABC): + + def __init__(self, text_page: str, logger: AbstractLogger): + super().__init__(text_page=text_page, logger=logger) + + def template_name(self): + return "شريط تصفح تشكيلة فريق كرة قدم" + + def parse(self): + parser = wtp.parse(self.text_page) + for template in parser.templates: + temp_template = copy.deepcopy(template) + if prepare_str(temp_template.name) == prepare_str(self.template_name()): + for param in temp_template.arguments: + if prepare_str(param.name) == prepare_str("القائمة"): + param.value = self.get_new_list() + self.text_page = str(self.text_page).replace(str(template), str(temp_template)) + return self.text_page + + def get_new_list(self): + temp_text = "" + for model in self.new_data: + temp_text += model.translated_value + temp_text += "{{فاصل}}" + temp_text += "\n" + return temp_text diff --git a/tasks/tahdith_tashkila/table.py b/tasks/tahdith_tashkila/table.py new file mode 100644 index 00000000..3bd77394 --- /dev/null +++ b/tasks/tahdith_tashkila/table.py @@ -0,0 +1,59 @@ +import pywikibot + +my_list = [ + "قالب:تشكيلة نادي أتلتيك بيلباو", + "قالب:تشكيلة أتلتيكو مدريد", + "قالب:تشكيلة نادي أوساسونا", + "قالب:تشكيلة نادي إسبانيول", + "قالب:تشكيلة نادي إشبيلية", + "قالب:تشكيلة نادي إيبار", + "قالب:تشكيلة نادي برشلونة", + "قالب:تشكيلة رايو فايكانو", + "قالب:تشكيلة نادي إلتشي", + "قالب:تشكيلة نادي قادش", + "قالب:تشكيلة نادي خيتافي", + "قالب:تشكيلة ديبورتيفو ألافيس", + "قالب:تشكيلة نادي ريال بلد الوليد", + "قالب:تشكيلة ريال بيتيس", + "قالب:تشكيلة ريال سوسيداد", + "قالب:تشكيلة نادي ريال مايوركا", + "قالب:تشكيلة ريال مدريد", + "قالب:تشكيلة سلتا فيغو", + "قالب:تشكيلة نادي غرناطة", + "قالب:تشكيلة نادي فالنسيا", + "قالب:تشكيلة نادي فياريال", + "قالب:تشكيلة نادي ليغانيس", + "قالب:تشكيلة نادي ليفانتي", +] + +site = pywikibot.Site("ar", "wikipedia") +wiki_table = "" +for t_item in my_list: + + ar_page = pywikibot.Page(site, t_item) + + en_title = None + for item in ar_page.langlinks(): + if str(item).startswith("[[en:"): + en_title = item.title + break + temp_title = t_item.replace("قالب:", "مستخدم:LokasBot/تحديث تشكيلة/") + title = t_item.replace("قالب:", "") + wiki_table += """ + |- + |[[temp_title|title]] + |[[:en:template:en_title]] + + """.replace("en_title", en_title).replace("temp_title", temp_title).replace("title", title) + +print(wiki_table) +# +# bot = BotFactory() +# bot.run(item) + +# page = pywikibot.Page(site, item) +# temp_text = page.text +# temp_title = item.replace("قالب:","مستخدم:LokasBot/تحديث تشكيلة/") +# page = pywikibot.Page(site, temp_title) +# page.text = temp_text +# page.save("بوت نسخ") diff --git a/tasks/tahdith_tashkila/test.py b/tasks/tahdith_tashkila/test.py new file mode 100644 index 00000000..81681a09 --- /dev/null +++ b/tasks/tahdith_tashkila/test.py @@ -0,0 +1,40 @@ +import pywikibot + +my_list = [ + "قالب:تشكيلة نادي أتلتيك بيلباو", + "قالب:تشكيلة أتلتيكو مدريد", + "قالب:تشكيلة نادي أوساسونا", + "قالب:تشكيلة نادي إسبانيول", + "قالب:تشكيلة نادي إشبيلية", + "قالب:تشكيلة نادي إيبار", + "قالب:تشكيلة نادي برشلونة", + "قالب:تشكيلة رايو فايكانو", + "قالب:تشكيلة نادي إلتشي", + "قالب:تشكيلة نادي قادش", + "قالب:تشكيلة نادي خيتافي", + "قالب:تشكيلة ديبورتيفو ألافيس", + "قالب:تشكيلة نادي ريال بلد الوليد", + "قالب:تشكيلة ريال بيتيس", + "قالب:تشكيلة ريال سوسيداد", + "قالب:تشكيلة نادي ريال مايوركا", + "قالب:تشكيلة ريال مدريد", + "قالب:تشكيلة سلتا فيغو", + "قالب:تشكيلة نادي غرناطة", + "قالب:تشكيلة نادي فالنسيا", + "قالب:تشكيلة نادي فياريال", + "قالب:تشكيلة نادي ليغانيس", + "قالب:تشكيلة نادي ليفانتي", +] +from tasks.tahdith_tashkila.src.bot import BotFactory + +site = pywikibot.Site("ar", "wikipedia") +for item in my_list: + bot = BotFactory() + bot.run(item) + + # page = pywikibot.Page(site, item) + # temp_text = page.text + # temp_title = item.replace("قالب:","مستخدم:LokasBot/تحديث تشكيلة/") + # page = pywikibot.Page(site, temp_title) + # page.text = temp_text + # page.save("بوت نسخ")