-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmove_kr.py
More file actions
177 lines (156 loc) · 8.1 KB
/
Copy pathmove_kr.py
File metadata and controls
177 lines (156 loc) · 8.1 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
from __future__ import annotations
import pywikibot
from pywikibot import pagegenerators
from pywikibot.bot import ConfigParserBot
import wikitextparser as wtp
import re
from typing import Optional
# --- невеликі утиліти ---------------------------------------------------
def extract_param_value(text: str, key: str) -> Optional[str]:
"""
Шукає в тексті рядок виду:
|key = value
(ігнорує пробіли навколо =, case-insensitive).
Повертає value (без кінцевого пробілу) або None.
"""
pattern = rf'^\s*\|\s*{re.escape(key)}\s*=\s*(.+)\s*$'
m = re.search(pattern, text, flags=re.IGNORECASE | re.MULTILINE)
if not m:
return None
val = m.group(1).strip()
# Якщо значення містить наступний рядок параметра, вирізати лише поточний рядок
# (ми вже взяли до кінця рядка, тому це зайве; лишаємо на випадок інших форматів)
return val
def unwrap_image(value: str) -> str:
"""
Просте витягання імені файлу з форм:
[[Файл:Name.png|...]] -> Name.png
[[File:Name.svg]] -> Name.svg
File:Name.png -> Name.png
commons:File:Name -> Name
або якщо вже plain 'Name.svg' -> Name.svg
"""
if not value:
return value
v = value.strip()
# [[...:Name|...]] або [[...:Name]]
m = re.search(r'\[\[\s*(?:[Ff]ile|[Фф]айл|[Cc]ommons:File|[Cc]ommons:Файл)?\s*[:/]?\s*([^|\]]+)', v)
if m:
return m.group(1).strip()
# префіксний варіант File:Name
m2 = re.match(r'^(?:[Ff]ile|[Фф]айл|[Cc]ommons:File|[Cc]ommons:Файл)\s*:\s*(.+)$', v)
if m2:
return m2.group(1).strip()
# якщо є pipe, беремо ліву частину
if '|' in v:
return v.split('|', 1)[0].strip()
# знайти щось з розширенням
m3 = re.search(r'([^/\\\|\n]+\.(?:svg|png|jpg|jpeg|gif|tif|tiff|webp))', v, flags=re.IGNORECASE)
if m3:
return m3.group(1).strip()
return v
def format_lua_value(key: str, raw: Optional[str]) -> str:
"""
Форматує значення для lua:
- числа (ціле або з десятковою частиною) повертаються як число (без лапок),
допускаються коми як десятковий розділювач (перетворюються в '.')
- для ключів image/image1 витягуємо ім'я файлу і повертаємо 'Name.ext'
- інші рядки — в одинарних лапках, апострофи екраніруємо
"""
if raw is None:
return "''"
v = raw.strip()
# видалити зовнішні лапки
if (v.startswith('"') and v.endswith('"')) or (v.startswith("'") and v.endswith("'")):
v = v[1:-1].strip()
# числа: допускаємо 51.6 або 51,6
v_num = v.replace(',', '.')
if re.fullmatch(r'-?\d+(\.\d+)?', v_num):
return v_num
# images
if key.lower().startswith('image'):
fname = unwrap_image(v)
fname = fname.replace("'", "\\'")
return f"'{fname}'"
# рядкове значення
s = v.replace("'", "\\'")
return f"'{s}'"
# --- main (обробка сторінок і створення модулів) -----------------------
def main(*args: str) -> None:
options = {}
local_args = pywikibot.handle_args(args)
gen_factory = pagegenerators.GeneratorFactory()
local_args = gen_factory.handle_args(local_args)
# парсимо прості опції (summary, replace)
for arg in local_args:
arg, _, value = arg.partition(':')
opt = arg[1:]
if opt in ('summary',):
options[opt] = value if value else pywikibot.input('Please enter a value for ' + arg)
else:
if opt:
options[opt] = True
gen = gen_factory.getCombinedGenerator(preload=True)
if not gen:
pywikibot.bot.suggest_help(missing_generator=True)
return
site = pywikibot.Site()
replace_flag = bool(options.get('replace', False))
summary = options.get('summary', 'Створення модуля Location map/data з шаблону')
for page in gen:
try:
pywikibot.output(f'Обробка сторінки: {page.title()}')
text = page.text or ''
if not text.strip():
pywikibot.output(' Порожня сторінка — пропускаю.')
continue
# Визначити суфікс для модуля: прибираємо "Шаблон:" і "Карта розташування"
title = page.title()
base = title
if base.startswith('Шаблон:'):
base = base[len('Шаблон:'):]
suffix = base
if base.startswith('Карта розташування'):
suffix = base[len('Карта розташування'):].strip()
suffix = suffix.strip()
if not suffix:
pywikibot.output(' Не вдалося визначити суфікс назви — пропускаю.')
continue
module_title = f'Модуль:Location map/data/{suffix}'
module_page = pywikibot.Page(site, module_title)
# Витягнути потрібні параметри (name, top, bottom, left, right, image, image1)
# Використовуємо простий пошук по рядках |key = value
keys = ['name', 'top', 'bottom', 'left', 'right', 'image', 'image1']
found = {}
# Для надійності спробуємо знайти у всьому тексті (не лише в тілі шаблона)
for k in keys:
v = extract_param_value(text, k)
if v is None:
# спробуємо також варіант з можливими CAPS/пробілами навколо (ще один пошук)
# (extract_param_value вже ігнорує регістр, тому цього кроку зазвичай не треба)
v = extract_param_value(text, k)
if v is not None:
found[k] = v
# Якщо хоча б одне поле знайдено — продовжимо; інакше пропускаємо
if not found:
pywikibot.output(' Не знайдено жодного з полів (name/top/bottom/left/right/image/image1) — пропускаю.')
continue
# Побудова lua-тексту у бажаному порядку
lines = []
for k in keys:
if k in found:
lua_val = format_lua_value(k, found[k])
lines.append(f'\t{k} = {lua_val},')
lua_text = "-- Автоматично згенеровано скриптом\nreturn {\n" + "\n".join(lines) + "\n}\n"
# Якщо модуль вже існує і не дозволено replace — пропускаємо
if module_page.exists() and not replace_flag:
pywikibot.output(f' Модуль уже існує: {module_title} — пропускаю (використайте -replace щоб перезаписати).')
continue
# Записуємо модуль
module_page.text = lua_text
module_page.save(summary=summary)
pywikibot.output(f' Створено/оновлено модуль: {module_title}')
except Exception as e:
pywikibot.output(f' Помилка при обробці {page.title()}: {e}')
if __name__ == '__main__':
main()