"""
Replaces parameter aliases with the parameter defined in the TemplateData. Only for templates listed at [[Bikarhêner:Balyozxane/skrîpt/json/replaceParams.json]]
To-do:
1. Template name might not match if it starts with lowercase.
2. Use redirects instead of listing them in the json. Json should only use the list of templates
"""
import pywikibot
from pywikibot import pagegenerators
from pywikibot.bot import SingleSiteBot, ConfigParserBot, AutomaticTWSummaryBot
import json
import re
import mwparserfromhell
import requests
class AppendTextBot(
SingleSiteBot,
ConfigParserBot,
AutomaticTWSummaryBot,
):
summary_key = 'basic-changing'
use_redirects = False
def __init__(self, **kwargs):
super().__init__(**kwargs)
# Fetch JSON content from the specified page
json_page = pywikibot.Page(self.site, "Bikarhêner:Balyozxane/skrîpt/json/replaceParams.json")
self.json_content = json_page.text
print("JSON Content:", self.json_content)
# Load JSON content into a dictionary
try:
self.parameter_conversions = json.loads(self.json_content)
self.alias_templates = self.parameter_conversions.get('templates', {})
print("Alias Templates:", str(self.alias_templates))
except json.JSONDecodeError as e:
pywikibot.error(f"Error decoding JSON content: {e}")
self.parameter_conversions = {}
def treat_page(self) -> None:
page = self.current_page
print("Current Page:", page)
if not page.exists():
pywikibot.error(f"Skipping {page.title()} since it does not exist")
return
text = page.text
wikicode = mwparserfromhell.parse(text)
print("WikiCode:", wikicode)
# Iterate through each template in the page
for template in wikicode.filter_templates():
print("Processing Template:", template)
# Check if the template name matches any of the citation templates
if self.should_process_template(template):
print("Template should be processed")
self.replace_template_name(template)
self.replace_aliases(template)
new_text = str(wikicode)
print("New Text:", new_text)
if new_text != text:
page.text = new_text
print("Page Text:", page.text)
page.save(summary="Replace template parameter aliases with parameter names")
def should_process_template(self, template):
"""Checks if a template should be processed based on self.cite_templates."""
template_name = template.name
template_name_lower = template_name.strip().lower()
print("Template Name Lower:", template_name_lower)
for key, value in self.alias_templates.items():
if (
key.lower() == template_name_lower
or value.lower() == template_name_lower
):
return True
return False
@staticmethod
def get_template_data(template_title):
url = "https://ku.wikipedia.org/w/api.php"
params = {
"action": "templatedata",
"titles": f"Template:{template_title}",
"format": "json"
}
response = requests.get(url, params=params)
print("API Response:", response)
if response.status_code == 200:
data = response.json()
print("API Data:", data)
pages_data = data.get('pages', {})
page_number = next(iter(pages_data)) # Get the first (and only) key in pages_data
print("Page Number:", page_number)
params_data = pages_data[page_number].get('params', {})
alias_dict = {}
for param_name, param_info in params_data.items():
aliases = param_info.get('aliases', [])
for alias in aliases:
alias_dict[alias] = param_name
print("Alias Dictionary:", alias_dict)
return alias_dict
else:
print("Error:", response.status_code)
return {}
def replace_template_name(self, template):
template_name = template.name.strip()
print("Template Name:", template_name)
try:
new_template_name = self.alias_templates[template_name]
print("New Template Name:", new_template_name)
template.name = f'{new_template_name}\n'
print("Template After Replacement:", template)
except KeyError:
pass
def replace_aliases(self, template):
template_name = template.name.strip()
print("Template Name for Aliases:", template_name)
alias_dict = self.get_template_data(template_name)
print("Alias Dictionary:", alias_dict)
if not alias_dict:
print("No template data")
return text
for param in template.params:
# Check if the parameter name is an alias
param_name_stripped = param.name.strip()
print("Param Name Stripped:", param_name_stripped)
if param_name_stripped in alias_dict:
# Get the corresponding parameter name from the alias dictionary
new_param_name = alias_dict[param_name_stripped]
# Adjust the length of the new parameter name to match the original length
new_param_name = new_param_name.ljust(len(param.name))
# Replace the parameter name
param.name = new_param_name
print("New Param Name:", new_param_name)
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)
print("Generator:", gen)
if not pywikibot.bot.suggest_help(missing_generator=not gen):
bot = AppendTextBot(generator=gen, **options)
bot.run()
if __name__ == '__main__':
main()